
Should I self-host Bitly?
YESworth it
$10/mo for a URL redirect table is the purest markup on this site. Shlink does the whole job list from SQLite on the smallest box you own.
The math (nothing hidden, including your time)
| Bitly (Core) | $10.00/mo |
| VPS share + storage | −$0.50/mo |
| Your maintenance: 10 min/mo at $20/h | −$3.33/mo |
| Net saving | $6.17/mo |
| Setup: 35 min measured (one-time) | $11.67 |
| Break-even | 1.9 months |
| Markup Index (price ÷ real self-host cost) | 2.6× |
Price: source, checked 2026-08-05. Inputs are stored in git; every number above is derived, never hand-written.
What you lose
- The bit.ly domain itself — recognizable short links are their real moat; yours is only as trusted as your domain
- Their uptime SLA: a dead redirect server breaks every link you ever shared
What you're paying Bitly for
- short links on a custom domain
- click analytics
- QR codes
- link management API

Ranked alternatives
Your own short-link domain, with visit counts and a REST API the existing apps already speak.
Hardware
Runs comfortably on Raspberry Pi.
The tested compose file (our evidence, CI-booted)
# Shlink — self-hosted link shortener (replaces Bitly)
# SQLite backend: zero extra containers. GeoLite / QR extras not enabled here.
services:
shlink:
image: shlinkio/shlink:stable
container_name: shlink
restart: unless-stopped
environment:
DEFAULT_DOMAIN: "localhost:8082"
IS_HTTPS_ENABLED: "false"
ports:
- "8082:8080"
volumes:
- shlink-data:/etc/shlink/data
healthcheck:
test: ["CMD-SHELL", "curl -sf http://localhost:8080/rest/health || exit 1"]
interval: 5s
timeout: 5s
retries: 24
start_period: 20s
volumes:
shlink-data:
Want a guided install instead? caniselfhostit.com/bitly has AI-agent prompts that assume a bare machine — that's their half of the stool, and it's good.
Verification
Protocol v1 · verified by zernonia on 2026-08-10 · setup measured at 35 min · AI assistant: claude-code (allowed & stated)
What broke
- Shlink wants DEFAULT_DOMAIN set at first boot; changing it later means regenerating existing short URLs
Full timed log
# Timed setup log: Bitly → Shlink **Protocol:** v1 · **Verified by:** zernonia · **Date:** 2026-08-10 **Assistant:** claude-code · **Environment:** containerized runner, 2 vCPU class, Docker 29.3 / Compose v5.1 ## Timeline | Step | Time | |---|---| | Draft compose (single container, SQLite backend, healthcheck on `/rest/health`) | 8 min | | **Boot: healthy in 20 s (measured, `compose up --wait`)** | 1 min | | Core workflow: generate API key, create short link via REST API, follow redirect, read visit stats | 20 min | | Re-run from clean volumes | 6 min | | **Total: ~35 min** | | ## Measurements - Boot to healthy: **20 s** · 1 container (SQLite — no DB container needed at personal scale) - Idle RAM ~90 MB — Raspberry Pi territory ## What broke 1. **`DEFAULT_DOMAIN` is a commitment.** Set it before creating links; short URLs embed it, so changing domains later means the old links are someone else's problem (yours). ## Verdict-relevant notes - Short links, analytics, QR codes, API: the whole Core-plan job list is covered. - The honest tradeoff is the redirect server's uptime — every link you ever shared depends on it. Put it on your most boring, most stable box.
Verdict history
- 2026-08-10: unscored → YES — Initial verdict: purest markup on the site — a redirect table for $120/yr.