
# Open Beans
**Dial in your perfect brew.**
A minimal, mobile-first coffee tracker, made for **single dosers**: when you
weigh in beans per shot and keep several bags open at once, every bean needs
its own grinder setting, dose, and brew time. Open Beans keeps every bag on
a swipeable shelf โ with a photo, a rating, and one auto-saving recipe per
brew style โ so the next espresso starts where the last one left off, not
from memory. Entirely serverless on Cloudflare's free tier: no server to
run, nothing to back up, installs like an app.
[](https://reactrouter.com)
[](https://www.typescriptlang.org/)
[](https://workers.cloudflare.com)
[](https://developers.cloudflare.com/d1/)
[](https://orm.drizzle.team)
[](https://tailwindcss.com)
[](#-install-it-like-an-app)
[](LICENSE)
---
## Contents
- [Feature Tour](#feature-tour)
- [How It's Built](#how-its-built)
- [Self-Hosting Guide](#self-hosting-guide)
- [1. Prerequisites](#1-prerequisites)
- [2. Clone and Install](#2-clone-and-install)
- [3. Create the D1 Database and R2 Bucket](#3-create-the-d1-database-and-r2-bucket)
- [4. Run It Locally](#4-run-it-locally)
- [5. Deploy](#5-deploy)
- [6. Add a Custom Domain](#6-add-a-custom-domain)
- [7. Turn On the Login Gate](#7-turn-on-the-login-gate)
- [Migrating from the Flask Version](#migrating-from-the-flask-version)
- [Install It Like an App](#-install-it-like-an-app)
- [Security Model](#security-model)
- [Development](#development)
- [Project Structure](#project-structure)
- [License](#license)
---
## Feature Tour
### ๐ซ Your Open Bags, One Shelf