2026-03-20 — Dinly: quality pass, feature gaps, and the weekly cadence system
What shipped today
The session opened with two broad /scout passes that identified 13 issues across code quality, UX gaps, and missing features. All were executed in a single session.
The first scout pass focused on code quality and UX. The ranking engine got its first unit tests — 17 cases covering all 7 scoring dimensions (votes, dietary disqualification, preferences, history, requests, bookmarks, bucket assignment). Two performance fixes landed: the curate action’s N+1 candidate updates were batched into 2 queries, and the results page’s 3 redundant family_members subqueries were eliminated. The planning flow got comprehensive UX improvements — empty states on every step (candidates, vote, curate, resolve, results), form validation feedback (min-selection, vote hints, finalize confirmation for partial weeks), and loading/disabled states on the voting status action buttons. Recipe import failures now surface to the user instead of being silently swallowed.
The second scout pass identified feature gaps by comparing the implementation against the product vision. The highest-impact finding was that email notifications were fully built (templates, Brevo integration, notify functions) but never wired into the app actions. Opening voting and finalizing plans now send branded emails to all family members. Other feature additions: onboarding completion warning before opening voting, print/copy export for shopping lists, nutrition information display on recipe detail pages, and ingredient search in the recipe library (searches 3,800+ recipes by ingredient name alongside title and description).
The biggest new feature was the weekly cadence system — a complete planning timeline derived from 4 household settings: week start day, meals per week, finalize lead time, and voting window. A pure computation function derives all milestone dates (draft due, voting opens, reminder, voting closes, finalize). The settings page got a new “Planning cadence” card with a live timeline preview. The cycle detail page now shows a horizontal step indicator with green checkmarks for completed steps and a pulsing dot for the current step. The plan builder respects meals_per_week instead of hardcoding 7. The “new week” page defaults to the next configured start day. A daily Vercel cron job sends context-appropriate nudge emails: draft reminders to cooks, voting reminders to unvoted members, and finalize reminders when it’s time to curate and shop.
Documentation was updated: USE-CASES.md rewritten with 23 use cases reflecting the full current state, FAQ.md created covering all user-facing questions, and CLAUDE.md updated with test commands, Supabase details, and key patterns.
Supabase was configured for production: redirect URLs set, SMTP configured via Brevo, email templates pasted, and migration 009 (cadence settings) applied via supabase db push.
Completed
- #107 Add unit tests for ranking engine
- #108 Batch candidate status updates in curate action
- #109 Deduplicate family member queries on results page
- #110 Add empty states and validation to the planning flow (decomposed)
- #111 Surface recipe import failures to the user
- #116 Add empty states to planning flow pages
- #117 Add validation feedback to planning flow forms
- #118 Add loading and disabled states to cycle status actions
- #122 Wire email notifications into app actions
- #123 Warn before opening voting if members haven’t completed onboarding
- #124 Add print and text export to shopping list
- #125 Display nutrition information on recipe detail page
- #126 Add ingredient and cook time filters to recipe library
- #132 Add cadence settings columns to households table
- #133 Add planning cadence section to household settings page
- #134 Build cadence timeline computation function
- #135 Add cadence timeline visualization to cycle detail page
- #136 Use meals_per_week setting in plan builder and finalize confirmation
- #137 Add daily cron job for cadence nudge emails
Release progress
- March 2026: 6/6 closed (complete)
- Phase 1–4: all closed
Carry-over
- Set
CRON_SECRETenv var in Vercel for the cadence cron job to authenticate - The full planning flow (Draft → Vote → Curate → Resolve → Days → Shopping) has still not been tested end-to-end in the browser with real data — this has been carry-over since March 19
- Supabase email templates were pasted manually in the dashboard but not verified with a real auth flow
Risks
- The cadence cron job uses
createAdminClient(service role) to query across households. If household count grows, this query could become expensive — consider adding an index onweekly_cycles.statusor batching by household. - The ingredient search fetches ALL recipe_ingredients for the household (could be 50,000+ rows for a large library). May need server-side filtering or a search index if performance degrades.
Flags and watch-outs
vercel.jsonwas created with cron config — needsCRON_SECRETenv var set in Vercel- New week page was split into server component + client form (page.tsx + new-week-form.tsx) to access household settings
- 33 unit tests now exist (17 ranking + 16 cadence) — run with
npm testfromweb/ - FAQ.md and USE-CASES.md are new docs — keep them updated as features evolve
Next session
- Test the full planning flow end-to-end in the browser: create week → candidates → vote → close → curate → resolve → days → finalize → shopping list
- Set
CRON_SECRETin Vercel:vercel env add CRON_SECRET production - Verify email notifications fire correctly (open voting, finalize plan)
- Deploy to production and verify the cadence timeline visualization renders
- Consider: Stripe trial plan integration (mentioned day 1, still unscoped)
- Consider: Paprika import support (second priority after Mela)
Why customer tools are organized wrong
This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.
Infrastructure shapes thought
The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.
Server-side dashboard architecture: Why moving data fetching off the browser changes everything
How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.
The work of being available now
A book on AI, judgment, and staying human at work.
The practice of work in progress
Practical essays on how work actually gets done.
The product changed its mind
A product pivoted its entire philosophy mid-session — from 'here's your list' to 'here's your next thing.' The code shipped in the same conversation as the idea. That's not iteration. That's something else.
Your project management tool was made for a non-human (AI) factory, not for you
Every project or task management tool on the market descends from Frederick Taylor's factory floor. The assumptions were wrong then. They're catastrophic in the Age of AI.
The last mile is all the miles
Building the product is the fun part. Deploying it, configuring auth, pasting email templates into dashboards, rotating leaked API keys — that's where the work actually lives.