features · publish & serve
Publish it, serve it, own the name.
Atomic, content-addressed deploys with instant rollback; a real web server over HTTP/1.1, /2, and /3; first-class projects; and automatic TLS for any domain.
Everything is pre-1.0. Where a capability's live validation is still in flight, it's marked:
live seam
beta
in progress
01 / PUBLISH
Cast off, roll back, never look down.
Atomic deploys
Every publish is an immutable, content-addressed deployment; going live is one atomic pointer flip. Readers never see a half-written mix.
sync
Dedup + delta uploads
Identical bytes are stored once; re-running
sync streams only the blobs that actually changed.content-addressed
Instant rollback
Re-activate any previous deployment in a single flip: nothing to rebuild, nothing to re-upload.
rollback
History & status
Inspect the live deployment and the full history: id, age, and file count.
deployments · status
Aliases & previews
Named pointers for staging and per-branch previews, plus immutable per-deploy preview hosts.
alias
Build step + bundler
Run any build tool before publishing, or the in-process Rolldown + lightningcss bundler.
build · bundle
Dry-run & validate
Preview exactly what an upload would change, and validate routing before anything ships.
--dry-run · validate
02 / PROJECTS
Many sites, one tenant boundary.
First-class projects
A project owns many sites plus their functions and compute. A site name is unique only within its project, so two teams can each own a
blog; deploys, aliases, crons, and workflow runs stay independent.project
Tenant data isolation
Each project is the tenant a handler's row-level scope resolves to:
kv, blobstore, sql, and messaging namespaces are scoped to the owning project, so same-named resources never share a data plane.tenant
Per-project RBAC
A Cedar
Project resource with project_admin / project_publisher / project_viewer roles; a token scoped to one project is refused (403) on any other.cedar
Declarative
applyOne RON manifest declares a whole project: its sites (content + build + routing), top-level functions (with their imports, env, and limits), and compute, all reconciled to desired state in a single pass.
apply.cfg
Upsert, never prunes
apply is create-or-replace and touches only what it names, so declarative and imperative management coexist; --dry-run prints the plan and writes nothing.--dry-run
Default project = no change
Everything that predates projects lives in a reserved
default project, so an omitted --project is byte-identical to single-site boatramp. No migration of your URLs or behaviour.default
03 / SERVE
A real web server, not a bucket.
Static serving
Range requests, conditional GETs, and strong ETags, all automatic, nothing to configure.
range · 304
HTTP/1.1, /2, /3
HTTP/3 over QUIC served alongside the TLS listener.
h1 · h2 · h3
First-party HTTP stack
Every connection is served through boatramp's own
boatramp-http, a hand-rolled HTTP/1.1 codec and a multiplexed HTTP/2 driver (no hyper in the accept path), conformance-gated against h2spec, a differential oracle, and fuzzing.boatramp-http
Routing
Redirects, internal rewrites, reverse-proxy targets, header rules, clean URLs, and a trailing-slash policy.
routing
Conditional routing
Gate redirects and rewrites on a
when predicate (a bounded CEL subset): language, cookie, header, or file_exists, with computed ${…} destinations and automatic Vary. Edge logic without a handler.when
SPA & error docs
SPA fallback and custom error documents, folded into the immutable deployment so they roll back with content.
spa · 404
Caching
Sensible Cache-Control + ETag defaults, with per-path immutable overrides.
cache-control
Edge response cache
Serve a cacheable
GET/HEAD from a host-level cache without re-instantiating the handler. Opt-in via Cache-Control, keyed per project scope, honoring Vary and never storing a private (Set-Cookie, no-store) response.handlers.cache
Compression
Brotli and gzip precompressed at publish; on-the-fly compression for dynamic output.
br · gzip
Netlify / CF Pages compatible
Existing
_redirects and _headers files are folded into the routing manifest on sync.migrate
04 / DOMAINS & TLS
Bring a domain; keep your certs.
Virtualhosts
Attach any number of hostnames (exact and wildcard) to a site, with canonical redirects.
domain add
Ownership verification
Prove control over a host via HTTP self-verify or a DNS-TXT record before it ever routes.
domain verify
Automatic HTTPS (ACME)
HTTP-01 certificates requested on first start, cached, and renewed before expiry. No cron, no certbot.
--tls acme
Wildcard / DNS-01
Wildcard certificates via the DNS-01 challenge, plus per-deploy preview certs.
--tls acme-dns
10 managed DNS providers
Cloudflare, Route 53, Google, Azure, DigitalOcean, Hetzner, NS1, DNSimple, OCI, and Akamai, plus a manual fallback.
auto-dns
BYO cert + transport security
Serve your own certificate, and set HSTS, CSP, and frame-options per site.
--tls custom
pre-1.0
Every capability above is implemented and dogfooded; this site runs on it. Interfaces may still shift before 1.0. Start with the quickstart, dig into the docs, or come crew it.