A static web frontend for the Kleiner Brauhelfer 2 home brewery database. Reads brauhelfer.sqlite, exports BeerJSON + BeerXML files, generates SVG bottle labels, and deploys everything to a static web host via FTP.
Brewlog turns your KBH2 SQLite database into a beautiful, self-hosted beer catalog. It exports every brew as BeerJSON and BeerXML files, generates printable SVG bottle labels with QR codes, and optionally charts brew-day and fermentation data from InfluxDB sensors. The entire site is a single index.html with no build step — deploy it to any static host via FTP.
Key features:
- Beer catalog — Filter by status and style, with radar charts, KPIs, and dark mode
- Detail pages — Full recipe breakdown: grain bill, hops, mash plan, fermentation timeline
- Labels — DIN A4-ready SVG labels with QR codes, radar charts, and your brewery logo
- Sensor data — Brew-day kettle temps and fermentation curves from iSpindel + MQTT sensors
- Multilingual — 8 languages (DE, EN, FR, IT, ES, NL, DA, CS) with a flag picker
List view — Beer cards with radar charts, status filters, and style chips:
Detail view — Full recipe with mash plan, fermentation charts, and photo gallery:
Labels — Printable SVG labels with QR codes and radar charts:
| Requirement | Notes |
|---|---|
| Python ≥ 3.11 | Core scripts use only stdlib; see requirements.txt for optional extras |
curl |
Used by the deploy scripts for FTP upload |
| Kleiner Brauhelfer 2 | Source of brauhelfer.sqlite |
pip install -r requirements.txt # optional: Pillow + qrcode + influxdb-client
Generate 5 example brews to preview the site locally:
python sample/generate_sample_data.pyThen configure .env, export, and preview:
copy .env.example .env # edit FTP + brewery settings
python web/export.py
cd web && python -m http.server 8080Open http://localhost:8080 to see the sample catalog.
- Copy
.env.example→.envand configure your FTP credentials, brewery name, and logo filenames - Place your
brauhelfer.sqlitedatabase ininput/ - Run deploy to export data and publish the site:
deploy/deploy.ps1 # Windows
bash deploy/deploy.sh # Mac/LinuxThat's it — your brew log is live at the URL configured in FTP_DIR.
brewlog/
├── input/
│ ├── brauhelfer.sqlite # KBH2 database (not in repo)
│ ├── enrichment/ # Taste profile, Untappd ID, label color
│ ├── influxdb/ # Fetched by fetch_influxdb.py (not in repo)
│ ├── images/ # Brew photos — source of truth (not in repo)
│ └── logo/ # Logo source files
├── web/
│ ├── export.py # SQLite + enrichment + images → web/data/ + web/images/
│ ├── generate_labels.py # BeerJSON → SVG labels
│ ├── fetch_influxdb.py # InfluxDB → input/influxdb/{n}.json (optional)
│ ├── index.html # SPA (reads data/ via fetch)
│ ├── i18n/ # Translation files (8 languages)
│ ├── data/ # Generated (not in repo)
│ ├── images/ # Generated (not in repo)
│ └── labels/ # Generated (not in repo)
├── tests/
├── deploy/
│ ├── deploy.ps1 # FTP upload – Windows (PowerShell)
│ └── deploy.sh # FTP upload – Mac/Linux (bash)
├── .env # FTP credentials + brewery config (not in repo)
└── .env.example # Template for .env
python -m unittest discover -s tests -vTests run against a self-contained fixture SQLite (two example brews created in code — no real database needed).
- Configuration — Environment variables, enrichment files, photos, i18n
- Deployment & Workflow — Deploy commands, local development, label generator
- Website Features — List view, cards, detail view, radar chart
- InfluxDB — Fermentation data fetching, schema, configuration
homelab.yml— Classification metadata (profile, route, personal-data flag) for infra tooling — seeinfrastructure/WEBAPP_PROJECT_STANDARD.md§1a- Compliance — this repo is public, so its
COMPLIANCE.mdlives in the infrastructure repo instead:compliance/brewlog.md(seeWEBAPP_PROJECT_STANDARD.md§1b for why)


