
Should I self-host Instapaper?
YESworth it
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.
The math (nothing hidden, including your time)
| Instapaper (Premium) | $5.99/mo |
| VPS share + storage | −$0.50/mo |
| Your maintenance: 10 min/mo at $20/h | −$3.33/mo |
| Net saving | $2.16/mo |
| Setup: 40 min measured (one-time) | $13.33 |
| Break-even | 6.2 months |
| Markup Index (price ÷ real self-host cost) | 1.6× |
Price: source, checked 2026-08-06. Inputs are stored in git; every number above is derived, never hand-written.
What you lose
- Instapaper's typography polish and tilt-scrolling niceties
- Their parser team chasing weird sites — wallabag's extractor occasionally needs a config nudge
What you're paying Instapaper for
- save articles to read later
- full-text archive that survives dead links
- mobile/offline reading
- tags & search

Ranked alternatives
Saves the readable article, not the link, and hands it to the phone or e-reader you actually read on.
Hardware
Runs comfortably on Raspberry Pi.
The tested compose file (our evidence, CI-booted)
# 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.
Verification
Protocol v1 · verified by zernonia on 2026-08-10 · setup measured at 40 min · AI assistant: claude-code (allowed & stated)
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
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).
Verdict history
- 2026-08-10: unscored → YES — Initial verdict: wallabag archives the full page.