links
Bitly logo

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-even1.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
Shlink running from the boot-verified compose file
Shlink, running from the compose file on this page — screenshot from our verified instance, not marketing material.

Ranked alternatives

Your own short-link domain, with visit counts and a REST API the existing apps already speak.

shlinkio/shlink · ★ 5,197 · last commit 5d ago · MIT

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.