Wallabag Read-It-Later Installation
Wallabag is a self-hosted read-it-later application that saves web articles to your server for offline reading, functioning as an open-source Pocket or Instapaper alternative. With browser extensions, mobile apps, RSS feeds, and annotation support, Wallabag lets you build a personal article archive on your Linux server without tracking or subscription fees.
Prerequisites
- Ubuntu 20.04+, Debian 11+, or CentOS/Rocky 8+
- Docker and Docker Compose installed
- Root or sudo access
- A domain name for external access and HTTPS
Installing Wallabag with Docker
# Create Wallabag directory
sudo mkdir -p /opt/wallabag/data
# Create docker-compose.yml
sudo tee /opt/wallabag/docker-compose.yml <<'EOF'
version: '3.8'
services:
wallabag:
image: wallabag/wallabag
restart: unless-stopped
ports:
- "8080:80"
environment:
- MYSQL_ROOT_PASSWORD=rootpassword # Change this!
- SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql
- SYMFONY__ENV__DATABASE_HOST=db
- SYMFONY__ENV__DATABASE_PORT=3306
- SYMFONY__ENV__DATABASE_NAME=wallabag
- SYMFONY__ENV__DATABASE_USER=wallabag
- SYMFONY__ENV__DATABASE_PASSWORD=dbpassword # Change this!
- SYMFONY__ENV__MAILER_HOST=smtp.example.com
- [email protected]
- SYMFONY__ENV__MAILER_PASSWORD=smtp-password
- [email protected]
- SYMFONY__ENV__DOMAIN_NAME=https://wallabag.example.com
- SYMFONY__ENV__SERVER_NAME="My Wallabag"
- POPULATE_DATABASE=true
volumes:
- /opt/wallabag/data:/var/www/wallabag/data
- /opt/wallabag/images:/var/www/wallabag/web/assets/images
depends_on:
- db
healthcheck:
test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost"]
interval: 1m
timeout: 3s
db:
image: mariadb:11
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword # Change this!
MYSQL_DATABASE: wallabag
MYSQL_USER: wallabag
MYSQL_PASSWORD: dbpassword # Change this!
volumes:
- /opt/wallabag/db:/var/lib/mysql
redis:
image: redis:7-alpine
restart: unless-stopped
EOF
cd /opt/wallabag
sudo docker compose up -d
# First startup takes a few minutes (database initialization)
sudo docker compose logs -f wallabag
Access at http://your-server:8080. Default credentials: wallabag / wallabag.
Initial Setup
Change admin credentials immediately:
- Log in with
wallabag/wallabag - Go to wallabag (username, top right) > Edit my profile
- Change username, email, and password
Create additional users (admin only):
# Via CLI in Docker
sudo docker compose exec wallabag \
php /var/www/wallabag/bin/console \
fos:user:create \
--env=prod \
newuser [email protected] "UserPassword123!"
# Grant admin role to a user
sudo docker compose exec wallabag \
php /var/www/wallabag/bin/console \
fos:user:promote \
--env=prod \
newuser ROLE_ADMIN
Configure Nginx reverse proxy:
# /etc/nginx/sites-available/wallabag
server {
listen 80;
server_name wallabag.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name wallabag.example.com;
ssl_certificate /etc/letsencrypt/live/wallabag.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wallabag.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo ln -s /etc/nginx/sites-available/wallabag /etc/nginx/sites-enabled/
sudo certbot --nginx -d wallabag.example.com
sudo systemctl reload nginx
Browser Extension Configuration
Wallabag has official browser extensions for one-click saving:
Install the extension:
- Firefox: Wallabagger
- Chrome/Chromium: Wallabagger
Configure the extension:
- Click the extension icon → Options
- Set Wallabag URL:
https://wallabag.example.com - Set Client ID and Client Secret (from API settings)
- Enter your username and password
- Click Test connection
Create API credentials:
- In Wallabag, go to API clients management (in the developer menu)
- Click Create a new client
- Name the client (e.g., "Firefox extension")
- Copy the Client ID and Client Secret
Mobile App Setup
Android: wallabag for Android (available on F-Droid and Google Play)
iOS: Readder, Carrots, or the official wallabag iOS app
Configure the mobile app:
Server URL: https://wallabag.example.com
Username: your-username
Password: your-password
Client ID: (from API settings)
Client Secret: (from API settings)
Test API access:
# Get an OAuth token
TOKEN=$(curl -s -X POST "https://wallabag.example.com/oauth/v2/token" \
-d "grant_type=password" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "username=wallabag" \
-d "password=wallabag" | jq -r '.access_token')
# Save an article via API
curl -X POST "https://wallabag.example.com/api/entries.json" \
-H "Authorization: Bearer $TOKEN" \
-d "url=https://example.com/article"
Tagging and Annotations
Create and assign tags:
- Open an article in Wallabag
- Click the tag icon in the article toolbar
- Type a tag name and press Enter
- Tags can be used to filter and organize articles
Apply tagging rules automatically:
- Go to Settings > Tagging rules
- Click Add a rule
- Set condition: e.g.,
domainName matches "nytimes.com" - Set tag to apply:
news
# Example tagging rules:
# domainName matches "github.com" → tag: coding
# content matches "kubernetes" → tag: devops
# isUnread = true → (use as filter, not rule)
Annotate articles:
- Select any text while reading an article
- A popup appears — click Annotate
- Add your annotation text
- Annotations are stored with the article and searchable
RSS Feeds
Wallabag generates RSS feeds for your article collections:
Access your RSS feeds:
- Go to Settings > RSS (under your user settings)
- Copy the RSS token shown
- Use these feed URLs in any RSS reader:
All articles: https://wallabag.example.com/feed/username/TOKEN/
Unread: https://wallabag.example.com/feed/username/TOKEN/unread
Starred: https://wallabag.example.com/feed/username/TOKEN/starred
Archived: https://wallabag.example.com/feed/username/TOKEN/archive
Tagged: https://wallabag.example.com/feed/username/TOKEN/tags/tagname
Data Import and Export
Import from Pocket:
- Export your Pocket data at
getpocket.com/export - In Wallabag → Import → Pocket
- Upload the exported HTML file
- All bookmarks are imported with their tags
Import from other services:
# Wallabag supports importing from:
# - Pocket (HTML export)
# - Instapaper (CSV export)
# - Readability (JSON export)
# - Pinboard (JSON export)
# - Delicious (XML export)
# - Firefox/Chrome bookmarks (HTML)
Export your library:
- Go to Export in the article list
- Select format: EPUB, PDF, CSV, JSON, or HTML
- Choose which articles (all, unread, starred, etc.)
- Download the exported file
Full database export via CLI:
# Export all articles as JSON
sudo docker compose exec wallabag \
php /var/www/wallabag/bin/console \
wallabag:export \
--env=prod \
--username=admin \
--filepath=/var/www/wallabag/data/export/all.json
Troubleshooting
Article content not fetching (empty or partial articles):
# Wallabag uses Graby for content extraction
# Check logs
sudo docker compose logs wallabag | grep -i "fetch\|error"
# Some sites block server-side fetching
# Try setting a custom user agent in settings:
# Admin > Internal Settings > Misc > Custom user-agent
# Force re-fetch an article via the UI:
# Open article → ... → Re-fetch content
Cannot save articles from browser extension:
# Test API connectivity
curl -v "https://wallabag.example.com/api/version"
# Verify OAuth credentials are correct
# Settings > API clients management — regenerate if needed
# Check CORS headers if using extension with HTTPS site
sudo nginx -t
High memory usage:
# Check container memory usage
sudo docker stats
# Clear Wallabag cache
sudo docker compose exec wallabag \
php /var/www/wallabag/bin/console \
cache:clear --env=prod
# Optimize database
sudo docker compose exec db \
mysql -u wallabag -pdbpassword wallabag -e "OPTIMIZE TABLE entry;"
Conclusion
Wallabag provides a complete self-hosted read-it-later solution with browser extensions, mobile apps, RSS feed generation, and migration tools from popular services like Pocket and Instapaper, all running on your own infrastructure without usage tracking or data collection. The combination of automatic tagging rules, annotations, and multi-format export makes it a durable long-term article archive that remains accessible even without an internet connection through offline-capable mobile apps.


