Point at anything that speaks HTTP. Failover is a list, not a support ticket.
- app
- origin.example.com
- media
- s3://sable-media
- docs
- docs-origin.example.com
- fallback
- origin-eu.example.com
A CDN whose edge behavior is a file you write, version, and can predict — not a dashboard of toggles you discover in production.
Every trace, site and figure on this page is illustrative pre-launch specimen data. Nothing here is a measurement or a commitment.
A CDN is a program that runs in a hundred places at once. You should be able to read it.
Your edge behavior lives in sable.rules, next to your
app, in your repository. It is reviewed in a pull request and diffed like anything
else you ship. Below is a real rule with a real threshold — turn the knob, or type
into the file. They are the same number.
# sable.rules — committed with your app, applied at every edge
origin "app" {
url = "https://origin.example.com"
connect = "2s"
keepalive = true
}
route "/assets/*" {
cache = "public, max-age=31536000, immutable"
stale = "while-revalidate=86400"
compress = ["br", "zstd"]
}
rule "shield-slow-origin" {
when = origin.latency > ms
then = shield("iad1") # nearest warm edge
else = pass
} Level sits inside the origin excursion — the rule fires on every miss and the picture holds still.
Versioned, reviewed, rolled back. The edge has no state your repository does not already describe.
Everything the edge does is in it. There is no second place to look and no toggle that quietly outranks your rule.
Ask which rule wins for a URL and get the matched line back — before you deploy, not after the incident.
Six modules, one enclosure. Every control here is live — it drives the readouts beside it, the way the real panel will.
Point at anything that speaks HTTP. Failover is a list, not a support ticket.
cache-control: public, max-age=86400 First match wins, top to bottom. No precedence to memorize.
/assets/*/api/*host = eu.**Collapse a stampede onto one origin fetch.
By surrogate key or by prefix. Momentary — it fires on press.
edge=lhr1 route=/assets/* status=HIT age=1204 ms=8
edge=iad1 route=/api/* status=MISS shield=iad1 ms=118
edge=nrt1 route=/assets/* status=HIT age=88 ms=11
edge=fra1 route=/ status=HIT age=42 ms=9 Seven sites armed, two in build. Round-trip figures are a stored reference trace, not a live measurement — this is a pre-launch page and the network is still going in.
| Site | Location | Region | RTT p50 | RTT p95 | State |
|---|---|---|---|---|---|
| IAD | Ashburn | na-east | 11 ms | 24 ms | armed |
| SJC | San Jose | na-west | 14 ms | 29 ms | armed |
| LHR | London | eu-west | 9 ms | 21 ms | armed |
| FRA | Frankfurt | eu-central | 10 ms | 22 ms | armed |
| NRT | Tokyo | apac | 13 ms | 27 ms | armed |
| SIN | Singapore | apac | 17 ms | 38 ms | armed |
| SYD | Sydney | oceania | 19 ms | 41 ms | armed |
| GRU | São Paulo | latam | 26 ms | 51 ms | build |
| JNB | Johannesburg | africa | 31 ms | 62 ms | build |
One instrument, three attenuator positions. The rule syntax is identical on all of them — the setting changes what you are allowed to push through, nothing else. Figures are provisional and will be confirmed before the beta opens.
There is nothing to buy yet. Every position leads to the same place until the beta opens.
Provisional Prices are illustrative pre-launch figures, not an offer. No card is taken for the waitlist.
SableCDN is in private beta. There is no sign-up, no trial, and no traffic being served today. Leave an address and we mail you once — when you can put a rule in and watch it run.