Skip to content

Commit 66e59a3

Browse files
authored
Update README.md
1 parent 1d6357f commit 66e59a3

1 file changed

Lines changed: 125 additions & 89 deletions

File tree

README.md

Lines changed: 125 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,71 @@
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

3449
Go to:
3550

3651
`qBittorrent → Settings → Web UI → Security`
3752

3853
And make sure:
3954

40-
***Disable CSRF protection**
41-
***Disable Host header validation**
55+
* ❌ Disable CSRF protection
56+
* ❌ Disable Host header validation
4257

4358
If 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

4964
These settings are required when running qBittorrent behind Docker or reverse proxies.
5065

5166
---
5267

53-
## Project structure
68+
## 📁 Project structure
5469

5570
```text
5671
bookseerr/
@@ -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
86105
npm install
87106
```
88107

89-
2. Create your environment file from the example:
108+
### 2. Create environment file
90109

91110
```bash
92111
cp .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
100121
npm run dev
101122
```
102123

103-
Or in production:
124+
Or production:
104125

105126
```bash
106127
npm start
107128
```
108129

109-
5. Open:
130+
### 5. Open in browser
110131

111-
```text
132+
```
112133
http://localhost:3000
113134
```
114135

115-
## Environment variables
136+
---
116137

117-
Main variables used by the app:
138+
## 🔐 Environment variables
118139

119140
```env
120141
PORT=3000
@@ -148,29 +169,29 @@ PROCESSED_DIR=/downloads/.imported
148169
REQUEST_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

157178
Returns 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
166187
curl "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
176197
curl -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
192213
curl -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

Comments
 (0)