vanityhost
Let customers bring their own domain.
Buy vanityhost for $99One payment of $99, plus sales tax where it applies, and every future update. Delivered as a private GitHub repository you're invited to.
See it work
vanityhost demo
vanityhost demo: a simulated host and a simulated customer, nothing leaves this machine.
claim 'localhost' -> refused: local
claim '10.0.0.5' -> refused: ip_address
claim 'rival.myapp.example.net' -> refused: platform_domain
claim '*.shop.example.com' -> refused: invalid_characters
claim 'help.example.com' -> accepted [pending_dns]. Show the customer:
TXT _vanityhost-challenge.help.example.com -> 55b37b31493047498afdb84fd484452b (ownership_verification)
CNAME help.example.com -> edge.host.example.net (routing)
polling every 30 seconds (simulated clock):
t= 0s pending_dns waiting for the ownership TXT record
t= 30s pending_dns waiting for the ownership TXT record
t= 60s dns_verified ownership TXT found
t= 60s host_registered registered with the host; waiting for DNS to point at it
t= 60s host_registered waiting for DNS to point at the host (poll 1)
t= 90s cert_pending DNS points at the host; certificate being issued
t= 90s active certificate issued; serving traffic
final state: active
transitions: pending_dns -> dns_verified -> host_registered -> cert_pending -> active
What it does
vanityhost runs bring-your-own-domain onboarding as one state machine: it refuses bad claims, shows the DNS records, verifies an HMAC ownership TXT, registers the domain with your host (Railway or Cloudflare for SaaS) and waits for the certificate.
- Claim guards
- Refuses your own domain and its subdomains, localhost, IP addresses, internal names, wildcards and malformed names, with a reason code for each.
- Ownership proof
- An HMAC token for each owner and domain, shown as a TXT record and checked as found, missing or mismatch. A resolver error counts as not yet, so a polling loop never crashes.
- Two host adapters
- Railway (GraphQL, with an account or project token) and Cloudflare for SaaS custom hostnames (REST), plus an in-memory simulated host. Both follow the vendors' documentation and are tested against stand-ins, not the live services, so try your credentials with a throwaway domain first.
- Never stuck, by default
- Every waiting stage has a timeout and registration has a retry limit, so with the default policy a record ends active, failed or disabled. A timeout set to None waits forever.
- Drive it your way
- From a cron job or a request handler. The clock, the sleep, the DNS lookup and the HTTP transport are arguments, so a whole onboarding runs in a test with no network.
- No dependencies
- Python standard library only: DNS-over-HTTPS TXT lookup, a JSON file store and a command line are included.
What you get
vanityhost 1.0.1: the Python package and the vanityhost command, the Railway, Cloudflare for SaaS and simulated host adapters, a JSON file store, a runnable example, and the full test suite, with 154 automated tests.
A commercial license. Use it and change it in your own projects and your clients' projects. Don't share or resell the source. Read the license.
Every update. New versions land in the same repository; git pull to get them.
Requirements
Python 3.10 or newer. Python 3.10 or newer. A Railway project or a Cloudflare for SaaS zone to go live with; none is needed for the demo and the tests.
How buying works
- Enter your GitHub username. You'll see the account before you pay, so you can check it's yours.
- Pay $99, plus any sales tax shown at checkout, on Stripe's checkout page.
- Accept the invitation GitHub emails you. Signed in as that account, you'll also find it at
github.com/dominares-tools/vanityhost/invitations. Invitations expire after 7 days; you can get a new one any time. - Clone and install:
git clone https://github.com/dominares-tools/vanityhost.gitPrivate repo: sign in to GitHub on this computer first. Run
gh auth loginand choose HTTPS, or give git a personal access token when it asks for a password. To use an SSH key instead, clonegit@github.com:dominares-tools/vanityhost.git.python3 -m venv .venv && . .venv/bin/activate pip install ./vanityhost
Questions
Do I need GitHub?
Yes. Access is a read-only invitation to a private repository, sent to the GitHub account you choose.
Can I get a refund?
Yes, within 14 days, no questions asked. Access ends when the refund goes through. Refund policy.
Who takes the payment?
Payments are handled by Stripe, which works out sales tax. Your receipt and card statement show Link (LINK.COM*), Stripe's checkout service.
Something wrong?
Email support@dominares.org. Every buyer of a tool shares its repository, so support happens by email rather than in GitHub issues.