尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A cloud-synced whiteboard app built on Excalidraw, with end-to-end encrypted sharing and workspace management.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A cloud-backed whiteboard built on Excalidraw.
Live app ·
Documentation
drawstuff combines a full-screen Excalidraw editor with cloud persistence, workspace organization,
encrypted sharing, real-time collaboration, and public read-only pages.
• Import, export, autosave, thumbnails, and attached binary assets
• Workspaces with scene search, filters, and categories
• Client-side compressed and AES-GCM-encrypted private share links
• End-to-end encrypted collaboration through a Cloudflare Durable Object gateway
• Public read-only pages at /p/[slug]
• English and Traditional Chinese UI查看完整 README ↗drawstuff is Excalidraw with an account: draw instantly without signing in, then keep your scenes in the cloud, organize them, share them, and edit them together in real time.
/p/[slug] with link previewsOnly share links are end-to-end encrypted. Collaboration rooms are protected by sign-in and access rules; see the threat model.
| Layer | Technology |
|---|---|
| Framework | Next.js 16, React 19 |
| Drawing engine | Excalidraw |
| API | tRPC v11 |
| Database | PostgreSQL, Drizzle ORM |
| Authentication | Better Auth, Google OAuth |
| Storage | UploadThing |
| UI | Tailwind CSS v4, Base UI, Sonner |
| Realtime | Cloudflare Durable Objects |
git clone https://github.com/EricTsai83/drawstuff.git
cd drawstuff
pnpm install
cp apps/web/.env.example apps/web/.env
Fill in apps/web/.env, then initialize the database and start the web app:
pnpm db:push
pnpm dev
Open http://localhost:3000. The collaboration Worker runs separately from pnpm dev; see
apps/collaboration-do/README.md for its configuration and
deployment workflow.
The complete template is apps/web/.env.example, and the validation schema is apps/web/src/env.ts.
| Purpose | Variables |
|---|---|
| Database | POSTGRES_URL, POSTGRES_URL_NON_POOLING |
| Authentication | BETTER_AUTH_SECRET, BETTER_AUTH_URL, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET |
| Storage | UPLOADTHING_TOKEN |
| Public origin | NEXT_PUBLIC_BASE_URL |
| Collaboration | COLLAB_IDENTITY_SECRET, COLLAB_AUTHORITY_SECRET, COLLAB_ADAPTER_SECRET, COLLAB_CONTROL_URL |
| Rate limiting | UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN |
| Maintenance | CRON_SECRET, CLEANUP_OWNER_EMAIL |
The three collaboration secrets must each be at least 32 characters and match the Worker secrets of
the same name (full list).
BETTER_AUTH_URL and NEXT_PUBLIC_BASE_URL must be the same origin, and Google OAuth needs
<origin>/api/auth/callback/google as an authorized redirect URI.
apps/
web/ # Next.js UI, tRPC API, and persistence
collaboration-do/ # Cloudflare Worker and room/lifecycle Durable Objects
packages/
excalidraw-adapter/ # The only package allowed to import Excalidraw
collaboration/ # Transport-neutral protocol, authority contracts, codecs, and recovery
Dependencies flow one way: the web app consumes both shared packages, while the Worker consumes only the server-safe collaboration entries. See the architecture contract for ownership rules.
| Command | Purpose |
|---|---|
pnpm dev | Start the web development server |
pnpm build | Build all workspaces |
pnpm check | Run formatting, lint, types, tests, and dead-code checks |
pnpm lint | Run ESLint |
pnpm typecheck | Run TypeScript checks |
pnpm test | Run unit tests |
pnpm check:affected | Lint, typecheck, and test only packages changed vs main |
pnpm --filter @drawstuff/web test:changed | Run only web tests that import files changed vs main |
pnpm test:e2e | Run Playwright tests |
pnpm db:push | Push the Drizzle schema to the configured database |
pnpm admin:bootstrap --email [email protected] | Provision the first operator |
Cloudflare commands such as pnpm cf:preflight, pnpm cf:deploy, and pnpm cf:smoke are described
in the Worker README.
pnpm admin:bootstrap --email <you>; use /admin afterwards
(admin runbook).COLLAB_ROOMS_DISABLED kill switch are in the
Worker deployment runbook.POST /api/maintenance/cleanup with Authorization: Bearer <CRON_SECRET>; review
its retention behavior before enabling the default Vercel schedule (30 3 * * 1).Start with the documentation guide for architecture contracts, ADRs, operations, performance budgets, and reusable system-design notes.