BrewNotes is a self-hosted coffee and espresso logging app designed for fast daily use and deeper analytics over time. It helps you dial in your KitchenAid KF7 by tracking beans, drink settings, ratings, notes, photos, and attribution. BrewNotes is a single-container deployment that runs on Unraid or any Docker host.
- Fast drink entry flow optimized for mobile logging.
- Bean + drink presets with auto-loaded settings.
- Full KF7 settings support (strength, temperature, body, order, volumes, grind).
- Attribution for “Made by” and “Rated by” with recent names.
- Analytics dashboard with Recharts graphs.
- Photo management with thumbnails.
- PWA support for quick home screen access.
- Export/backup endpoints including JSON, CSV, and ZIP with uploads.
Add screenshots here once you deploy BrewNotes.
- Dashboard
- Beans list
- Bean analytics
- Drink detail
docker run -d \
--name brewnotes \
-p 8087:8080 \
-e APP_PORT=8080 \
-e DATA_DIR=/data \
-e DB_PATH=/data/app.db \
-e UPLOAD_DIR=/data/uploads \
-e PUID=99 \
-e PGID=100 \
-v /mnt/user/appdata/brewnotes:/data \
brewnotes:latest- Copy
brewnotes.xmlinto your Unraid templates directory. - In Unraid, go to Apps → Templates and select BrewNotes.
- Map
/mnt/user/appdata/brewnotesto/dataand set the port to8087. - Access BrewNotes at
http://<unraid-ip>:8087.
docker pull brewnotes:latest
docker stop brewnotes
docker rm brewnotes
docker run ... (same as above)BrewNotes provides full export endpoints:
/api/export.json→ Full JSON export/api/export.csv→ Beans + drinks CSVs in one response/api/export.zip→ ZIP containing JSON, CSVs, and uploads
- Schedule a job to download
/api/export.zipweekly. - Store it in Unraid backups or cloud storage.
- Extract the ZIP locally.
- Copy
uploads/back into/data/uploads. - Restore the SQLite database from
/data/app.db.
If PUID and PGID are set, BrewNotes will:
- Create a user/group once.
- Fix permissions on
/dataonly once. - Avoid re-chowning on every start.
If you run into permission issues, delete /data/.brewnotes_permissions to force a one-time fix.
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
alembic -c alembic.ini upgrade head
uvicorn app.main:app --reloadcd frontend
npm install
npm run devThe frontend proxies /api to the backend in development.
-
GET /api/beans(query:include_archived) -
POST /api/beans -
PUT /api/beans/{id} -
POST /api/beans/{id}/archive -
POST /api/beans/{id}/unarchive -
POST /api/beans/{id}/photo -
GET /api/beans/{id}/analytics -
GET /api/beans/{id}/recommended-settings -
GET /api/drinks -
POST /api/drinks -
PUT /api/drinks/{id} -
DELETE /api/drinks/{id} -
POST /api/drinks/{id}/photo -
GET /api/export.json -
GET /api/export.csv -
GET /api/export.zip
name(required)roaster,origin,process,roast_leveltasting_notes,notesroast_date,open_datebag_size_g,price,decafimage_path,thumbnail_patharchivedcurrent_best_settings(JSON blob)
bean_id,drink_type,custom_labelmade_by,rated_by- KF7 settings:
strength_level,temperature_level,body_level,order,coffee_volume_ml,milk_volume_ml,grind_setting - Ratings:
overall_rating,sweetness,bitterness,acidity,body_mouthfeel,balance,would_make_again,dialed_in notes,photo_path,thumbnail_path
MIT