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