Maki is a manga collection manager in the spirit of Sonarr/Radarr: add a series once and Maki keeps it complete. It monitors sites for new chapters, downloads pages, and packages everything as CBZ files with ComicInfo.xml that Kavita parses natively — or read them straight in Maki's own built-in reader.
Maki is almost entirely AI-slop-built, developed with Anthropic's latest Claude models.
- You own the files. Everything lands on disk as a standard CBZ + ComicInfo.xml. No proprietary database lock-in. Point any OPDS/CBZ-aware reader at the library folder.
- Set-and-forget monitoring. Add a series once; Maki polls sources for new chapters and downloads them automatically, the same workflow as Sonarr for TV or Radarr for movies.
- Rich, free metadata. A local mirror of the MangaBaka database means instant search and zero API rate limits, with cross-IDs into MyAnimeList / AniList / MangaUpdates / Kitsu.
- Kavita-friendly, but not Kavita-required. Output is a plain, well-tagged CBZ readable by any comic/manga reader. Read straight in Maki's built-in reader or over OPDS, or point Kavita at the same folder for cover push, scan triggers, and reading-progress scrobbling.
- Metadata from MangaBaka. One search identifies a series and brings along its MyAnimeList / AniList / MangaUpdates / Kitsu cross-IDs. Maki keeps a local copy of the MangaBaka database (nightly snapshot, ~3 GB on disk) so metadata search and library imports are instant and free of API rate limits; MangaBaka-original data is licensed CC BY-NC-SA 4.0.
- Built-in site sources (Suwayomi/Tachiyomi-style, compiled in):
- MangaDex (official API)
- MangaPill
- Weeb Central
- MangaFire (requires FlareSolverr)
- MangaPlus (official Shueisha)
- TCB Scans
- Asura (manhwa/manhua)
- Automatic source matching when you add a series, with manual linking for anything fuzzy.
- Monitoring engine. Refreshes chapter lists on a schedule and auto-downloads new chapters, with smart auto-queue for newly-monitored series.
- Kavita-friendly output.
{Series}/{Series} Vol.X Ch.Y.cbznaming, ComicInfo.xml with series/number/volume/authors/genres/language/reading-direction, atomic imports (no torn files). - Built-in reader. Read pages directly in Maki (paged or continuous scroll-to-advance), with progress tracked and merged with Kavita so nothing double-counts. A Home screen surfaces Continue Reading, Recently Added and other user-orderable, switchable rails.
- Library at a glance. Grid or list view (with density options), per-series download state (Downloading / Queued / Complete / Missing), read badges, monitor status on every card, a stats strip (series, monitored, on disk, missing, in queue), user tags, and saved filters.
- Live activity queue over SignalR, with retry/remove and per-page progress.
- Torrent acquisition. Search releases via Prowlarr, grab to qBittorrent, auto-import on completion. Runs alongside direct scraper downloads in the same queue.
- Scrobbling. Pushes read progress to AniList, MyAnimeList, Kitsu and MangaBaka, driven by reading progress from Kavita or Maki's own reader.
- Discover. Local ONNX embeddings over the MangaBaka dump surface titles that match your library's feel, not just shared genre labels. Seed from specific titles or browse curated per-genre rails on the Genres tab, and filter by year, rating, type, status, genre, chapter count and an obscurity dial. Every rail has a fullscreen "Show more" view with the same filters and up to 120 results. Each detail card shows categorized tags, per-source ratings and a few MyAnimeList reviews.
- OPDS server. Serves the library as an OPDS 1.2 catalogue with page streaming (OPDS-PSE), so Panels, Chunky, KOReader and the Mihon/Tachiyomi OPDS extensions read straight from Maki with no Kavita hop. Off by default; the feed URL carries its own rotatable token, and pages streamed by a reader count as read in your library, Rewind and your trackers.
- Rewind stats. An append-only reading/download history (per-series read counts, activity over time) built from reading progress (Kavita or Maki's built-in reader) and download events.
- Backup & restore. One-click zip snapshot of the database and settings, with an automatic safety backup before every schema migration.
- Themes. Pick an accent (Indigo / Rose / Emerald / Amber) or a light theme under Settings.
- REST API (
/api/v1,X-Api-Keyauth, rotatable from Settings) + Swagger at/swagger.
services:
maki:
image: ghcr.io/orbitmpgh/maki:latest
container_name: maki
environment:
- PUID=1000
- PGID=1000
volumes:
- ./maki-config:/config
- /path/to/manga-library:/library
ports:
- "8990:8990"
restart: unless-stopped
kavita:
image: jvmilazz0/kavita:latest
container_name: kavita
volumes:
- ./kavita-config:/kavita/config
- /path/to/manga-library:/library # same library!
ports:
- "5000:5000"
restart: unless-stopped
# Optional, only needed for Cloudflare-protected sources (MangaFire)
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: flaresolverr
ports:
- "8191:8191"
restart: unless-stopped- Open
http://localhost:8990, go to Settings and add/libraryas a root folder. - (Optional) Set the FlareSolverr URL to
http://flaresolverr:8191and hit Test. - Add Series → search → pick → Maki auto-links sources and syncs chapters.
- Click the download button on a chapter (or Search all missing) and watch Activity.
- Point a Kavita library at the same folder. The CBZs parse with full metadata.
The API key is generated on first run into /config/config.json and shown in Settings.
- Root folders. Where CBZs are written (point Kavita at the same paths).
- Metadata. Download the local MangaBaka dump (~3 GB) for instant, rate-limit-free search.
- Discover index. Build the ONNX embedding index that powers recommendations.
- Reader. Paged / double-page / continuous-scroll modes, reading direction, fit mode, and whether progress pushes back to Kavita.
- Home. Turn Home on/off, pick it as the start page, and reorder or hide its rails.
- Prowlarr / qBittorrent. Optional torrent acquisition.
- Kavita. Optional scan triggers, cover/metadata push, and reading-progress scrobbling.
- OPDS. Off by default. Switch it on to get a token-carrying feed URL for external readers.
- Scrobbling. Connect AniList / MyAnimeList / Kitsu / MangaBaka.
- Appearance. Accent colour and light/dark theme.
- Backup & Restore. Snapshot your database +
config.jsonto a zip (see below). - API key. Shown here, and rotatable without editing
config.jsonby hand.
Settings → Backup & Restore manages zip backups of your library. Each backup holds a
consistent snapshot of the database plus config.json, everything that isn't cheap to
regenerate. The MangaBaka dump, embeddings, covers and cache are deliberately excluded, so
backups stay small. Backups live under {ConfigDir}/backups; keep the newest N per kind with
the retention setting.
Maki also takes an automatic backup immediately before any upgrade applies a database migration. Migrations are forward-only, so this is your recovery path if an upgrade goes wrong.
Backups contain your settings secrets (API keys, passwords) in plain text. Treat a downloaded backup like a password.
Restoring replaces the current database and settings, then restarts Maki to apply. Under
Docker (restart: unless-stopped) or systemd the app comes back automatically; a bare
dotnet run/exe just exits and you start it again. You can also upload a backup zip from another
machine. Maki refuses one that's newer than the running version (its schema can't be
downgraded).
The repository ships a multi-stage Dockerfile that builds the frontend
(Node 22) and backend (.NET 10 SDK) and packages them into an aspnet:10.0 runtime image with
the built SPA served from wwwroot/. Build and run it yourself:
# Build (tag however you like)
docker build -t maki:local .
# Run
docker run -d --name maki \
-p 8990:8990 \
-v "$PWD/maki-config:/config" \
-v "/path/to/manga-library:/library" \
maki:localMulti-arch build & push to a registry with Buildx:
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ghcr.io/<you>/maki:latest \
--push .Notes:
- The build context is the repo root;
.dockerignorekeepsbin/,obj/,node_modules/,dist/and dev config out of the context. entrypoint.shdrops privileges toPUID/PGID(viagosu) after fixing ownership of/config, so files land with your user's ownership.- State persists in the
/configvolume; the library is a separate mount you share with Kavita. - An identical Dockerfile lives at
distribution/docker/Dockerfilefor CI.
# Backend (http://localhost:8990, Swagger at /swagger)
dotnet run --project src/Maki.Api
# Frontend dev server (http://localhost:5173, proxies /api + /signalr)
npm --prefix frontend run dev
# Tests
dotnet test
# Release build (what the container ships)
dotnet build -c ReleaseState lives in MAKI_CONFIG_DIR (defaults to /config in Docker, %APPDATA%\Maki
on Windows). SQLite database, logs, covers, page cache, and the MangaBaka dump all live there.
For local development, point it at a throwaway dir so you don't touch your real library/DB:
MAKI_CONFIG_DIR="$PWD/.devconfig" dotnet run --project src/Maki.ApiEF Core migrations apply automatically on startup, no manual step.
src/
├── Maki.Api/ ASP.NET Core host, REST /api/v1, SignalR, Quartz jobs, download workers
├── Maki.Core/ Domain: entities, ISource/IMetadataProvider, parser, naming, CBZ pipeline
├── Maki.Data/ EF Core + SQLite
├── Maki.Sources/ Site scrapers (MangaDex, MangaPill, WeebCentral, MangaFire, MangaPlus,
│ TCB Scans, Asura)
└── Maki.Metadata/ MangaBaka provider + local dump + ONNX embeddings
frontend/ Vite + React + TypeScript + Mantine SPA
Sources implement a single ISource interface (search / series / chapters / pages) and are
registered in DI. Adding a site is one class plus one registration. Page requests carry their
own headers (Referer, cookies) end-to-end so hotlink-protected CDNs work uniformly.
Maki is pre-1.0 and under active development. Schema and API can still shift between releases.
Issues and pull requests are welcome.
Maki is a tool for organizing your library. Scraper sources access third-party websites. You are responsible for complying with those sites' terms of service and your local laws. Support the industry: buy official releases.








