Migrating from Omnivore to Wallabag

Self-hosted setup using docker-compose and importing of articles from Omnivore

  •  3 mins  •  

The read-it-later app which I had been using, Omnivore, recently announced that it was being acquired by EvenLabs and would shut down on 30 November 2024.1

Although Omnivore is technically open source (which was one of the reasons I selected it), the project is not mature. It does not actually support self-hosted installations at the moment and the mobile apps will in any case need to be republished with a developer account.

I figured that this was a good lesson and an opportune time to migrate to a well-established, open source, self-hostable read-it-later service, Wallabag. This was in fact one of the options recommended by the Omnivore team and appears to be a fairly common choice amongst many former Omnivore users.

Wallabag very helpfully includes support for importing articles from Omnivore.

Export from Omnivore

First, you have to export your data from Omnivore, which you can do by navigating to https://omnivore.app/settings/account and clicking the "Export Data" button:

Screenshot of Omnivore export screen

You should do this before 30 November 2024 because Omnivore may not be accessible after that date.

Wallabag setup

Next, if you have not already done so, you should set up your Wallabag installation (or using the hosted Wallabag server).

The process is quite similar to other self-hosted apps. I used docker-compose and my docker-compose file looks something like this:

services:
  app:
    image: wallabag/wallabag
    env_file: .env
    ports:
      - 80:80
    volumes:
      - ./data:/var/www/wallabag/data
      - ./config:/var/www/wallabag/config
      - ./images:/var/www/wallabag/web/assets/images
    depends_on:
      - wallabag-db
      - wallabag-redis
    
  db:
    image: postgres:17-alpine
    env_file: .env
    volumes:
      - ./postgresql_data:/var/lib/postgresql/data
    
  redis:
    image: redis:alpine

The .env file looks like this:

SYMFONY__ENV__DOMAIN_NAME=https://your-url.com
SYMFONY__ENV__SECRET=supersecure
SYMFONY__ENV__SERVER_NAME="Your Wallabag Server"  
TZ=Asia/Singapore  
PUID=[INSERT]  
PGID=[INSERT]   
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=wallabager  
POSTGRES_USER=wallabag  
POSTGRES_PASSWORD=wallabager  
POPULATE_DATABASE=true  
SYMFONY__ENV__FOSUSER_REGISTRATION=false  
SYMFONY__ENV__REDIS_HOST=redis

You will obviously need to fill in the placeholders and replace the dummy values as appropriate.

One issue I ran into was that the initial database migrations do not appear to run automatically when the docker containers are created, resulting in errors to the effect that database tables are not found or do not exist:

no such table: wallabag_internal_setting

Table 'wallabag_db.wallabag_craue_config_setting' doesn't exist

An exception occurred while executing a query: SQLSTATE[HY000]: General error: 1 no such table: wallabag_internal_setting

This seems to be a known issue. A pull request which should fix this is pending, but in the meantime this can easily be resolved by running the migrations manually. docker exec into the app container and run the following:

bin/console doctrine:migrations:migrate --env=prod --no-interaction

Separately, the default credentials for the initial user created by the setup process don't appear to be documented in the Wallabag documentation site. The default credentials are set out in the README for the docker image but just to save you the trouble of looking it up:

Username: wallabag

Password: wallabag

Importing Omnivore articles into Wallabag

After you have successfully logged into Wallabag, you will find that on the import page, there is an option to upload and import your Omnivore JSON export files:

Screenshot of Wallabag import screen

Keen-eyed readers will however, have noticed, that the importer purports to require the JSON export files to be uploaded "one by one". For me, this was a highly unsatisfactory state of affairs because I had more than 1,000 articles to import, and each JSON file contained about 20 articles.

Fortunately, it seems that the constraint is with the number of files that can be uploaded at once and not the number of items imported.

I aggregated all my JSON exports into a single file with the handy jq CLI utility:

cd ~/omnivore_export_directory
jq -s '[.[][]]' *.json > omnivore.json

After uploading this to Wallabag, Wallabag appeared to freeze for several minutes whilst processing the files, but the import ultimately succeeded and I am now a satisfied Wallabag user.