A daily edition composed from your own notes.
Your notes, read back to you — an original morning edition written from everything you've already written.
Againpage reads your personal note vault (an Obsidian folder, or any folder of Markdown) and periodically composes an original edition — a piece of writing that connects ideas across your notes, resurfaces things you'd forgotten, and gives you a reason to re-encounter your own thinking. It then presents it in a quiet, newspaper-like reader.
It is local-first: it runs on your machine, stores everything in a local database, and — with a local model — never sends a single note over the network.
Alpha. Againpage is early software. Today you run it locally with Docker (below). A packaged one-click desktop app is on the roadmap.
- Composed, not collected — each edition is original writing (a lead essay, connections between notes, standalone summaries, questions, things to apply), not a list of links.
- Reads across your whole vault — scans your Markdown, embeds every note, and clusters them into themes so editions draw unexpected connections.
- Click any note, read it in depth — a slide-in drawer shows a rich ~500-word summary of any single note, on demand.
- On your schedule — pick a delivery time and an "every N days" cadence, with a live countdown to your next edition.
- Private by design — your notes stay on your machine; with Ollama, editions compose fully offline.
- Bring your own models — local via Ollama, or hosted via OpenRouter, all configured in the app.
There are two ways to run Againpage:
- For personal use — run the engine with Docker and use the downloaded reader app. No coding tools required.
- For development — run everything from source with the dev toolchain. You use your own filesystem directly, so none of the Docker path caveats apply.
Install the toolchain:
| Tool | For |
|---|---|
| Docker | local Postgres (pnpm db:up) |
| Node 24 + pnpm 10.30.3 | reader + workspace |
| uv + Python ≥ 3.14 | the engine |
| Rust (stable) | building the desktop app (optional) |
pnpm install
cd engine && uv sync && cd ..
pnpm db:up # Postgres (pgvector) in Docker
# then three terminals:
cd engine && uv run againpage-api # API → :8000
cd engine && uv run againpage-worker # worker
pnpm --filter reader dev # reader → :5173Run natively like this and the engine reads your real filesystem — you use
ordinary absolute paths, and the folder picker works normally. None of the
Docker mount rules below apply. Full details: CONTRIBUTING.md.
The reader is a downloadable desktop app; the engine (Postgres + API +
worker) runs with Docker. First: install Docker, pick an AI source — an
OpenRouter key (one key covers writing and
embeddings; simplest) or Ollama (fully local:
ollama pull nomic-embed-text + a chat model) — and clone the repo:
git clone <this-repo-url> againpage && cd againpage
⚠️ The one Docker rule — read this. The engine runs in a container and can only read a folder you mount into it. So mount the parent folder of your notes asVAULT_PATH; it appears inside the engine at/vault. Then in the reader, write each notes folder as/vault/<folder-name>. (A\\server\shareURL won't work — mount the share on the host first, then pointVAULT_PATHat that host path.)Do NOT use the reader's folder picker here. It points at your machine, which the containerized engine can't read — type
/vault/<folder-name>instead. The picker is only for the development setup (native engine, no Docker).
# mount the PARENT of your notes; it appears inside the engine at /vault
VAULT_PATH="/Users/you/Documents" docker compose up --build -dDownload the reader for your OS (macOS .dmg, Windows .exe/.msi, Linux
.AppImage/.deb) from the Releases page and open it — it connects to
http://localhost:8000 automatically. Then, in the reader:
- Notes folder — type
/vault/<folder-name>. E.g. notes in~/Documents/Notes→ you mounted~/Documents, so enter/vault/Notes. Add as many/vault/...folders as you like. - AI source — OpenRouter key, or Ollama at
http://host.docker.internal:11434. Test connection. - Index — Settings → Advanced → Re-index notes & embeddings, then generate and read.
To stop the engine: docker compose down (data persists in a Docker volume).
Don't want Docker? If you already have the dev tools, use For development instead — it runs against your own filesystem, no mounting.
Engine on a server or NAS, reader on your laptop.
On the server — mount the parent folder of your notes (a network share mounted on the server works) and start the engine:
VAULT_PATH="/mnt/notes" pnpm engine:up # ≡ docker compose up --build -d ; API on 0.0.0.0:8000On your laptop — download and open the reader, then point it at the server (required — otherwise every screen fails to load):
- Set the Engine URL to
http://SERVER_IP:8000— in onboarding (welcome step) or later in Settings → Engine connection. - Set the notes folder to
/vault/<folder-name>— the path on the server, as mounted (again, type it; don't use the picker). If you run the engine natively on the server (dev tools, no Docker), there's no mount — use the real path like/mnt/notes/vault1; the/vault/...prefix only exists because of the Docker mount. - AI source → index → read, as above.
There's also an Android build of the reader. Download Againpage_<version>_android.apk
from the Releases page and open
it on your phone — Android will ask you to allow installing from this source; enable
it, then install. It's a thin client, so it works exactly like the split setup above:
on the welcome step set the Engine URL to your server (e.g. your Tailscale/VPN
address such as https://your-host.tailXXXX.ts.net), and it reads from the engine —
it never indexes locally, so there's no folder picker. If the engine is already set
up, onboarding exits on its own once it connects. Use an https:// engine URL:
the release build blocks plain-http (cleartext) traffic.
Tailscale + Android gotcha. If the engine loads in the phone's browser but the app fails with a name-resolution error (the reader can't reach a MagicDNS
…ts.netaddress), turn Settings → Network & internet → Private DNS → Off. Android's Private DNS (DNS-over-TLS) routes lookups through a public resolver that can't see private Tailscale names; the system WebView follows it even though Chrome works around it. With Private DNS off, the system uses Tailscale's resolver and the app connects.
Optionally enable Settings → Preferences → "Notify me when an edition is ready" to get a local notification a few minutes after each edition's delivery time (Android only; asks for notification permission).
⚠️ Security. The engine API is unauthenticated and single-user. Keep it on a trusted LAN or VPN — never expose it to the public internet; anyone who can reach it can read your notes.
- Everything runs on your machine — a local Postgres database and a local reader.
- With Ollama selected, no note ever leaves your computer; editions can be composed with the network disconnected.
- Notes only reach a hosted provider (OpenRouter) if you explicitly choose it for the writer model.
- No account, no sign-up, no telemetry.
- Developers: setup, repo layout, and conventions live in
CONTRIBUTING.md. - License: Againpage is source-available under the Functional Source License
1.1, converting to Apache License 2.0 on 1 January 2029 — see
LICENSE.
Copyright © 2026 Kushal Agrawal and the Againpage contributors.
Licensed under FSL-1.1-ALv2 (see LICENSE).