尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Personal kitchen inventory, expiry tracking, and AI meal planning. Mobile-first PWA.
Stack: Next.js 15 (App Router) · React 19 · TypeScript · Tailwind · PostgreSQL (Supabase) · Prisma · Supabase Auth + Storage · Vercel.
What works after setup:
/login.Inventory entry, receipt scanning, recipes, etc. arrive in later milestones.
psql on your PATH (ships with the Postgres client tools) for applying RLS.npm install
From your Supabase dashboard:
Project URL and the anon public key.6543) and direct (Session, port 5432) URIs.cp .env.example .env
Fill in .env. The two Postgres URLs matter:
DATABASE_URL → pooled connection, port 6543, must end with ?pgbouncer=true. Used at runtime.DIRECT_URL → direct connection, port 5432. Used for migrations, RLS, and seeding.npm run db:generate # generate the Prisma client
npm run db:migrate # create tables (uses DIRECT_URL)
npm run db:rls # runs prisma/rls.sql against DIRECT_URL via psql
Alternatively, paste
prisma/rls.sqlinto the Supabase SQL editor and run it.
npm run db:seed
Expected output ends with something like:
Seed complete: { categories: 12, ingredients: 23, aliases: ~70, shelfLifeRules: 22, units: 14 }
npm run dev
Open http://localhost:3000 → you'll be redirected to /login.
/auth/callback). For local dev you can disable "Confirm email" in Supabase → Authentication → Providers → Email./dashboard, greeted by time of day, with three zero-valued stat cards and an empty-state prompt. This confirms auth + Prisma + user-scoped queries all work end-to-end.profiles, confirm a row was auto-created for your user (the trigger). A user_preferences row is created on first dashboard load./login and the guard blocks /dashboard until you sign back in.profiles/inventory_items rows via the Supabase client.Runtime data access goes through Prisma, which connects with a privileged role and therefore bypasses RLS. Primary authorization is enforced in the service/query layer: every query is scoped to the authenticated user.id (see the dashboard queries for the pattern). RLS is defense-in-depth — it governs the anon/authenticated roles used by the browser Supabase client and Storage, so a leaked anon key can never read another user's rows. Keep both layers; don't rely on either alone.
prisma/
schema.prisma # full data model
rls.sql # signup trigger + RLS policies
seed.ts # reference data
src/
app/
(auth)/login/ # login page + auth server actions
(app)/ # authenticated shell (dashboard + tab stubs)
auth/callback/ # email-confirm / OAuth callback
components/ # bottom nav, UI primitives
lib/
supabase/ # browser / server / middleware clients
env.ts # validated env
server/db.ts # Prisma singleton
middleware.ts # session refresh + route guard
Environment variable not found: DATABASE_URL — you haven't created .env, or you're running a DB command that needs DIRECT_URL.prepared statement errors — your DATABASE_URL is missing ?pgbouncer=true./login in a loop — the anon key or Supabase URL is wrong, so getUser() never resolves a session.db:migrate at the pooled URL; migrations must use the direct (5432) connection.Manual add/edit/delete inventory, search/filter/sort, the expiry engine with status badges, and the cook/deduction flow. The schema and seed data here already support all of it.