Cerra Sites is the application layer of Cerra Cloud 2.0. The main platform provides a stable entry point, accounts and discovery; each site has its own release, URL and access policy. An agent can work through scoped APIs to edit, deploy and maintain an application without rebuilding the main platform for every customer change.
Two products with similar names appear in this guide: ChatGPT Sites is the managed hosting service used by the original Cerra Cloud application. Cerra Sites is our own modular application platform at sites.cerra.cloud. Both use Cloudflare technology, but their deployment control and databases are separate.
The current system architecture
Follow the solid connections below. The website, identity authority, deployment gateway, application data and capture processes are different parts of the system. A shared domain suffix does not mean a shared database or a shared browser session.
Browser → main platform or site URL · Agent → authenticated Cerra Sites API / MCP tools
Original Cerra Cloud
Main website + application API
Cloudflare Worker and built assets; CERRA accounts, documentation, marketplace entry and existing modules.
Sites-managed cloud runtimeMain D1 + private R2
Accounts, sessions, traffic records and review history in D1; images and larger objects in R2.
Resources bound to the original Site
Cerra Sites control plane
Cloudflare gateway Worker
Console, site ownership, membership, scoped API credentials, deployment routing and publication.
cerra-sites-stagingIndependent Sites D1
Tenant/site registry, releases, audit, account links and small static bundles.
Cloudflare · Eastern North America (current metadata)
Managed application runtime
Authenticated provider via Cloudflare Tunnel
The gateway selects a reviewed release; a provider manages Docker on a CERRA-operated Linux host.
Managed Linux hostIsolated application container
App-specific process and resource limits; stable site and account identity passed by the gateway.
Persistent site volume
SHA application SQLite data survives replacing the container. Source and build records are stored separately on the host.
Live Capture today
Camera acquisition + local inference
Capture, model inference and health monitoring run outside the website request runtime.
Existing capture / GPU workstationDurable delivery spool
Local SQLite retains unacknowledged observations and retries with stable IDs and original timestamps.
Original traffic ingest API
Authenticated delivery to cerra.cloud writes structured records to main D1 and evidence images to main R2.
- CurrentMain platform connects to Sites console
Marketplace link and shared-account authorization redirect
- CurrentSites gateway connects to Main account API
Server-to-server code exchange and live session / permission validation
- CurrentSite hostname → gateway connects to Static D1 bundle or container provider
Resolve the active deployment; enforce its access policy
- CurrentCapture workstation connects to Main traffic API → D1 / R2
Authenticated, retryable ingestion; no direct browser database access
Where each part is deployed
The public URL identifies an entry point. Runtime ownership and release boundaries explain what actually changes when an application is published.
| Entry / component | Actual runtime | Release boundary and current scope |
|---|---|---|
| cerra.cloud | ChatGPT Sites-managed Cloudflare Worker + assets | Original application, account authority and existing modules remain here. A release currently rebuilds this application. |
| sites.cerra.cloud | CERRA-operated Cloudflare Worker | Console and gateway remain on the staging-named Worker and independent staging D1. The brand domain does not imply a completed production-environment migration. |
| hello-cerra.sites.cerra.cloud · calendar.sites.cerra.cloud | Static content served by the Sites gateway | Each site has its own active release and hostname. Today: up to 20 text files / 512 KiB per bundle, sandboxed with external network access blocked. |
| sha.sites.cerra.cloud | Sites gateway → authenticated tunnel → managed Docker application | Private container viewing, persistent application data, source revisions and builds are implemented. Editable assets and release metadata are allowed; the server and Dockerfile remain operator-managed. |
| Live Capture acquisition and inference | Independent Linux workstation services | Processes continue when a dashboard closes. Their capture/delivery health and local backlog are operational concerns distinct from website availability. |
| Future Worker / VM adapters | Not currently available as general customer runtimes | Workers for Platforms entitlement is not enabled in the current account. VM support and arbitrary user-code execution require a separate implementation and operating model. |
One account authority, separate application permissions
The existing CERRA account is the identity source for both platforms. A successful sign-in proves who the visitor is; site ownership, editor membership and module permissions determine what that person can do.
Current behavior
- Password, Google and email sign-in resolve through the original CERRA account system. Sites links the stable account ID to its own tenant records; it does not copy passwords.
- Enabled accounts can authenticate. Creation and broader management depend on deployment/admin capability; explicitly assigned site editors receive their scoped rights. A login alone never grants every site or every module.
- Private container viewing uses a separate site-view authorization purpose and host-only session. The current SHA policy checks its module entitlement, site ownership or editor membership. Private static-site browsing is not yet implemented.
- Agents use expiring, revocable credentials scoped to a site and permitted operations. They do not receive Cloudflare account credentials, the main session cookie or unrestricted host access.
How shared sign-in works
Start from Sites
Sites creates a random state and S256 PKCE challenge, then redirects the browser to the main platform’s authorization endpoint.
Use the existing CERRA login
The main platform checks the enabled account and live session, then returns a short-lived, single-use authorization code to the fixed Sites callback.
Exchange on the server
Sites validates state and exchanges the code with its verifier over an authenticated backchannel. The browser receives a Sites-specific Secure, HttpOnly, host-only cookie.
Check authorization on each request
The gateway revalidates the grant with the main service and applies the current site policy. Account disablement, session expiry and changed permissions take effect without sharing a parent-domain cookie.
Signing out of the Sites console revokes its grant; signing out of the main CERRA session invalidates grants tied to that session. If the identity service cannot validate a protected request, access fails closed. Independent releases therefore still have an explicit availability dependency on the shared account service.
Where the databases and files live
Account sharing is an API relationship, not a database merge. These stores have separate owners, backup needs and recovery procedures. Cloudflare’s edge network does not make every database globally replicated.
| Data | Current storage | Ownership / recovery boundary |
|---|---|---|
| Original platform accounts and business records | ChatGPT Sites-managed Cloudflare D1, bound as DB | Users, sessions, shared-login grants, traffic observations and review history remain in the original Site. Its precise physical region is not exposed by the verified deployment interface. |
| Original evidence media and larger objects | ChatGPT Sites-managed private Cloudflare R2, bound as BUCKET | Original images and object data stay with the main platform. Moving a webpage does not copy these files or make them public. |
| Sites management records and static releases | Separate CERRA-owned Cloudflare D1 | Current database: cerra-sites-staging, region ENAM; read replication disabled. Ownership, membership, releases, token digests and audit are separate from main D1. |
| Managed container application state | Per-site persistent Docker volume on the managed Linux host | The SHA app uses SQLite in its volume, with site/account-aware records. Code rollback preserves that volume; it does not roll back user data. |
| Source revisions and provider/build state | SQLite registries and content-addressed files on the managed host | Working source, build state and deployed releases are distinct. Host metadata and site volumes need coordinated backup and restore checks. |
| Capture backlog and other local services | Workstation SQLite spool; separate service-owned local storage | Pending camera observations remain local until acknowledged. The existing research service also owns private SQLite history; a cloud D1/R2 export does not include these stores. |
Why take this route?
Managed ChatGPT Sites made the original product quick to build and publish, including server APIs and durable storage. The pressure now comes from CERRA’s growing mix of applications: frequent customer changes, persistent capture jobs, native dependencies and independent data lifecycles. The limitations below describe this deployment and workload fit, not every application built with ChatGPT.
What this makes possible
Smaller, independent releases
A customer dashboard can be built, checked and rolled back within its own site. The main platform changes when shared product contracts change, rather than every time a customer edits a page.
An operating model that fits the workload
Small presentation sites can stay static; approved Python services can use containers; future GPU or stronger isolation requirements can select a dedicated runtime. A VM offers broader operating-system control, but it is an optional runtime, not the definition of a site.
A stable interface for agents
Scoped APIs, source revisions, build status and audit give different agents a consistent way to work. The current SHA workflow detects conflicting edits and supports idempotent build requests instead of giving an agent the host’s shell or Docker socket.
Data and access with clear owners
A site has an owner, collaborators and an explicit audience. Separating high-volume capture records from shared identity data can support targeted retention, backup and scaling without forcing every module into the same release cycle.
A directory that grows with the applications
Stable links let owners demonstrate or distribute their work. A public site and marketplace listing are separate choices; private applications stay protected while the platform can promote approved public projects.
Boundaries and tradeoffs
The current shared application couples changes
Many original modules share one application build and D1/R2 lifecycle. A small module change requires application-level release checks, and a full migration must reconcile accounts, reviews, objects and external services together.
A request runtime is not a continuous capture host
The original Worker has bounded CPU and memory. Continuous camera acquisition, a durable upload queue and native Python inference already run elsewhere; GPU use depends on the configured host and model. Merely moving the frontend to another Worker would not move those processes.
More control brings operational work
CERRA now operates the gateway and container host, including images, patches, capacity, monitoring, backup and recovery. The current managed host and tunnel are availability dependencies; this adapter is not yet a high-availability compute fleet.
Containers and VMs have different boundaries
Containers share a host kernel; VMs can provide a separate guest kernel and wider configuration freedom. Either requires quotas, network policy and secrets isolation. The current provider accepts reviewed releases, not arbitrary images, shell commands or privileged customer workloads.
Code rollback is only one part of recovery
A release pointer can be reverted while database writes remain. Cross-store migration and schema changes need their own restore plan; a new hostname or a successful container start is not proof of data equivalence.
The Live Capture migration roadmap
This is the proposed next-stage plan, not a claim that Live Capture has moved. Keep the original path available while extracting one boundary at a time. Each step has an observable completion condition before the next ownership switch.
- FoundationImplemented
Shared identity and an independent application path
Use the existing Sites gateway, scoped credentials, separate releases and private container example as the starting point. SHA demonstrates the hosting path; it is not the Live Capture replacement.
- Keep main CERRA as the account authority; distinguish console management from private viewing.
- Preserve hostname routing, tenant checks and source/build audit. SHA text assistance is available; photo/video detection remains disabled.
- 01Planned
Define the Live Capture module contract
Document capture sources, ingest payloads, observation IDs, image hashes, review revisions, model versions, health signals and ownership. Separate collection, delivery, inference, storage and UI responsibilities.
- Versioned ingest/read/review API; stable site and account IDs; local observation/receipt time versus cloud ingestion time; the camera clock is not verified.
- Inventory all writers, local spools, cloud tables/objects and external services before migration.
- 02Planned
Move the dashboard behind a scoped service adapter
Build the Live Capture dashboard as its own site first. A server-side adapter can read the existing service with explicit authorization while the original store remains authoritative. Browser code receives neither the main database binding nor service secrets.
- Compare existing and new dashboard results, image access, history and revoked-user behavior.
- Keep the original entry available and link to the new module through the main marketplace.
- 03Planned
Extract ingest, review and data storage
Provision a dedicated module database and private object store after sizing. Cloudflare D1 plus R2 is one candidate; high-volume ingestion may require another database. Preserve IDs and attributed review history rather than rebuilding them from screenshots or aggregates.
- Copy in bounded, resumable batches; verify schema, typed values, row counts, image hashes, references and review revisions.
- Use a fenced capture or a validated change journal and replay process. D1 and R2 do not form one shared transaction; two ordinary exports are not automatically one consistent snapshot.
- Produce a private, access-controlled backup and successfully restore it into isolated target storage before changing the authoritative writer. Verify the restored records, objects and permissions without activating live integrations.
- A stopped collector does not prove all admitted cloud requests have finished. Require a verified drain, a storage write fence, or a consistent snapshot covering every writer.
- Run shadow reads before switching the single authoritative writer. Avoid uncontrolled dual writes; replay failures idempotently.
- 04Planned
Package collection and inference as managed jobs
Keep collectors on the existing workstation initially. Then package supported acquisition/inference services for an appropriate Linux or GPU runtime. Extend the current reviewed-app provider with worker supervision and job contracts before onboarding continuous capture.
- Preserve the durable spool, stable delivery IDs, original timestamps, bounded retries and explicit coverage gaps.
- Plan historical import for long pauses: current delivery archives observations older than 23 hours locally, while ordinary ingest rejects observations older than one day. Those archives are not automatically replayed; never rewrite their times to bypass validation.
- Verify cancellation, concurrency limits, restart recovery, model availability and advancing capture plus delivery health.
- Use queues and scheduled workflows for bounded tasks; use supervised services for continuous capture. A request callback is not a permanent background process.
- 05Planned
Cut over, observe and reuse the module pattern
Switch a small, agreed scope first, monitor completeness and lag, and retain the old path for the defined recovery period. Reuse the same contracts for other dashboards and collection modules only after Live Capture meets its checks.
- Acceptance covers ingestion lag, missing/duplicate observations, image integrity, review history, revoked access and recovery after restart.
- Routing rollback and data rollback have separate procedures; replay any post-cutover writes before reverting storage authority.
- Define backups, restore exercises, retention and capacity budgets. Broader VM access, per-customer runtime allocation and automatic domains remain later platform work.
Try it and read further
- Cerra Sites console
Live console and marketplace. Sign in with a CERRA account; actions depend on your permissions.
- Public example site
A small independently versioned static site.
- SHA container application
Private application; CERRA identity and site authorization are required.
- Cloudflare Workers limits
Request-runtime resource limits; relevant when separating web APIs from continuous processes.
- Workers for Platforms
A possible future adapter for isolated customer Workers; not enabled in the current account.
- D1 database transactions
Transactional batches within D1; these do not include R2 object operations.
- R2 consistency
Object-operation guarantees to consider in cross-store migration and recovery.
