個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證iPhone-first meal planning, recipes and grocery price tracking for a couple. Next.js 16, Supabase Postgres with RLS, Google Gemini; built with Claude Code.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Plan it, price it, cook it. An iPhone-first web app (installable PWA) that a couple uses every day to plan meals, cook from recipes, track grocery prices across stores and build the shopping list, with AI that reads recipes from photos and estimates nutrition.
Live: dialed-kitchen.vercel.app · Status: in daily use; all roadmap milestones shipped.
Try it: open the app and tap Try the demo: a shared demo kitchen with sample recipes, a planned week and price history, reset daily (how it's built).
I built Dialed Kitchen with Claude Code as an AI pair programmer. I owned the product and the engineering decisions:
Inside the product, AI is used where it earns its place, with guard rails: Google Gemini reads recipe photos and estimates nutrition (see AI features).
| Layer | Choice | Why |
|---|---|---|
| UI and server | Next.js 16 (App Router), React 19 Server Components and Server Actions, TypeScript (strict) | One codebase; data access and secrets stay on the server, and little JavaScript ships to phones |
| Styling | Tailwind CSS v4 with named design tokens | One source of truth for colors; text contrast is checked by a test |
| Database and auth | Supabase: Postgres, row-level security, Google sign-in (PKCE) | Real relational data; the database itself enforces who can see what |
| AI | Google Gemini (server-side only), structured JSON output, model fallback chain | Reads recipe photos and estimates nutrition on the free tier |
| Validation | Zod at every trust boundary: forms, URL parameters, fetched pages, AI replies, database rows | Types aren't validation |
| Hosting and CI | Vercel (Node 24), GitHub Actions, Dependabot | Every push is checked; every merge to main deploys |
Request flow, with a check at each layer: UI → Server Action (Zod validation and sign-in check) → server-only data access (the user's own session, never a service key) → Postgres row-level security, the final guard even if app code has a bug.
Code layout: features/<feature>/ holds each feature's components, actions (writes), queries (reads) and schemas. lib/ holds pure, unit-tested logic (pricing, units, nutrition, plan rules). lib/server/ holds server-only infrastructure. supabase/migrations/ holds versioned SQL.
households ──< household_members household_invites (hashed, single-use, 7 days)
│
├──< stores (fixed six) ──< item_prices >── items ──< grocery_list_items
├──< pantry_items (In stock) │
└──< recipes ──< recipe_ingredients ──────────┘
└──< meal_plan_entries
ai_requests (per-person daily AI limit)
Every table carries household_id with row-level security. Composite foreign keys ((id, household_id)) stop rows from pointing at another household's data. Unit price and best price are computed from history, never stored, so they can't go stale. The week's shopping list, its cost and the meal-prep totals come from one SQL function, so they always agree.
household_id), and check constraints for every invariant (46 in all).| Feature | How |
|---|---|
| Recipe from photos | Up to 3 photos, resized on the phone, sent to Gemini (multimodal) with a JSON schema; the answer is validated with Zod and fills an editable form; nothing saves on its own |
| Nutrition estimate | Gemini estimates per-serving calories and macros from the ingredients; any impossible value rejects the whole estimate |
| Reliability | A chain of free models: overloaded or slow models fall through to the next, a bad key stops at once, with per-model timeouts and a total time budget |
| Cost control | A shared 40-a-day limit per person, counted in Postgres |
Requires Node.js 24 and a Supabase project.
cp .env.example .env.local # fill in the Supabase URL and publishable key (and optionally a Gemini key)
npm install
npx supabase link --project-ref <your-project-ref>
npx supabase db push # applies the migrations in supabase/migrations
npm run dev # http://localhost:3000
npm test # unit and database tests
npm run lint && npm run typecheck && npm run build
See SECURITY.md.
Copyright © 2026 Tyler Clark. All rights reserved. The code is public to be read and evaluated; see LICENSE.