A guide for customizing your Cloudflare OS deployment
292
stars
13
commits
TypeScript
primary language
Sep 11, 2026
updated
Deploy a pinned Cloudflare OS release with branding, sign-in, integrations, routes, and upgrades under your control.
[!IMPORTANT] Cloudflare OS is early-access software. Pin upstream releases, review changes, and verify the trust boundary before every production upgrade.
pnpm exec wrangler login.deployment.jsonc: account ID, Worker names, hostname, Access audience, admin emails.pnpm check, then pnpm deploy./admin and set the site name, logo, and accent color; branding needs no redeploy.Deploy and Customization expand each step. Everything else on this page is optional reading.
This repository adds deployment controls around a pinned Cloudflare OS release without modifying the upstream source.
| Control | What you own |
|---|---|
| Branding | Site name, logo, and accent color, changed in /admin without a deploy |
| Identity | The sign-in method and administrator allowlist; this starter deploys Cloudflare Access mode |
| Routing | A production Custom Domain or a workers.dev evaluation route |
| Data | Existing KV/R2 resources or automatic provisioning |
| Integrations | Wrapper-owned Gatekeepers and service bindings without patching upstream |
| AI | A Workers AI model catalog through AI Gateway out of the box, with no API token; which providers and which gateway |
| Operations | Structured logs, traces, explicit error reports, validation, deployment order, and upgrades |
The deployment is six Workers. A router owns the public route and serves the frontend, proxying /api to the Workshop backend and /gatekeeper/<name> to whichever Gatekeeper the binding name matches; the Workshop, the Context, Scheduler and custom Gatekeepers, and the Error Reporter sit behind it with no route of their own, reachable only over service bindings.
The deploy command derives temporary Wrangler files from upstream base configs, builds the frontend in Cloudflare Access mode, deploys the private Error Reporter, the Gatekeepers and the Workshop before the router that binds them, and removes generated files even on failure. Secrets never enter tracked configuration.
A hosted flow deploys the same upstream release to your Cloudflare account without this repository. It builds nothing locally, configures sign-in and your admin emails for you, and leaves the whole /admin surface intact: site name, logo, accent color, announcements, agent instructions, featured blueprints, and which connectors your users can reach. Built-in Gatekeepers such as GitHub and Google are still yours to connect with your own OAuth credentials.
Anything past that needs your own code or settings, which is what this repository is for: custom Gatekeepers, customized error reporting, your own Worker names, reusing storage you already have, choosing how much logging to keep, and a pinned version you upgrade when you decide. Hosted deployments also run on a workers.dev address, so deploy from here if you want the app on your own domain, or the email Gatekeeper, which needs a zone. Come back when branding stops being enough.
Install Node.js 24.19 or newer (the deploy scripts are TypeScript run directly by node), pnpm 11.17, and authenticate Wrangler:
git submodule update --init
pnpm install
pnpm --dir cloudflare-os install
pnpm exec wrangler login
Your account needs Workers, KV, R2, Browser Rendering, and Dynamic Worker Loaders. It also needs Workers AI and AI Gateway, which the default model catalog runs on; only turning that catalog off makes them dispensable. Artifacts is optional.
Cloudflare OS supports several sign-in methods. This starter deploys Cloudflare Access mode, which verifies identity before a request reaches the Worker. See Sign-in methods for the alternatives and what switching involves.
os.example.com.deployment.jsonc and replace the active placeholders. Every control is annotated in place.The hostname belongs to the router, the only Worker here with a public route. Wrangler creates its DNS and TLS at deploy time. For an evaluation without a zone, switch the annotated route to { "workersDev": true } and set publicBaseUrl to the resulting origin.
pnpm check
pnpm deploy
With resource values left as null, Wrangler creates the three KV namespaces and R2 bucket automatically and reconnects them on later deploys. Set explicit IDs or a bucket name when the deployment must reuse existing resources.
A Workers AI model catalog is enabled by default and needs no API token: the Workshop reaches AI Gateway over its WORKERS_AI binding, which is pre-authenticated inside your account. See AI models to add providers, change the gateway, or turn the catalog off.
Git-backed Context collections are disabled by default. Accounts with Artifacts access can enable them in context.artifacts; see Context Artifacts.
Backend error reporting is enabled without a vendor account. Explicit upstream issue events become structured logs in the private Error Reporter Worker; see Observability and error reporting.
/admin, confirm the email is an administrator, and set Context, Scheduler and Custom Gatekeepers to disabled, optional, or enabled.error_report query surface.| Customize | Best place | Deploy required |
|---|---|---|
| Site name, logo, color, announcements, instructions, connectors | /admin | No |
| Sign-in, routes, AI, storage, observability, Worker identities | deployment.jsonc | Yes |
| Logs, traces, error destinations, browser reporting | Observability guide | Sometimes |
| Organization APIs and capabilities | packages/custom-gatekeeper | Yes |
| Product behavior unavailable through Worker boundaries | Pinned upstream fork/commit | Yes |
The complete control reference and recipes live in Customization. The upstream write-gatekeeper skill covers richer integrations.
wrangler tail.wrangler rollback.Ejecting an instance created by the hosted flow means redeploying over Workers that already hold your data. Worker names, storage IDs, the public URL, and AI Gateway all have to be carried across by hand, and each one fails quietly if it is not: the deploy succeeds against empty storage. Migrating from the hosted deploy is the checklist.
TypeScript
100.0%
A guide for customizing your Cloudflare OS deployment
292
stars
13
commits
TypeScript
primary language
Sep 11, 2026
updated
Deploy a pinned Cloudflare OS release with branding, sign-in, integrations, routes, and upgrades under your control.
[!IMPORTANT] Cloudflare OS is early-access software. Pin upstream releases, review changes, and verify the trust boundary before every production upgrade.
pnpm exec wrangler login.deployment.jsonc: account ID, Worker names, hostname, Access audience, admin emails.pnpm check, then pnpm deploy./admin and set the site name, logo, and accent color; branding needs no redeploy.Deploy and Customization expand each step. Everything else on this page is optional reading.
This repository adds deployment controls around a pinned Cloudflare OS release without modifying the upstream source.
| Control | What you own |
|---|---|
| Branding | Site name, logo, and accent color, changed in /admin without a deploy |
| Identity | The sign-in method and administrator allowlist; this starter deploys Cloudflare Access mode |
| Routing | A production Custom Domain or a workers.dev evaluation route |
| Data | Existing KV/R2 resources or automatic provisioning |
| Integrations | Wrapper-owned Gatekeepers and service bindings without patching upstream |
| AI | A Workers AI model catalog through AI Gateway out of the box, with no API token; which providers and which gateway |
| Operations | Structured logs, traces, explicit error reports, validation, deployment order, and upgrades |
The deployment is six Workers. A router owns the public route and serves the frontend, proxying /api to the Workshop backend and /gatekeeper/<name> to whichever Gatekeeper the binding name matches; the Workshop, the Context, Scheduler and custom Gatekeepers, and the Error Reporter sit behind it with no route of their own, reachable only over service bindings.
The deploy command derives temporary Wrangler files from upstream base configs, builds the frontend in Cloudflare Access mode, deploys the private Error Reporter, the Gatekeepers and the Workshop before the router that binds them, and removes generated files even on failure. Secrets never enter tracked configuration.
A hosted flow deploys the same upstream release to your Cloudflare account without this repository. It builds nothing locally, configures sign-in and your admin emails for you, and leaves the whole /admin surface intact: site name, logo, accent color, announcements, agent instructions, featured blueprints, and which connectors your users can reach. Built-in Gatekeepers such as GitHub and Google are still yours to connect with your own OAuth credentials.
Anything past that needs your own code or settings, which is what this repository is for: custom Gatekeepers, customized error reporting, your own Worker names, reusing storage you already have, choosing how much logging to keep, and a pinned version you upgrade when you decide. Hosted deployments also run on a workers.dev address, so deploy from here if you want the app on your own domain, or the email Gatekeeper, which needs a zone. Come back when branding stops being enough.
Install Node.js 24.19 or newer (the deploy scripts are TypeScript run directly by node), pnpm 11.17, and authenticate Wrangler:
git submodule update --init
pnpm install
pnpm --dir cloudflare-os install
pnpm exec wrangler login
Your account needs Workers, KV, R2, Browser Rendering, and Dynamic Worker Loaders. It also needs Workers AI and AI Gateway, which the default model catalog runs on; only turning that catalog off makes them dispensable. Artifacts is optional.
Cloudflare OS supports several sign-in methods. This starter deploys Cloudflare Access mode, which verifies identity before a request reaches the Worker. See Sign-in methods for the alternatives and what switching involves.
os.example.com.deployment.jsonc and replace the active placeholders. Every control is annotated in place.The hostname belongs to the router, the only Worker here with a public route. Wrangler creates its DNS and TLS at deploy time. For an evaluation without a zone, switch the annotated route to { "workersDev": true } and set publicBaseUrl to the resulting origin.
pnpm check
pnpm deploy
With resource values left as null, Wrangler creates the three KV namespaces and R2 bucket automatically and reconnects them on later deploys. Set explicit IDs or a bucket name when the deployment must reuse existing resources.
A Workers AI model catalog is enabled by default and needs no API token: the Workshop reaches AI Gateway over its WORKERS_AI binding, which is pre-authenticated inside your account. See AI models to add providers, change the gateway, or turn the catalog off.
Git-backed Context collections are disabled by default. Accounts with Artifacts access can enable them in context.artifacts; see Context Artifacts.
Backend error reporting is enabled without a vendor account. Explicit upstream issue events become structured logs in the private Error Reporter Worker; see Observability and error reporting.
/admin, confirm the email is an administrator, and set Context, Scheduler and Custom Gatekeepers to disabled, optional, or enabled.error_report query surface.| Customize | Best place | Deploy required |
|---|---|---|
| Site name, logo, color, announcements, instructions, connectors | /admin | No |
| Sign-in, routes, AI, storage, observability, Worker identities | deployment.jsonc | Yes |
| Logs, traces, error destinations, browser reporting | Observability guide | Sometimes |
| Organization APIs and capabilities | packages/custom-gatekeeper | Yes |
| Product behavior unavailable through Worker boundaries | Pinned upstream fork/commit | Yes |
The complete control reference and recipes live in Customization. The upstream write-gatekeeper skill covers richer integrations.
wrangler tail.wrangler rollback.Ejecting an instance created by the hosted flow means redeploying over Workers that already hold your data. Worker names, storage IDs, the public URL, and AI Gateway all have to be carried across by hand, and each one fails quietly if it is not: the deploy succeeds against empty storage. Migrating from the hosted deploy is the checklist.
TypeScript
100.0%