Status: historical static contract. Generalized Forge Deploy now owns every active build, release, activation, reconciliation, and serving decision.
This document describes the original static Sites slice. New Forge Deploy
deployments use the public preview guide and
the forgeBuild.ts v1 contract. Static-only
applications continue to use the same immutable artifact and edge-serving
path.
The Sites product surface is retained as a view over generalized projects,
releases, deployments, and endpoints. It does not create or serve a separate
Site deployment. Using sites.smol.ai for pre-production does not itself
authorize dynamic execution, public self-service, or a production launch.
During review and pre-production validation, operators may set
HOST_SUFFIX=.sites.smol.ai, producing {project}.sites.smol.ai and
deployment-specific preview hostnames under the same suffix.
This is an explicit temporary exception to the production isolation rule below. It does not satisfy the dedicated registrable-domain production gate and must not be described as a production-ready hosting boundary. The compensating controls and mandatory domain-graduation criteria are documented in the Forge Deploy security proposal.
The production hostname is intentionally not named in source. Operators must
set HOST_SUFFIX to a Forge-owned registrable domain used only for hosted
content before enabling Sites in production. The domain must not share the
Forge application origin or its registrable domain. A proxied wildcard DNS
record and Worker Route serve *.HOST_SUFFIX.
Sites builds run in Forge's restricted public-repository container runner:
The default v1 artifact policy is versioned as v1:
| Limit | Value |
|---|---|
| Files per deployment | 5,000 |
| Bytes per file | 25 MiB |
| Total output | 250 MiB |
| UTF-8 bytes per relative path | 512 |
Trusted ingest rejects symlinks, special files, path traversal, duplicate normalized paths, unsupported extensions, observed file-size changes during ingest, and limit violations. It derives MIME types from a fixed allowlist, writes files under a deployment-specific immutable R2 prefix, and stores the completed manifest last. The build sandbox never receives bucket credentials. The runner uses the Sandbox SDK RPC transport so binary output can cross into trusted ingest without a base64 or HTTP fallback. Before inspecting output, the runner kills repository-started processes and verifies the sandbox is quiescent so repository background processes cannot continue mutating output during ingest.
The dedicated Sites Worker:
GET and HEAD;preview-*
deployment slug;nosniff, restrictive frame/referrer/permissions
headers, no platform cookies, and no broad CORS;Static Sites does not itself expose server code. Forge Deploy adds one Forge-owned application abstraction with HTTP, durable state, and bounded realtime, while private-source builds, secrets, customer Cloudflare credentials, broad egress, arbitrary provider bindings, and custom domains remain outside the current Alpha.
Before any enablement under the pre-production hostname exception:
HOST_SUFFIX.cloudforge-site-assets R2 bucket.0023 and 0024.SITE_ASSETS binding.SITE_ADMIN_USER_IDS and HOST_SUFFIX.noindex and shared-domain controls in the Deploy security
proposal.Before production enablement, move hosted content to the separate Forge-owned registrable domain and pass every production-graduation gate in the Deploy security proposal.