Free subdomains for apps · open source · zero servers

your-app-name .is-my.app

Your app deserves a real URL. Point it at wherever it already runs, or hand us an open-source repo and we build and ship it. One JSON file. One pull request. Live.

How it works

One file.
One PR.
Live.

01

Name your app in JSON

Add domains/your-app-name.json: who owns it and where it runs. That is the whole application.

domains/pomodoro.json
{
  "owner": { "github": "jn-aman" },
  "description": "a focus timer",
  "records": {
    "CNAME": "jn-aman.github.io"
  }
}
02

Open a pull request

A bot checks the schema, confirms you own the GitHub account, and that the name is free. Valid PRs merge themselves in seconds.

Pull request #42
Claim pomodoro.is-my.app open
  • Schema is valid
  • Owner matches PR author @jn-aman
  • pomodoro is available
  • Target jn-aman.github.io resolves
Auto-merged
03

Merged. Your app is live.

CI writes your DNS on Cloudflare, or builds your repo and ships it to the edge. No tickets, no waiting on a human.

~ zsh
$ dig +short pomodoro.is-my.app
jn-aman.github.io.
185.199.108.153
$ curl -sI https://pomodoro.is-my.app | head -1
HTTP/2 200
 live on the edge in 38s
$0forever. Really.
<60sfrom merge to live DNS
330+edge cities serving your site
1pull request. That is it.

Two ways to use it

Point it. Or ship it.

Mode 01

Point

Your app already runs on GitHub Pages, Vercel, Netlify, Cloudflare Pages or your own box? Add a CNAME, A, AAAA, MX or TXT record and it resolves in under a minute.

"records": { "CNAME": "you.github.io" }
  • Bring any host
  • Email and verification records
  • Optional Cloudflare proxy
Mode 02

Deploy

No hosting at all? Give us your app's public GitHub repo, a build command and an output folder. We build it in an isolated container and serve it from Cloudflare's edge. Push to your branch and it redeploys.

"deploy": { "repo": "you/site", "build": "npm run build", "output": "dist" }
  • Any static framework
  • Automatic HTTPS
  • Auto redeploy on push

Recipes

Wherever your app runs, one file.

domains/pomodoro.json

          

No servers to rent. No bills to pay. No forms to fill. Just a JSON file, a pull request, and a real address for the app you just shipped.

Claim a name

Name your app. We will write the PR.

GitHub will fork the repo for you and prefill domains/your-app-name.json. Just hit Propose changes. Prefer the terminal? See the CLI flow.

domains/your-app-name.json

Reference

The whole API is one file.

schema/domain.schema.jsonsource
KeyTypeWhat it does
owner.githubstringYour GitHub username. Must match the author of the pull request.
descriptionstringOne line about your app, shown on this site.
records point it
records.CNAMEstringHost to alias to. Cannot be mixed with other types.
records.Astring[]Public IPv4 addresses, up to 10.
records.AAAAstring[]Public IPv6 addresses, up to 10.
records.MXarrayMail servers, as hostnames or { target, priority }.
records.TXTstring | string[]Verification and SPF values.
proxiedbooleanServe through Cloudflare for free HTTPS and caching.
deploy ship it
deploy.repostringPublic repo as owner/name. Required.
deploy.branchstringBranch to build. Default main.
deploy.buildstringBuild command. Empty means the files are already static.
deploy.outputstringFolder with the built app. Default .
deploy.rootstringFolder the build runs in, for monorepos.
deploy.nodestringNode.js version for the build. Default 22.

What the bot checks

  • App names use a-z, 0-9 and hyphens, up to 63 characters.
  • Up to 5 apps and 50 DNS records per GitHub account. The account must be 14 days old.
  • Nested names like api.my-app are DNS only, and need you to own my-app.
  • Hosted apps and proxied need a top-level name.
  • Builds get 15 minutes, 20,000 files and 25 MiB per file. Static output only.
  • Use either records or deploy, never both.
Prefer the terminal
$ gh repo fork jn-aman/is-my.app --clone
$ cd is-my.app && git switch -c pomodoro
$ cat > domains/pomodoro.json <<'EOF'
{ "owner": { "github": "you" },
  "records": { "CNAME": "you.github.io" } }
EOF
$ npm run validate
6 domain file(s) checked: 0 error(s), 0 warning(s)
$ git add domains && git commit -m "Claim pomodoro"
$ gh pr create --fill
✓ validated, auto-merged, live in about a minute
GET is-my.app/domains.jsonopen
$ curl -s https://is-my.app/domains.json \
    | jq '.domains[] | select(.kind == "deploy")'
{
  "name": "tetris",
  "owner": "jn-aman",
  "description": "Tetris in the browser",
  "kind": "deploy",
  "target": "jn-aman/tetris"
}

The full registry as JSON, rebuilt on every merge. Build a badge, a bot or a directory on top of it.

The registry

00 apps and counting.

Questions

Good questions.

Is it actually free?

Yes. DNS runs on Cloudflare's free plan and builds run on GitHub Actions, which is free for public repositories. There is nothing to bill you for.

How fast does it go live?

Valid pull requests merge themselves. DNS is written within a minute of the merge. Hosted apps take as long as your build, usually one or two minutes.

My app is on Vercel, Netlify or GitHub Pages. Anything special?

Add your-app-name.is-my.app as a custom domain on your host first, then point a CNAME at the target it gives you. The recipes have the exact file for each host.

What can the deploy mode build?

Any app that produces static files: Vite, React, Svelte, Astro, Next static export, Hugo, Jekyll, plain HTML. Builds run in a node container with no secrets, get 15 minutes, up to 20,000 files and 25 MiB per file. We check your branch every hour and redeploy when it moves.

Do I get HTTPS?

Always. In deploy mode Cloudflare issues the certificate for you. In point mode your host issues it, just like any custom domain.

How many apps can I have?

Up to five apps per GitHub account, plus nested names under them, with up to 50 DNS records in total. Your account needs to be at least two weeks old.

Can I use a nested name like api.my-app?

Yes, for DNS records, as long as you own my-app. Hosted apps and the Cloudflare proxy need a top-level name, because Cloudflare's free certificate covers one level of subdomain.

What is not allowed?

Phishing, malware, spam, impersonation, anything illegal. Names that break the rules are removed without notice. Read the terms.