55<h1 align =" center " >Quire</h1 >
66
77<p align =" center " >
8- <em >Self-hosted EPUB reader for calibre-web. No telemetry, no cloud, your data.</em >
8+ <strong >quire</strong > <em >  ; /ˈkwaɪər/   ; n.  ; — a gathering of folded leaves, bound into a book.</em >
9+ </p >
10+
11+ <p align =" center " >
12+ <em >A privacy-first Android EPUB reader for calibre-web — gathering your library,<br >
13+ your reading state, and opt-in, self-hosted AI into one bound whole.<br >
14+ No telemetry, no cloud, your data.</em >
915</p >
1016
1117<p align =" center " >
2733A self-hosted reading stack for people who already run [ calibre-web] :
2834
2935- ** Quire** — native Android EPUB reader (Kotlin / Compose / Readium).
30- - ** Quire Server** — small FastAPI service that stores reading progress
31- (and later bookmarks) in Postgres. The Python package is ` quire_server `
32- and the container image is ` ghcr.io/vitofico/quire-server ` .
36+ - ** Quire Server** — small FastAPI service that stores reading state and
37+ your per-user library mirror in Postgres, and orchestrates the optional
38+ AI features. The Python package is ` quire_server ` and the container image
39+ is ` ghcr.io/vitofico/quire-server ` .
40+ - ** Optional, private AI** — book insights, catalog previews, a reader
41+ profile, recommendations, and barcode book-scanning — all routed through
42+ an OpenAI-compatible endpoint * you* control. Off by default, opt-in per
43+ user. [ Jump to AI ↓] ( #ai-on-your-terms )
3344
3445calibre-web stays the source of truth for books. Quire Server is the
3546source of truth for reading state. Quire reconciles both on the device.
@@ -45,6 +56,77 @@ source of truth for reading state. Quire reconciles both on the device.
4556 [Postgres]
4657```
4758
59+ ## AI, on your terms
60+
61+ Most reading apps that got "smart" did it by shipping your library to
62+ someone else's cloud. Quire does the opposite: the intelligence runs
63+ against an endpoint ** you** point it at, it is ** off by default** , and
64+ every user ** opts in** individually. The admin configures any
65+ OpenAI-compatible endpoint — Ollama, llama.cpp, vLLM, OpenAI,
66+ OpenRouter, … — and if AI isn't enabled and opted into, Quire makes no
67+ AI calls at all.
68+
69+ What that unlocks:
70+
71+ ### 📷 Scan a book before you buy it
72+
73+ Point your phone at a physical book's barcode (or type the ISBN) and
74+ Quire tells you, on the spot, whether it belongs on your shelf:
75+
76+ - ** Reader-affinity score** — a deterministic 0–100 match score with a
77+ band (very low → very high) and plain-language reasons, computed from
78+ the authors, series, and subjects already in your library. ** No LLM,
79+ no AI network call** — instant, private, and works as a snap judgment
80+ in a bookshop.
81+ - ** Already-owned detection** — tells you if it's in your library and
82+ where you left off (unread / in progress / finished / abandoned).
83+ - ** Cover + one-tap deep dive** — pulls the cover from OpenLibrary and,
84+ if you want more, loads the full AI insight card on demand.
85+
86+ ### 📖 Insights that actually say something
87+
88+ Per-book insight cards generated by the LLM and ** grounded with real
89+ citations** from Wikipedia and OpenLibrary — not hallucinated blurbs:
90+
91+ - intro · author context · series placement
92+ - themes & ** craft notes** (how the book is * made* , not just what it's about)
93+ - ** comparative anchors** ("if you liked…")
94+ - a distinctive take · discussion prompts · content advisory · cited sources
95+
96+ Insights show up ** on catalog tiles before you download** (tap the info
97+ icon), so you can size up a book before it ever touches your device.
98+ Download it and the cached insight is promoted onto the owned book
99+ instantly. Cards are cached per book and shared across every opted-in
100+ reader on your instance, so you pay for each generation once.
101+
102+ ### 🎚️ In your voice, in your language
103+
104+ Set the tone — neutral, enthusiastic, scholarly, or casual — and the
105+ language: 100+ options, or ** ` auto ` ** to follow the book's own language.
106+ Don't like a card? Regenerate it with feedback.
107+
108+ ### 🧭 A reader profile that recommends
109+
110+ From the books you've finished, Quire builds an AI-written narrative of
111+ your taste (refresh on demand) that powers three flavors of suggestions:
112+
113+ - ** In-library** — unfinished books you * already own* that fit your taste.
114+ - ** Discovery** — more from authors you've finished, fetched from OpenLibrary.
115+ - ** AI-suggested** — books you don't own yet, worth hunting down.
116+
117+ Plus ** Library Stats** (finished / in-progress / abandoned counts, top
118+ authors, top themes) and an ** abandoned-book** status that quietly drops
119+ DNFs out of your library view until you ask for them.
120+
121+ ### 🔧 Built for self-hosters
122+
123+ Per-user daily budgets and quotas, an AI ** health endpoint** , and deploy
124+ modes for ** sync-only** , ** AI-only** , or ** full-stack** operation. Bring
125+ your own model; cap your own spend.
126+
127+ > All of the above is opt-in and routed through your endpoint. For setup,
128+ > env vars, and deploy modes see [ ` server/README.md ` ] ( server/README.md ) .
129+
48130## Why this exists
49131
50132The starting point was an OPDS catalog (calibre-web) and a simple need:
@@ -81,40 +163,6 @@ Apache-2.0, calibre-web-only, **no telemetry, ever.**
81163- Credentials are stored in Android Keystore (hardware-backed where the
82164 device supports it).
83165
84- ## AI features (optional)
85-
86- Quire optionally calls AI for book insights and library analysis. AI is
87- ** off by default** . The Quire Server admin enables it server-side by
88- configuring an OpenAI-compatible endpoint (Ollama, llama.cpp, vLLM,
89- OpenAI, OpenRouter, …); each user then opts in from Quire's settings.
90-
91- When enabled, Quire Server sends the EPUB metadata (title, author,
92- publisher, description, subjects) of books a user opens to the
93- configured AI endpoint, plus deterministic queries to Wikipedia and
94- OpenLibrary to ground the generated insights with citations. The
95- generated insight is cached server-side per book and reused across all
96- of that user's devices and other opted-in users on the same instance.
97-
98- Surfaces in the app today:
99-
100- - ** Book-detail cards** — summary, author, series, themes, craft notes,
101- comparative anchors, discussion prompts, content advisory, sources.
102- - ** Catalog detail screen** — previews the same insight cards before
103- download via an ` info ` icon on each catalog tile. Once the EPUB is
104- downloaded the cached catalog insight is promoted onto the canonical
105- identity so the book-detail screen shows it immediately.
106- - ** Library Stats** — totals, finished / in-progress / abandoned counts,
107- top authors, top themes, backed by ` GET /library/v1/stats ` .
108- - ** Library Insights** — a per-user reader profile (narrative, in-library
109- recommendations, OpenLibrary discovery recommendations, AI-suggested
110- reads), refreshed on demand from the screen. Backed by
111- ` GET /ai/v1/profile ` + ` POST /ai/v1/profile/refresh ` . A "Delete
112- profile" action in Settings wipes the cached row.
113- - ** Abandoned book UX** — books you've marked abandoned drop out of
114- Library by default; a "Show abandoned" toggle reveals them.
115-
116- For configuration details see [ ` server/README.md ` ] ( server/README.md ) .
117-
118166## Install
119167
120168Install Quire from [ F-Droid] or grab the latest APK from [ Releases] ,
0 commit comments