Should I self-host Bitly?
$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 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
short links on a custom domain · click analytics · QR codes · link management API
* Percent of the subscription price. Your time is priced at the slider's rate — $0/h ("my homelab time is free and I love it") is a legitimate position. Every number is derived from the record, never hand-written. Price source, checked 2026-08-05.
Runs comfortably on a Raspberry Pi.


Shlink wants DEFAULT_DOMAIN set at first boot; changing it later means regenerating existing short URLs
# 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.
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.