A minimal read-it-later server: import articles via URL or a userscript, read them in a clean reader view, and export them as EPUB.
docker compose upThe app listens on :8080 and stores its SQLite database in the readone-data volume.
| Env var | Default | Description |
|---|---|---|
PORT |
8080 |
HTTP listen port |
DB_PATH |
/app/data/data.db |
Path to the SQLite database |
DEBUG |
unset | Set to 1 to load static/ (templates and /assets/*) straight from disk instead of the embedded build, so edits show up on restart without a rebuild |
Install the Tampermonkey/Greasemonkey script served at /readone.user.js (the
server rewrites its save URL to point at itself, so no manual setup is
needed). It adds a draggable "Reader" tab to every page that:
- Extracts the article with Readability, fixing up lazy-loaded, background,
and
<noscript>images first so they survive extraction. - Lets you view it in a reader overlay, or save it to this server.
- On save, downloads every remote
<img>in the extracted content from the browser (viaGM_xmlhttpRequest, using the page's own cookies/UA/referrer to get past hotlinking and bot-blocking) and bundles them into a zip alongside the article. This works even for images the server itself couldn't fetch directly.
The server stores that zip as-is next to the article. Images referenced by
it are served from /articles/:id/assets/* for the reader view, and are
embedded directly when exporting to EPUB. Images that fail to download stay
as plain remote URLs — nothing breaks, they just aren't bundled.
go run .Run with DEBUG=1 go run . to load static/ from disk instead of the
embedded build.
Pushing a v* tag (e.g. v1.2.3) triggers .github/workflows/release.yml, which builds and publishes a multi-arch Docker image to ghcr.io/abdusco/readone.