Domains
A domain is the web address people use to reach something running in your lab (your own Linux machine in the cloud). This page shows you how to add a domain and attach it to a lab, so that it is served over HTTPS.
Two kinds of domain
| Platform subdomain | Custom domain | |
|---|---|---|
| Looks like | myshop.selfmade.one | www.example.com |
| DNS | Created for you | You create an A record at your DNS provider first |
| Plan | Every plan | Paid plans only |
| Limit | Shown in the page header (5 by default) | 25 per account. The page header says Unlimited, but the 25th is the last one accepted. |
| HTTPS certificate | Automatic | Automatic, once the A record is correct |
Platform subdomains come from zones the platform offers — for example
selfmade.one, selfmade.fun or zeal.ninja. The dropdown always shows the
current list.
1. Add a domain
Go to Connectivity → My Domains and select Add New Domain.
- Under Choose DNS Provider, pick a platform zone — or Custom Domain for a name you own.
- Type the name. For a platform zone, type only the part before the zone, for
example
myshoporvscode.yourname. For a custom domain, type the full name. - Select Verify and Add.
Names must be at least 3 characters long and use only letters, digits, dots and hyphens.
While you type, the dialog previews the result: the full https:// address
the domain will have, or a red message if the name is not valid. A name must
also start and end with a letter or digit. Names are stored in lowercase.
The dialog suggests names such as vscode.yourname, code.yourname or
ide.yourname for the browser editor, and yourname for a website.
Custom domains: point the A record first
A custom domain is checked when you add it. Before you select Verify and Add, create an A record for the name at your DNS provider. Point it at the platform's public IP address.
To find that address, select the ? button next to Add New Domain on the My Domains page.
Type Name Value
A www <labs-public-ip>
DNS changes can take some time to spread. If adding fails with the A-record message below, wait and try again.
Checklist for the DNS record:
| Check | Why |
|---|---|
The record is an A record for the exact name you are adding (www, shop, or @ for the bare domain) | The platform looks up that exact name |
| Its value is the address shown under ? | That address is how the platform confirms the name is yours |
| Proxying is off for the record, if your DNS provider offers it | A proxied record answers with the provider's address instead of the platform's address, so the check fails |
| No other A or AAAA record for the same name points elsewhere | Certificates are validated by connecting to your domain, and a stray record can send that check to the wrong place |
Adding example.com does not add www.example.com. Each name you want to use
needs its own A record and its own entry on My Domains.
You cannot add something.selfmade.one as a custom domain. Choose that zone
from the dropdown instead.
2. Attach it to a lab
A domain does nothing until a lab uses it. Open the lab, go to Preferences, and find Public Exposure.
| Setting | Choose |
|---|---|
| Expose to Web (port 80) | Public, 80 exposed over 443 — whatever your lab serves on port 80 is published over HTTPS |
| Choose Domains | One or more of your domains |
Then select Save Preferences and Apply & Redeploy now.
Domain settings show Saved here, applied on the next redeploy. The lab keeps serving its old setup until you redeploy it. You can also set all of this in the Redeploy dialog.
For this option, your app must listen on port 80 inside the lab. To publish a different port, or several, see Publishing ports.
If you choose Public but have no domains, the dialog says No DNS entries to take you public. Please add Domains to continue.
Choose Domains lists only your domains that are verified and not in use by another lab. If a domain is missing from the list, check its card on My Domains: fix its DNS if it is unverified, or remove it from the lab that is using it. A lab owned by an organization offers that organization's domains; your personal labs offer yours.
A domain for VS Code in the browser
Labs with VS Code in the browser also have Domain for VS Code Web. Leave the default, or pick one of your platform subdomains to open the editor on a name you choose. Custom domains are not offered here.
The domain card
| On the card | Meaning |
|---|---|
| selfmade / custom | Platform subdomain or your own |
| verified / unverified | Whether the DNS currently points at the platform. It is checked automatically, at regular intervals and at every deploy. There is no button for it. |
| in use / not in use | Whether a lab is serving it. Hover in use to see which lab. |
| SSL badge | Opens the SSL Manager for this domain's certificate |
| Common Name, Domain Name, A Record | The full name, and the address it currently points to (Not Available if it does not resolve) |
| Service | The platform's name for a platform subdomain, or Custom for your own domain |
The name at the top of the card is a link that opens the domain in a new tab.
The SSL badge appears once a lab exposes the domain:
| SSL badge | Meaning |
|---|---|
| SSL valid | The certificate is healthy |
| SSL expiring | It expires within 30 days; it is normally renewed automatically |
| SSL expired / SSL failing | Visitors see a warning, or soon will. Open the badge and run Troubleshoot. |
| no SSL yet | The domain is exposed but has no certificate yet |
The only action is Delete. A lab's own Domains tab lists the domains that lab is serving.
Verification
The platform re-checks every domain regularly — by default about every ten minutes — and at every deploy. A custom domain whose DNS stops pointing at the platform turns unverified; it stays on your list, but it is no longer offered under Choose Domains until the DNS is fixed and the next check passes. Platform subdomains are repaired automatically.
Delete a domain
Delete in the card's menu removes the domain from your account and from every lab that was set to use it. For a platform subdomain, its DNS record is removed too, so the name stops working. Redeploy any lab that was serving the domain so its routing and certificate are rebuilt without it.
Domains in an organization
While you are acting as an organization, My Domains shows the organization's domains. Domains you add then belong to the organization and count against its limit.
Rules to know
- One domain, one lab. A domain can be served by only one running lab at a time. Remove it from the other lab (or stop that lab) first.
- A domain can appear once per lab. You cannot use the same name for two ports of the same lab.
- Only your own domains. If a lab carries a domain that is registered to someone else, the platform detaches it and redeploys the lab. Otherwise the certificate for all of that lab's domains would fail. When this happens, you get a notification that names the domain.
Errors
| Message | What to do |
|---|---|
| The domain name is not available or already registered. | Someone has it. Choose another name. |
| The domain name you are trying is invalid. | Use letters, digits, dots and hyphens; at least 3 characters. |
| We cannot verify your ownership to domain since the A records are not right… | Your custom domain's A record is missing or points elsewhere. Fix it at your DNS provider and wait for it to spread. |
| You need to upgrade your plan to add custom domains | Custom domains need a paid plan. See Plans and limits. |
| DNS Service is currently busy. Try again after sometime. | A temporary problem. Try again in a few minutes. |
| Domain '…' is already attached to your running instance '…'. | Remove it from that lab, or stop that lab, then redeploy this one. |
| …is not registered on this platform. Add it under Domains first. | Add the domain on My Domains before choosing it on a lab. |
| Add Domain is grayed out (it replaces Add New Domain) | You have reached your limit of platform subdomains. While it is grayed out, you cannot add a custom domain either. Delete a platform subdomain you no longer use. |
| Custom-domain limit reached: you already have … (limit …). | You have 25 custom domains. Delete one you no longer use. |
| Rate limit reached. Remove existing domains to add more domains. | You are at your platform-subdomain limit. Delete one first. |
| Could not add the domain. Please try again later. | Something unexpected went wrong. Try again in a few minutes. |
Do it with an AI assistant
You can also do this by asking an AI assistant connected to your account — see Connect an AI assistant to set one up.
| Ask | What the assistant does |
|---|---|
| “Register myapp on one of the platform's domains” | Checks which zones you already use with list_domains, then add_domain |
| “Add shop.example.com — the A record is set” | add_domain |
| “Put myapp on my essentials lab” | Confirms the domain is verified with list_domains, reads the lab's current domains with lab_info, then configure_lab_routing and redeploys |
| “Is my domain attached to a lab yet?” | list_domains |
A domain you own is checked the moment it is added. If its A record does not already point at the platform, the domain is refused. It is not added as pending. Set the record, wait for it to spread, and then ask. Attaching a domain saves the routing, but it goes live only when the lab is redeployed.
Next
- HTTPS certificates — what happens after you attach a domain
- Publishing ports — publish more than port 80
- HTTPS not secure — when the browser warns