Sign inSign up

gatoserio/bready

By gatoserio

β€’Updated 14 days ago

Self-hosted baking companion PWA β€” sourdough logs, dough calculators, bake journal

Image
0

3.4K

gatoserio/bready repository overview

⁠🍞 Bready

Self-hosted baking companion, installable as a PWA on mobile and desktop.

Home screen Starter feeding log Bread calculator Bake journal with schedule

Desktop layout: top bar with the app brand, inputs beside the live formula

  • Sourdough starters β€” feeding calculator (keep Γ— ratio Γ— hydration) and a feed log with photos and "last fed" indicators; logging shows a βœ… confirmation (refresh/double-tap safe); a fridge mode (❄️ with temperature) switches reminders to a longer fridge interval; a jar ledger tracks what each feed discards, deducts the levain each bake takes, and accepts "jar now holds X g" corrections; a jar registry (name, photo, empty weight) lets you weigh jar-and-all and have the tare subtracted for you, and a split action seeds a new starter from an existing jar with the grams deducted from its ledger
  • Calculators β€” one baker's-percentage engine powering bread, Italian pizza styles (Napoletana direct / 20% biga / 100% biga / Teglia romana), broa de milho amarelo (with escaldΓ£o) and pancakes; flour blends, preferments with correct levain accounting, target-baked-weight scaling with bake-loss estimation, mixer batch planning; extras that come in whole pieces (eggs…) can carry a unit weight so scaled amounts round to whole units ("egg Γ— 2", never 1.7 of one)
  • Schedules β€” every recipe's method steps back-calculated from "I want it ready at…" into clock times, with optional kitchen-temperature adjustment of fermentation durations (Q10)
  • Recipes β€” all of the above as editable templates (duplicate & printable kitchen sheets included), plus your own from scratch
  • Journal β€” "Bake this" freezes formula + schedule into an entry; check off steps in the kitchen (actual vs planned times), rate, note, photograph, calibrate each recipe's real bake loss from measured weights; searchable and filterable
  • Live bake mode β€” full-screen countdown to the next step with tap-to-done and screen wake lock
  • Starter analytics β€” feeds/week, average interval/temp/hydration, discard per week (and its flour cost with the price list) and an interval sparkline from the feed log
  • Reminders β€” push notifications via ntfy⁠: "starter is hungry" on a per-starter interval (nagging repeats β€” at most daily β€” until the feed is logged; fridge-mode starters run on their longer fridge interval), and each bake step when its planned time arrives (Settings β†’ Notifications: server + topic, then subscribe in the ntfy app)
  • Calendar feed β€” token-protected /calendar.ics with planned bakes and order due dates for any calendar app
  • Export / import β€” download everything as JSON + photos (recipes also as portable Cooklang⁠ .cook files, downloadable per recipe too); restore the same zip from Settings. Other Cooklang apps read those files as a plain gram recipe at one size (Cooklang has no baker's percentages); an embedded frontmatter line makes re-import into Bready lossless. Foreign .cook files import through a review screen β€” masses and millilitres convert, cups and unit counts you confirm by hand, and the result is a flat formula without preferment accounting. The import page also offers optional sample recipes (pizza napoletana, sourdough β€” plain or with chouriΓ§o, queijo da ilha, cheese, or coffee, cacau and chocolate chips β€” focaccia, ciabatta) as one-tap Cooklang loads β€” nothing is saved unless you keep them (docs/recipes/⁠ has the same files)
  • Desktop layout β€” phones get the compact tab-bar app; at β‰₯960px the same pages rearrange into a desktop layout: top bar with the app brand, lists as card grids, calculators with the live formula beside the inputs
  • Sales (optional) β€” off by default; enable in Settings for ingredient prices, per-recipe cost & suggested-price estimates (ingredients + energy per oven load + packaging + optional labor at your hourly rate), clients, orders with status flow and costs frozen at order time, partial payments with balances, a 6-month billed/received chart, and a per-day production sheet (aggregated doughs + shopping list with costs)
  • Pantry & margin alerts (optional) β€” track ingredient stock in kg (purchases feed the price list, bakes deduct what they use, the production sheet warns when a day runs short) and get warned when a price change pushes a product below your target margin
  • Client portal (optional) β€” invite clients to a separate /shop login where they browse your published products (bake-day stock or made-to-order with lead times) and place orders that land in your Sales tab for confirmation
  • User manual β€” the full manual ships inside the app at /manual (also linked from Settings β†’ About), so it works offline too

All data is metric grams. UI language is a setting (English and PortuguΓͺs available). One SQLite file + a photos folder = the whole state.

⁠Selling & the client portal

Turn on Sales in Settings for costing, clients, orders, payments and a per-day production sheet; add the client portal on top and clients order from a small self-service shop at /shop. Portal orders arrive pending β€” you confirm or decline, and stock, production, costing and payments stay in sync. Costing counts energy per oven load and (optionally) your hands-on time, freezes each order's costs at creation so past margins stay honest, and β€” with the optional pantry β€” tracks ingredient stock and warns before a short production day; margin alerts flag underpriced products when ingredient prices rise:

flowchart LR
    S[Client orders at /shop] --> P(pending)
    M[You type an order in] --> O(open)
    P -- confirm --> O
    P -- decline --> D(declined Β· stock freed)
    O -- bake day --> B(baked)
    B -- handover --> V(delivered)

Sales overview Production sheet Client shop Pending portal order

Billed vs received, last six months

See PLAN.md⁠ for the full plan. Status: all seven phases complete. Display options include 24h/12h clock and auto/light/dark theme.

⁠Deploy with Docker

git clone https://github.com/PauloJf/bready && cd bready
# edit docker-compose.yml: set ORIGIN and the Dockflare labels for your hostname
docker compose up --build -d

Notes:

  • ORIGIN must match the public URL (e.g. https://bready.example.com) or form submissions fail SvelteKit's CSRF check.
  • HTTPS is required for PWA installation. The compose file carries labels for Dockflare⁠-managed Cloudflare tunnels β€” adjust label names/values to your setup. Any other reverse proxy (Caddy, Traefik, NPM) works too; the app listens on port 3000.
  • No ports are published by default; uncomment the ports block for direct LAN testing.
  • The container runs as the unprivileged node user (uid 1000), with a read-only root filesystem and all capabilities dropped. The bind-mounted data folder must be writable by uid 1000: mkdir -p data && sudo chown -R 1000:1000 data (existing deployments upgrading from the root-based image need the same chown once).
  • On first visit you choose a password (setup screen). Sessions last 90 days. Changing the password signs out all other devices. Set the password before exposing the app publicly β€” until setup completes, the first visitor picks it.

⁠Backup & restore

Everything lives in the ./data volume: bready.db (SQLite) plus photos/.

  • Backup: copy the data/ folder (or use Settings β†’ Export for a portable zip of JSON + photos).
  • Restore: stop the container, put your data/ folder back, start it again.

⁠Install as an app

  • Android/Chrome: open the site β†’ menu β†’ Add to Home screen / Install app.
  • iOS/Safari: share button β†’ Add to Home Screen.
  • Desktop Chrome/Edge: install icon in the address bar.

Calculators work offline after first visit; pages you've opened before are cached.

⁠Develop

npm install
npm run dev
  • npm test β€” unit tests (engine, schedule, auth, starter math)
  • npm run check β€” typechecking
  • npx drizzle-kit generate --name <name> β€” new migration after schema changes (migrations run automatically at boot)
  • npm run icons β€” regenerate PWA icons from scripts/icon.html

Stack: SvelteKit (Svelte 5) + SQLite (better-sqlite3/Drizzle), single container, no external services.

⁠License

Bready is free for personal use under the PolyForm Noncommercial License 1.0.0⁠ β€” use it, change it, share it, as long as the license notice travels with it. One explicit extra permission: running your own small-scale home bakery on it (that's what the Sales module is for) counts as personal use. Offering Bready itself as a product or service is commercial use and needs separate permission. Because of the noncommercial clause this is source-available rather than OSI open source.

Tag summary

Content type

Image

Digest

sha256:282627456…

Size

90.9 MB

Last updated

14 days ago

docker pull gatoserio/bready