Self-Hosting Readeck with Docker Compose
What Is Readeck?
Readeck saves the readable content of web pages — articles, blog posts, documentation — and stores everything locally as immutable ZIP files. No external requests after the initial save. Text, images, and metadata all live on your server. It’s a self-hosted alternative to Pocket, Instapaper, and Omnivore (which shut down in 2024).
What sets Readeck apart from Wallabag and Hoarder: it’s a single Go binary with SQLite, uses ~50 MB of RAM, and exports to EPUB with OPDS support — so you can read saved articles on an e-reader.
Prerequisites
- A Linux server (Ubuntu 22.04+ recommended)
- Docker and Docker Compose installed (guide)
- 512 MB of free RAM (Readeck uses ~30-50 MB)
- Disk space for saved articles (varies — ~1-5 MB per article with images)
- A domain name (optional, for remote access)
Docker Compose Configuration
Create a directory for Readeck:
mkdir -p /opt/readeck && cd /opt/readeck
Create a docker-compose.yml file:
services:
readeck:
image: codeberg.org/readeck/readeck:0.21.6
restart: unless-stopped
ports:
- "8000:8000"
volumes:
- readeck-data:/readeck
environment:
# Server configuration
- READECK_SERVER_HOST=0.0.0.0
- READECK_SERVER_PORT=8000
# Logging
- READECK_LOG_LEVEL=info
healthcheck:
test: ["CMD", "readeck", "healthcheck"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
volumes:
readeck-data:
Start the stack:
docker compose up -d
Readeck starts in under 5 seconds. Open http://your-server:8000 and create your first admin account.
Key Features
| Feature | Details |
|---|---|
| Content extraction | Saves readable text + images from any URL |
| Storage format | Immutable ZIP files per bookmark |
| Database | SQLite (embedded, zero config) |
| Full-text search | Query across all saved content |
| Labels | Organize bookmarks with custom tags |
| Collections | Group bookmarks into themed collections |
| Highlights | Mark important passages within articles |
| EPUB export | Convert articles to EPUB for e-readers |
| OPDS feed | Serve saved articles to e-reader apps (KOReader, Calibre) |
| Browser extensions | Firefox and Chrome (save with one click) |
| API | REST API for integrations |
| Multi-user | Separate accounts with independent libraries |
Initial Setup
- Navigate to
http://your-server:8000 - Create the admin account (first user gets admin privileges)
- Install the browser extension from Readeck’s site — available for Firefox and Chrome
- Configure the extension with your Readeck URL and credentials
- Save your first article — the extension adds a single-click save button to your browser toolbar
Configuration
Readeck uses environment variables or a config.toml file. The Docker volume stores both the database and saved content.
Environment Variables
environment:
# Server
- READECK_SERVER_HOST=0.0.0.0
- READECK_SERVER_PORT=8000
- READECK_SERVER_PREFIX=/ # URL path prefix (for reverse proxy sub-path)
# Database
- READECK_DATABASE_SOURCE=/readeck/db.sqlite3
# Logging
- READECK_LOG_LEVEL=info # debug, info, warn, error
# Content extraction
- READECK_SCRAPER_TIMEOUT=30 # Timeout for fetching pages (seconds)
Using a Config File
Mount a config.toml for more control:
[server]
host = "0.0.0.0"
port = 8000
[database]
source = "/readeck/db.sqlite3"
[log]
level = "info"
Mount it in your Docker Compose:
volumes:
- ./config.toml:/readeck/config.toml:ro
- readeck-data:/readeck
OPDS for E-Readers
Readeck’s OPDS feed lets e-reader apps browse and download your saved articles as EPUB files. This is a killer feature for offline reading.
OPDS endpoint: http://your-server:8000/opds
Compatible apps:
- KOReader (Kindle, Kobo, PocketBook) — add the OPDS URL in the OPDS browser
- Calibre — add OPDS catalog in Calibre preferences
- Moon+ Reader (Android) — supports OPDS catalogs
- Librera (Android) — OPDS support built in
Your workflow: save articles throughout the day with the browser extension, then sync them to your e-reader for offline reading. No export steps — the OPDS feed updates automatically.
Reverse Proxy
Nginx Proxy Manager or Caddy configuration for HTTPS access:
Caddy:
readeck.yourdomain.com {
reverse_proxy readeck:8000
}
Nginx Proxy Manager: Create a new proxy host pointing to readeck:8000 on port 8000, enable SSL with Let’s Encrypt, and enable WebSocket support.
See the full Reverse Proxy Setup guide.
Backup
Readeck stores everything in the /readeck volume:
db.sqlite3— the database (bookmarks, users, labels)bookmarks/— saved article ZIP files
Back up the entire volume:
docker compose stop readeck
tar czf readeck-backup-$(date +%Y%m%d).tar.gz /var/lib/docker/volumes/readeck_readeck-data
docker compose start readeck
For automated backups, use Borgmatic or Kopia with the volume path.
Troubleshooting
Articles Save But Show No Content
Symptom: Bookmark appears in the list but the readable view is blank.
Fix: Some sites block server-side content fetching. Check docker compose logs readeck for HTTP errors. Some sites require a User-Agent header to serve content. You can also try saving the article via the browser extension, which fetches content from your browser (client-side) rather than the server.
Cannot Log In After Docker Restart
Symptom: Credentials rejected after container restart.
Fix: Verify the data volume is mounted correctly. If the volume was lost, the database was recreated empty. Check docker volume ls and ensure readeck-data exists with your data.
Browser Extension Won’t Connect
Symptom: Extension shows “connection refused” or “unauthorized.”
Fix: Ensure the Readeck URL in the extension settings includes the port (http://your-server:8000). If behind a reverse proxy, use the HTTPS URL. Generate an API token in Readeck’s settings page and use that instead of username/password.
OPDS Feed Returns 401
Symptom: E-reader app can’t authenticate to the OPDS feed.
Fix: OPDS uses HTTP Basic Authentication. Enter your Readeck username and password in the e-reader app’s OPDS settings. Some apps don’t prompt for credentials — configure them manually.
Search Returns No Results
Symptom: Full-text search doesn’t find articles you know exist.
Fix: Readeck indexes content on save. Articles saved before a version upgrade may need re-indexing. Check the Readeck documentation for the re-index command.
Resource Requirements
| Resource | Requirement |
|---|---|
| RAM | 30-50 MB idle, 50-100 MB during content extraction |
| CPU | Minimal — Go binary is efficient |
| Disk | ~15 MB for the application, 1-5 MB per saved article (with images) |
| Network | Outbound HTTP/HTTPS for fetching articles |
Readeck is one of the lightest self-hosted applications available. It runs comfortably on a Raspberry Pi alongside other services.
Verdict
Readeck is the best choice for self-hosters who want a read-later app with e-reader integration. The OPDS support and EPUB export are features that Wallabag, Linkwarden, and Hoarder either don’t have or implement less cleanly. The single-binary Go architecture means it uses almost no resources and starts instantly.
The trade-off: Readeck is younger and has a smaller community than Wallabag. There’s no mobile app (browser extension + PWA works, but native apps don’t exist yet). If you need team features, annotation sharing, or a polished mobile experience, Wallabag is more mature.
For personal use — saving articles during the day, reading them on a Kindle at night — Readeck is exactly right.
FAQ
Can I import bookmarks from Pocket or Wallabag?
Yes. Readeck supports importing from Pocket (export HTML file) and Wallabag (JSON export). Check the import section in Readeck’s admin settings.
Does Readeck have a mobile app?
No native app. The web UI works on mobile browsers, and the site can be added as a PWA (Progressive Web App) on iOS and Android. Share-to-Readeck works via the browser extension on Android.
How does Readeck compare to Omnivore?
Omnivore shut down in late 2024. Readeck fills the same niche — clean reading experience, offline support, highlights. Readeck adds OPDS/EPUB export. It doesn’t have Omnivore’s AI features or newsletter integration.
Related
Get self-hosting tips in your inbox
New guides, comparisons, and setup tutorials — delivered weekly. No spam.
Comments