[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-95859":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":38,"readmeContent":39,"aiSummary":40,"trendingCount":16,"starSnapshotCount":16,"syncStatus":41,"lastSyncTime":42,"discoverSource":43},95859,"runs-on.dev","zordhalo\u002Fruns-on.dev","zordhalo","Grab your own cool'runs-on.dev' subdomain to use for free forever.","https:\u002F\u002Fruns-on.dev",null,"JavaScript",132,41,103,7,0,23,4.87,"Other",false,"main",true,[24,25,26,27,28,29,30,31,32,33,34,35,36,37],"cloudflare","dev","developer","dns","domains","foss","free","free-domain","free-for-dev","free-for-developers","github-pages","oss","subdomains","website","2026-09-21 02:04:28","\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fruns-on.dev\">\n    \u003Cpicture>\n      \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fruns-on.dev\u002Fopengraph-image\">\n      \u003Cimg src=\"https:\u002F\u002Fruns-on.dev\u002Fbanner-dark\" alt=\"runs-on.dev\" width=\"820\">\n    \u003C\u002Fpicture>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">runs-on.dev\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  Free subdomains for developers. Claim \u003Ccode>yourname.runs-on.dev\u003C\u002Fcode> in seconds,\n  then point it wherever you like.\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fruns-on.dev\">\u003Cb>Claim a name\u003C\u002Fb>\u003C\u002Fa>\n  &nbsp;·&nbsp;\n  \u003Ca href=\"https:\u002F\u002Fruns-on.dev\u002Fdocs\u002Fquickstart\">Quickstart\u003C\u002Fa>\n  &nbsp;·&nbsp;\n  \u003Ca href=\"https:\u002F\u002Fruns-on.dev\u002Fdocs\u002Fguides\">Guides\u003C\u002Fa>\n  &nbsp;·&nbsp;\n  \u003Ca href=\"https:\u002F\u002Fruns-on.dev\u002Fdocs\u002Frecords\">Records\u003C\u002Fa>\n  &nbsp;·&nbsp;\n  \u003Ca href=\"https:\u002F\u002Fruns-on.dev\u002Fpolicy\">Policy\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fzordhalo\u002Fruns-on.dev\u002Fstargazers\">\u003Cimg alt=\"stars\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fzordhalo\u002Fruns-on.dev?label=stars&color=1b4dff\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fzordhalo\u002Fruns-on.dev\u002Ftree\u002Fmain\u002Fdomains\">\u003Cimg alt=\"names claimed\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdirectory-file-count\u002Fzordhalo\u002Fruns-on.dev\u002Fdomains?type=file&extension=json&label=names%20claimed&color=1b4dff\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fzordhalo\u002Fruns-on.dev\u002Factions\u002Fworkflows\u002Ftest.yml\">\u003Cimg alt=\"tests\" src=\"https:\u002F\u002Fgithub.com\u002Fzordhalo\u002Fruns-on.dev\u002Factions\u002Fworkflows\u002Ftest.yml\u002Fbadge.svg\">\u003C\u002Fa>\n  \u003Ca href=\".\u002FLICENSE\">\u003Cimg alt=\"license: AGPL-3.0\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-AGPL--3.0-informational\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\nClaiming a name writes one file to this repository. That file is the record. It is the only\nthing that makes the name resolve, and you can read it without asking anyone.\n\n```json\n{\n  \"name\": \"yourname\",\n  \"owner\": { \"github\": \"yourname\" },\n  \"claimedAt\": \"2026-01-01T00:00:00.000Z\",\n  \"records\": {}\n}\n```\n\nThere is no hidden database. The registry is this directory, the history is the git log, and\nthe rules are in `lib\u002F`.\n\n## Why this exists\n\nA real top-level domain means an ICANN application. The 2026 round's\nevaluation fee alone is $227,000, before you've built or run a registry to\nback it. That's not a plausible way to get a custom-looking address for a\nside project.\n\n`runs-on.dev` gets the same feeling: a distinctive ending instead of\n`vercel.app` or `github.io`, for the price of one domain, about $10 a\nyear, by giving away subdomains under it. This is a subdomain registry,\nnot a TLD. Every name you claim lives under `runs-on.dev`, which Advance\nLabs registered and is responsible for. Saying that plainly, instead of\ndressing it up as something bigger, is the whole basis for trusting it.\nThere's prior art doing exactly this: [is-a.dev](https:\u002F\u002Fwww.is-a.dev),\n[js.org](https:\u002F\u002Fjs.org), [eu.org](https:\u002F\u002Feu.org).\n\n## Claim a name\n\nGo to [runs-on.dev](https:\u002F\u002Fruns-on.dev), sign in with GitHub, and type\nthe name you want. If it's available, claiming it writes a record to\n`domains\u002F\u003Cname>.json` in this repo, as shown above, and the name is live\nwithin seconds. One name per GitHub account. See\n[docs\u002Fclaiming.md](.\u002Fdocs\u002Fclaiming.md) for eligibility rules, the\nper-account limit, and why they exist.\n\n## Point it at your own hosting\n\nBy default a claimed name serves a small profile card built from your\nGitHub account. To point it at your own site, forward email, or a plain\nredirect instead, there are two ways to change its record.\n\n**From the site.** Sign in and open\n[runs-on.dev\u002Fmanage](https:\u002F\u002Fruns-on.dev\u002Fmanage). Pick a record type, fill\nit in, and save. That writes a commit to `domains\u002F\u003Cname>.json` in this\nrepository, exactly as a merged pull request would, and DNS follows within\nseconds. The form offers the record types in the combinations DNS actually\npermits, so it cannot build a record the schema would reject.\n\n**By pull request.** Still supported, and the right choice when you want the\nchange reviewed before it lands:\n\n1. Fork this repo.\n2. Edit `domains\u002F\u003Cname>.json`, adding a record under `records` (and\n   optionally `subdomains`, for a one-level-deep entry like `_atproto`).\n3. Open a pull request. CI validates the change against\n   [`schema\u002Frecord.schema.json`](.\u002Fschema\u002Frecord.schema.json); once it's\n   green and merged, a workflow pushes the record to DNS automatically.\n\nBoth paths enforce the same rules, from the same code in\n[`lib\u002Fedit.js`](.\u002Flib\u002Fedit.js): only the owner may change a record, and\n`owner`, `claimedAt`, and `name` are immutable once set.\n\n| Type | Shape | Coexistence |\n| --- | --- | --- |\n| `CNAME` | a hostname string | Alone: cannot sit next to `A`, `TXT`, or `MX`. |\n| `A` | 1+ IPv4 addresses | With `TXT`, `MX`. |\n| `TXT` | 1+ strings, up to 255 chars each | With `A`, `MX`. |\n| `MX` | 1 to 5 `{ priority, value }` entries | With `A`, `TXT`. |\n| `URL` | one absolute `http(s):\u002F\u002F` string | Alone: cannot sit next to anything, not allowed under `subdomains`. |\n\nNine hosting providers, a URL redirect, email forwarding, a Bluesky\nhandle, and Discord verification, each with the exact record to copy, are\nin [docs\u002Fguides.md](.\u002Fdocs\u002Fguides.md). The same walkthroughs render on the\nsite at `\u002Fdocs\u002Fguides\u002F\u003Cprovider>` with more detail per provider; the\nmarkdown file is the compact version for reading here.\n\nOnce a name serves your own site, [docs\u002Fseo.md](.\u002Fdocs\u002Fseo.md) covers what\nchanges when that site lives on a subdomain: `robots.txt` and sitemaps are\nper host rather than per domain, redirect names cannot rank, and a name\nneeds its own Search Console property.\n\n\u003Cdetails>\n\u003Csummary>Two worked examples\u003C\u002Fsummary>\n\nVercel, the shortest path from claim to a live custom domain:\n\n```json\n\"records\": { \"CNAME\": \"cname.vercel-dns.com\" }\n```\n\nAdd `you.runs-on.dev` as a custom domain on the Vercel project; it shows\nyou this same CNAME target.\n\nA Bluesky handle, which needs no hosting at all, just a subdomain entry:\n\n```json\n\"subdomains\": {\n  \"_atproto\": { \"TXT\": [\"did=did:plc:abc123\"] }\n}\n```\n\nFull record reference, the `subdomains` grammar, and why `CNAME` can't\ncoexist with anything else: [docs\u002Frecords.md](.\u002Fdocs\u002Frecords.md).\n\n\u003C\u002Fdetails>\n\n## How it works\n\nA single wildcard `*.runs-on.dev` DNS record points every possible\nsubdomain at one Vercel project, so an unclaimed or record-less name still\nresolves with a valid HTTPS certificate and gets served the profile-card\npage. Claiming a name is therefore a git commit, not a DNS write. Pointing\na name at your own hosting merges a record into `domains\u002F\u003Cname>.json`, and\na GitHub Actions workflow pushes that exact record to Vercel's DNS API on\nmerge, which then takes priority over the wildcard for that one name. More\ndetail, including the two write paths and the token split, in\n[docs\u002Farchitecture.md](.\u002Fdocs\u002Farchitecture.md).\n\n## The rules\n\nEverything CI checks on a `domains\u002F**` pull request, so you can verify a\nPR yourself before opening it:\n\n- One file per pull request.\n- The path must match `domains\u002F\u003Cname>.json`, matching\n  `^domains\u002F([a-z0-9-]+)\\.json$`.\n- Renaming a record is refused outright. Claim a new name instead.\n- `owner` and `claimedAt` are immutable once set; only the recorded owner\n  may edit or remove a record.\n- New names may be claimed either on the site or by pull request. Both\n  paths apply the same gates: the record must name its own author as\n  owner, the name must not be reserved, the account must be at least 30\n  days old with one public repository, and it must not already hold a\n  name.\n- An owner may delete their own record by pull request; a maintainer can\n  do the same under [POLICY.md](.\u002FPOLICY.md).\n\nSee [`lib\u002Fpr.js`](.\u002Flib\u002Fpr.js) for the implementation CI actually runs,\nand [docs\u002Fcontributing.md](.\u002Fdocs\u002Fcontributing.md) for the full breakdown\nof what it checks.\n\n\u003Cdetails>\n\u003Csummary>Self-hosting\u003C\u002Fsummary>\n\nThis is an open registry, not a hosted product with a private backend.\nRunning your own copy under a domain you own means:\n\n- Fork this repo and rename it; `REGISTRY_REPO` in `.env.example` points\n  at wherever the fork lives.\n- Register your own domain, point a wildcard record at your deployment,\n  and add it to Vercel (or adapt `scripts\u002Fsync-dns.mjs` and `lib\u002Fdns.js`\n  for a different DNS provider).\n- Change `ROOT` in `proxy.js` and the hostname literals in `app\u002Fpage.jsx`\n  and `app\u002Fsites\u002F[name]\u002Fpage.jsx` from `runs-on.dev` to your domain.\n- Create your own GitHub OAuth app and set `GITHUB_CLIENT_ID` \u002F\n  `GITHUB_CLIENT_SECRET`.\n- Review `data\u002Freserved-*.json` and adjust `lib\u002Feligibility.js` for your\n  own abuse tolerance.\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Local development\u003C\u002Fsummary>\n\n```bash\nnpm install\nnpm run dev\n```\n\nThe claim flow needs a signed-in GitHub session, and the session and\nOAuth cookies are set `Secure` (see `app\u002Fapi\u002Fauth\u002Fgithub\u002Froute.js` and\n`...\u002Fcallback\u002Froute.js`). A `Secure` cookie is dropped by the browser over\nplain HTTP, so the GitHub sign-in flow cannot be exercised on\n`http:\u002F\u002Flocalhost`. This is correct for production: `runs-on.dev` is on\nthe HSTS preload list, so it's always HTTPS there, and a cookie that only\never travels over HTTPS shouldn't get a `Secure`-free code path just for\nlocal convenience.\n\nTo exercise sign-in locally, serve the app over HTTPS with a\nlocally-trusted certificate,\n[mkcert](https:\u002F\u002Fgithub.com\u002FFiloSottile\u002Fmkcert) being the simplest way:\n\n```bash\nmkcert -install\nmkcert localhost\n```\n\nThen run `next dev` behind a TLS-terminating proxy pointed at it, and set\n`APP_ORIGIN` to the `https:\u002F\u002F` URL you're serving from so the OAuth\nredirect URI matches. Everything that doesn't touch sign-in, name\nvalidation, schema checks, the blocklist, the record UI, works over plain\n`http:\u002F\u002Flocalhost` without any of this. See\n[.env.example](.\u002F.env.example) for every variable the app reads.\n\n\u003C\u002Fdetails>\n\n## Star the registry\n\nEvery name claimed here is one commit in this repo, authored under the\nclaimant's own GitHub account. If you have a name, you're already in the log —\na star keeps the registry easy for the next person to find.\n\n## Contributing\n\nBug fixes, blocklist additions, and doc improvements are welcome. See\n[docs\u002Fcontributing.md](.\u002Fdocs\u002Fcontributing.md) for how to add to the\nblocklists, run the tests, and what CI checks.\n\n```bash\nnpm install\nnpm test\n```\n\n## License\n\nThe code in this repository is [AGPL-3.0 licensed](.\u002FLICENSE). It is a network\nservice, so section 13 applies: run a modified copy and let other people use it\nover a network, and you owe those users your source. Using the registry, or\nclaiming a name, carries no such obligation — this binds people who fork and\nhost the software, not people who point a subdomain at their site.\n\nUp to commit `3492bf7` the code was MIT, and that grant still stands for the\ncode as it was then; see [NOTICE](.\u002FNOTICE).\n\nThe bundled profanity blocklist (`data\u002Freserved-words.json`) is seeded from\n[LDNOOBW\u002FList-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words](https:\u002F\u002Fgithub.com\u002FLDNOOBW\u002FList-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words)\n(English list) and keeps its own\n[CC BY 4.0](https:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby\u002F4.0\u002F) license; see\n[data\u002FREADME.md](.\u002Fdata\u002FREADME.md).\n\n## Credits\n\nThe idea of giving away free subdomains under one registered domain isn't\nnew; credit to [is-a.dev](https:\u002F\u002Fwww.is-a.dev) for the prior art, and to\n[js.org](https:\u002F\u002Fjs.org) and [eu.org](https:\u002F\u002Feu.org) for more of it.\n\n---\n\nOperated by [Advance Labs](https:\u002F\u002Fadvancelabs.dev), which registered\n`runs-on.dev` and is the party responsible for what runs under it. See\n[POLICY.md](.\u002FPOLICY.md).\n","runs-on.dev 是一个面向开发者的免费子域名注册服务，允许用户永久免费申领并使用 yourname.runs-on.dev 格式的个性化子域名。其核心采用 Git 托管的声明式注册机制：每个子域名对应一个公开的 JSON 记录文件，无中心化数据库，解析规则由 Cloudflare DNS 驱动，支持自定义 CNAME\u002FA 记录。项目开源透明，注册即写入 GitHub 仓库，历史可追溯、规则可审计。适用于个人项目展示、技术博客、静态网站托管（如 GitHub Pages）、开源工具演示等轻量级 Web 发布场景，为开发者提供比 vercel.app 或 github.io 更具辨识度的免费域名方案。",2,"2026-09-05 02:30:03","CREATED_QUERY"]