尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Guest list and RSVP, built to the spec in
docs/wedding-platform-spec.md.
This is V1. It exists to get invitations out and RSVPs back without a
spreadsheet — the only part of the plan with a deadline that cannot move.
Vendors, budget, the inbox and seating are V2 and V3, and deliberately absent.查看完整 README ↗Guest list and RSVP, built to the spec in
docs/wedding-platform-spec.md.
This is V1. It exists to get invitations out and RSVPs back without a spreadsheet — the only part of the plan with a deadline that cannot move. Vendors, budget, the inbox and seating are V2 and V3, and deliberately absent.
Next.js 15 (App Router) · Supabase (Postgres, Auth) · TypeScript · Tailwind
extension/) that sends any
image on the web to a board, live, and a Pinterest import for boards you
already have. How to use all of it is at /moodboards/help, in the app —
the questions it answers get asked while looking at the screen, usually on
a phone.npm install
cp .env.example .env.local # every value is explained in the file
supabase start # or point at a hosted project
supabase db reset # applies migrations and the dev seed
node scripts/ensure-bucket.mjs # the private moodboards storage bucket
npm run dev
ensure-bucket.mjs is idempotent and has to be run once per environment. It
is a script rather than a migration on purpose: a migration touching storage
could not be applied to the bare PostgreSQL cluster verify-migrations.sh
builds. Skip it and image uploads fail with "Storage isn't reachable".
No Supabase project exists yet — the migrations have only ever been applied to
throwaway local clusters. See docs/HANDOFF.md for what that means and what to
do about it.
Set up SPF, DKIM and DMARC on the sending domain and let it warm up. Without them a hundred invitations land in spam and you find out from a relative. This takes days and sits directly in front of the one immovable deadline in the project, so do it early.
npm run typecheck # strict, with noUncheckedIndexedAccess
npm test # 287 unit tests
./scripts/verify-migrations.sh # 167 SQL assertions on a throwaway cluster
npm run build
verify-migrations.sh builds its own PostgreSQL cluster, applies a small
Supabase shim, runs every migration and the seed, then executes the SQL test
suite. No Docker, no network, no Supabase CLI — CI runs it on every push. It
must not run as root, because initdb refuses.
src/
app/
(planner)/ signed-in screens: dashboard, guests, ranking, invitations
rsvp/[token]/ public RSVP — no login, one household per token
m/[token]/ public moodboard — no login, one board per token
w/ public site
api/ cron, CSV exports, the clipper endpoint, Pinterest OAuth
components/
lib/ ranking, tokens, CSV, timezone, formatting, Supabase clients
net/ the one module allowed to fetch a URL somebody else chose
server/
actions/ every write in the app
queries/ every read
rsvp/ token resolution and throttling
supabase/
migrations/ schema, RLS, views
tests/ tenancy and derived-value assertions
seed.sql two weddings — a tenancy test with one tenant proves nothing
extension/ the Chrome MV3 clipper. Not part of the Next.js build.
docs/
wedding-platform-spec.md the amended spec, V1 through V3
specs/ one spec per feature, with its open questions
HANDOFF.md current state and what to pick up next
Tenancy is a foreign key, not a convention. Every tenant table carries
wedding_id, every parent carries a redundant unique (id, wedding_id), and
children reference (parent_id, wedding_id). Attaching a guest in one wedding
to a household in another is a foreign key violation — even for the service
role, which bypasses RLS entirely.
The service role client bypasses RLS, and every caller scopes itself. The
public RSVP path (a token resolved to one household), the cron sender, the FX
rate cache, moodboard storage, and the moodboard share and clip-token paths (a
token resolved to one board or one wedding). Everything a signed-in
collaborator does goes through src/lib/supabase/server.ts, so the database
stays the thing enforcing access. src/lib/supabase/admin.ts lists all five
and why each one is allowed.
The moodboards bucket is private and has no storage policies at all. That
is what keeps storage.objects out of every migration, which is what lets
verify-migrations.sh apply the whole set to a bare PostgreSQL cluster. The
consequence: object paths are derived from ids the server has already
checked (storageObjectPath()), never accepted from a client. A client that
could name its own path could name somebody else's.
More, including the traps that have already cost time, in docs/HANDOFF.md.