Custom Domains
Every Cell is reachable at a *.dev.tissue.systems address the moment it is deployed. You can also serve it from your own domain — api.yourdomain.com, app.example.com, or any hostname you control — by adding a CNAME record in your DNS pointing at your Cell's hostname.
How it works
A CNAME record is an alias: it tells DNS resolvers that api.yourdomain.com should resolve to the same address as crane-a4f2.dev.tissue.systems. Once the record is in place, requests to your custom hostname arrive at your Cell. TLS certificates for the custom hostname are provisioned automatically.
The Cell receives the request with your custom hostname in request.url — the platform does not rewrite the URL.
Step 1 — Find your Cell's hostname
Run ribo list or check the output of your last ribo deploy:
ribo deploy
deployed my-api
address ab1cd
kind js
url https://crane-a4f2.dev.tissue.systems
The hostname you need is crane-a4f2.dev.tissue.systems.
Step 2 — Create a CNAME record
In your DNS provider's control panel, add a record with:
| Field | Value |
|---|---|
| Type | CNAME |
| Name / Host | The subdomain you want, e.g. api |
| Value / Target | Your Cell's hostname, e.g. crane-a4f2.dev.tissue.systems |
| TTL | 300 (5 minutes) or your provider's default |
This maps api.yourdomain.com → crane-a4f2.dev.tissue.systems.
Provider-specific steps
Cloudflare — Dashboard → your domain → DNS → Records → Add record. Set type to CNAME, name to api, target to your Cell hostname. Leave proxy status as DNS only (grey cloud icon) — do not proxy through Cloudflare.
Namecheap — Domain List → Manage → Advanced DNS → Add New Record → CNAME. Host: api, Value: crane-a4f2.dev.tissue.systems.
AWS Route 53 — Hosted zone → Create record. Record type: CNAME, Record name: api, Value: crane-a4f2.dev.tissue.systems.
GoDaddy — My Products → DNS → Add. Type: CNAME, Name: api, Value: crane-a4f2.dev.tissue.systems.
Porkbun — DNS → Add new record. Type: CNAME, Subdomain: api, Answer: crane-a4f2.dev.tissue.systems.
Google Domains / Squarespace — DNS → Custom records → Add custom record. Type: CNAME, Host name: api, Data: crane-a4f2.dev.tissue.systems.
Any standard DNS provider that supports CNAME records will work the same way.
Step 3 — Wait for DNS to propagate
DNS changes typically take effect within a few minutes for short TTLs. They can take up to 24 hours in rare cases.
Check propagation with:
dig api.yourdomain.com CNAME
or use a web tool such as dnschecker.org.
Once DNS resolves and TLS is provisioned, https://api.yourdomain.com is live.
Apex (root) domains
Standard DNS does not permit a CNAME at the apex of a domain (yourdomain.com itself, without a subdomain). If you need to serve from a bare domain, most DNS providers offer a proprietary CNAME-at-apex mechanism under various names:
- Cloudflare — CNAME flattening (set the record name to
@) - AWS Route 53 — ALIAS record
- Porkbun — ALIAS record
- Namecheap — CNAME with host
@
Check your DNS provider's documentation for their specific approach.
The Cell sees your custom hostname
Once the CNAME is live, your Cell sees requests arriving at the custom hostname:
export default {
async fetch(request, env) {
const url = new URL(request.url);
// url.hostname → "api.yourdomain.com"
// url.pathname → whatever path the client requested
return Response.json({ host: url.hostname, path: url.pathname });
},
};
Multiple custom domains
A single Cell can be reached via multiple hostnames. Add additional CNAME records — one per hostname — all pointing at the same Cell hostname. No configuration in ribo.toml is required.
See also
- Cells Overview — Cell addresses and default URLs
- Writing Cells — reading
request.urland routing - ribo.toml Reference — deploying Cells