Getting started
Install the workspace, run the checks, and start a reference site locally.
Launch is a plain pnpm workspace. You need Node 24 (the version is in .nvmrc) and the pnpm version pinned in the root package.json.
git clone https://github.com/patronage/launch.git
cd launch
pnpm install
pnpm verify
pnpm verify is the full gate: a frozen install, then lint, typecheck and tests across the workspace. Run it before you open a pull request. There are no GitHub Actions; Cloudflare Workers Builds runs the same command before it deploys.
Run a reference site
Each reference seeds the same demo content. Each app’s README has the details.
Headless WordPress. WordPress in Docker, and the vinext front-end in local workerd:
pnpm --filter cms-wordpress-headless run setup # WordPress, demo content and .env.local
pnpm --filter web-wordpress dev # http://localhost:3000
Payload. One app on local D1 and R2. vite dev does not work with Payload yet, so build and preview:
cd apps/payload
cp .env.example .env # then set PAYLOAD_SECRET in .env
cp .env .dev.vars # the Worker reads its secrets from .dev.vars
pnpm payload migrate
pnpm seed
pnpm build && pnpm preview # http://localhost:4173/admin
Traditional WordPress. A Timber theme renders the site, in Docker:
pnpm --filter cms-wordpress-timber run setup # http://localhost:8090
Check a change in the browser
pnpm verify checks dependencies, lint, types and tests, not that a page looks right. Before you open a pull request that changes pages, sections, forms or the admin, drive the change in a real browser and keep the screenshots. The repo’s launch-verify agent skill does this for the Payload app and the headless WordPress front-end:
node .agents/skills/launch-verify/scripts/verify.ts --help
Run these docs
pnpm --filter docs-site dev # http://localhost:4321
pnpm --filter docs-site build # static site in apps/docs-site/dist
Dependencies
Versions are pinned exactly, and pnpm only installs versions older than the minimumReleaseAge in pnpm-workspace.yaml. Update them with the deps:* scripts in the root package.json, which read the same window.
Rules for contributors
The repo is public, so everything in it must be fit to publish. The short version, from AGENTS.md:
- No third-party plugin or vendor code. WordPress plugins and themes come in through Composer; only Patronage’s own
patronage-*code is committed. - No client references, anywhere. Demo content is invented.
- No Wrangler config files and no GitHub Actions. See Deploying to Workers.
- Shared UI takes plain props and knows nothing about any CMS.
- A pull request that changes what a reader of these docs would run, deploy or decide updates these docs in the same pull request. Spike notes and decision records publish themselves; everything else is a page under
apps/docs-site/docs.