Introducing OpenWorkers
Self-hosted Cloudflare Workers in Rust
OpenWorkers is an open-source runtime for executing untrusted JavaScript in V8 isolates. It brings the power of edge computing to your own infrastructure.
What works today
export default { async fetch(request, env) { const data = await env.KV.get("key"); const rows = await env.DB.query( "SELECT * FROM users WHERE id = $1", [1] ); return Response.json({ data, rows }); } };
Features
Bindings
- • KV storage (get, put, delete, list)
- • PostgreSQL database
- • S3/R2-compatible storage
- • Service bindings
- • Environment variables & secrets
Web APIs
- • fetch, Request, Response
- • ReadableStream
- • crypto.subtle
- • TextEncoder/Decoder, Blob
- • setTimeout, AbortController
Architecture
┌─────────────────┐
│ nginx (proxy) │
└────────┬────────┘
│
┌───────────────┬────────┴──┬───────────────┐
│ │ │ │
│ │ │ │
┌────────┸────────┐ ┌────┸────┐ ┌────┸────┐ ┌────────┸────────┐
│ dashboard │ │ api │ │ logs * │ │ runner (x3) * │
└─────────────────┘ └────┬────┘ └────┰────┘ └────────┰────────┘
│ │ │
│ │ │
┌────────┸────────┐ │ ┌────────┸────────┐
│ postgate * │ └──────┥ nats │
└─────────────────┘ └────────┰────────┘
│
│
┌─────────────────┐ ┌──────┴───────┐
* ─────┥ PostgreSQL │ │ scheduler * │
└─────────────────┘ └──────────────┘ - V8 Isolates: Secure sandboxing with CPU (100ms) and memory (128MB) limits per worker.
- Cron Scheduling: Built-in support for 5 or 6-field cron syntax.
- Compatibility: Cloudflare Workers syntax compatible.
Self-hosting
Deployment is designed to be simple. A single PostgreSQL database and a single Docker Compose file is all you need.
git clone https://github.com/openworkers/openworkers-infra cd openworkers-infra && cp .env.example .env docker compose up -d postgres # Run migrations, generate token docker compose up -d
Why I built this
This project has been evolving for about 7 years. I started experimenting with vm2 for sandboxing JS, then Cloudflare launched Workers and I got hooked on the model. When Deno came out, I switched to deno-core and ran on that for two years. Recently, with Claude's help, I rewrote everything on top of rusty_v8 directly.
The goal has always been the same: run untrusted JavaScript securely on your own servers, with the same DX as Cloudflare Workers but without vendor lock-in.
Next up: Execution recording & replay for deterministic debugging.