Skip to main content

Self-Host Wallabag: Read-Later & Article Archiver 2026

·OSSAlt Team
wallabagread-laterarticle-archiverself-hostingdockerpocket2026

TL;DR

Wallabag (MIT, ~10K GitHub stars, PHP) is a self-hosted read-later app and article archiver. Save articles from any website via browser extension, mobile app, or API — Wallabag fetches the full content, strips ads, and makes it available for offline reading. Pocket charges $4.99/month for Premium features; Instapaper is free but sends your reading list to their servers. Wallabag stores everything on your server with no subscription.

Key Takeaways

  • Wallabag: MIT, ~10K stars, PHP — read-later with full article content, tagging, and export
  • Browser extensions: Chrome, Firefox, Safari — save articles with one click
  • Mobile apps: iOS, Android — read offline, sync with server
  • EPUB/PDF export: Export articles or entire tag collections as ebooks
  • Annotations: Highlight text and add personal notes within saved articles
  • RSS feed: Every tag creates an RSS feed — use with Miniflux/FreshRSS

Part 1: Docker Setup

# docker-compose.yml
services:
  wallabag:
    image: wallabag/wallabag:latest
    container_name: wallabag
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - wallabag_data:/var/www/wallabag/data
      - wallabag_images:/var/www/wallabag/web/assets/images
    environment:
      SYMFONY__ENV__DATABASE_DRIVER: pdo_pgsql
      SYMFONY__ENV__DATABASE_HOST: db
      SYMFONY__ENV__DATABASE_PORT: 5432
      SYMFONY__ENV__DATABASE_NAME: wallabag
      SYMFONY__ENV__DATABASE_USER: wallabag
      SYMFONY__ENV__DATABASE_PASSWORD: "${DB_PASSWORD}"
      SYMFONY__ENV__SECRET: "${SECRET_KEY}"
      SYMFONY__ENV__DOMAIN_NAME: "https://read.yourdomain.com"
      SYMFONY__ENV__SERVER_NAME: "Wallabag"
      SYMFONY__ENV__FOSUSER_REGISTRATION: "false"   # Disable public registration
      SYMFONY__ENV__MAILER_HOST: mail.yourdomain.com
      SYMFONY__ENV__MAILER_USER: read@yourdomain.com
      SYMFONY__ENV__MAILER_PASSWORD: "${MAIL_PASSWORD}"
      SYMFONY__ENV__FROM_EMAIL: read@yourdomain.com
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: wallabag
      POSTGRES_USER: wallabag
      POSTGRES_PASSWORD: "${DB_PASSWORD}"
    volumes:
      - db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U wallabag"]
      interval: 10s
      start_period: 20s

volumes:
  wallabag_data:
  wallabag_images:
  db_data:
docker compose up -d

Visit http://your-server:8080 → log in with wallabag / wallabagchange password immediately.


Part 2: HTTPS with Caddy

read.yourdomain.com {
    reverse_proxy localhost:8080
}

Part 3: Browser Extensions

Chrome / Chromium

  1. Install Wallabag Browser Extension
  2. Extension settings:
    • Wallabag URL: https://read.yourdomain.com
    • Username + password
  3. Click extension icon on any page → saves to Wallabag

Firefox

  1. Install from Mozilla Add-ons: search "Wallabagger"
  2. Same configuration

Safari (iOS/macOS)

  1. Install Wallabag iOS app
  2. Share Sheet → Wallabag — saves any article from any browser

Bookmarklet

For browsers without an extension:

  1. Wallabag → Settings → Misc → Bookmarklet
  2. Drag to bookmarks bar
  3. Click bookmark on any page to save

Part 4: Mobile Apps

iOS

  1. Install Wallabag 2 Official from App Store
  2. Server: https://read.yourdomain.com
  3. Username + password → log in
  4. Sync → downloads all saved articles for offline reading

Android

  1. Install Wallabag Android
  2. Same setup
  3. Offline mode: Sync articles before going offline

Part 5: Tags and Organization

Tags

Tag articles when saving:

  1. Article → Edit → Tags: tech, later, work, read-in-progress
  2. Or add tags via browser extension before saving

Tag RSS feeds

Every tag generates its own RSS feed:

https://read.yourdomain.com/api/v1/entries.xml?tags=tech&username=admin&token=API_TOKEN

Subscribe this in FreshRSS/Miniflux → your Wallabag tagged articles appear as RSS items.

Automatic rules (via annotations)

# Mark articles as "starred" automatically if they contain keywords:
# Settings → Rules → If article title contains "security" → star it

Part 6: Export

Export a single article

  1. Article → Export
  2. Format: EPUB, PDF, CSV, JSON, XML, TXT
  3. Download

Export by tag

  1. Tag → Export all articles in tag
  2. Format: EPUB → creates a proper ebook with all articles
# Via API:
TOKEN="your-api-token"

# Export all articles as EPUB:
curl "https://read.yourdomain.com/api/v1/export.epub" \
  -H "Authorization: Bearer $TOKEN" \
  --output wallabag-articles.epub

# Export articles with tag "tech":
curl "https://read.yourdomain.com/api/v1/export.epub?tags=tech" \
  -H "Authorization: Bearer $TOKEN" \
  --output tech-articles.epub

Part 7: Annotations

Highlight and annotate within saved articles:

  1. Read an article → select text
  2. Highlight → creates yellow highlight
  3. Annotate → add a personal note to the selection
  4. All annotations saved and searchable

Annotations export with the article in EPUB format.


Part 8: REST API

# Get OAuth token:
curl -X POST "https://read.yourdomain.com/oauth/v2/token" \
  -d "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=password&username=admin&password=PASSWORD"

TOKEN="access_token_from_above"

# Get unread articles:
curl "https://read.yourdomain.com/api/v1/entries?archive=0" \
  -H "Authorization: Bearer $TOKEN" | jq '._embedded.items[].title'

# Add an article:
curl -X POST "https://read.yourdomain.com/api/v1/entries" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/article", "tags": "tech,interesting"}'

# Mark as read:
curl -X PATCH "https://read.yourdomain.com/api/v1/entries/42" \
  -H "Authorization: Bearer $TOKEN" \
  -d "archive=1"

# Search articles:
curl "https://read.yourdomain.com/api/v1/entries?term=kubernetes" \
  -H "Authorization: Bearer $TOKEN" | jq '._embedded.items[].title'

Maintenance

# Update:
docker compose pull
docker compose up -d

# Backup:
docker exec wallabag-db-1 pg_dump -U wallabag wallabag \
  | gzip > wallabag-db-$(date +%Y%m%d).sql.gz

tar -czf wallabag-images-$(date +%Y%m%d).tar.gz \
  $(docker volume inspect wallabag_wallabag_images --format '{{.Mountpoint}}')

# Flush Wallabag asset cache:
docker exec wallabag php /var/www/wallabag/bin/console cache:clear --env=prod

# Logs:
docker compose logs -f wallabag

See also: Miniflux — pair with Wallabag for a complete reading workflow

See all open source productivity tools at OSSAlt.com/categories/productivity.

Comments