One page holding every link you want to point people at from a social profile. You add links, pick a theme, and it gives you a short address to put in a bio.
Build me a link-in-bio page that replaces Linktree: one address that holds everything I want people to reach, on my own domain, with click numbers I can actually see. STACK - Node 20+ with Fastify, server-rendered HTML, almost no JavaScript - SQLite through better-sqlite3, WAL mode - Caddy in front for TLS on a custom domain - The public page must render in under 200ms and weigh under 50KB with the avatar THE DATA MODEL - pages: id, slug, title, bio, avatar_path, theme_json, custom_domain, is_published, seo_json - links: id, page_id, position, kind, label, url, icon, is_active, starts_at, ends_at, clicks_cached - link_schedules: a link that appears only between two dates, or only on certain weekdays - clicks: id, link_id, created_at, referrer_host, country, device, ip_hash, bot - views: id, page_id, created_at, referrer_host, country, device, ip_hash, bot - socials: id, page_id, network, url, position — the row of icons, separate from the stack of buttons - Link kinds: link, header, embed, email capture, product. Each renders differently and the kind is a column, not a guess THE PUBLIC PAGE - Avatar, name, one line of bio, a row of social icons, then the buttons - Every button is a real anchor: it works with JavaScript off, and a long press offers 'copy link' like any other link - Redirect through /go/:id so a click is recorded, then a 302 to the destination. Record after the response, never before it - The page is regenerated to static HTML on every edit and served from disk. An outage of the admin must not take the page down - Open Graph tags and a generated preview card, so the page itself looks like something when it is shared - No cookie banner because there are no cookies APPEARANCE WITHOUT A THEME SHOP - A theme is: background (colour, gradient or image), button shape, button fill, font pairing from a small self-hosted set, and text colour. Nothing else - Contrast is checked when the theme is saved: a theme that puts 3:1 text on its background is refused with an explanation, because the point of the page is being read - Dark and light variants of the same theme, following the visitor's system setting unless the owner pins one SCHEDULING AND EXPIRY - A link can start and end at a time. An expired link disappears from the page rather than 404ing after the click - A link can be hidden without deleting it, keeping its click history - Reorder by dragging in the admin, and the order is a column, not the row id THE NUMBERS - Per link: clicks, unique visitors, click-through rate against page views - Per page: views, unique visitors, top referrers, countries, devices - A 'unique visitor' is a distinct salted hash of address and user agent within the window, and the page says so - Bots recorded with a flag and excluded from the published figures - Windows: today, 7 days, 30 days, all time. Computed at query time, no aggregate tables - Export to CSV CAPTURING SOMETHING - An email capture block: a field, a button, a stored address, with double opt-in off by default and a one-click unsubscribe that needs no login - A product block: image, title, price, and a link to wherever it is actually sold. No payments here — this page is a signpost, not a shop CUSTOM DOMAIN - Point a CNAME, and Caddy gets a certificate on demand - A verification step so somebody cannot claim a domain they do not control - The default subdomain keeps working and redirects to the custom one THE ADMIN - One screen: the page as it will look on the left, the list of links on the right, edits applied live - Nothing more than: add link, edit, reorder, hide, schedule, theme - Login by email link or password, and one account per page unless you need more OPERATIONS - .env: DATABASE_PATH, BASE_URL, HASH_SALT, SESSION_SECRET, SMTP_URL - Migrations on boot, each once - Nightly backup off the machine, restore script tested - Health endpoint that checks the database and the static page's freshness WHAT MATTERS MOST The public page is the product and it must never be slow, never be down, and never require JavaScript. Build the static generation and the redirect counter first, put it on a real phone on a bad connection, and only then build the admin around it. Give me the repository, migrations, .env.example, a seed page with six links, and a README with deploy steps behind Caddy including the custom-domain setup.
What you lose
- A page that is live thirty seconds after signing up, with no domain to buy or DNS to point
- Themes that look designed, without opening a stylesheet
- Click counts per link, and a scheduler that shows or hides a link on a date
- The linktr.ee address itself, which is already printed in bios, videos and business cards
If you would rather not build
- A single HTML file, which is genuinely enough here
- Bio.link or Bento, if you would rather not host anything
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $5/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
LittleLink
$0A static link-in-bio page you host yourself; no database at all.
sethcottle/littlelinkfree · open source
Linkstack
$0Self-hosted link page with an admin panel, for when more than one person needs to edit it.
LinkStackOrg/LinkStackfree · open source
Why this verdict
our own opinion · changed only by a person
90/100
Verdict yes at 90: this is a list of links. The honest caveat is not the build, it is that the old address is already in circulation and a redirect from it is not something you control.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Linktree
answered from the record above
Is Linktree free?
No — the plan we track is $5 a month. Starter at $5/month billed monthly, around $4 annually; the free tier covers a basic page.
Can you replace Linktree by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 90 out of 100, build time one session. Read what you lose before you decide.
How much does Linktree cost?
$5 a month on Starter — $60 a year. Recorded 9 Aug 2026.
What do you lose by replacing Linktree?
A page that is live thirty seconds after signing up, with no domain to buy or DNS to point; Themes that look designed, without opening a stylesheet; Click counts per link, and a scheduler that shows or hides a link on a date; The linktr.ee address itself, which is already printed in bios, videos and business cards. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Linktree?
Yes: LittleLink, Linkstack. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

