Guidance for AI coding agents (Claude Code, Codex, Cursor, β¦) working in this repository. CLAUDE.md is a
symlink to this file. Each app has its own AGENTS.md with content conventions β read the app's file before
editing content there (apps/docs/AGENTS.md, apps/developer-docs/AGENTS.md).
pnpm workspace + Turborepo holding both Plane documentation sites and their shared theme:
| Package | Path | What |
|---|---|---|
docs |
apps/docs |
docs.plane.so β product documentation |
developer-docs |
apps/developer-docs |
developers.plane.so β API reference, self-hosting, dev tools |
@plane/docs-theme |
packages/theme |
Shared VitePress theme (tokens, fonts, header, layout, Card/CardGroup/Tags, Copy page menu, cookie consent) β consumed as source, no build step |
| Tool | Version / notes |
|---|---|
| Framework | VitePress 2.0.0-alpha.16 (pinned in the catalog: of pnpm-workspace.yaml) |
| Base theme | @voidzero-dev/vitepress-theme 4.8.x (brings Tailwind CSS v4) |
| Package manager | pnpm 11.8.0 (packageManager in root package.json) |
| Node | >=24.0.0 |
| Task runner | Turborepo 2.x (turbo.json) |
| Formatting | oxfmt (root .oxfmtrc.json, defaults: printWidth 100, trailing commas) |
| Type-checking | tsc per package, all extending root tsconfig.base.json |
pnpm install # one lockfile for the whole workspace
pnpm dev:docs # docs.plane.so dev server β http://localhost:5173
pnpm dev:developer-docs # developers.plane.so dev server β http://localhost:5174
pnpm dev # both, interleaved log output
pnpm build # turbo run build (apps/<app>/docs/.vitepress/dist)
pnpm preview # turbo run preview (:4173 / :4174)
pnpm check:types # turbo run check:types (theme + both apps)
pnpm check:format # oxfmt --check .
pnpm fix:format # oxfmt --write .
pnpm check # check:format + check:types
pnpm --filter docs <script> # run a script in one package (or cd into the app)Turbo runs tasks with cwd = the package directory, so per-app .env files live at apps/<app>/.env
(templates: apps/<app>/.env.example).
apps/
docs/ # docs.plane.so β see apps/docs/AGENTS.md
docs/ # content (*.md) + .vitepress/{config.ts, theme/index.ts, theme/site.css}
package.json vercel.json tsconfig.json .env.example
developer-docs/ # developers.plane.so β see apps/developer-docs/AGENTS.md
docs/ # content + public/ (images, fonts, logos) + .vitepress/{config.mts, theme/β¦}
package.json vercel.json tsconfig.json .env.example
packages/
theme/ # @plane/docs-theme β see packages/theme/README.md
src/{index.ts, options.ts, components/, layout/, css/, types/}
turbo.json # tasks: build, dev, preview, check:types
pnpm-workspace.yaml # workspace packages, dependency catalog, overrides, allowBuilds
tsconfig.base.json # shared compilerOptions + @vp-* path aliases (${configDir}-relative)
.oxfmtrc.json .gitignore .github/workflows/ci.yml
- Theme changes go in
packages/themeβ both sites pick them up. Never fork a shared component or CSS rule into one app; site-specific bits go throughcreatePlaneTheme({ brand, components, setup })options inapps/<app>/docs/.vitepress/theme/index.tsor into that app'ssite.css. packages/theme/src/index.tsis the only importer of the theme CSS (Tailwind root). Do not import@plane/docs-theme's CSS from an app.- Shared dependency versions live in the
catalog:inpnpm-workspace.yaml; apps and the theme reference them as"catalog:". Add new shared deps there. There must be exactly one copy ofvue,vitepressand@voidzero-dev/vitepress-theme(pnpm dedupe --checkruns in CI). - One
pnpm-lock.yamlat the root; never edit it by hand. - Each app keeps its own
vercel.json(redirects, headers) andmiddleware.ts(Vercel Routing Middleware forAccept: text/markdownnegotiation; the two copies must stay identical) β Vercel projects point atapps/docsandapps/developer-docsas Root Directory. - Header buttons come from
themeConfig.navitems flaggedplaneButton: "primary" | "secondary".
Run pnpm fix:format before committing. CI checks formatting via pnpm check:format. Never skip this step.
- Default branch:
master. Open PRs againstmaster. - Branch naming: short descriptive slugs (
fix/csv-importer-typo,docs/add-milestones-page,theme/card-hover). - Commit messages:
<type>(<scope>): short descriptionβ scope is optional (docs,developer-docs,theme); link an issue where applicable (docs: add recurring work items page (#412)). - CI (
.github/workflows/ci.yml): oxfmt check;pnpm dedupe --check;turbo run check:types build.
apps/developer-docs was imported from the former makeplane/developer-docs repository with full history
(rename commit + merge). Use git log --follow <path>; add --first-parent to stay on the docs.plane.so
lineage for paths that existed in both repos (e.g. docs/index.md).
- Do not commit new image or font binaries to
apps/docs(CDN only).apps/developer-docs/docs/public/holds its images/logos. - Do not modify
pnpm-lock.yamlmanually β let pnpm manage it. - Do not edit generated files in
**/.vitepress/dist/. - Do not add analytics keys, API keys, or secrets to any file. Use environment variables (
apps/<app>/.envlocally, platform env vars in CI/Vercel). - Do not rewrite VitePress config structure without understanding the existing sidebar/nav shape β the sidebars are hand-curated and order matters.