尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Mobile-first travel planning web app: the whole trip (itinerary, stays, transport, tickets, travelers) in one place.
Stack: Next.js, TypeScript, Tailwind CSS, shadcn/ui, Supabase.
• Product and project context: CLAUDE.md
• Data model and permissions: docs/data-model.md
Requires Docker and the Supabase CLI.
Open http://localhost:3000.
• Migrations live in supabase/migrations/ and are plain SQL.
• New migration: supabase migration new; rebuild the local database from the migrations: supabase db reset.
• After changing the schema, regenerate the TypeScript types: npm run db:types.查看完整 README ↗Mobile-first travel planning web app: the whole trip (itinerary, stays, transport, tickets, travelers) in one place.
Stack: Next.js, TypeScript, Tailwind CSS, shadcn/ui, Supabase.
CLAUDE.mddocs/data-model.mdRequires Docker and the Supabase CLI.
npm install
cp .env.example .env.local # then paste the publishable key from `supabase status`
supabase start # local Postgres, Auth, Storage and Studio (http://127.0.0.1:54323)
npm run dev
Open http://localhost:3000.
supabase/migrations/ and are plain SQL.supabase migration new <name>; rebuild the local database from the migrations: supabase db reset.npm run db:types.npm test # Vitest: schedule, conflicts, dates, Today, budget split… (src/lib/**/*.test.ts)
npm run typecheck # route types + tsc
npm run test:db # pgTAP against the local database: RLS and invitations (supabase/tests/)
The database tests run inside a transaction that is rolled back, so they leave no data behind. The first npm run test:db downloads the pg_prove image and can take a few minutes.
GitHub Actions runs all of this on every push (.github/workflows/ci.yml). In Vercel, Settings → Deployment Checks requires the "Travio CI" commit status (posted by the last CI job once "App" and "Database" pass), so a red build is never promoted to production.
Supabase Auth with email/password and Google. Sessions live in cookies (@supabase/ssr); src/proxy.ts refreshes them on each request and redirects signed-out users to /login. Authorization itself is RLS in the database.
Locally, email confirmation is off, so sign-up signs you in immediately. Emails sent by Auth can be read in Mailpit: http://127.0.0.1:54324.
Disabled until you have OAuth credentials:
In Google Cloud Console → APIs & Services → Credentials, create an OAuth client ID of type Web application.
Add the authorized redirect URI http://127.0.0.1:54321/auth/v1/callback (for the hosted project it is https://<project-ref>.supabase.co/auth/v1/callback).
Create supabase/.env (git-ignored) with:
SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID=...
SUPABASE_AUTH_EXTERNAL_GOOGLE_SECRET=...
Set enabled = true under [auth.external.google] in supabase/config.toml and restart: supabase stop && supabase start.
Emails go out through Resend (src/lib/email/send.ts,
templates in src/emails/). Without RESEND_API_KEY they're only logged.
Without a verified domain Resend only delivers to the account owner's address.
What sends what:
POST /api/avisos/enviar, called every 10 minutes by
pg_cron in Supabase (migration 20261005150000_trip_events_and_cron.sql).
Changes are recorded by triggers in trip_events.Each environment needs:
Env vars (.env.local locally, Vercel in production): SUPABASE_SECRET_KEY,
RESEND_API_KEY, EMAIL_FROM, CRON_SECRET (see .env.example).
Two Vault secrets in that environment's database, so pg_cron knows where to
call and with what (run in the SQL editor, or with psql locally):
select vault.create_secret('<app url>/api/avisos/enviar', 'notifications_url');
select vault.create_secret('<same value as CRON_SECRET>', 'notifications_secret');
Locally the URL is http://host.docker.internal:3000/api/avisos/enviar (the
database runs in Docker). Without these secrets the job simply doesn't run.
To run the job right away instead of waiting for the clock:
select public.request_notification_run(); and check net._http_response.