Running on Cloudflare
Prefer the edge to a box? The same highseas codebase deploys to Cloudflare Workers unchanged. This is the other half of "runs anywhere" — self-host it, or ship it to Cloudflare, from one source tree.
Deploy
With a Cloudflare account and Wrangler configured, it's the standard Workers flow:
npm run build wrangler deployStorage maps straight onto Cloudflare's primitives — your database to D1, object storage to R2, and durable state to Durable Objects. The self-hosted runner mirrors those same bindings locally, which is why the app doesn't know or care which one it's running on.
Why dual-runtime matters
- No lock-in. Start on Cloudflare, move to your own box later — or the reverse — without a rewrite.
- Honest portability. The self-hosted path isn't a stripped-down fallback; it runs the same runtime (workerd) Cloudflare does.
- Your call. Edge performance and zero ops, or full ownership on hardware you control. Same app either way.
One gotcha: database migrations
A plain wrangler deploy ships code but does not run D1 migrations. After adding migrations, apply them to your remote database:
wrangler d1 migrations apply <your-db> --remoteOn the self-hosted path this is automatic — migrations run on container boot. See Self-hosting for that route.