Domains
A domain is how people on the internet reach something running in your lab. By the end of this page you will have added one and attached it to a lab, 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) | Limited; you see a message when you reach it |
| 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 list you see in the
dropdown is the current one.
1. Add a domain
Go to Connectivity → My Domains and click 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. - Click Verify and Add.
Names must be at least 3 characters and use only letters, digits, dots and hyphens.
Custom domains: point the A record first
A custom domain is checked when you add it. Before you click Verify and Add, create an A record for the name at your DNS provider, pointing at the labs' public IP address.
To find that address, click the ? button next to Add New Domain on the My Domains page.
Type Name Value
A www <labs-public-ip>
DNS changes can take a while to spread. If adding fails with the A-record message below, wait and try again.
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 click 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.
Your app needs to listen on port 80 inside the lab for this option. 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.
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 labs. Checked automatically, periodically and at every deploy — there is no button. |
| in use / not in use | Whether a lab is serving it |
| SSL badge | Opens the SSL Manager for this domain's certificate |
| Common Name, A Record, Service | The full name, where it points, and what is using it |
The only action is Delete. A lab's own Domains tab lists the domains that lab is serving.
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 somehow 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.
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 New Domain is greyed out | You are at your limit. Delete a domain you no longer use. |
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, it is refused outright — not added as pending — so set the record, wait for it to propagate, then ask. Attaching a domain saves routing; 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