Local-first reading journal for Obsidian users. Runs as a single Go binary on Windows, keeps your Obsidian vault as the source of truth, and serves a lightweight localhost UI for logging reading progress, ratings, and reviews.
Status: v0.1 shipped (tag v0.1.0) — see SKILL.md for the full spec, priority order (security > lightweight > polish > features), and milestone plan.
- Build.
go build -o shelf.exe ./cmd/shelf(ormake build). - Configure. Copy
shelf.example.tomltoshelf.tomlin the same directory as the binary and fill invault.path+vault.books_folder. - Run.
./shelf.exe. The tray icon appears, and your default browser opens tohttp://127.0.0.1:7744/library. - Stop. Right-click the tray icon → Quit, or Ctrl-C the terminal.
Three options, pick whichever matches your workflow:
| I want… | Do |
|---|---|
| One click from Explorer | Double-click update.bat. Stops, pulls, rebuilds, relaunches. |
| Same thing from a terminal | make update — same flow via the Makefile target. |
| Just see if anything's new without updating | make update-check — fetches and lists unmerged commits. |
| Full control | Quit Shelf manually, git pull, make build, relaunch ./shelf.exe. |
Windows can't overwrite a running .exe, so any update path has to stop the running instance first. The scripts force-kill it; all vault writes are atomic (temp + fsync + rename) and shelf.db uses SQLite WAL journaling, so kill-9 is crash-consistent. Config (shelf.toml), data (shelf.db, covers/, backups/, logs/), and Windows autostart registration all persist across updates.
- Security. Path validation on every filesystem operation, atomic writes only, localhost-only by default, no external calls without user action.
- Lightweight. Single Go binary, no cgo, no npm/bundler, stdlib-first.
- Polish. Only after 1 and 2 are solid.
- Features. Only after 1, 2, 3 are solid.
- Vault is truth. The SQLite index is a rebuildable cache.
- Atomic writes only. Temp file + fsync + rename, always.
- Explicit user fields always win. External sources fill gaps; they never overwrite populated vault frontmatter.
- Dry-run + backup before any bulk write. No exceptions.
Full details in SKILL.md.