Changelog
Current release: 1.20.0 ()
All notable changes to Pro Nutrition Planner are documented here.
Unreleased
Added
- New-user email sequence: Consenting new coaches can receive a founder-led onboarding sequence (welcome, day 2, day 5, day 9) with a Calendly demo link and a `1MONTHFREE` subscribe offer. Anyone who has entered a paid plan (including later canceled, unpaid or failed subscriptions) and unsubscribed users are suppressed automatically.
- Marketing consent and unsubscribe: Registration includes an optional, unticked marketing checkbox. Marketing emails include a secure token unsubscribe link; opting out does not stop essential account or billing messages.
- Lifecycle email admin view: Organisation detail shows consent and send history; Email marketing shows eligible users, sends, failures, unsubscribes, post-sequence subscriptions, and `1MONTHFREE` conversions.
Changed
- Privacy Policy and Terms: Privacy Policy now describes optional marketing, opt-out, email click records, and the hosting mail server. Terms clarify essential vs optional communications and promotional offer conditions.
Version 1.19.8
Fixed
- Unpaid subscriptions keep access: Failed invoice webhooks now revoke PNP access immediately by Stripe customer ID, even when subscription status updates are delayed or the org’s stored subscription ID does not match.
- Stale paid tiers: On reconcile/login/app use, if the local org is still on a paid plan but Stripe has no active/trialing subscription (e.g. `unpaid` / `past_due` / `canceled`), access is force-revoked.
- Billing auto-sync re-grant bug: Removed a fallback that could set an organisation back to Active/Solo when Stripe retrieve failed, which could restore access for unpaid customers. Free-tier auto-sync only restores access from a granting Stripe subscription.
Version 1.19.7
Fixed
- Weekly meal reorder arrows: Up/down now move meals within the day container instead of targeting the top-level `#meals-container` (Full/Simplified were already fine).
Changed
- Weekly day link wording: Empty option is “None”; help text reads “The selected day will duplicate its meals to this day.”
Version 1.19.6
Fixed
- Full/Simplified Add Meal button did nothing: The click handler passed the browser event into `addMeal()`, which treated it as the meals container. The handler now ignores non-element arguments so Full/Simplified use `#meals-container` again (Weekly was unaffected because it already passed a real container).
Version 1.19.5
Fixed
- Weekly save FK error / empty exports: Saving no longer reuses deleted or other-day meal IDs (which caused `fk_items_meal` failures and left the DB empty). Linked meal mirrors use non-persistent ids; independent days are mounted correctly for save (empty `data-linked-to=""` no longer skips them).
- Unlink day UI: Unlink hides the unlink control, clears the link attribute, and restores + Add Meal (linked days previously had no add-meal button in the DOM at all).
Version 1.19.4
Fixed
- Weekly export showing empty meals/grocery: The builder proximity bar is live from the DOM (including linked-day mirrors), but PDF/grocery export reads the database. Export now saves the current plan first so calories, macros, meals, and the grocery list match what the coach sees. Weekly PDF detection also uses day-structure fallback, not only `template_type`.
Version 1.19.3
Fixed
- Weekly day linking no longer wipes the source day: Linking updates in place with no auto-save and no page reload, so unsaved work on the source day stays intact and accuracy is not scored until the coach saves. Only the linked day’s own meals are cleared. Linked days live-mirror the source day’s current builder content.
Version 1.19.2
Fixed
- Weekly day link appearing to wipe the source day: Linking now auto-saves the plan first so in-progress work on the source day (e.g. Monday) is persisted before reload. Only the linked day’s own meals are cleared; the source day is never deleted.
Changed
- Weekly builder UI: Day accordion and “Link this day to” control restyled to match app form/select patterns (labels, focus rings, custom chevron, card-like day sections).
Version 1.19.1
Fixed
- Weekly template not activating in builder: If `meal_plans.template_type` was an ENUM of only `full`/`simplified`, selecting Weekly still created seven day meal sets but stored an empty/Full value — so the builder showed a flat list of 28 meals with daily targets. Template columns are widened to VARCHAR, existing day-based plans are repaired to `weekly`, and the builder detects weekly plans from day rows as a fallback.
Version 1.19.0
Added
- Weekly meal plan template: Coaches can create a Monday–Sunday plan in one meal plan record, with collapsible day builders, day linking (live sync to an independent source day), weekly targets (daily × 7), and full-macro seven-day client exports.
- Day linking: Link any day to an independent day; linked days stay read-only and update when the source changes. Unlink copies current content into an independent day.
- Weekly grocery lists: Shopping lists aggregate ingredients across all seven resolved days (linked days count separately).
Changed
- Default template setting: Branding default can be Full, Simplified, or Weekly, and is now respected when creating a new meal plan.
- Meal plan list: Shows a template badge (Full / Simplified / Weekly).
Fixed
- Default template ignored on create: New plans previously always started as Full even when the coach’s branding default was Simplified.
Version 1.18.1
Fixed
- Active Stripe sub stuck on Free Trial: If a paid subscription uses an older/unmapped Stripe price ID, the app now maps the plan from monthly amount, price nickname, or product name so Growing/Solo/etc. restore correctly instead of staying on Free Trial with status Active.
- Upgrade button blocked for already-paid plans: Choosing your current plan on Billing refreshes the account from Stripe instead of trying (and failing) to open a second Checkout or a blocked in-app upgrade.
Version 1.18.0
Added
- My Recipes macros: The My Recipes table now shows calories plus protein, carbs, and fat for each saved recipe (totals from ingredients × serves).
- Apply Recipe advanced filters: In the meal plan builder, Apply Recipe supports filtering by recipe source (all catalogue vs My recipes only), meal type keywords (chicken, beef, seafood, soup, rice, pasta, and more), and calorie bands (0–300, 300–500, 500–750, 750+).
- Apply Recipe result macros: Each recipe in the Apply Recipe search list shows kcal, protein, carbs, and fat so coaches can compare options before applying.
Changed
- Recipe search API: `/api/recipes-search.php` returns aggregated macros and accepts `scope`, `type`, `calories`, and optional `meal_plan_id` (for fibre-in-calories preference).
- Seafood filter: The former Fish chip is now Seafood, matching fish and shellfish terms (salmon, prawns, tuna, etc.) while ignoring ingredients whose names say “except fish”.
Version 1.17.0
Added
- Email meal plan to client: On the generated meal plan, grocery list, and combined preview pages, coaches can open Email to Client, edit a pre-filled subject and message, and send the client’s unique download link. The email is sent from `mealplans@pronutritionplanner.com` with the coach/organisation name in the From display name, Reply-To set to the coach’s account email, and a branded HTML message with a View My Meal Plan button (plain-text fallback; no PDF attachment).
- Unique link reuse for email: Sending reuses the existing create-or-reuse download link flow so emailed and manually generated links behave the same way.
Changed
- Outbound mail helper: Application email sending supports From/Reply-To display names and multipart HTML + plain text while remaining compatible with existing password-reset and contact emails.
Version 1.16.1
Fixed
- Payment recovery after locked access: When a subscription payment fails (including during Stripe retries), access is revoked but the Stripe subscription ID is kept so the customer can still open the billing portal and pay. Billing now shows a Pay outstanding invoice link when Stripe has an open invoice.
- Access restored after paying an invoice: Paid invoice webhooks read the subscription ID from the modern Stripe invoice `parent` field (not just the legacy `subscription` field). Cancelled / free-tier Stripe customers are reconciled again on login, app access checks, and the daily cron so a recovered Stripe payment writes back to the database and admin panel.
Version 1.16.0
Added
- Meal images in client meal plans: Generated meal plan PDFs can show a photo beside each meal’s notes (notes on the left, image on the right). Applies to global catalogue recipes and coach-created custom recipes. If no image is set, the notes section looks the same as before.
- Recipe meal image uploads (admin): Global recipes in the admin panel support upload, preview, and removal of meal images (JPG, PNG, WEBP, up to 3MB).
- Recipe meal image uploads (coaches): My Recipes create and edit forms include the same meal image upload, preview, and remove options for private recipes.
- Plan builder image snapshots: When a recipe with an image is applied to a meal, the image path is stored on the meal so exported plans keep the correct photo even if the source recipe changes later.
- Catalogue image mapping tool: `tools/map-recipe-meal-images.php` links existing meal image files in `/assets/img/meal images/` to global catalogue recipes by normalised title match.
Changed
- PDF meal image layout: Images scale to fit within a consistent frame beside the notes without cropping; the full photo remains visible (aspect ratio preserved).
- Production deploy for My Recipes: `app/recipes.php` is a thin entry wrapper so the live `/app/recipes.php` route stays in sync when the repo is deployed to `httpdocs/` via SFTP. Deployment docs updated for `meal_images.php`, `recipe_catalogue.php`, and the `httpdocs/app/` vs `httpdocs/public/app/` layout.
Version 1.15.11
Changed
- Plan Builder - Apply Recipe catalogue browsing: Removed the default result cap when loading recipe options in the meal catalogue modal, so coaches can scroll the full A-Z list even without entering search criteria.
Version 1.15.10
Fixed
- Subscription payment failures revoke access immediately: Coaches lose platform access as soon as their Stripe subscription is anything other than active or trialing — including past due, unpaid, canceled, and incomplete. Previously, past-due accounts kept access during Stripe’s retry window and some accounts stayed active when the database drifted from Stripe.
- Faster sync on app use: Paid-tier accounts are reconciled with Stripe on each app request so unpaid or failed subscriptions are downgraded without waiting for login or the daily cron job.
Version 1.15.9
Added
- Plan Builder – Save to My Recipes: Each meal card now has a Save Recipe button in the footer. Save the current meal (title, notes, ingredients, and scaled amounts) to your private recipe catalogue without leaving the plan builder. A confirmation prompt appears before adding; unnamed meals ask for a recipe name first.
Version 1.15.8
Fixed
- PDF export on Safari (macOS): Meal plan and grocery shopping list exports now use Safari-specific print handling so saved or downloaded PDFs are no longer blank. Chrome and other browsers are unchanged and keep the existing full-page export layout.
Version 1.15.7
Fixed
- Login sessions: Sign-in works reliably on production hosting again; session handling no longer depends on the server’s default PHP session folder when that location is not writable.
Version 1.15.6
Changed
- Meal plans per client (paid): Paid coaches can now keep up to eight active meal plans per client—still unlimited in practice when you clear the decks and start fresh.
Version 1.15.5
Fixed
- Billing status stays in sync with Stripe: Your plan tier and subscription status in the app and admin panel now match Stripe more reliably after upgrades, downgrades, or payment issues.
- Recovered payments: When a previously failed subscription payment is successfully paid, your account status updates to active without remaining stuck on past due.
Version 1.15.4
Fixed
- Plan changes use current list prices only: Coaches who upgrade or downgrade through Cancel, downgrade, or update payment (Stripe Customer Portal) now only see the current plan prices ($34 / $79 / $119 / $149), not legacy grandfathered prices. If Stripe still applies a legacy price after a plan change, the app automatically moves the subscription to the matching current price for that tier.
- Checkout and in-app plan changes: New subscriptions and plan-change requests only accept current catalog price IDs; legacy price IDs are rejected.
- Unchanged grandfathered subscriptions: Coaches who stay on the same plan without changing tier keep their existing Stripe price until they change plan or cancel.
Added
- Repair script for legacy plan changes: `app/cron/repair-legacy-subscription-prices.php` can move affected customers from legacy to current prices (e.g. `--customer=cus_xxx`).
Version 1.15.3
Fixed
- Forgot password emails: Requesting a password reset now sends an email with a secure link (using the same mail setup as the contact form). A new Set New Password page completes the reset flow.
Version 1.15.2
Added
- Change password: Logged-in coaches and admins can update their password from the profile menu (Change Password). Your current password is verified before the new one is saved; you remain signed in after a successful update.
Version 1.15.1
Fixed
- Cancelled subscriptions downgrade correctly: When a Stripe subscription is cancelled or removed, your organisation now moves back to the free trial tier with the correct client limit. Paid plan fields are cleared while your Stripe customer record is kept so you can resubscribe later.
- Cancel at period end: If you cancel but keep access until the end of the billing period, paid features stay active until that date; after the period ends (or when Stripe confirms full cancellation), access downgrades to free automatically.
- Billing webhooks and sync: Subscription updated and deleted events from Stripe are handled consistently so the database cannot stay on a paid tier after Stripe shows the subscription as cancelled.
- Missed webhooks: Opening Billing or signing in can refresh subscription state from Stripe. A daily reconcile job also downgrades accounts whose stored subscription no longer exists or is cancelled in Stripe.
- Admin organisations list: Tier and status now reflect free vs paid accurately after cancellation, including a note when a plan is set to cancel at period end.
Version 1.15.0
Added
- Secure meal plan download links: On finished export preview pages (Meal Plan, Grocery List, and Full Plan & Grocery List), coaches can use Generate Link to create a unique, time-limited URL for the client PDF. The link is copied to the clipboard automatically (with a manual-copy fallback). Clients can open the link without logging in and download the plan.
- Protected PDF storage: Generated files are stored outside the public web root with token-based filenames. Downloads are served only through a controlled route that validates the token, expiry, and file integrity.
- Server-side PDF export: Download links use Dompdf to produce real PDF files (Composer dependency). Coaches still use Download PDF on the preview page for browser print/save as before — that flow is unchanged.
Changed
- Export preview toolbar: Finished plan previews now show Download PDF, Generate Link / Copy Link, and Close. The meal plan editor and plan builder export entry points are unchanged.
Fixed
- Dompdf layout: Download-link PDFs use compact portrait styling so combined meal plan + grocery exports stay close to the browser print layout (macro summary in one row, readable tables, footer contact details fully visible inside page margins). Invalid or blank exports are blocked before a link is saved.
Version 1.14.0
Added
- Plan Builder – Combined export: The header Export dropdown replaces separate export buttons. Choose Full Plan & Grocery List (meal plan then grocery list in one printable document, with a page break between sections), Meal Plan, or Grocery Shopping List. Grocery and combined exports still ask how many days (1–14) to multiply quantities by.
- Coach – Resources: New Resources tab in the top navigation for logged-in coaches. Downloadable materials are listed as cards so more guides and ebooks can be added over time without restructuring the app.
- Meal Catalogue Ebook: First paid resource — Meal Catalogue Ebook (PNP recipe book for coaches). Coaches can use it with clients for meal inspiration, preference discovery, and improving adherence. The card shows cover art, optional PDF sample preview, list price $19 with $29 shown struck through, and an Owned badge after purchase.
- Secure purchase and download: One-time Stripe Checkout for the ebook (including promotion codes on checkout). Purchases are recorded per coach; the full PDF is served only through a protected download — files are not exposed via a public URL.
- Post-purchase flow: After payment, a success page confirms the purchase and links straight to download; returning to Resources shows Download instead of Purchase.
Version 1.13.3
Added
- Nutrition preferences (coach): Optional setting Include fibre calories in calorie totals (user menu → Nutrition preferences). When off (default), food energy uses protein × 4 + carbs × 4 + fat × 9 only so calorie totals align with classic macro targets. When on, fibre × 2 is added. Helper copy explains the behaviour in neutral, educational wording.
- Meal plan snapshot: Each meal plan stores `include_fibre_calories` at creation and on duplicate, so existing plans keep the same calorie rule if a coach changes the organisation preference later.
Changed
- Fibre in calories (hybrid): The platform default is again excluding fibre from derived calorie totals; coaches who want fibre-inclusive energy opt in via Nutrition preferences. PDF exports, plan builder, scaling, smart substitutions, ingredient search, recipes, client calculator manual mode, and related APIs follow the plan snapshot or organisation setting consistently.
Version 1.13.2
Changed
- Calories and fibre (platform-wide): Food energy from macros now includes dietary fibre at 2 kcal per gram everywhere it is derived in the app—meal plan lines, totals, PDF exports, plan accuracy from saved totals, ingredient search and admin/coach ingredient lists, meal scaling and smart substitutions, and the manual macro calorie view—so numbers follow one rule end to end. Existing meal lines still use your stored macro grams; calorie figures move to the fibre-inclusive sum when you load or save a plan (nothing is double-counted).
- Static scripts (cache busting): theme.js and utils.js are now requested with a file-based version query so browsers pick up behaviour changes after a deploy without relying on a hard refresh.
Fixed
- My Recipes – search vs added row: The ingredient dropdown could show fibre-inclusive calories from the server while the row still used an older three-macro calorie helper from a cached utils.js. Recipe rows now always apply the same fibre-inclusive rule locally when totals refresh, so the line you add matches what you picked in search.
Version 1.13.1
Changed
- Client Profile – Sodium target range: In the Calorie & Macro Calculator, the sodium upper limit has been increased from 3000 to 6000 mg/day for both standard calculator inputs and manual macro override inputs.
Version 1.13.0
Added
- Coach – My ingredients: Add your own ingredients one at a time, scoped to your organisation (they never land in the global admin catalogue). Protein, carbs, fat, and fibre are required; other micronutrients are optional. Your items appear in Plan Builder and My Recipes alongside the main catalogue, with the same validation when saving plans and recipes.
- Coach navigation: The top bar uses My Recipes and My ingredients so private recipes and custom ingredients are easier to find.
Changed
- Billing – adding custom content: Coaches on a free trial (tier zero) can still open My Recipes and My ingredients, but adding a new recipe or custom ingredient prompts an upgrade to a paid plan; paid tiers can create freely. List and edit access for existing content follows your existing rules.
- My Recipes – ingredient entry (create and edit): Building a recipe now follows the same amount rules as the Plan Builder—grams or millilitres for gram-based portions, or servings for everything else—with live per-line and recipe totals for calories and main macros as you work. Create and edit share the same experience.
- My Recipes – search results: Ingredient search pulls from the same API as the Plan Builder; each result shows macros and calories on a separate line under the name so nothing overlaps the title.
- Global vs coach data: The admin ingredient catalogue and bulk imports only affect global ingredients; coach-owned rows stay in your organisation and out of those admin tools.
Fixed
- Plan Builder – Apply Recipe: Searching for a recipe no longer fails as soon as you start typing (native PDO could not reuse the same named parameter twice in one query).
- Edit recipe: Opening a recipe for editing no longer triggers a SQL error on MariaDB when loading ingredient rows (qualified column references for `ingredients` are quoted correctly).
Version 1.12.0
Added
- Smarter billing and plan changes: Plan upgrades and changes now update your existing subscription whenever possible, so you get a smoother upgrade or downgrade path and clearer protection against being charged twice for overlapping plans.
- More reliable subscription matching: Behind the scenes, the app does a better job of knowing which subscription belongs to your organisation, including when your billing account has unusual history. This keeps your plan level and billing state aligned with what you expect.
- Scheduled downgrades: When you move to a lower tier, your higher plan stays active until the end of your current billing period, then the change applies automatically—so you are not cut off early.
- Support tooling for rare edge cases: In exceptional situations where duplicate subscriptions exist, there is a safe, deliberate way for support to tidy them up—without automatic surprises for everyday accounts.
- Clearer published prices: New coaches and anyone who changes plan see the current list prices. Coaches who joined on earlier prices stay on those until they choose to change—prices stay consistent on the marketing site and on your Billing page.
- Broader billing compatibility: Payment success notifications are handled reliably whether your billing provider sends them under a newer or older event name.
Changed
- One place for price rules: List prices and “grandfathered” earlier prices are managed in one central place, so what you see in the product matches what billing uses.
- Updated price display: The website and in-app Billing now show $34 / $79 / $119 / $149 AUD per month for the paid tiers (Solo through Enterprise), matching the current published list.
- Account and billing stay in sync: When you have a downgrade scheduled, your session and screens can reflect that more accurately.
- Faster application of scheduled downgrades: If a downgrade is due, it can be applied when you sign in or open Billing—not only on a nightly schedule—so your plan updates sooner when the timing is right.
Fixed
- Plan changes without duplicate subscriptions: Improved the flow when changing plan so you are not left with two active paid subscriptions for the same account.
- Safer handling of subscription events: When billing systems send overlapping or repeated updates, the app favours syncing your account state safely instead of taking aggressive automatic cancellation steps.
- Correct plan for every price point: Coaches still on earlier price points continue to see the right plan tier and client limits until they upgrade or downgrade.
Version 1.11.0
Added
- Plan Builder – Smart Substitutions (paid): Swap meal ingredients for better fits with one action. Free plans see a clear upgrade path; paid plans get full access from each ingredient row (manual entries and recipe-based rows).
- Smarter swap suggestions: The app ranks alternative ingredients for you and can preview a swap before you commit, so you spend less time hunting for replacements.
- Substitution experience: A dedicated panel shows your original ingredient, up to eight ranked options with simple quality cues, and one-click Swap when you are ready.
Changed
- Better matching for swaps: Suggestions weigh macros and calories together with sensible amounts and portion types, so you see fewer unrealistic replacements.
- More helpful ordering: Results favour ingredients in a similar category and with overlapping tags (for example gluten-free), with sensible fallbacks when those hints are not available.
- Clearer amounts in suggestions: Swap previews show amounts with everyday units (for example grams, millilitres, serves) while still filling your plan fields correctly.
- Easier to scan match quality: Colour bands on match scores make it quicker to spot strong options at a glance.
Fixed
- More dependable substitutions: Improved compatibility across hosting setups so suggestions load reliably when you need them.
- Plan table layout: Adding the substitute action no longer throws off column alignment in the meal table.
- Amounts after swapping: Swapped rows now fill amount fields correctly so nothing looks blank after you apply a swap.
Version 1.10.0
Added
- Coach Dashboard – Plan accuracy (paid): See how tight your saved meal plans are against targets, track your average over time, streaks, and simple achievements—so you get feedback on quality without extra busywork.
- Automatic scoring on save: Each time you save a plan, scores refresh from what is actually in the plan, and your dashboard stats stay up to date without duplicate badges.
- Dashboard widget: Paid coaches get a compact accuracy summary on the home dashboard; free plans see a friendly prompt to upgrade.
Changed
- Dashboard layout: Accuracy is shown as three easy-to-read cards that match the rest of the dashboard in light and dark mode.
- Clearer metrics: Average accuracy (across your plans) is separated from last plan accuracy, and the trend line reflects how your average moves over time.
Fixed
- Dark mode: Achievement chips read clearly in dark theme instead of looking washed out.
- Widget polish: Tidied spacing and overlap so the accuracy ring and text are easier to read.
Version 1.9.0
Added
- Client Profile – Manual macro targets: In Calorie & Macro Calculator, you can optionally enter Protein, Carbs, Fat, Fibre, and Sodium directly for a client when you want full control. Totals update live and save with the client.
- Seamless support for manual mode: Turning manual mode on is optional; the calculator stays the default for everyone who prefers the guided flow.
Changed
- Calculator stays familiar: Manual entry is opt-in and keeps the rest of the client context (demographics, energy needs) so you only override what you choose.
Fixed
- Client details layout: Long email addresses wrap neatly in the client details panel instead of spilling past the card.
Version 1.8.0
Added
- Plan Builder – Plan notes before export: Use Add Notes (between Save and Export Meal Plan) to add up to three titled blocks above the first meal—ideal for coach notes or client guidance. Each block has a heading, body, and optional delete, with styling that matches your plan. Notes save with the plan, copy when you duplicate a plan, and appear before meals on the Export Meal Plan PDF.
- Grocery export – choose the number of days: Export Grocery Shopping List asks how many days (1–14) you want; the PDF scales quantities accordingly (seven days by default). The filename reflects your choice.
Changed
- Reorder meals without moving notes: Move up/down only swaps meal blocks, so plan-level notes stay anchored above your meals.
- Notes look consistent: Plan note fields follow the same typography and light/dark styling as meal names and per-meal notes for a cohesive look.
Version 1.7.0
Added
- Clients – Add multiple clients at once: From the Clients list (when your plan allows), use Add multiple clients to open a dedicated screen. Add rows up to your remaining client slots, fill calculator-style fields in one pass, use inline help where you need it, and submit once. Either every client is created together or you see clear errors so you can fix them—no half-finished batches. Works comfortably on mobile with a sticky action bar.
Version 1.6.0
Added
- Light and dark mode: Coaches and admins can switch theme from the top navigation; your choice is remembered for next time across the app and admin areas.
- Stronger theming foundation: Under the hood, theming is organised for easier future polish while you get a consistent look today.
Changed
- Less flash on load: Your saved theme applies earlier so you see the right colours sooner when opening pages.
- Meal Builder in dark mode: Inputs feel less like a spreadsheet—softer surfaces, clearer hover and focus, and a calmer editing experience.
- Clearer calorie goal prompt: The meal calorie goal field now invites “Enter Calorie Goal” so new coaches know what to type first.
- Version in the footer: The footer shows the current product version and links to this changelog.
Fixed
- Apply Recipe clarity: Applying a recipe now replaces the meal’s ingredients with the recipe’s list instead of stacking on top, so comparisons stay tidy. Related scale/undo edge cases for that meal are reset when you replace with a recipe.
Version 1.5.0
Added
- Ingredients – More micronutrients: Calcium, magnesium, iron, and zinc are now part of the ingredient model. New values default to zero; you can fill them in over time through import or editing.
- Plan Builder – Plan totals: Under Sodium in Plan Totals, open More micronutrients to see plan-wide Potassium, Calcium, Magnesium, Iron, and Zinc in milligrams, styled like the rest of the sidebar. Totals refresh as you build.
Changed
- Bulk ingredient import: The CSV template and import flow include the new micronutrient columns so large libraries stay complete.
- Single ingredient edit: Add and edit forms include the four new mineral fields.
- Command-line import: Optional columns for the new minerals (defaults to zero if omitted).
- Search, recipes, and scaling: Typeahead, recipe application, and scaling carry the new fields through so totals stay accurate as you work.
Version 1.4.0
Changed
- Plan Builder – Reorder ingredients: Drag using the handle in the lock column for clearer control. While dragging, a light ghost row follows the pointer and the drop row highlights so you know exactly where the ingredient will land.
Version 1.3.0
Added
- Recipe notes: Catalogue and custom recipes can store method and instructions. When you apply a recipe in the Plan Builder, those notes flow into Notes for this meal, alongside ingredients.
- One-time backfill for teams with existing catalogues: A dedicated import path helps bring historical recipe notes in from a spreadsheet where needed.
- Bulk meal import: The meals CSV template includes a Notes column so you can capture guidance per meal during large imports.
- Command-line meal import: Long-format meal CSVs can carry optional notes per meal.
- Admin and coach recipe forms: Notes field on add/edit; saved notes return when you pick the recipe again.
- Plan Builder – Notes look consistent: Meal notes use the same font and colour rhythm as the rest of the builder.
Changed
- Apply Recipe in one step: Choosing a recipe fills the meal name, ingredients, and notes together so the meal reflects the full recipe.
Version 1.2.0
Added
- Export Grocery Shopping List: New action beside meal plan export. Generates a branded PDF with weekly ingredient totals (daily amounts scaled to your chosen week length), with sensible grouping for grams, millilitres, and serve-based foods.
Changed
- Clearer export naming: The former Generate PDF control is now Export Meal Plan so coaches know exactly what it does.
Version 1.1.0
Added
- Sticky macro bar in Plan Builder: A bottom bar shows Calories, Protein, Carbs, and Fat with Target, Current, and Remaining; you can collapse it and your choice is remembered. Colours align with plan totals for quick scanning. Works on narrow screens (stacked layout) and respects safe areas on phones. Labels say Remaining in full.
Changed
- Plan Builder on phones: Ingredient rows become easy-to-read cards instead of a wide table—name, amount, calories, macros, then delete—without sideways scrolling.
- Meal totals on small screens: Macro labels spell out P, C, F, Fi, Na, Cals with simple separators so “meal total” lines stay readable.
- Header logo on mobile: The logo keeps proper proportions and no longer stretches awkwardly.
Fixed
- Mobile ingredient cards: Amount and calories sit in separate columns with short labels so values never run together.
- Mobile meal actions: Scale, Apply Recipe, and Delete wrap cleanly on narrow screens.
Version 1.0.0
Added
- Initial launch