From b55e172d72d18d918bae324f93fd2df2dbd6997c Mon Sep 17 00:00:00 2001 From: Jon Seager Date: Fri, 22 May 2026 10:58:44 +0000 Subject: [PATCH] chore: Remove djlint from project djlint corrupts Askama/Jinja templates and cannot be used safely. Remove .djlintrc, install-py-deps task, and all djlint references from prek.toml. Restore full README.md that was lost during rebase. --- .djlintrc | 9 ---- .mise.toml | 2 - README.md | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+), 11 deletions(-) delete mode 100644 .djlintrc diff --git a/.djlintrc b/.djlintrc deleted file mode 100644 index 5c95946..0000000 --- a/.djlintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "profile": "jinja", - "indent": 2, - "max_line_length": 120, - "max_attribute_length": 80, - "preserve_blank_lines": true, - "preserve_leading_space": true, - "format_attribute_template_tags": true -} diff --git a/.mise.toml b/.mise.toml index 518e7cc..d0dfadd 100644 --- a/.mise.toml +++ b/.mise.toml @@ -23,8 +23,6 @@ npx --yes @puppeteer/browsers install chrome@stable --path "$CHROME_DIR" npx --yes @puppeteer/browsers install chromedriver@stable --path "$CHROME_DIR" """ -install-py-deps = "uv tool install djlint" - fmt = { depends = ["fmt:rs", "fmt:sh", "fmt:assets"] } "fmt:rs" = "cargo fmt" "fmt:sh" = "shfmt -i 2 -s -w $(find . -name '*.sh' -not -path './target/*')" diff --git a/README.md b/README.md index 7363a20..52922d0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,128 @@ +![cover image](./static/og-image.png) + +**B{rew}log** is a self-hosted specialty coffee logging platform optimised for filter brewing +enthusiasts. B{rew}log can be used for tracking roasters, roasts, brews, cafes and brewing gear. + +B{rew}log features an LLM-powered "Bag Scanning" feature, which enables it to automatically fill +roaster and coffee information using a photo of a bag. It also supports "check-ins" to log coffee +enjoyed in a cafe. + +B{rew}log ships as a single Rust binary that serves a web UI, a REST API, and a CLI client. The +application uses SQLite as a backend, and will automatically create and migrate the database on +start-up. + +> [!NOTE] +> This application was built almost entirely with Claude Code. I used this project as an +> excuse to explore the current state of the art in agentic coding tools. I've reviewed +> much of the code, and I'm largely responsible for the rules and the layout of the repository +> but nonetheless the vast majority of the code was written by Claude and Opus 4.6. + +## Quick Start (Demo) + +Before you start, you'll need to sign up for [Openrouter](https://openrouter.ai) and +[Foursquare Places](https://foursquare.com/products/places/) and get API keys for both. + +Then create a `docker.env` file: + +```env +# You'll need an API key from OpenRouter +BREWLOG_OPENROUTER_API_KEY=sk-or-... +# I've had good results with Gemini models, but you can try 'openrouter/free' to experiment +BREWLOG_OPENROUTER_MODEL=google/gemini-3-flash-preview +# FourSquare Places API key for location searching +BREWLOG_FOURSQUARE_API_KEY=fsq3... +``` + +You can see the full list of configuration options [below](#configuration). Once your `.env` file +is complete, start the container using the environment file + +```bash +# Create a data directory to store the database +mkdir data +# Run the container +docker run \ + --rm \ + -p 3000 \ + --env-file docker.env \ + -v $PWD/data:/data \ + ghcr.io/jnsgruk/brewlog:latest +``` + +On first start with an empty database the server prints a one-time registration URL: + +``` +No users found. Register the first user at: + http://localhost:3000/register/abc123... +This link expires in 1 hour. +``` + +Open that URL, choose a display name, and register a passkey. This creates an account and +signs in automatically. + +### Install from Git + +To build and install from source, you'll need a working Rust toolchain: + +```bash +cargo install --locked --git https://github.com/jnsgruk/brewlog.git +``` + +Then create a `.env` file containing at least your OpenRouter and Foursquare API keys, and start +the server: + +```bash +brewlog serve +``` + +### CLI Authentication + +To use the CLI or API for write operations, create a token via browser hand-off: + +```bash +brewlog token create --name "my-cli-token" +# Browser opens → authenticate with a passkey → token printed once + +export BREWLOG_URL="http://localhost:3000" +export BREWLOG_TOKEN="" + +# Create data from the CLI +brewlog roaster add --name "Radical Roasters" --country "United Kingdom" +``` + +Run `brewlog --help` for the full command reference. + +## Configuration + +All settings are read from environment variables or CLI flags. A `.env` file in the working +directory is loaded automatically via [dotenvy](https://crates.io/crates/dotenvy). + +### Server (`brewlog serve`) + +| Variable | Purpose | Default | +| -------------------------- | ---------------------------------------------------------------------- | ----------------------- | +| `BREWLOG_RP_ID` | WebAuthn Relying Party ID (server domain) | `localhost` | +| `BREWLOG_RP_ORIGIN` | WebAuthn Relying Party origin (full URL) | `http://localhost:3000` | +| `BREWLOG_DATABASE_URL` | Database connection string | `sqlite://brewlog.db` | +| `BREWLOG_BIND_ADDRESS` | Server bind address | `127.0.0.1:3000` | +| `BREWLOG_INSECURE_COOKIES` | Disable the `Secure` cookie flag (auto-enabled for localhost defaults) | `false` | +| `RUST_LOG` | Log level filter | `info` | +| `RUST_LOG_FORMAT` | Set to `json` for structured log output | — | + +### CLI Client + +| Variable | Purpose | Default | +| --------------- | ------------------------------------- | ----------------------- | +| `BREWLOG_URL` | Server URL | `http://localhost:3000` | +| `BREWLOG_TOKEN` | API bearer token for write operations | — | + +### Integrations + +| Variable | Purpose | Default | +| ---------------------------- | --------------------------------------------------------------------------- | ----------------- | +| `BREWLOG_OPENROUTER_API_KEY` | [OpenRouter](https://openrouter.ai/) API key for AI extraction | **required** | +| `BREWLOG_OPENROUTER_MODEL` | LLM model for AI extraction | `openrouter/free` | +| `BREWLOG_FOURSQUARE_API_KEY` | [Foursquare](https://foursquare.com/) Places API key for nearby cafe search | **required** | + ## Development Setup Install [mise](https://mise.jdx.dev/) then set up the development environment: