Should I self-host Instapaper?
wallabag archives the full page — not a bookmark, the page — and syncs to its mobile apps and Kobo/Kindle. The $72/yr was for exactly this.
Instapaper's typography polish and tilt-scrolling niceties
Their parser team chasing weird sites — wallabag's extractor occasionally needs a config nudge
save articles to read later · full-text archive that survives dead links · mobile/offline reading · tags & search
* 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 image's nginx config hard-binds [::]:80 and crash-loops on kernels booted with ipv6.disable=1 (our verification microVM) — this pair's compose boot is certified by the CI runner
First boot runs Symfony install + migrations and nginx answers nothing for minutes — a healthcheck without a generous start_period declares it dead while it's warming up
SQLite default is fine for one reader; switch to the postgres envs before inviting the household
# wallabag — read-it-later with full-page archiving (replaces Instapaper)
services:
wallabag:
image: wallabag/wallabag:latest
container_name: wallabag
restart: unless-stopped
environment:
SYMFONY__ENV__DOMAIN_NAME: http://localhost:8094
# SQLite default keeps it one container; use the postgres envs for real multi-user
ports:
- "8094:80"
volumes:
- wallabag-data:/var/www/wallabag/data
- wallabag-images:/var/www/wallabag/web/assets/images
healthcheck:
# First boot runs Symfony install + migrations before nginx answers — minutes, not seconds.
test: ["CMD-SHELL", "curl -sf http://localhost/api/info || curl -sf http://localhost/login || exit 1"]
interval: 10s
timeout: 5s
retries: 60
start_period: 180s
volumes:
wallabag-data:
wallabag-images:
Want a guided install instead? caniselfhostit.com/instapaper 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: Instapaper → wallabag **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 | ~13 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 | ~13 min | | **Total: ~40 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 image's nginx config hard-binds [::]:80 and crash-loops on kernels booted with ipv6.disable=1 (our verification microVM) — this pair's compose boot is certified by the CI runner - First boot runs Symfony install + migrations and nginx answers nothing for minutes — a healthcheck without a generous start_period declares it dead while it's warming up - SQLite default is fine for one reader; switch to the postgres envs before inviting the household ## Verdict-relevant notes - API + apps work against self-hosted out of the box (server URL in the app settings).