gflare
Zero-glue Gleam framework for Cloudflare Workers. Write Gleam, deploy to Cloudflare — no index.js, no wrangler.toml editing, no JavaScript.
Quick Example
import gflare/bindings.{type Env}
import gflare/worker.{type Context}
import gflare/request.{type HttpRequest}
import gflare/response
import gleam/javascript/promise
// This function handles every HTTP request to your worker
pub fn fetch(request: HttpRequest, env: Env, ctx: Context) {
response.new(200)
|> response.set_body("Hello from Gleam!")
|> promise.resolve
}
Features
- Pure Gleam bindings for Cloudflare Workers APIs
- KV, D1, R2, Queues, Durable Objects support
- Turso database over HTTP (no npm packages)
- SQL code generation (like squirrel for SQLite)
- Database migrations for D1 and Turso
- Typed error handling
- esbuild bundling, wrangler integration
Quick Start
gleam new my-worker
cd my-worker
gleam add gflare
gleam run -m gflare -- init
Write your handler, then:
gleam run -m gflare -- dev # Run locally
gleam run -m gflare -- deploy # Deploy to Cloudflare
Documentation
| Guide | Description |
|---|---|
| Getting Started | Install, setup, and first worker |
| Configuration | gleam.toml reference |
| Bindings | How bindings work |
| KV | Key-value storage |
| D1 | SQLite database |
| Turso | Turso database over HTTP |
| R2 | Object storage |
| Queues | Message queues |
| Durable Objects | Stateful objects |
| Code Generation | SQL to Gleam code |
| Migrations | Database migrations |
| Error Handling | Error patterns |
| Router | Routing and middleware |
| CORS | Cross-Origin Resource Sharing |
| Rate Limiting | Request rate limiting |
| Validation | Request validation |
| Logging | Structured logging |
| Troubleshooting | Common issues |
CLI Commands
| Command | Description |
|---|---|
gleam run -m gflare -- init | Initialize Cloudflare Workers |
gleam run -m gflare -- build | Build for Cloudflare Workers |
gleam run -m gflare -- dev | Build and start local dev server |
gleam run -m gflare -- deploy | Build and deploy to Cloudflare |
gleam run -m gflare -- db generate | Generate Gleam code from SQL |
gleam run -m gflare -- db generate --backend turso | Generate for Turso |
gleam run -m gflare -- db migrate create <name> | Create a migration |
gleam run -m gflare -- db migrate list | List migration files |
gleam run -m gflare -- db migrate run | Apply pending migrations |
gleam run -m gflare -- db migrate run --turso | Apply migrations to Turso |
How It Works
┌─────────────────────────────────────────────────┐
│ Your Gleam code (handlers + binding calls) │
├─────────────────────────────────────────────────┤
│ gflare library (types, FFI, wrappers) │
├─────────────────────────────────────────────────┤
│ gleam build │
│ → outputs .mjs files in build/dev/javascript/ │
├─────────────────────────────────────────────────┤
│ gflare CLI (detects handlers, generates glue) │
│ → generates index.js + wrangler.toml │
├─────────────────────────────────────────────────┤
│ esbuild (bundles into single file) │
├─────────────────────────────────────────────────┤
│ wrangler dev / wrangler deploy │
└─────────────────────────────────────────────────┘
gleam buildcompiles your Gleam to.mjsfiles- The CLI scans the compiled output for exported handlers (
fetch,queue, etc.) - It generates
index.js(Cloudflare Worker entrypoint) andwrangler.toml esbuildbundles everything into a single filewranglerruns locally or deploys to Cloudflare
License
MIT — see LICENSE for details.