The 2026 Free Domain Landscape
If you run static sites for side projects, a domain is the one recurring cost you can usually avoid. The catch is that free domain providers are unstable in a way paid registries are not. Programs open, close, change terms, or quietly stop approving applications. Planning around them means treating the domain as a replaceable pointer, not as permanent infrastructure.
The 2026 situation, based on what actually happened over the past couple of years:
- eu.org still works and is still free, but manual review can take months. It is fine for a project you are just starting; it is not a tool for a site that needs to be live this week.
-
DigitalPlat's
.us.kgand.xx.kgpaused new registrations after abuse problems. Existing domains kept resolving, but you could not onboard. -
.qzz.io, also run under the DigitalPlat umbrella, moved to paid-only. -
dpdns.orgstayed open for new registrations and became the default choice for people who needed a free subdomain quickly.
The pattern is obvious: subdomain programs are cheap to launch and expensive to police. Expect any free suffix to have a finite lifespan. The engineering response is to make migration cheap, which is what most of this post is about.
Why dpdns.org Became the Default
dpdns.org is a subdomain service, not a registrar. You get something like yourname.dpdns.org, and the provider runs the authoritative nameservers for the zone. You control the records beneath your label.
What makes it usable for static hosting:
- New registrations are open, so you can get a name in minutes rather than months.
- You can delegate to external nameservers if you want, which matters if you already run DNS elsewhere.
- It works with GitHub Pages, Cloudflare Pages, Netlify, and Vercel without special handling, because those platforms only care about a CNAME pointing at their edge.
- HTTPS works through the hosting platform's certificate automation, so you do not need to manage TLS for the subdomain yourself.
The trade-offs are the same as any free subdomain. You do not own the name. The zone owner can change rules. There is no EPP transfer, so you cannot move the domain to another registrar—only the records inside it. And whois is essentially meaningless: the registrant is the provider, and your identity lives only in their control panel.
That is acceptable for a portfolio, a documentation mirror, or a demo site. It is not acceptable for anything where losing the hostname breaks users, email, or payments.
The DigitalPlat Registration Flow
The flow is short, but the DNS step is where people get stuck.
1. Register the label
Sign in to the DigitalPlat panel, pick the suffix (dpdns.org), and enter the label you want. Registration is effectively first-come-first-served, so short labels go fast. Once accepted, the subdomain appears in your dashboard.
At this point the domain exists but resolves to nothing useful. You have to point it somewhere.
2. Choose between provider DNS and external nameservers
Two paths:
- Use DigitalPlat's nameservers. You add A, AAAA, or CNAME records in their panel. Simplest option, and fine for a single static site.
- Delegate to external nameservers. You set NS records for your subdomain to, say, Cloudflare's nameservers, then manage everything there. More control, and it makes the next migration easier because your records live in a zone you can export.
For static sites, the second path is worth the extra ten minutes. Keeping records in a zone you control means that when dpdns.org changes terms, you only need to repoint the NS delegation—your A records, CNAMEs, and TXT records stay put.
3. Point the records at your host
For GitHub Pages, the pattern is a CNAME from your subdomain to <user>.github.io, plus the custom domain set in the repository settings. For Cloudflare Pages or Netlify, it is a CNAME to the project's assigned hostname. Either way, the record is a single CNAME and the platform handles the certificate.
If you are delegating to external nameservers, you create that CNAME in the external zone, not in the DigitalPlat panel. Doing it in both places causes conflicting answers and confusing propagation behavior.
4. Verify resolution before you announce anything
Do not trust the panel's "active" status. Query the authoritative servers directly:
import dns.resolver
def check_subdomain(name: str, record_type: str = "CNAME") -> None:
"""Query the authoritative chain for a subdomain and print what it returns."""
resolver = dns.resolver.Resolver(configure=False)
resolver.nameservers = ["1.1.1.1", "8.8.8.8"]
resolver.lifetime = 5.0
try:
answers = resolver.resolve(name, record_type)
except dns.resolver.NoAnswer:
print(f"{name} {record_type}: no answer")
return
except dns.resolver.NXDOMAIN:
print(f"{name}: NXDOMAIN")
return
for rdata in answers:
print(f"{name} {record_type} -> {rdata}")
check_subdomain("yourname.dpdns.org", "CNAME")
If you delegated NS records, also confirm the delegation itself took effect:
import dns.resolver
def check_delegation(name: str) -> None:
"""Print the NS records that the parent zone actually serves for a subdomain."""
resolver = dns.resolver.Resolver(configure=False)
resolver.nameservers = ["1.1.1.1"]
try:
for ns in resolver.resolve(name, "NS"):
print(f"NS: {ns.target}")
except dns.resolver.NoAnswer:
print(f"{name}: no NS records served by parent")
check_delegation("yourname.dpdns.org")
If the NS query returns nothing, the delegation has not propagated or was never saved. Fix that before touching anything downstream—a CNAME in a zone nobody is querying will never resolve.
What You Give Up
Be explicit about the costs, because they shape how you should use these domains.
Stability risk. The zone owner can change policy at any time. .qzz.io going paid-only is the concrete example; .us.kg pausing registrations is another. Your domain is not a contract, it is a courtesy.
No whois control. The registrant record belongs to the provider. You cannot prove ownership through whois, which rules out some verification workflows and makes disputes unwinnable.
No transfer. There is no EPP code, so you cannot move the name to another registrar. Migration means registering a new name and repointing traffic.
Certificate and email constraints. Let's Encrypt issuance works fine for the web hostname, but you should not build email on a free subdomain. SPF, DKIM, and DMARC on a name you do not own is a deliverability problem waiting to happen.
Search and reputation. Shared suffixes carry the reputation of everyone else on them. A subdomain on a suffix with heavy abuse gets treated worse by filters and some mail systems.
None of this is a reason to avoid free domains for hobby work. It is a reason to keep the domain layer thin, documented, and easy to swap.
Migration Checklist for Near-Zero Downtime
The goal is to move from old-free-domain to new-free-domain without a visible gap for visitors. The trick is to run both names in parallel for a while and cut over only when the new one is fully verified.
1. Register the new name and set up records first
Register the new subdomain and configure its records to point at the same origin as the old one. Your host should accept both hostnames—GitHub Pages and Cloudflare Pages both let you attach multiple custom domains to one project, which is what makes this painless.
2. Verify the new name end to end
Check DNS, then check HTTPS and content:
import ssl
import urllib.request
def verify_site(url: str, expected_marker: str) -> bool:
"""Fetch a URL with certificate validation and confirm a marker string is present."""
ctx = ssl.create_default_context()
try:
with urllib.request.urlopen(url, context=ctx, timeout=10) as resp:
body = resp.read().decode("utf-8", errors="replace")
status = resp.status
except Exception as exc:
print(f"{url}: FAILED ({exc})")
return False
ok = status == 200 and expected_marker in body
print(f"{url}: status={status} marker_found={expected_marker in body}")
return ok
verify_site("https://newname.dpdns.org", "your-site-title")
Do not skip this. A CNAME that resolves but serves a certificate error or a 404 from the wrong project is worse than a domain that has not propagated yet.
3. Audit the old domain for hardcoded references
Anything that embeds the old hostname needs updating: canonical tags, Open Graph URLs, sitemap entries, RSS feeds, API base URLs in frontend code, and webhook callbacks. A quick scan over a built static site:
from pathlib import Path
OLD = "oldname.dpdns.org"
NEW = "newname.dpdns.org"
def find_references(root: str) -> None:
"""Scan built output for the old hostname and report file and line."""
for path in Path(root).rglob("*"):
if not path.is_file() or path.suffix not in {".html", ".xml", ".json", ".js", ".css"}:
continue
try:
text = path.read_text(encoding="utf-8", errors="ignore")
except OSError:
continue
for lineno, line in enumerate(text.splitlines(), start=1):
if OLD in line:
print(f"{path}:{lineno}: {line.strip()[:120]}")
find_references("public")
Fix these in source, rebuild, and redeploy. If you rely on canonical URLs for search indexing, update them before the cutover so the new domain is the one being indexed.
4. Keep the old domain alive as a redirect
Leave the old records in place and configure your host to redirect the old hostname to the new one with a 301. This preserves inbound links and search signals. On GitHub Pages you get this by keeping both custom domains attached and adding a redirect at the edge; on Cloudflare you can do it with a redirect rule.
5. Cut over traffic sources
Update anything you control that points at the old name: bookmarks in docs, links in README files, profile URLs, and any CI jobs that curl the site for smoke tests. This is the slow part, and it is why step 4 matters—the redirect covers the tail.
6. Retire the old name later, not immediately
Keep the redirect for at least a few months. Free domains can be reclaimed if the provider changes policy, so do not assume the redirect will live forever. The point is to make the new name fully self-sufficient before the old one disappears.
Keeping the Next Migration Cheap
Two habits make all of this much easier:
- Put records in a zone you control. Delegate NS from the free subdomain to a DNS provider you can export from. When the suffix changes, you repoint one delegation instead of rebuilding every record.
- Never hardcode the hostname. Use a single config value for the site origin and derive canonical URLs, sitemaps, and feeds from it. The scan script above exists because this rule gets broken; a build-time constant means it only has to be changed once.
Free domains are a reasonable choice for hobby infrastructure as long as you treat them as a pointer you can move. The providers will keep changing; your build process should not care.
More notes like this ship every week on this site.
Daily Picks
The following pairs are selected from the multi-timeframe trend scanner (Gate.io futures) and are for technical-analysis study only — not investment advice.
Data updated: 2026-10-21 08:46:52
Short
| Pair | Signal | Price | Take Profit | Stop Loss | R/R |
|---|---|---|---|---|---|
| JCT | 热点跟涨 | $0.0047 | $0.0043 | $0.0048 | 1:1.9 |
1 picks selected. Scanner runs every 15 minutes.
Top comments (0)