Send a new deploy to 5% of users first and ramp up automatically while errors stay under your threshold.
Edge platform · v4.2
Ship APIs to the edge in one command.
Your functions and APIs run in 38 regions, next to your users — with a preview URL for every branch, instant rollbacks and logs you can actually read.
$
npx khat deploy --prod
One request, step by step
200GET /v1/ordersfra1 · 38 ms
010203040ms
dns2 ms
tls5 ms
edge3 ms
function22 ms
kv.get8 ms
response6 ms
Regions38
Global p5014 ms
Uptime99.99%
Requests / day1.2B
01 — Product
Everything an API needs in production.
01Edge functions
Write TypeScript, Python or Go; we run it in the closest region.
export default async (req) => {
return Response.json({ ok: true })
}
02Instant rollbacks
Every deploy is immutable — go back to any version in one click.
a3f9c2eprod
91be0042h
4c7d1aa5h
03Preview URLs
Each branch gets its own URL to review before merging.
feat/checkout
→ payments-git-feat-checkout.khat.app
04Observability
Logs, traces and metrics with zero configuration.
05Global KV
A key–value store replicated everywhere in under 10 ms.
session:9f2{ uid: 41 }
rate:ip:5.217
06Secure by default
TLS 1.3, a web firewall and encrypted secrets — no extra work.
✓ tls 1.3 · auto-renew
✓ waf · owasp ruleset
✓ secrets · aes-256
02 — Develop
Your code, our edge.
One file, one command. You get a production URL in under a minute, and every push builds a preview.
$ npx khat deploy --prod › building 3 functions… ✓ built in 6.2s ✓ deployed to 38 regions → https://api.acme.example
// api/orders.ts — runs in every regionimport { kv } from "khat:kv"export default async function handler(req: Request) { const id = req.headers.get("idempotency-key") const seen = await kv.get(id) if (seen) return Response.json(seen) const order = { id, total: 420 } await kv.set(id, order, { ttl: 86400 }) return Response.json(order, { status: 201 })}
# api/orders.pyfrom khat import kv, json_responseasync def handler(req): key = req.headers.get("idempotency-key") if seen := await kv.get(key): return json_response(seen) order = {"id": key, "total": 420} await kv.set(key, order, ttl=86400) return json_response(order, status=201)
// api/orders.gopackage apifunc Handler(w http.ResponseWriter, r *http.Request) { id := r.Header.Get("Idempotency-Key") if v, ok := kv.Get(id); ok { json.NewEncoder(w).Encode(v); return } order := Order{ID: id, Total: 420} kv.Set(id, order, 24*time.Hour) w.WriteHeader(201) json.NewEncoder(w).Encode(order)}
# create an order (safe to retry)curl -X POST https://api.acme.example/v1/orders \ -H "Idempotency-Key: 7c1e-42" \ -H "Content-Type: application/json" \ -d '{"total": 420}'
03 — Architecture
The shortest path from user to data.
Clienttehran · 4g
Edge38 regions · anycast
Functionv8 isolate · 0 ms cold
Datakv · postgres · blob
04 — Pricing
Pay for traffic, not idle servers.
| Feature | Hobby | Pro | Enterprise |
|---|---|---|---|
| Regions | 12 | 38 | 38 + private |
| Function timeout | 10s | 60s | 900s |
| Custom domains | 1 | 50 | ∞ |
| Support | Community | Email · 24h | Dedicated · 1h |
05 — Changelog
A little better every week.
NewGradual rollouts
ImprovedLogs are 3× faster
Searching a million log lines now takes under a second.
FixedMiddle East regions
Users in Tehran and Dubai now route to the closest region.
06 — Start
Deploy your first API in 60 seconds.
$
npx khat init payments-api