env when the Worker runs. better-router exposes that object on the request:
wrangler.jsonc. Type them by augmenting AppBindings.
Binding map
better-router does not wrap these products. Use the Cloudflare APIs (or your own clients) against
getEnv().
D1
wrangler.jsonc
npx wrangler d1 create app.
KV
wrangler.jsonc
npx wrangler kv namespace create KV.
R2
wrangler.jsonc
npx wrangler r2 bucket create app-media.
Queues
Queues have two sides:- Producer —
env.EMAILS.send(body)from a request or cron - Consumer — the Worker
queuehandler insrc/worker.ts
wrangler.jsonc
defineWorker({ queue }) — see Worker entrypoint.
Email (inbound)
Email Routing can deliver inbound messages to a Worker. Handle them withdefineWorker({ email }).
Cron Triggers
Cron expressions live on the Worker, not in DNS.wrangler.jsonc
scheduled event’s cron string is event.cron in defineWorker({ scheduled }). Exporting a handler is not enough — Cloudflare only fires alarms listed in Wrangler.
Assets
The client build is static files. Wrangler serves them in front of the Worker so/assets/client.js does not hit Hono.
public/ are copied by Vite into that directory.
Vars and secrets
Plain values go invars. Secrets go through wrangler secret put and never sit in git.
getEnv().STRIPE_SECRET. Locally, put secrets in .dev.vars (Wrangler) or .env (Vite). See Environment.
Type the env
src/env.d.ts
getEnv().DB typechecks in loaders, actions, and middleware.
Example wrangler.jsonc
wrangler.jsonc
Other Cloudflare products
These are available onc.env if you bind them:
Add them in Wrangler and type them on
AppBindings the same way.
See examples/cloudflare for D1, a queue producer/consumer, and cron in one app.