A single-file, zero-build portfolio page for domain investors.
Drop in a JSON file, push, done. No framework, no bundler, no backend β just one index.html and your domains.json. Free open-source alternative to Carrd, Linktree, and marketplace seller pages.
Live demo Β· Quick start Β· Schema Β· Deploy Β· domainer
Domain investors who want a public "here's what I'm holding / selling" page have bad options:
| Option | Problem |
|---|---|
| Marketplace seller page (Sedo, Afternic) | Locked to their platform, their branding, their commission |
| Carrd / Linktree | Monthly fee, not domain-aware, no tags/BIN/status |
| Hand-rolled site | Build step, framework churn, hosting setup |
domain-portfolio is the boring-on-purpose answer: a single HTML file that reads a JSON file. Fork it, edit domains.json, push to any static host. That's the whole product.
- πͺΆ One file.
index.htmlβ vanilla JS, no dependencies, nonpm install. - π JSON-driven. Your portfolio is
domains.json. Diff-friendly, scriptable, AI-friendly. - π· Domain-aware. Tags become filter chips. BIN price, status (active / for-sale / sold), inquiry mailto.
- π Dark mode out of the box (respects
prefers-color-scheme). - π Deploy anywhere. GitHub Pages workflow included; works on Cloudflare Pages, Netlify, Vercel, or
python3 -m http.server. - π Pairs with domainer. Pipe
domainer exportstraight intodomains.json. - π MIT. Fork it, theme it, sell services around it.
# 1. Use this template (or fork)
gh repo create my-domains --template kwkuh/domain-portfolio --public --clone
cd my-domains
# 2. Edit your portfolio
$EDITOR domains.json
# 3. Push β GitHub Pages auto-deploys (Settings β Pages β Source: GitHub Actions)
git commit -am "my portfolio" && git pushLocal preview, zero install:
python3 -m http.server 8000 # β http://localhost:8000domains.json is the only file you edit:
No other file needs touching. index.html fetches domains.json at runtime and renders.
If you run domainer (the open-source domain-ops bot/CLI), keep this page in lockstep with your real portfolio:
domainer export --format=json > domains.json
git commit -am "sync portfolio" && git pushAutomate it with the included .github/workflows/sync.yml.example (scheduled pull from a domainer HTTP endpoint).
| Host | How |
|---|---|
| GitHub Pages | Included workflow β Settings β Pages β Source: GitHub Actions |
| Cloudflare Pages | npx wrangler pages deploy . |
| Netlify | Drag the folder into the dashboard, or connect the repo |
| Vercel | vercel --prod (no framework preset needed) |
| Any web host | Upload index.html + domains.json |
- JSON-driven render, tag filters, dark mode
- GitHub Pages auto-deploy
- Per-domain detail page (
/example.com) - Theme variants (terminal, minimal, card-grid)
- Optional OG image generation per domain
- Offer/counter form (Formspree/Web3Forms adapter)
- i18n strings
PRs welcome. The constraint that defines this project: it stays a single index.html with zero runtime dependencies. No framework, no build step, no tracker. Theme variants and adapters are fine; a bundler is not.
MIT β fork it, theme it, make it yours.
{ "owner": { "name": "Your Name", "handle": "@yourhandle", "telegram": "yourhandle", // optional β Telegram link "email": "you@example.com", // optional β inquiry mailto "github": "yourhandle", // optional β GitHub link "tagline": "Short bio line." }, "domains": [ { "name": "example.com", "bin": 2500, // optional, USD β shows a price chip "tags": ["ai", "brandable"], // any strings β become filter chips "status": "for_sale" // active | for_sale | sold } ] }