尚未检测到更新。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.