Fujimod
브라우저에서 카메라 펌웨어를 시험하고 Fujimod SD 부팅 파일을 만든다
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.