A workspace's default URL is <orgId>-<projectName>.spinforge.dev. Attach a custom domain to point your own hostname (app.example.com, mybrand.com) at the same site. AppMint validates plan eligibility, stores the domain on the dev env record, and SpinForge handles DNS / TLS once you point the records.
Attach a domain
curl -X POST "$APPMINT_API_URL/dev-env/attach-domain/$APPMINT_PROJECT_NAME" \
-H "Authorization: Bearer $APPMINT_TOKEN" \
-H "orgid: $APPMINT_ORG_ID" \
-H "Content-Type: application/json" \
-d '{"domainName":"app.example.com"}'
Response codes:
200— attached, stored on the dev env record. The domain joinsdev-env.domainsand is mirrored into.vibe/project.jsonon the next sync.403— your plan doesn't support custom domains. The error body includes an HTML upgrade link.409— the domain is already attached to a different dev env in the same org.
From Vibe Studio: Launch → Domains → Attach a domain. Same call, just wrapped in UI.
DNS records
Once attached, point your DNS to SpinForge's edge:
A app.example.com <SpinForge-edge-IP>
AAAA app.example.com <SpinForge-edge-IPv6>
The exact IPs are returned by SpinForge — pull them from the deploy's status response or from your dev env record's domains[].dnsTarget field after attach.
For apex domains (example.com rather than app.example.com), use ALIAS / ANAME records if your DNS provider supports them. Otherwise CNAME flattening on a managed DNS like Cloudflare works.
SSL certificates
SpinForge issues certificates via Let's Encrypt automatically once DNS resolves to its edge. There's no manual cert upload step — the next deploy after DNS propagates will trigger issuance.
For wildcard certificates (e.g., *.example.com), contact AppMint support — wildcards require DNS-01 challenge, which needs API access to your DNS provider.
Sync to SpinForge without a redeploy
Attaching a domain on AppMint stores the record but doesn't push it to SpinForge until the next deploy. To sync immediately:
ALIASES=$(curl -s "$APPMINT_API_URL/dev-env/$APPMINT_PROJECT_NAME" \
-H "Authorization: Bearer $APPMINT_TOKEN" \
-H "orgid: $APPMINT_ORG_ID" \
| jq -c '.data.domains // []')
curl -X POST "$SESSION_MANAGER_URL/api/deploy/spinforge/$APPMINT_ORG_ID/$APPMINT_PROJECT_NAME/sync-aliases" \
-H "Authorization: Bearer $APPMINT_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"customerId\":\"$APPMINT_USER_EMAIL\",\"aliases\":$ALIASES}"
This re-runs SpinForge's /_partners/auth with the new alias list. No build, no upload — just a DNS routing update.
Detach a domain
The studio supports detach in the same Domains panel. Underneath:
curl -X POST "$APPMINT_API_URL/dev-env/detach-domain/$APPMINT_PROJECT_NAME" \
-H "Authorization: Bearer $APPMINT_TOKEN" \
-H "orgid: $APPMINT_ORG_ID" \
-d '{"domainName":"app.example.com"}'
Then sync aliases again so SpinForge stops serving the domain.
What if DNS doesn't propagate
DNS propagation is the most common issue. Check:
- The records exist and resolve to SpinForge's edge —
dig +short app.example.com. - TTL is reasonable (300s is fine; 86400s makes debugging painful).
- No CAA records block Let's Encrypt —
dig CAA example.com. - The provider isn't intercepting (Cloudflare's "proxy" mode breaks Let's Encrypt unless you also enable full-strict TLS).
Wait 5–15 minutes after pointing DNS. If the cert still hasn't issued, redeploy — the deploy step retriggers the certificate flow.
Domains in the workspace identity
.vibe/project.json carries a cached domains array. It's not authoritative — the source of truth is the dev env record on AppMint. The studio refreshes the cache on each project open and on each successful attach/detach.
The agent reads domains from the env file or from APPMINT_PROJECT_NAME's dev env record (whichever is more current) when generating code that needs to know the deployed URL — for example, when wiring an OAuth callback or a webhook URL.
Plan limits
Free plans don't include custom domains. Paid plans include a number of domains; the limit is enforced server-side in AppMint:
HTTP/1.1 403 Forbidden
Your plan allows up to 1 custom domain. Upgrade at https://appmint.io/billing.
The exact limit depends on your subscription. Verify in the AppMint admin console under billing.
Multiple domains on one dev env
You can attach more than one domain (subject to plan limits). All attached domains route to the same site. To split traffic across separate sites — say app.example.com for production and staging.example.com for staging — create two dev envs and attach the domains separately.