No description
Find a file
Jon Seager 145ddb4765
fix(timeline): centre line behind cards on mobile for full-width layout
- Move timeline line to centre on mobile instead of left gutter
- Remove left padding from cards to maximise horizontal space
- Reposition dots to top-centre of each card border on mobile
- Make card background fully opaque so line doesn't show through
- Desktop alternating layout unchanged
2026-02-03 13:21:55 +00:00
.github chore: update copliot instructions 2025-11-25 21:42:20 +00:00
migrations feat(gear): add filter paper category and optional brew association 2026-02-03 10:13:35 +00:00
scripts feat(bootstrap): add filter paper gear and brew references 2026-02-03 12:50:18 +00:00
src feat(roasts): consolidate table columns and add tasting notes search 2026-02-03 12:51:59 +00:00
templates fix(timeline): centre line behind cards on mobile for full-width layout 2026-02-03 13:21:55 +00:00
tests feat(search): add search to ListQuery, ListNavigator, and route handlers 2026-02-03 12:51:34 +00:00
.gitignore feat(backup): add CLI backup and restore commands 2026-02-03 12:50:41 +00:00
Cargo.lock chore(deps): remove unused wiremock dev-dependency 2026-02-02 17:43:13 +00:00
Cargo.toml chore(lint): enable clippy pedantic and restriction lints 2026-02-02 17:55:16 +00:00
CLAUDE.md fix(brews): lay out action icons horizontally and merge temp into recipe 2026-02-03 13:08:07 +00:00
flake.lock refactor(nix): migrate flake.nix to flake-parts 2026-02-02 17:39:38 +00:00
flake.nix refactor(nix): migrate flake.nix to flake-parts 2026-02-02 17:39:38 +00:00
README.md feat: add username/password flags to create-token command 2025-11-26 16:32:40 +00:00

B{rew}log

B{rew}log is a self-hosted coffee logging platform for tracking your roasters, roasts, brews, cafes and brewing gear.

The application is distributed as a single Rust binary that powers both an HTTP server and a command-line client for the API. There is a web frontend built with Tailwind CSS that enables client-side reactivity with Datastar.

Note

This project was built with significant assistance from Github Copilot. I used it as a test-bed for trying out newer agentic coding workflows, and to get some basic experience with Datastar, which had attracted my attention.

Basic usage

B{rew}log ships as one executable. You decide whether it acts as a server or a client.

First-time setup

On first start, you must set an admin username and password via the BREWLOG_ADMIN_USERNAME and BREWLOG_ADMIN_PASSWORD environment variables:

BREWLOG_ADMIN_USERNAME="admin" BREWLOG_ADMIN_PASSWORD="your-secure-password" brewlog serve

This creates the admin user in the database. On subsequent starts, the environment variables are not required.

Authentication

Brewlog supports two authentication methods:

  1. Web Frontend: Session-based authentication via login page
  2. CLI/API: Token-based authentication via Bearer tokens

Web Authentication

  1. Start the server and browse to the frontend
  2. Click "Login" in the navigation bar
  3. Sign in with username admin and your password
  4. You're now authenticated and can create/update/delete records

CLI/API Authentication

First, create an API token:

brewlog create-token --name "my-cli-token"
# You will be prompted for username and password.
# Alternatively, you can provide them via flags:
# brewlog create-token --name "my-cli-token" --username admin --password secret

# Username: admin
# Password: ********
#
# Token created successfully!
# Token ID: nye9BDqnLL
# Token Name: my-cli-token
#
# ⚠  Save this token securely - it will not be shown again:
#
# dEadB3efDeadb33fdeadb33F...
#
# Export it in your environment:
#   export BREWLOG_TOKEN=dEadB3efDeadb33fdeadb33F...

Export the token and use it for all CLI commands:

export BREWLOG_TOKEN="dEadB3efDeadb33fdeadb33F..."
export BREWLOG_URL=http://localhost:3000

# Now all write operations work
brewlog add-roaster \
  --name "Radical Roasters" \
  --country "UK" \
  --city "Bristol" \
  --homepage "https://radicalroasters.co.uk"

brewlog add-roast \
  --roaster-id "deadbeef" \
  --name "Chelbesa Lot 2" \
  --origin "Ethiopia" \
  --region "Gedeo" \
  --producer "Chelbesa Cooperative" \
  --process "Washed" \
  --tasting-notes "Blueberry, Jasmine"

Token Management

# List your active tokens
brewlog list-tokens

# Revoke a token
brewlog revoke-token --id abc123

API Usage

For direct API access, include your token as a Bearer token:

curl http://localhost:3000/api/v1/roasters \
  -H "Authorization: Bearer dEadB3efDeadb33fdeadb33F..." \
  --json '{"name":"Radical Roasters","country":"UK"}'

Note: All read operations (GET requests) are public and don't require authentication. Only write operations (POST/PUT/DELETE) require authentication.

Installation

At present, the only way to use brewlog is to build it from source:

git clone https://github.com/jnsgruk/brewlog.git
cd brewlog
cargo build --release

The resulting binary lives at target/release/brewlog.

During development you can run directly:

cargo run -- serve

Testing

The project includes a number of unit and integration tests, all of which can be executed with cargo:

cargo test