If you’ve ever used Pocket or Instapaper to save articles for later, you know the value of a good read-it-later service. But those services track your reading habits, inject ads, and can shut down features at any time. Wallabag gives you the same experience — save articles with one click, read them distraction-free, sync across devices — entirely on your own server.
In this guide, we’ll set up Wallabag with Docker, configure it with PostgreSQL for reliable storage, and connect browser extensions and mobile apps for a seamless reading workflow.
What Is Wallabag?
Wallabag is an open-source, self-hosted application for saving web pages. Think of it as your personal Pocket replacement. Key features include:
- Save any webpage with browser extensions or mobile share
- Full-text extraction — strips ads, navigation, and clutter
- Offline reading on mobile apps (iOS and Android)
- Tagging and search to organize your reading list
- Export to ePub, PDF, or plain text
- API access for integrations with RSS readers, automation tools, and more
- Annotations — highlight and comment on saved articles
Prerequisites
Before we start, you’ll need:
- A Linux server (VPS or home server) with at least 1GB RAM
- Docker and Docker Compose installed
- A domain name (optional but recommended for HTTPS access)
- A reverse proxy like Traefik, Nginx Proxy Manager, or Caddy
Step 1: Create the Docker Compose File
Create a directory for your Wallabag installation:
mkdir -p ~/wallabag && cd ~/wallabag
Create docker-compose.yml:
services:
wallabag:
image: wallabag/wallabag:latest
container_name: wallabag
restart: unless-stopped
ports:
- "8090:80"
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=changeme_db_password
- SYMFONY__ENV__DOMAIN_NAME=https://read.example.com
- SYMFONY__ENV__SERVER_NAME="Wallabag"
- SYMFONY__ENV__FOSUSER_REGISTRATION=false
- SYMFONY__ENV__FOSUSER_CONFIRMATION=false
volumes:
- ./images:/var/www/wallabag/web/assets/images
- ./data:/var/www/wallabag/data
depends_on:
- db
- redis
db:
image: postgres:16-alpine
container_name: wallabag-db
restart: unless-stopped
environment:
- POSTGRES_DB=wallabag
- POSTGRES_USER=wallabag
- POSTGRES_PASSWORD=changeme_db_password
volumes:
- ./db:/var/lib/postgresql/data
redis:
image: redis:7-alpine
container_name: wallabag-redis
restart: unless-stopped
Important: Replace changeme_db_password with a strong password and update DOMAIN_NAME to match your actual domain.
Step 2: Deploy Wallabag
Start the stack:
docker compose up -d
The first startup takes a minute or two as Wallabag runs database migrations. Check the logs:
docker compose logs -f wallabag
Wait until you see something like wallabag is ready. Once it’s up, access it at http://your-server-ip:8090.
Step 3: Log In and Create Your Account
The default credentials are:
- Username:
wallabag - Password:
wallabag
Change these immediately after your first login:
- Click your username in the top-right corner
- Go to Config → User information
- Update your username and password
- Optionally change your email address
Since we set FOSUSER_REGISTRATION=false, no one else can create accounts on your instance.
Step 4: Set Up HTTPS with a Reverse Proxy
Never expose Wallabag over plain HTTP. Here’s how to put it behind your reverse proxy.
Traefik Labels
If you’re using Traefik, add these labels to the wallabag service in your compose file:
labels:
- "traefik.enable=true"
- "traefik.http.routers.wallabag.rule=Host(`read.example.com`)"
- "traefik.http.routers.wallabag.entrypoints=websecure"
- "traefik.http.routers.wallabag.tls.certresolver=letsencrypt"
- "traefik.http.services.wallabag.loadbalancer.server.port=80"
And remove the ports section (Traefik handles routing internally).
Nginx Proxy Manager
- Add a new Proxy Host
- Domain:
read.example.com - Forward to:
wallabagport80(or your server IP port8090) - Enable SSL with Let’s Encrypt
Step 5: Install Browser Extensions
Wallabag has official browser extensions that make saving articles effortless:
- Firefox: Wallabagger
- Chrome/Edge: Wallabagger
To configure the extension:
- In Wallabag, go to API clients management (under your user menu)
- Create a new client — give it a name like “Browser Extension”
- Copy the Client ID and Client Secret
- In the browser extension settings, enter:
- Your Wallabag URL (
https://read.example.com) - Client ID and Client Secret
- Your username and password
- Your Wallabag URL (
Now you can save any page with one click on the extension icon.
Step 6: Set Up Mobile Apps
Wallabag has native apps for reading on the go:
- Android: wallabag (free on F-Droid too)
- iOS: wallabag 2
Configure them the same way as the browser extension — create an API client, enter the credentials, and your saved articles sync automatically.
The mobile apps support offline reading, so you can download articles on Wi-Fi and read them anywhere.
Step 7: Import from Pocket or Instapaper
Migrating from another service? Wallabag makes it easy:
- Export from Pocket: Go to getpocket.com/export and download your HTML file
- Export from Instapaper: Go to Settings → Export → Download CSV
- In Wallabag, go to Import in the sidebar
- Select your source (Pocket, Instapaper, Pinboard, Firefox, Chrome, etc.)
- Upload the export file
Wallabag will process each URL and extract the full article content. Large imports may take a while — check the import queue in the sidebar.
Step 8: Configure Tagging Rules (Optional)
Wallabag can auto-tag articles based on rules. Go to Config → Tagging rules and create rules like:
| Rule | Tags |
|---|---|
domainName = "arstechnica.com" | tech, news |
readingTime > 15 | long-read |
language = "fr" | french |
This keeps your library organized without manual effort.
Step 9: Enable RSS Feeds (Optional)
Wallabag can generate RSS feeds for your saved articles, which is useful for:
- Reading saved articles in your RSS reader
- Sharing curated reading lists
- Automating workflows with n8n
Go to Config → RSS and generate your token. You’ll get feed URLs for unread, starred, and archived articles.
Updating Wallabag
Keep Wallabag up to date with the latest features and security patches:
cd ~/wallabag
docker compose pull
docker compose up -d
For automatic updates, consider Watchtower to handle this for you.
Troubleshooting
Wallabag won’t start / database errors
Check logs for migration issues:
docker compose logs wallabag | grep -i error
If the database wasn’t initialized properly, you may need to reset:
docker compose down -v # WARNING: deletes data
docker compose up -d
Articles not extracting properly
Some websites block content extraction. Try:
- Check if the site uses JavaScript rendering (Wallabag can’t handle SPAs)
- Use the browser extension’s “Save content” option instead of “Save URL”
- Check the site config repository for custom extraction rules
Extension can’t connect
- Verify your
DOMAIN_NAMEenvironment variable matches your actual URL - Make sure HTTPS is working (the API requires a valid SSL cert)
- Check that the API client credentials are correct
- Try creating a new API client
High memory usage
Wallabag can be memory-hungry during imports. If you’re on a small VPS:
# Add to the wallabag service in docker-compose.yml
deploy:
resources:
limits:
memory: 512M
Backup Strategy
Your Wallabag data lives in three volumes:
# Database
./db/
# Article images
./images/
# App data (SQLite if used, config)
./data/
Back these up regularly with Restic or your preferred backup tool:
# Quick backup
tar czf wallabag-backup-$(date +%Y%m%d).tar.gz db/ images/ data/
Conclusion
Wallabag gives you everything Pocket offers — and more — without the tracking, ads, or vendor lock-in. With browser extensions, mobile apps, RSS feeds, and a powerful API, it fits naturally into any reading workflow.
The setup takes about 10 minutes with Docker, and once it’s running, it’s remarkably low-maintenance. Your reading list, your server, your data.
Related guides: