Wallabag is a self-hosted read-it-later app. Save any web article with one click, and Wallabag fetches the text, strips ads and clutter, and keeps a clean, readable copy, even if the original disappears. Read on the web, on your phone, or export to e-readers. With Pocket shut down in 2025, it’s one of the best ways to keep your reading list under your own control.
Requirements
- A small VPS: 1 vCPU and 1–2 GB RAM.
- Docker and Docker Compose. See install Docker.
- A domain, e.g.
read.example.com.
Docker Compose
# /opt/wallabag/compose.yaml
services:
wallabag:
image: wallabag/wallabag:latest
restart: unless-stopped
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: change-me-db
POSTGRES_PASSWORD: change-me-root
POSTGRES_USER: postgres
SYMFONY__ENV__DOMAIN_NAME: https://read.example.com
SYMFONY__ENV__SERVER_NAME: "My Wallabag"
SYMFONY__ENV__FOSUSER_REGISTRATION: "false"
SYMFONY__ENV__REDIS_HOST: redis
SYMFONY__ENV__SECRET: change-me-long-random
ports:
- "127.0.0.1:8080:80"
volumes:
- ./images:/var/www/wallabag/web/assets/images
depends_on: [db, redis]
db:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_PASSWORD: change-me-root
POSTGRES_USER: postgres
volumes:
- ./db:/var/lib/postgresql/data
redis:
image: redis:7-alpine
restart: unless-stopped
cd /opt/wallabag && docker compose up -d
docker compose logs -f wallabag # the first start provisions the database
The default login is wallabag / wallabag. Change the password immediately, or create your own admin user and delete the default one:
docker compose exec wallabag /var/www/wallabag/bin/console fos:user:create --super-admin --env=prod
Generate the secret with openssl rand -hex 32. Check the image documentation for current variable names.
HTTPS with Nginx
server {
server_name read.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# listen 443 ssl; certbot --nginx -d read.example.com
}
SYMFONY__ENV__DOMAIN_NAME must match the public URL. See Let’s Encrypt.
Saving articles
- Browser extensions for Firefox and Chrome: set your server URL and an API client (created under API clients management).
- Mobile apps: the official Wallabag apps for Android (also on F-Droid) and iOS, with sharing from any app.
- Bookmarklet, or email-to-wallabag via integrations.
- Import from Pocket, Instapaper, Pinboard, browser exports or other Wallabag instances (Import menu). Redis handles large imports asynchronously.
Organise and read
- Tagging rules tag articles automatically (e.g.
domainName = "github.com"→dev, orreadingTime >= 15→longread). - Annotations and highlights, starred and archived states, and full-text search.
- Export to EPUB, MOBI, PDF, CSV or JSON. Send a batch of saved articles to your e-reader.
- RSS feeds of your unread, starred or tagged articles, which integrate with RSS readers. See Miniflux and FreshRSS.
Paywalls and site credentials
Some sites need credentials or special parsing. Wallabag uses site configuration files (graby/fivefilters) for better extraction, and supports site credentials for paywalled sources you subscribe to. Respect each site’s terms.
Backups and updates
- Back up the database and the
imagesfolder:
docker compose exec -T db pg_dumpall -U postgres > /backups/wallabag-$(date +%F).sql
tar -czf /backups/wallabag-images-$(date +%F).tar.gz -C /opt/wallabag images
See backup strategy.
- Update:
docker compose pull && docker compose up -d. Migrations run on start. See updating self-hosted apps.
Quick reference
| Task | Command / setting |
|---|---|
| Start | docker compose up -d |
| Default login | wallabag / wallabag (change it!) |
| Public URL | SYMFONY__ENV__DOMAIN_NAME |
| Disable signups | SYMFONY__ENV__FOSUSER_REGISTRATION=false |
| API for apps | API clients management |
| Create admin | bin/console fos:user:create --super-admin --env=prod |
Related: Docker Compose and n8n workflow automation.