Tell us your goal in your own words. Zoonk plans every day until your date, with lessons, practice and reviews shaped by it.
Try for free
- Node.js v26
- pnpm v12
- PostgreSQL v18, running on this machine
We recommend using mise to manage your Node.js and pnpm versions. On macOS, install PostgreSQL with brew install postgresql@18 && brew services start postgresql@18 and put $(brew --prefix postgresql@18)/bin on your PATH. On a Linux machine or a cloud agent, bash scripts/cloud/setup.sh installs all three (cloud agents).
pnpm installto install dependencies for all apps and packagespnpm db:setupto create the local development, test, and E2E databases, apply migrations, and seed new ones. It connects aspostgres:postgres@localhost:5432(creating that role if it can) and never resets a database it didn't create, so rerun it whenever you likepnpm devto start the apps
No environment variable is required: the apps use local defaults, sign-in codes land in the local mailbox, and services you haven't configured stay off. Anything that generates, such as plans and lessons, goes through AI Gateway: with access to Zoonk's Vercel team, sign in to the Vercel CLI and link the apps (development guide); otherwise set your own AI_GATEWAY_API_KEY in apps/main/.env and apps/api/.env. Each app's .env.example lists what the other keys turn on.
pnpm devto start every app through Portless. Routes include the clone name, such ashttp://main.zoonk.localhost:1355, and linked worktrees also receive a branch prefixpnpm dev:lanwhen testing from a phone or another device on the same trusted network. It prints the.localMain URL to open on that device, such ashttp://main.zoonk.local:1356pnpm dev:directto bypass Portless and use the original fixed localhost portspnpm dev:pruneto let Portless remove orphaned servers left by crashed sessions. A stack's services stop by themselves within seconds of itspnpm devorpnpm startending, even when that process is force-killedpnpm buildto create a production buildpnpm startto build every app and serve the production builds at the same Portless URLs aspnpm dev, with local sign-in and the mailbox working the same way. Stop the checkout'spnpm devfirst, since both use the same routespnpm lintto run lintingpnpm typecheckto run TypeScript type checkingpnpm knip --productionto check for unused codepnpm testto run tests with Vitestpnpm e2eto run end-to-end tests with Playwright, orpnpm e2e:mainandpnpm e2e:apifor one app (they pass further arguments, such as a test file, to Playwright)pnpm i18n:lintto run i18n lintingpnpm i18nto translate missing i18n keys
Codex, T3 Code, and Claude Code run pnpm worktree:setup when they create a worktree and wait for it before the agent starts: Codex through .codex/environments/zoonk.toml, T3 Code through the Setup action in t3.json (import it once from the project's Actions menu, under From t3.json), and Claude Code through the WorktreeCreate hook in .claude/settings.json, which creates its worktrees in .claude/worktrees/ from the session's current commit. For other tools, run it once in the new worktree after git worktree add. It installs dependencies, generates Prisma, and prepares the worktree's own development, test, and E2E databases on the local PostgreSQL server; the development copy starts as a snapshot of the primary checkout's zoonk when there is one. Keep using pnpm dev, pnpm test, and pnpm e2e normally.
See worktree database setup for prerequisites, cleanup, and recovery.
We're not accepting pull requests from external contributors right now. See contributing for how to report bugs and share ideas instead.
See reporting bugs. AI agents filing a report for someone: follow the bug report guide.
See suggesting features and sharing feedback. AI agents posting an idea for someone: follow the feature request guide.
See everyone who has supported this project.