Mobile-first vegan meal-prep generator
  • JavaScript 88.8%
  • CSS 6.3%
  • HTML 4.9%
Find a file
Peter McNeil da9cf47092
All checks were successful
Deploy Static App / deploy (push) Successful in 13s
Trigger redeploy with fixed action
2026-06-14 19:06:53 +01:00
.forgejo/workflows Use fully qualified action URL for deploy action 2026-06-14 18:59:40 +01:00
components Rework generator: macro-first selection with micronutrient diversity 2026-06-11 05:40:18 +00:00
js Rework generator: macro-first selection with micronutrient diversity 2026-06-11 05:40:18 +00:00
styles Build Slop Bowl: goal-driven vegan meal-prep generator 2026-06-10 15:18:13 +00:00
vendor Build Slop Bowl: goal-driven vegan meal-prep generator 2026-06-10 15:18:13 +00:00
icon.svg Add deploy config, registry metadata, and app icon 2026-06-14 18:55:19 +01:00
index.html Build Slop Bowl: goal-driven vegan meal-prep generator 2026-06-10 15:18:13 +00:00
README.md Rework generator: macro-first selection with micronutrient diversity 2026-06-11 05:40:18 +00:00
registry.yaml Add deploy config, registry metadata, and app icon 2026-06-14 18:55:19 +01:00

Slop Bowl

Mobile-first vegan meal-prep generator. Configure goals, sauces, and proteins; generate weeks of bowl plans; get a shopping list scoped to week 1; keep a persistent pantry.

Fully client-side — no npm, no bundler, no build step. Vanilla ES modules, web components, Tailwind (vendored browser build in vendor/tailwind.js), localStorage persistence.

Run

Serve the repo root with any static file server, e.g.

python3 -m http.server

or point Caddy at the directory. No server-side logic.

How it works

  • Goals (high protein, high fibre, 500700 kcal, travel safe, eat cold) are toggles in Config. Kcal/travel/cold filter the bowl pool; protein/fibre weight the scoring.
  • Generation samples hundreds of candidate weeks of (bowl, protein) pairs — protein choice changes the macros — then selects in three stages: keep weeks near the best protein+fibre totals, among those maximise micronutrient diversity (food-group coverage via MICRO_GROUPS, with a rotation penalty against repeating last week's bowls), then tie-break on fewest new shopping items (pantry items count as free). Bowls may repeat up to 3× per week.
  • Persistence is localStorage behind js/storage.js (slop-pantry, slop-config, slop-plan). The adapter is async so it can be swapped for a network API later without touching the rest of the app.