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:

  1. Click your username in the top-right corner
  2. Go to ConfigUser information
  3. Update your username and password
  4. 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

  1. Add a new Proxy Host
  2. Domain: read.example.com
  3. Forward to: wallabag port 80 (or your server IP port 8090)
  4. Enable SSL with Let’s Encrypt

Step 5: Install Browser Extensions

Wallabag has official browser extensions that make saving articles effortless:

To configure the extension:

  1. In Wallabag, go to API clients management (under your user menu)
  2. Create a new client — give it a name like “Browser Extension”
  3. Copy the Client ID and Client Secret
  4. In the browser extension settings, enter:
    • Your Wallabag URL (https://read.example.com)
    • Client ID and Client Secret
    • Your username and password

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:

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:

  1. Export from Pocket: Go to getpocket.com/export and download your HTML file
  2. Export from Instapaper: Go to Settings → Export → Download CSV
  3. In Wallabag, go to Import in the sidebar
  4. Select your source (Pocket, Instapaper, Pinboard, Firefox, Chrome, etc.)
  5. 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 ConfigTagging rules and create rules like:

RuleTags
domainName = "arstechnica.com"tech, news
readingTime > 15long-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 ConfigRSS 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:

  1. Check if the site uses JavaScript rendering (Wallabag can’t handle SPAs)
  2. Use the browser extension’s “Save content” option instead of “Save URL”
  3. Check the site config repository for custom extraction rules

Extension can’t connect

  • Verify your DOMAIN_NAME environment 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: