1- # bookseerr
1+ # Bookseerr – Ebook Request Manager for Calibre-Web
22
3- ` bookseerr ` is a self-hosted fullstack service for searching, downloading, and auto-importing ebooks with a lightweight web UI .
3+ > A lightweight alternative to Overseerr for managing ebooks with Calibre-Web .
44
5- GitHub repository: ` https://github.com/Cruzadera/bookseerr.git `
5+ Bookseerr is a self-hosted ebook request manager designed to automate ebook search, download, and import into your Calibre-Web library.
66
7- ## What it does
7+ It integrates tools like Prowlarr and qBittorrent into a seamless pipeline, allowing users to search and request books from a simple web interface.
88
9- ` bookseerr ` connects the following services into a single automated pipeline:
9+ ---
10+
11+ ## 🔍 Keywords
12+
13+ self-hosted ebook manager, calibre-web automation, ebook request system, overseerr for books, ebook downloader, prowlarr books, qbittorrent ebooks
14+
15+ ---
16+
17+ ## 🚀 What it does
1018
11- * ` Prowlarr ` for book search
12- * ` qBittorrent ` for download handling
13- * ` Calibre-Web ` for library import
14- * a local watcher that detects completed book files and uploads them automatically
19+ Bookseerr integrates popular self-hosted services into a fully automated ebook pipeline:
1520
16- User flow:
21+ * ` Prowlarr ` → search engine for books
22+ * ` qBittorrent ` → download manager
23+ * ` Calibre-Web ` → library management
24+ * Local watcher → detects completed downloads and imports them automatically
1725
18- ` Open UI -> search book -> start download -> watcher detects file -> Calibre-Web import `
26+ ### User flow
1927
20- ## Features
28+ ` Open UI → search book → start download → watcher detects file → Calibre-Web import `
2129
22- * Minimal web UI served directly by Express
23- * Search endpoint: ` GET /api/search `
24- * Manual download endpoint: ` POST /api/download `
25- * Automatic request endpoint: ` POST /api/request `
26- * Job tracking endpoint: ` GET /api/jobs `
27- * EPUB-first ranking logic in ` ProwlarrService `
28- * Automatic import of downloaded ebooks into Calibre-Web
30+ ---
31+
32+ ## ✨ Features
33+
34+ * Minimal and fast web UI served by Express
35+ * Ebook search via ` GET /api/search `
36+ * Manual download via ` POST /api/download `
37+ * One-click request via ` POST /api/request `
38+ * Download tracking via ` GET /api/jobs `
39+ * EPUB-first ranking logic
40+ * Automatic import into Calibre-Web
41+ * Fully self-hosted and lightweight
42+
43+ ---
2944
3045## ⚠️ qBittorrent Configuration (IMPORTANT)
3146
32- To allow ` bookseerr ` to communicate correctly with qBittorrent WebUI API, you must disable some security options.
47+ To allow Bookseerr to communicate correctly with qBittorrent WebUI API, you must disable some security options.
3348
3449Go to:
3550
3651` qBittorrent → Settings → Web UI → Security `
3752
3853And make sure:
3954
40- * ❌ ** Disable CSRF protection**
41- * ❌ ** Disable Host header validation**
55+ * ❌ Disable CSRF protection
56+ * ❌ Disable Host header validation
4257
4358If these options are enabled:
4459
4560* API requests may fail with ` 403 Forbidden `
46- * Downloads may appear as accepted but never actually start
61+ * Downloads may appear accepted but never start
4762* Authentication may silently fail
4863
4964These settings are required when running qBittorrent behind Docker or reverse proxies.
5065
5166---
5267
53- ## Project structure
68+ ## 📁 Project structure
5469
5570``` text
5671bookseerr/
@@ -70,51 +85,57 @@ bookseerr/
7085└── README.md
7186```
7287
73- ## Requirements
88+ ---
89+
90+ ## ⚙️ Requirements
91+
92+ * Node.js >= 18
93+ * Access to Prowlarr
94+ * Access to qBittorrent
95+ * Access to Calibre-Web
96+ * Shared downloads directory
7497
75- * ` Node.js >= 18 `
76- * access to ` Prowlarr `
77- * access to ` qBittorrent `
78- * access to ` Calibre-Web `
79- * a shared downloads path visible to both ` bookseerr ` and the downloader
98+ ---
8099
81- ## Quick start
100+ ## ⚡ Quick start
82101
83- 1 . Install dependencies:
102+ ### 1. Install dependencies
84103
85104``` bash
86105npm install
87106```
88107
89- 2 . Create your environment file from the example:
108+ ### 2. Create environment file
90109
91110``` bash
92111cp .env.example .env
93112```
94113
95- 3 . Update the values in ` .env ` for your environment.
114+ ### 3. Configure variables
96115
97- 4 . Start the service:
116+ Edit ` .env ` with your setup values.
117+
118+ ### 4. Run the app
98119
99120``` bash
100121npm run dev
101122```
102123
103- Or in production:
124+ Or production:
104125
105126``` bash
106127npm start
107128```
108129
109- 5 . Open:
130+ ### 5. Open in browser
110131
111- ``` text
132+ ```
112133http://localhost:3000
113134```
114135
115- ## Environment variables
136+ ---
116137
117- Main variables used by the app:
138+ ## 🔐 Environment variables
118139
119140``` env
120141PORT=3000
@@ -148,29 +169,29 @@ PROCESSED_DIR=/downloads/.imported
148169REQUEST_TIMEOUT_MS=30000
149170```
150171
151- Note: ` .env.example ` currently reflects your local setup style. Before publishing or sharing the repository, make sure it does not contain real credentials or internal-only addresses.
172+ ---
152173
153- ## API
174+ ## 🔌 API
154175
155176### ` GET /health `
156177
157178Returns service status.
158179
159- ### ` GET /api/search?query=<text> `
180+ ---
160181
161- Searches books through ` Prowlarr ` .
182+ ### ` GET /api/search?query=<text> `
162183
163- Example:
184+ Search ebooks using Prowlarr.
164185
165186``` bash
166187curl " http://localhost:3000/api/search?query=dune"
167188```
168189
169- ### ` POST /api/download `
190+ ---
170191
171- Starts a download from a selected result.
192+ ### ` POST /api/ download`
172193
173- Example:
194+ Start a manual download.
174195
175196``` bash
176197curl -X POST " http://localhost:3000/api/download" \
@@ -182,11 +203,11 @@ curl -X POST "http://localhost:3000/api/download" \
182203 }'
183204```
184205
185- ### ` POST /api/request `
206+ ---
186207
187- Searches automatically, picks the best result, and sends it to ` qBittorrent ` .
208+ ### ` POST /api/request `
188209
189- Example:
210+ Automatically search and download the best result.
190211
191212``` bash
192213curl -X POST " http://localhost:3000/api/request" \
@@ -196,31 +217,39 @@ curl -X POST "http://localhost:3000/api/request" \
196217 }'
197218```
198219
220+ ---
221+
199222### ` GET /api/jobs `
200223
201- Returns tracked download/import jobs.
224+ Returns tracked jobs.
225+
226+ ---
227+
228+ ## 🖥️ Frontend
202229
203- ## Frontend
230+ A minimal vanilla JavaScript UI served from ` /web ` .
204231
205- The frontend is a simple vanilla JS app served from ` web/ ` .
232+ Includes:
206233
207- It includes:
234+ * Search input
235+ * Results list
236+ * Download buttons
237+ * “Download best” action
208238
209- * search input
210- * search results list
211- * per-result download button
212- * ` Download best ` action using ` /api/request `
239+ No frontend framework required.
213240
214- No frontend framework is required.
241+ ---
215242
216- ## Automation flow
243+ ## 🔄 Automation flow
217244
218- 1 . The user searches a book from the UI or API.
219- 2 . ` ProwlarrService ` returns ranked results, prioritizing ` EPUB ` .
220- 3 . ` qBittorrentService ` sends the selected magnet to qBittorrent.
221- 4 . The watcher monitors the download directory.
222- 5 . ` ImportService ` uploads supported book files to Calibre-Web.
223- 6 . The imported file is moved or deleted depending on ` POST_IMPORT_ACTION ` .
245+ 1 . User searches a book
246+ 2 . Prowlarr returns ranked results (EPUB prioritized)
247+ 3 . qBittorrent starts the download
248+ 4 . Watcher detects completed files
249+ 5 . ImportService uploads to Calibre-Web
250+ 6 . File is moved or deleted
251+
252+ ---
224253
225254## 🐳 Docker
226255
@@ -243,36 +272,43 @@ docker run -d \
243272 ghcr.io/cruzadera/bookseerr:latest
244273```
245274
275+ ---
276+
246277### docker-compose
247278
248- The repository includes ` docker-compose.example.yml ` for a single-service ` bookseerr ` deployment .
279+ A ` docker-compose.example.yml ` is included .
249280
250- 1 . Copy it to your deployment directory as ` docker-compose.yml ` .
251- 2 . Update the placeholder bind mounts so they match your host paths.
252- 3 . Make sure the ` build ` path points at your local ` bookseerr ` checkout.
253- 4 . Start the container with ` docker compose up -d --build ` .
281+ Steps:
254282
255- ### Notes
283+ 1 . Copy it to ` docker-compose.yml `
284+ 2 . Update volumes
285+ 3 . Adjust build path
286+ 4 . Run:
256287
257- * Make sure ` /downloads ` points to the same shared download directory used by qBittorrent so the watcher can detect completed files.
258- * Make sure ` /library ` points to the library location expected by your Calibre-Web workflow.
259- * Mount ` /data ` to persistent storage so ` STATE_FILE=/data/state.json ` survives container restarts.
260- * If your host uses custom ownership or a NAS share, ensure the container has the correct file permissions and UID/GID mapping when needed.
288+ ``` bash
289+ docker compose up -d --build
290+ ```
261291
262- ## Development notes
292+ ---
263293
264- * Existing import logic was kept intact.
265- * Existing watcher logic was kept intact.
266- * Existing logging and job tracking were preserved.
267- * The web UI is intentionally small and framework-free.
294+ ## 🧠 Notes
268295
269- ## Roadmap
296+ * ` /downloads ` must match qBittorrent path
297+ * ` /library ` must match Calibre-Web library
298+ * ` /data ` ensures persistence
299+ * Check permissions if using NAS
270300
271- - [ ] Multi-user support
272- - [ ] Automatic shelf assignment
273- - [ ] Notifications
274- - [ ] Improved ranking logic
301+ ---
302+
303+ ## 🛣️ Roadmap
304+
305+ * [ ] Multi-user support
306+ * [ ] Automatic shelves
307+ * [ ] Notifications
308+ * [ ] Better ranking logic
309+
310+ ---
275311
276- ## License
312+ ## 📄 License
277313
278- No license file is included yet. Add one before making the repository public if you want to define reuse terms explicitly .
314+ No license defined yet. Add one (MIT recommended) before public distribution .
0 commit comments