尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗This is a Next.js project bootstrapped with create-next-app.
This project uses a cloud Supabase project per environment — no Docker, no Supabase CLI. Two environments:
| Env file | Supabase project | Used by | |
|---|---|---|---|
| Development | .env.development.local | your own dev project | npm run dev |
| Production | .env.local | the live project | migration scripts, npm run build |
Next.js loads .env.development.local ahead of .env.local when you run
npm run dev, so the app points at dev automatically while the production values
stay available to the scripts.
Both files are gitignored. Only the .example templates are committed.
Create a dev Supabase project at supabase.com.
Name it something unmistakable, e.g. markitup-dev. The free tier is fine.
Create your dev env file:
cp .env.development.local.example .env.development.local
Fill in NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY
(Settings → API), and a SUPABASE_ACCESS_TOKEN from
account/tokens so the
migration scripts can reach the database. Generate a dev-only
FIGMA_TOKEN_SECRET; never reuse production's.
Build the schema. One command applies all migrations in order and records each one:
npm run dev:migrate
Check it any time with npm run dev:status.
If that cannot connect, the last resort is the dashboard:
npm run db:bootstrap # writes supabase/bootstrap.sql
Paste that file into the Supabase SQL Editor and Run it once. It creates everything and records all migrations as applied, so the runner will report the database as up to date. The file is generated, not committed — regenerate it whenever you need it.
Create the storage buckets. Migrations cover tables and policies, not
buckets. In Supabase → Storage, create two private buckets:
mockups and comment-files.
Turn off email confirmation. Authentication → Sign In / Providers → Email → uncheck Confirm email. With it on and no SMTP configured, a new signup produces no session and cannot enter the app.
Enable anonymous sign-ins (Authentication → Sign In / Providers) if you want to test public share links, which let clients comment without an account. Remember to press Save — the toggle reverts silently otherwise.
Run it:
npm run dev
Migrations live in supabase/migrations/ and are applied by a runner that keeps
a ledger in the app_migrations schema — filename, a checksum of the contents,
and when it ran.
The runner takes either of two routes, and prefers the first:
SUPABASE_ACCESS_TOKEN — an account token from
account/tokens. Runs SQL over
HTTPS. No database password, and it works on networks that block the Postgres
port. The project comes from NEXT_PUBLIC_SUPABASE_URL, so the token is the
only thing to paste. It covers your whole Supabase account, so keep it to the
gitignored env file and revoke it from that page if it leaks.SUPABASE_DB_URL — a direct Postgres connection.Prefer the token. A database password is shown exactly once, lives inside a URL
where one wrong character changes it invisibly, and fails with
28P01 password authentication failed whether it was mistyped, never saved, or
simply stale — three very different problems that look identical. If you hit
that error, don't reset the password again; switch to a token.
npm run db:status # what is applied and pending (read-only, safe on prod)
npm run db:migrate # apply everything pending
npm run dev:status # the same, against the dev project
npm run dev:migrate
Nothing is written unless you ask it to apply. Three rules the runner enforces:
To adopt an existing database that already has every migration applied by hand, record them without executing anything:
npm run db:baseline
Create supabase/migrations/00NN_short_name.sql, write the SQL with a comment
explaining why, then:
npm run dev:migrate # dev first, always
npm run test # then the suite
npm run db:migrate # production, once dev is proven
Email/password auth works out of the box. To also enable "Sign in with Google", configure the Google provider in Supabase:
https://<your-project-ref>.supabase.co/auth/v1/callback as an authorized redirect URI.[auth.external.google] in supabase/config.toml.)app/auth/callback/route.ts) exchanges the returned code for a session and redirects to /app; no additional app code changes are required once the provider is configured.Transactional email (comment notifications, invites, welcome) is sent via Resend. Password-reset emails are sent by Supabase.
.env.local, and in Vercel → Settings →
Environment Variables for Production/Preview):
RESEND_API_KEY — your Resend API key.EMAIL_FROM — sender address. Use [email protected] until you
verify a domain; then set e.g. [email protected].NEXT_PUBLIC_APP_URL — your live URL, e.g. https://markitup-woad.vercel.app.https://<your-app>/auth/callback to the Redirect URLs. The password-reset
flow routes through this same route (it performs the server-side PKCE code
exchange, so resets work across devices) and then forwards internally to
/reset-password, which is same-origin and needs no separate allowlist
entry. This is the same callback URL used by Google sign-in above, so it
may already be present.apexure.com in Resend (add the DNS records it shows),
then set [email protected]. Until then, Resend only
delivers to your own verified address.If RESEND_API_KEY is unset, the app runs normally and email sends are skipped
(logged as warnings), so local dev and tests need no email config.
This project uses Vitest for unit tests.
npm test # run the unit test suite once (Vitest)
npm run test:watch # run in watch mode
npm run test:e2e # full end-to-end core loop (Playwright, drives the real app)
Two database-backed invariants are proven by standalone scripts that run against the cloud DB (they use a transaction and roll back, leaving no data behind):
node scripts/rls-check.mjs # tenant-isolation RLS (self-join denied, owner bootstrap allowed)
node scripts/pins-check.mjs # per-mockup sequential pin numbering
First, run the development server:
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
Open http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying app/page.tsx. The page auto-updates as you edit the file.
This project uses next/font to automatically optimize and load Geist, a new font family for Vercel.
To learn more about Next.js, take a look at the following resources:
You can check out the Next.js GitHub repository - your feedback and contributions are welcome!
The easiest way to deploy your Next.js app is to use the Vercel Platform from the creators of Next.js.
Check out our Next.js deployment documentation for more details.