Doop
Doop: 오픈소스 멀티플레이어 디자인 캔버스 및 AI 에이전트용 MCP
디자인 어디든 클릭해 의견 남기기, 이미지·HTML·Figma에 고정·스레드 피드백, 계정 없이 가능
Clients click anywhere on your design to leave a comment. Pinned, threaded feedback on images, live HTML and Figma frames, with no account needed to comment.
디자인TypeScript · CSSGitHub @waseembashir온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.