Cells/Custom Domains

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.comcrane-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