Skip to main content

Custom domains

Serve the browser workspace on a customer hostname (for example agents.client.example) while keeping the Carina control plane on platform hosts.

What this enables

  • Customer-branded browser workspace on a custom hostname
  • Canonical invite and public URLs on your domain
  • Sender name and address from brand settings
  • TLS at nginx with host-aware brand resolution in the app

The control plane (core.carinaai.uk, ops.carinaai.uk) does not become a customer vanity domain.

Setup (cloud workspace)

  1. Open Settings as workspace owner (custom domain tools are linked from the brand section).
  2. Add a hostname.
  3. Publish DNS TXT:
    • Name: _carina-verify.example.com
    • Value: carina-verify=<token> (shown in UI)
  4. Run verification from settings.
  5. Mark the domain canonical when invite links should use it.

API (cloud app)

MethodPathPurpose
GET/api/workspace/domainsList domains
POST/api/workspace/domainsDeclare hostname
POST/api/workspace/domains/:id/verifyVerify DNS
POST/api/workspace/domains/:id/canonicalSet canonical host
DELETE/api/workspace/domains?id=Remove domain

API (hosted org on core)

MethodPathPurpose
GET/api/carina-ops/domainsList org domains
POST/api/carina-ops/domainsDeclare hostname
POST/api/carina-ops/domains/:id/verifyVerify DNS
POST/api/carina-ops/domains/:id/canonicalSet canonical
DELETE/api/carina-ops/domains/:idRemove domain

TLS and nginx

  1. Verify the domain in Carina first.
  2. Issue a certificate (certbot or your process).
  3. Render nginx config:
cd core.carinaai.uk
CARINA_CUSTOM_DOMAINS="agents.client.example" \
./docker/scripts/render-custom-domain-nginx.sh > docker/nginx/conf.d/carina-cloud-custom-domains.conf
  1. Reload nginx.

Template: docker/nginx/carina-cloud-custom-domains.inc.example

nginx forwards the original Host header. Brand resolution uses /api/brand in the app.