尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Digital invitations and events platform for the Egyptian market. Hosts create an event page, share a digital invitation, collect RSVPs, run a temporary shared photo gallery (Standard tier) and QR check-in at the door (Premium tier).
Next.js 16 App Router (single app on Vercel) · Supabase (Postgres, Auth with Google, Storage) · Drizzle ORM · Tailwind CSS v4 + shadcn/ui (Radix, RTL) · zod v4 · motion · next-intl (Arabic-first, bilingual).查看完整 README ↗Digital invitations and events platform for the Egyptian market. Hosts create an event page, share a digital invitation, collect RSVPs, run a temporary shared photo gallery (Standard tier) and QR check-in at the door (Premium tier).
.ics download at /e/<slug>/event.ics, and a live countdown in the hero.Next.js 16 App Router (single app on Vercel) · Supabase (Postgres, Auth with Google, Storage) · Drizzle ORM · Tailwind CSS v4 + shadcn/ui (Radix, RTL) · zod v4 · motion · next-intl (Arabic-first, bilingual).
npm install # also copies the QR scanner wasm into public/wasm
cp .env.example .env.local # then fill in the values below
npm run db:migrate # creates tables, RLS policies, triggers and storage buckets
npm run db:seed # inserts the package tiers
npm run dev # http://localhost:3000
Either point .env.local at the hosted da3wety-dev project (checklist below) or run the Supabase CLI stack locally (supabase start, then use the URL/keys/connection strings it prints; supabase/config.toml is committed). For local development without Google OAuth, set DEV_LOGIN_ENABLED=true and create a password host:
node --env-file=.env.local scripts/create-dev-host.mjs # [email protected] / local-dev-password
node --env-file=.env.local scripts/create-dev-host.mjs [email protected] pw # custom credentials
Then sign in at /login with the dev-login form. Add the email to ADMIN_EMAILS to reach /admin.
Checks: npm run typecheck, npm run lint, npm run test, npm run build. The PostgREST RLS integration test (tests/integration) is skipped unless you run it against a real project: RUN_INTEGRATION=1 node --env-file=.env.local node_modules/vitest/vitest.mjs run tests/integration.
Create two projects, da3wety-dev and da3wety-prod (region eu-central-1, Frankfurt). Repeat the steps for each; step 6 is dev-only.
sb_publishable_…) and the secret key (sb_secret_…) into .env.local.DATABASE_URL and the session pooler URL (port 5432) into DATABASE_MIGRATION_URL.http://localhost:3000 and https://da3wety.com, and the redirect URI https://<project-ref>.supabase.co/auth/v1/callback. Paste the client id/secret into Authentication → Providers → Google and enable it.https://da3wety.com; Redirect URLs: http://localhost:3000/**, https://da3wety.com/auth/callback, https://*-<vercel-team>.vercel.app/**.npm run db:migrate then npm run db:seed.If the migration cannot insert into storage.buckets (permissions differ between projects), create the buckets in the dashboard: event-assets (public, 5 MB, image/jpeg,image/png,image/webp) and event-photos (private, 3 MB, same MIME types).
See .env.example. SUPABASE_SECRET_KEY, DATABASE_URL, CRON_SECRET, ADMIN_EMAILS and DEV_LOGIN_ENABLED are server-only. ADMIN_EMAILS is a comma-separated list of Google accounts that become admins on first login.
Import the repo as a Vercel project (framework: Next.js, build npm run build). Node 20+.
Environment variables (Production → prod Supabase project, Preview → dev project): every key in .env.example. NEXT_PUBLIC_SITE_URL must be https://da3wety.com in Production (it is baked into QR payloads and share links). Keep DEV_LOGIN_ENABLED unset/false in Production; the route also refuses to run when NODE_ENV=production.
CRON_SECRET: Vercel calls /api/cron/cleanup-galleries daily at 03:00 UTC (vercel.json) with Authorization: Bearer $CRON_SECRET. The route fails closed (401) without it. Verify after the first deploy:
curl -H "Authorization: Bearer $CRON_SECRET" https://da3wety.com/api/cron/cleanup-galleries
# {"ok":true,"claimed":0,"purged":0,"objectsRemoved":0,"rowsDeleted":0,"staleReservations":0,"errors":0}
Domain: add da3wety.com (and www → redirect). Then update the Supabase prod project: Auth → URL Configuration (Site URL + redirect URLs) and the Google OAuth client's authorized origins.
Cron on the Hobby plan runs once a day at best-effort times; that is fine for gallery cleanup. Pro gives exact schedules.
https://da3wety.com/login with a real account; that account listed in ADMIN_EMAILS and /admin reachable.curl above returns ok:true on production./e/<slug> link into WhatsApp and the Facebook Sharing Debugger; the OG image should show the cover photo and the honoree names./scan/<token> on both (iOS needs the "start camera" tap); reduced-motion setting skips the animation./e/<slug>: accessibility, best practices and SEO at 100. Performance is bounded by the two Arabic font families (~300 KB) plus React; see Notes.npm audit reports a moderate advisory in esbuild pulled in by drizzle-kit's dev loader. It only affects the drizzle-kit dev process, never the deployed app.public/wasm folder is generated at install time from zxing-wasm and is git-ignored.src/lib/validation/ except state.ts (ESLint enforces it): zod is ~390 KB and belongs in server actions only. Pure phone helpers for the client live in src/lib/phone.ts.font-normal on the invitation h1) saves ~100 KB if the heading weight is acceptable.