Adoption checklist
Use this checklist before the first production deploy of a Cloudflare app. Repeat the relevant steps when risk, data, or profile changes.
-
Select the application profile.
Choose the smallest profile that fits the product. A static docs site does not need Queues. A payment path is high-risk even when the rest of the app is not. Record high-risk data or actions.
-
Configure repository controls.
Enable the organization standards that apply. Require one stable check on the default branch, such as
CI / quality. Keep required approvals at zero for a sole-owner repository. Allow auto-merge and enable squash auto-merge when a pull request opens. Assign organization repository properties, includingsecurity_baseline. For a privateshared-privateorcustom-equivalentrepo, Grok or Standards grants Read under@mnppi/quality→ Manage Actions access → Add repository in the signed-in box browser before the first required private quality run. GitHub has no public API for that list. Do not add aPACKAGES_TOKENsecret. AddAGENTS.mdand.cursor/environment.jsonper the coding agents standard. That site is the operating source of truth. Default to it before inventing. If the repository sends transactional, ops, or notify HTML email, depend on@mnppi/email-layoutandBRAND_PRESETS, and name that package inAGENTS.md. UseBRAND_PRESETS.mnppifornotify.mnppi.organd other MNPPI ops alerts. CID-embed logos by default (getCloudflareLogoAttachment/LOGO_CID); remotelogoUrlis fallback only when no embedded PNG. Cloudflare Email Sending only. No Resend. No one-off HTML email shells. -
Configure CI.
Run format, lint, typecheck, tests, package, and policy checks as they apply. For a Worker app, include a production build and
cf:check. Pointcf:checkatcf deploy --dry-runonly when BOS exists; otherwisewrangler deploy --dry-run. Pin Node.js ≥ 22 wherevercfruns. Route self-hosted jobs to the designated runner group and leave them in queue. -
Configure the Cloudflare project.
Connect Workers Builds to the repository. Use the default branch for production. Enable preview builds for pull requests when you need them. When that Worker installs
@mnppi/*, preview Builds env must match prod Packages auth. Seedocs/private-package-distribution.md. Vite-ready Workers with a Worker entry usecfCLI, Vite,@cloudflare/vite-plugin, and typedcloudflare.config.tswhen the build produces BOS. Assets-only Astro keeps labeled transitionalwrangler.jsonc. See cf CLI and cloudflare.config.ts. Pin Vite, Astro, React, Vitest, TypeScript, Node.js, pnpm, and Wrangler to the supported major. New repositories and templates must start on Standard. Do not start a new repository on an older major without a recorded exception insupported-majors.json. Do not deletewrangler.jsoncor flip Workers Builds towrangler --experimental-new-config. -
Apply the platform baseline.
Serve HTML, JS, CSS, and fonts with Static Assets when no server code is required. Bind Worker routes only for dynamic paths such as
/api/*or auth callbacks. Use bindings for D1, R2, KV, Queues, and other Cloudflare services. Send transactional, ops, and notify HTML email through Cloudflare Email Sending and@mnppi/email-layout. CID-embed logos by default. Do not add Resend. -
Add data and security controls.
Access D1 only through a Drizzle database package. Enforce authz in the Worker, not only at the edge. Keep secrets in Cloudflare secrets and local Keychain wiring, not in git.
-
Set operating limits.
Define latency, error, CPU, bundle, and cost limits you will watch. Add alerts only when a named owner will respond.
-
Test release and recovery.
Verify the production build path end to end. Test Worker rollback or roll-forward. Test D1 recovery separately. Rolling back code does not undo a migration.
-
Record the result.
Link the profile, required controls, numeric limits, and exceptions. Set the next review date.
Production gate
Section titled “Production gate”A project may enter production when:
- All required GitHub checks pass.
- The owner can enable squash auto-merge without an approval deadlock.
- Cloudflare builds the default branch without a GitHub deploy token.
- Production uses bindings and protected secrets.
- The owner can detect a failed release from health or error signals.
- The owner can recover the app and its data.