Introducing: readmepls, your one-stop app to store, read, highlight, annotate and categorize your favorite articles.
Paste any link to extract the readable content into your library. Also works with Youtube videos!
The app has been developed with a simple idea: the free, core version is fully functional and feature complete. No features hidden behind a paywall. However, subscribing to the Pro version enables a suite of AI features that will make your experience even more enjoyable!
Updating: docker compose pull && docker compose up -d. Data persists in the
pb_data volume.
Smoke test: pnpm smoke boots the full stack, seeds one job, and asserts the
worker processes it end-to-end (uses a mock AI provider, so no API key is needed).
Semantic search: library search is hybrid — every query blends keyword (full-text)
and semantic (meaning-based) matches, so both exact phrases and paraphrases surface.
Embeddings run on a local model (multilingual-e5-small, no API key); it downloads
once on the first capture into the worker_models volume. To enable the semantic
half, set WORKER_SEARCH_SECRET in .env (openssl rand -hex 32) — the same value
wires the worker's internal /search endpoint and the web app that calls it. Leave it
empty to run keyword-only. To embed content you captured before enabling it, set
BACKFILL_EMBEDDINGS=1 for one worker boot. If the worker is unreachable, search
degrades to keyword-only automatically.
Three processes against one PocketBase superuser shared by the worker and the web service client.
# 1. PocketBase (applies migrations on start)
cd pocketbase && ./pocketbase superuser upsert worker@local password12345
./pocketbase serve --http=127.0.0.1:8090
# 2. Worker (new terminal, from repo root) — build once, then run
pnpm --filter @readmepls/worker build
PB_URL=http://127.0.0.1:8090 \
PB_WORKER_EMAIL=worker@local PB_WORKER_PASSWORD=password12345 \
ANTHROPIC_API_KEY=sk-... \
pnpm --filter @readmepls/worker start
# 3. Web (new terminal, from repo root) — service client uses PB_ADMIN_*
PB_URL=http://127.0.0.1:8090 \
PB_ADMIN_EMAIL=worker@local PB_ADMIN_PASSWORD=password12345 \
pnpm --filter @readmepls/web devWanna build your own, personal library? Got you covered there too — the app is easily self-hostable, with an optional bring-your-own-key approach to the AI features. Full walkthrough: readmepls.com/docs.
- Grab
compose.ymland.env.examplefrom this repo — no need to clone it. - Rename
.env.exampleto.envand fill in the PocketBase admin/worker passwords (and, optionally,ANTHROPIC_API_KEYto turn AI features on for everyone using your instance). docker compose pull && docker compose up -d
Data persists in the pb_data volume.
YouTube on a VPS: YouTube bot-blocks datacenter IPs (Sign in to confirm you're not a bot), so YouTube captures may fail from a cloud host even though
they work locally. Export cookies from a browser logged into a throwaway Google
account (Netscape cookies.txt format), save the file on the host, and set
YOUTUBE_COOKIES_HOST in .env to its absolute path — the worker passes them to
yt-dlp. Cookies expire; refresh them if extraction starts failing again.
Maintainers: deploying the gated staging environment (develop-branch
images, same VPS as prod)? See docs/deploy/staging.md.
GNU AGPL-3.0-or-later. You may use, modify, and self-host freely; if you run a modified version as a network service, you must release your source changes.
Copyright (C) 2026 readmepls authors.
