# Meal planning workspace

Bookify adaptation, 2026, of mealie-recipes/mealie at c88a28ef9f3f4110ea22a28496b683b8528ae054 (AGPL-3.0). Original repository: https://github.com/mealie-recipes/mealie. Copyright belongs to the contributors named in the original project. The original licence is retained in LICENSE.txt. Original files used as reference are retained under source/ with their paths; TypeScript reference files have a .txt suffix so the host does not compile them.

Adapted code in source.mjs ports cleaner.py string normalization, mixed HowToSection/HowToStep flattening, duplicate-heading suppression, ingredient cleaning and structured-duration handling; use-scaled-amount.ts three-place scaling; unit-systems.ts dimensions/factors; and shopping_lists.py compatible-unit aggregation with preserved per-recipe references. The UI adapts MealPlanDay.vue day panels and meal-slot cards, RecipeIngredients.vue checklists, and RecipePageInstructions.vue section cards and reversible completed-step state. The orange accent and white cards follow the inspected meal planner reference. No third-party photographs, logos or branding are copied. Reference files are not executable dependencies.

Bookify adds strict local schemas, bounded JSON-LD traversal, conservative reviewed ingredient parsing, unknown-versus-zero handling, explicit US measurements, frozen prep/cooking snapshots, allocation accounting, atomic revision checks, backup preview/undo, grocery snapshots and privacy-controlled exports. Unknown quantities do not merge as zero. Ingredient lines with secondary quantities (alternate measurements, ranges or package sizes) remain fully unspecified until reviewed, so only part of a measurement is never scaled. Fractions keep their numeric precision until final display rounding. Imported cup/spoon/custom units need review; no density conversions. Prep ingredients count once on the prep date. The cooking timer is a saved wall-clock deadline without background notifications. No shared accounts or source backend services are used.

Runtime: index.html, style.css, app.mjs, core.mjs, source.mjs and storage.mjs are browser modules with no build step or third-party runtime dependencies. Serve this directory over HTTP/HTTPS. IndexedDB requires an ordinary same-origin browser context. No upstream code, install scripts, migrations or dependencies were executed while preparing this adaptation.

Website imports use a separate original Bookify endpoint POST /api/apps/recipes/import with JSON {"url":"https://public.example/recipe"}. It returns bounded inert {"html":"...","url":"..."}; the browser parses Recipe JSON-LD and requires review. The generic transport uses pinned public IPv4 DNS results, standard ports, no login cookies, bounded bytes/redirects/time and process-wide concurrency/rate limits. IPv6-only sites are unsupported. Service-reference copies and the React Router route are included in source/service-reference for reproducibility; run them in a Node 24 React Router service or supply an equivalent endpoint. Recipe parsing is not performed in the main Bookify application bundle.

The same-origin bookify-meals-source.zip contains every distributed file except itself. Regenerate using scripts/package-meal-source.py in the containing Bookify repository. The complete standalone workspace and included service-reference code are provided under AGPL-3.0. The original AGPL reference sources retain their licences. No third-party fraction code is used; quantity display is decimal.
