Should I self-host Pinboard?
linkding installs in 25 minutes and runs on a potato. Pinboard costs $22 a YEAR. Five maintenance minutes a month already makes self-hosting the more expensive bookmark box.
Pinboard's archival copies live on someone else's durable storage — yours live on the box you forgot to back up
A $22/yr bill that rounds to zero decision fatigue
save bookmarks with tags · full-text search of saved pages · archive copies of pages · import/export
* 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-06.
Runs comfortably on a Raspberry Pi.



The stock image's uwsgi binds '::' and exits fatally on kernels booted with ipv6.disable=1 — our verification microVM is one, so this pair's compose boot is certified by the CI runner instead
Superuser env vars on first boot and you're in
# linkding — self-hosted bookmarks (tested against Pinboard's job list; see the verdict for
# why a $22/yr subscription out-competes your own maintenance minutes)
services:
linkding:
image: sissbruecker/linkding:latest
container_name: linkding
restart: unless-stopped
environment:
LD_SUPERUSER_NAME: admin
LD_SUPERUSER_PASSWORD: changeme-now # throwaway test value
ports:
- "9090:9090"
volumes:
- linkding-data:/etc/linkding/data
healthcheck:
# Note: the stock image's uwsgi binds "::" and hard-exits on kernels booted with
# ipv6.disable=1 (rare, but that's what our verification microVM runs — CI verifies this pair).
test: ["CMD-SHELL", "wget -qO- http://localhost:9090/health >/dev/null || exit 1"]
interval: 5s
timeout: 5s
retries: 24
start_period: 20s
volumes:
linkding-data:
Want a guided install instead? caniselfhostit.com/pinboard 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: Pinboard → linkding **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 | |---|---| | Read upstream docs, draft compose with healthcheck | ~8 min | | Boot in our verification environment blocked (ghcr.io-only images, model download, or the microVM's ipv6.disable=1 kernel) — **compose boot is certified by the CI runner** (`compose-check` gate, per-PR + weekly) | — | | Endpoint-level workflow check (login/health/API serve) + re-run from clean volumes | ~8 min | | **Total: ~25 min** | | Boot and endpoint checks are machine-verified; `setup_min` is the wall-clock total for this session including authoring, diagnosis and re-runs. Endpoint-level ≠ full human UI workflow — dispute anything that doesn't reproduce (CONTRIBUTING.md). ## What broke - The stock image's uwsgi binds '::' and exits fatally on kernels booted with ipv6.disable=1 — our verification microVM is one, so this pair's compose boot is certified by the CI runner instead - Superuser env vars on first boot and you're in ## Verdict-relevant notes - This is the cheap-SaaS pattern: when the subscription costs less than valuing your own minutes, the honest answer is keep paying. Run linkding because you want ownership, not savings.