The missing *arr for manga and comics. Type a title, get every volume: AniList + Prowlarr + qBittorrent + Kavita, self-hosted, FR/EN.
Python
1
0 commits
updated Oct 1, 2026
Type a manga's name. Get every volume, in French, on your shelf.
A self-hosted "Seerr for manga and comics": Lire finds a series under all its names, reads the messy release titles on your trackers, picks the smallest set of torrents that covers every volume, and files the result straight into Kavita.
English · Français
Sonarr and Radarr made films and TV boring in the best way: ask once, it shows up. Books never got that, and manga is worse. A French manga release is named something like Berserk (01-41+) (Miura) (2004) [Digital-1920] (PRiNTER-PapriKa+), packs overlap single volumes, editions (Perfect, Deluxe, Colossale…) mix with the regular run, and no *arr understands any of it. So you end up reading torrent titles by hand, volume by volume.
Lire does that reading for you. It is built for people who self-host their library and want the whole series, not a list of search results.
T01-T41, (01-41+), Tome 12 + 3HS, lists, counts), spots editions, and leaves out chapters, art books, other languages and unreadable formats, telling you why.![]() | ![]() |
![]() | ![]() |
flowchart LR
U[You] -->|"Berserk"| L(Lire)
L -->|titles, synopsis| M[AniList · Kitsu · MangaDex]
L -->|search every alias| P[Prowlarr]
P --> T[(Your trackers)]
L -->|parse, plan, add| Q[qBittorrent]
Q -->|files per series| D[(Library folder)]
L -->|scan, covers, progress| K[Kavita]
K --> D
U -->|read| K
app/parse.py): series match, edition, format, language, volumes.app/plan.py): weighted greedy cover of the missing volumes, then prune redundant picks; implausible volume numbers are capped against the known count.| Piece | Role |
|---|---|
| Docker + Compose | Runs Lire |
| Prowlarr | Searches your indexers (French manga lives on trackers such as YggTorrent) |
| qBittorrent | Downloads, Web UI enabled |
| Kavita 0.8+ | Library and reader: one library for manga, optionally one for comics |
| Ollama (optional) | Translates synopses that exist in only one language |
qBittorrent, Kavita and Lire must see the same folders: qBittorrent writes to them, Kavita reads them, Lire mounts them to delete series cleanly.
git clone https://github.com/Joopinhontas/lire.git
cd lire
cp lire.env.example lire.env && chmod 600 lire.env
# fill in LIRE_PASSWORD, SESSION_SECRET, the Prowlarr / qBittorrent / Kavita URLs and keys
echo "MANGA_DIR=/srv/media/manga" >> .env # host folders shared with qBittorrent and Kavita
echo "COMICS_DIR=/srv/media/comics" >> .env
docker compose up -d
The prebuilt image runs on amd64 and arm64 (Raspberry Pi, most NAS). Pin a version with LIRE_VERSION=1.0.0 in .env, or build from source with docker compose up -d --build.
Open http://localhost:8160, sign in as admin with LIRE_PASSWORD, search for a series.
To reach it from elsewhere, set LIRE_BIND=0.0.0.0:8160 in .env and put it behind your HTTPS reverse proxy (Lire sets its own CSP and security headers; let the proxy add HSTS).
Everything lives in lire.env; lire.env.example documents each variable. The ones people usually touch:
| Variable | Default | Meaning |
|---|---|---|
KAVITA_LIBRARY / KAVITA_COMICS_LIBRARY | Mangas / Comics & BD | Kavita library names |
MANGA_SAVE_ROOT / COMICS_SAVE_ROOT | /data/manga / /data/comics | Save folders as qBittorrent sees them |
KAVITA_MANGA_ROOT / KAVITA_COMICS_ROOT | /manga / /comics | The same folders as Kavita sees them |
PROWLARR_CATEGORIES | 7000 | Categories searched |
MANGA_CATEGORIES / COMICS_CATEGORIES | YggTorrent ids | Categories a release must carry to count |
KAVITA_PUBLIC_URL | KAVITA_URL | Address readers open |
OLLAMA_URL | empty | Enables synopsis translation |
French is the default, but a series can be fetched in English, Japanese (raw), Spanish, Italian or German too. Lire reads language tags in release titles; for indexers whose releases carry no tag (Nyaa is English), declare them with INDEXER_LANGS=5:en (Prowlarr indexer ids). Non-default languages go to manga-lang/<code> next to your manga folder: mount it in Kavita as /manga-lang (and comics-lang as /comics-lang) and Lire creates "Mangas EN", "Mangas JP"… on first use and opens them to every account.
If Kavita runs with the base URL /kavita/ and your proxy serves it under Lire's own host, set PUBLIC_URL and Lire opens the reader in the same installed app instead of a new tab:
location /kavita/ {
proxy_pass http://kavita:5000;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Open Lire in Safari, tap Share, then Add to Home Screen. It runs full screen like an app, and Kavita opens inside it when the location above is set.
__Host- cookie, HttpOnly, SameSite=Lax, revoked on password reset.Permissions-Policy, no-referrer.no-new-privileges, unprivileged user, pinned and audited dependencies.Found a vulnerability? Open a private security advisory rather than an issue.
python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt pytest
pytest -q
The test suite runs on real release titles (anonymised fixtures in tests/fixtures). When a title is parsed wrong, add it to tests/test_parse.py first, then fix the parser. The frontend is plain ES modules in app/static, no build step; interface strings live in app/static/i18n.js and must exist in both languages. Design principles are in docs/DESIGN.md.
What comes next is tracked in issues: more English release fixtures, Komga support, notifications when a series lands, and metadata pushed into Kavita. Ideas and questions are welcome in Discussions.
If Lire saves you an evening of reading torrent titles, a star helps other readers find it.
Lire automates searching and downloading through tools you already run. It hosts nothing and ships with no indexer. Use it for content you have the right to download where you live, and support the authors and publishers whose work you enjoy.
PolyForm Noncommercial 1.0.0. Free to use, study, modify and share for any noncommercial purpose: personal use, hobby projects, research, education, charities, public institutions. Selling it, hosting it as a paid service or using it inside a commercial product requires a separate license: open an issue to ask.
This is a source-available license, not an OSI-approved open source one. That is deliberate: the project stays a gift to readers rather than raw material for someone else's paid service.
Python
52.7%
JavaScript
33.7%
CSS
12.4%
The missing *arr for manga and comics. Type a title, get every volume: AniList + Prowlarr + qBittorrent + Kavita, self-hosted, FR/EN.
Python
1
0 commits
updated Oct 1, 2026
Type a manga's name. Get every volume, in French, on your shelf.
A self-hosted "Seerr for manga and comics": Lire finds a series under all its names, reads the messy release titles on your trackers, picks the smallest set of torrents that covers every volume, and files the result straight into Kavita.
English · Français
Sonarr and Radarr made films and TV boring in the best way: ask once, it shows up. Books never got that, and manga is worse. A French manga release is named something like Berserk (01-41+) (Miura) (2004) [Digital-1920] (PRiNTER-PapriKa+), packs overlap single volumes, editions (Perfect, Deluxe, Colossale…) mix with the regular run, and no *arr understands any of it. So you end up reading torrent titles by hand, volume by volume.
Lire does that reading for you. It is built for people who self-host their library and want the whole series, not a list of search results.
T01-T41, (01-41+), Tome 12 + 3HS, lists, counts), spots editions, and leaves out chapters, art books, other languages and unreadable formats, telling you why.![]() | ![]() |
![]() | ![]() |
flowchart LR
U[You] -->|"Berserk"| L(Lire)
L -->|titles, synopsis| M[AniList · Kitsu · MangaDex]
L -->|search every alias| P[Prowlarr]
P --> T[(Your trackers)]
L -->|parse, plan, add| Q[qBittorrent]
Q -->|files per series| D[(Library folder)]
L -->|scan, covers, progress| K[Kavita]
K --> D
U -->|read| K
app/parse.py): series match, edition, format, language, volumes.app/plan.py): weighted greedy cover of the missing volumes, then prune redundant picks; implausible volume numbers are capped against the known count.| Piece | Role |
|---|---|
| Docker + Compose | Runs Lire |
| Prowlarr | Searches your indexers (French manga lives on trackers such as YggTorrent) |
| qBittorrent | Downloads, Web UI enabled |
| Kavita 0.8+ | Library and reader: one library for manga, optionally one for comics |
| Ollama (optional) | Translates synopses that exist in only one language |
qBittorrent, Kavita and Lire must see the same folders: qBittorrent writes to them, Kavita reads them, Lire mounts them to delete series cleanly.
git clone https://github.com/Joopinhontas/lire.git
cd lire
cp lire.env.example lire.env && chmod 600 lire.env
# fill in LIRE_PASSWORD, SESSION_SECRET, the Prowlarr / qBittorrent / Kavita URLs and keys
echo "MANGA_DIR=/srv/media/manga" >> .env # host folders shared with qBittorrent and Kavita
echo "COMICS_DIR=/srv/media/comics" >> .env
docker compose up -d
The prebuilt image runs on amd64 and arm64 (Raspberry Pi, most NAS). Pin a version with LIRE_VERSION=1.0.0 in .env, or build from source with docker compose up -d --build.
Open http://localhost:8160, sign in as admin with LIRE_PASSWORD, search for a series.
To reach it from elsewhere, set LIRE_BIND=0.0.0.0:8160 in .env and put it behind your HTTPS reverse proxy (Lire sets its own CSP and security headers; let the proxy add HSTS).
Everything lives in lire.env; lire.env.example documents each variable. The ones people usually touch:
| Variable | Default | Meaning |
|---|---|---|
KAVITA_LIBRARY / KAVITA_COMICS_LIBRARY | Mangas / Comics & BD | Kavita library names |
MANGA_SAVE_ROOT / COMICS_SAVE_ROOT | /data/manga / /data/comics | Save folders as qBittorrent sees them |
KAVITA_MANGA_ROOT / KAVITA_COMICS_ROOT | /manga / /comics | The same folders as Kavita sees them |
PROWLARR_CATEGORIES | 7000 | Categories searched |
MANGA_CATEGORIES / COMICS_CATEGORIES | YggTorrent ids | Categories a release must carry to count |
KAVITA_PUBLIC_URL | KAVITA_URL | Address readers open |
OLLAMA_URL | empty | Enables synopsis translation |
French is the default, but a series can be fetched in English, Japanese (raw), Spanish, Italian or German too. Lire reads language tags in release titles; for indexers whose releases carry no tag (Nyaa is English), declare them with INDEXER_LANGS=5:en (Prowlarr indexer ids). Non-default languages go to manga-lang/<code> next to your manga folder: mount it in Kavita as /manga-lang (and comics-lang as /comics-lang) and Lire creates "Mangas EN", "Mangas JP"… on first use and opens them to every account.
If Kavita runs with the base URL /kavita/ and your proxy serves it under Lire's own host, set PUBLIC_URL and Lire opens the reader in the same installed app instead of a new tab:
location /kavita/ {
proxy_pass http://kavita:5000;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Open Lire in Safari, tap Share, then Add to Home Screen. It runs full screen like an app, and Kavita opens inside it when the location above is set.
__Host- cookie, HttpOnly, SameSite=Lax, revoked on password reset.Permissions-Policy, no-referrer.no-new-privileges, unprivileged user, pinned and audited dependencies.Found a vulnerability? Open a private security advisory rather than an issue.
python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt pytest
pytest -q
The test suite runs on real release titles (anonymised fixtures in tests/fixtures). When a title is parsed wrong, add it to tests/test_parse.py first, then fix the parser. The frontend is plain ES modules in app/static, no build step; interface strings live in app/static/i18n.js and must exist in both languages. Design principles are in docs/DESIGN.md.
What comes next is tracked in issues: more English release fixtures, Komga support, notifications when a series lands, and metadata pushed into Kavita. Ideas and questions are welcome in Discussions.
If Lire saves you an evening of reading torrent titles, a star helps other readers find it.
Lire automates searching and downloading through tools you already run. It hosts nothing and ships with no indexer. Use it for content you have the right to download where you live, and support the authors and publishers whose work you enjoy.
PolyForm Noncommercial 1.0.0. Free to use, study, modify and share for any noncommercial purpose: personal use, hobby projects, research, education, charities, public institutions. Selling it, hosting it as a paid service or using it inside a commercial product requires a separate license: open an issue to ask.
This is a source-available license, not an OSI-approved open source one. That is deliberate: the project stays a gift to readers rather than raw material for someone else's paid service.
Python
52.7%
JavaScript
33.7%
CSS
12.4%