mokuro-bridge
mokuro-bridge is where all three dokuha projects converge. It is a small local service that runs mokuro OCR on finished pages and uploads the result, producing the .cbz / .mokuro / .webp trio that reader.mokuro.app reads.
The three projects
- dokuha-cli is the engine and the batch downloader. A Node CLI that downloads manga volumes from five stores (BookWalker, CMOA, ebookjapan, Kindle and k-manga) at full resolution, unscrambles them offline, and owns series downloads: give it a series URL and it finds the free volumes and previews itself.
- dokuha-userscript is the in-browser companion. What you can install today is the earlier userscript release, bookwalker-ebookjapan-cmoa-native-downloader, which covers BookWalker, CMOA and ebookjapan: it downloads the single volume you already have open, with no install beyond a userscript manager. The rewrite that adds Kindle and k-manga is in development and not published yet.
- mokuro-bridge (this repository) is where all three converge. A small local service that runs mokuro OCR on finished pages and uploads the result to MEGA, Google Drive, OneDrive or a local folder, producing the
.cbz/.mokuro/.webptrio that reader.mokuro.app reads. Both downloaders hand finished volumes to it, so OCR and upload are identical no matter which one produced the pages. It is also useful on its own for any client that can produce page images.
dokuha-cli is the batch downloader, dokuha-userscript is the browser companion, and this repository is the shared OCR and delivery service. Both downloaders call the same HTTP API here, so a volume captured headlessly and a volume captured in a browser are processed by exactly the same code.
What this service is responsible for
The bridge owns one half of the capture pipeline and only that half: it never touches a storefront and holds no store account, cookie or store protocol. A client gets the images out however it likes and hands them over, which is why the bridge does not break when a store changes and why anything that can produce a page image can use it.
| What it is | A local FastAPI service: pages in, .cbz + .mokuro + .webp out |
| Runs on | macOS, Windows and Linux, Python 3.10 or newer |
| Needs | Any mokuro plus PyTorch for OCR; the fetch accelerator is in the base install |
| Delivery | A local folder by default; MEGA, Google Drive and OneDrive opt in |
| Exposure | Loopback only, unauthenticated, and meant to stay that way |
The output is always the same three files, under a per-series folder:
<output>/<series>/
<volume>.cbz page images
<volume>.mokuro OCR text and block data
<volume>.webp cover
A volume folder keeps a clean name unless that name is genuinely taken, in which case the bridge adds a short random suffix (<volume>_a1b2c3) so two different volumes never share a directory.
Where it converges with the other two
dokuha-cli hands over a folder of finished pages with --mokuro. dokuha-userscript streams each captured page to the bridge as it downloads, so OCR overlaps the capture. Both end at the same POST /session/{id}/finalize, which assembles the trio, uploads it and reports progress as NDJSON on the same connection.
The three projects are documented together under docs/clients.md, which gives the exact request sequence each client uses.
Key advantages
- Store-agnostic. The bridge knows nothing about any store, so a storefront redesign cannot break OCR or delivery.
- OCR runs as pages arrive, in chunks of 8 with an idle flush after 1.5 s, so a long volume is not a capture followed by a separate wait.
- Twelve HTTP routes cover capture, resume, status, queue, health and destination checks; the full table is in docs/endpoints.md.
- Named destinations. Each provider can hold several accounts (
mega,mega:work,drive:personal), each with its own remote root and credentials. See docs/destinations.md. - A sticky default. Once any client names a destination explicitly, that choice becomes the default for every later request, including from other clients, until another explicit choice replaces it.
- A page-fetch accelerator for the browser companion. A browser allows six connections per origin, and the port is part of the origin, so the bridge opens 48 extra localhost ports by default and lists them on
/health. Each is worth six more sockets, so the userscript gets 288 extra lanes with nothing to configure. - Safe by default. It binds to
127.0.0.1, refuses to read outside your home and the system temp locations, and stages uploads inside the work volume.
Use cases
- Headless batch capture. Run dokuha-cli over a series with
--mokuroand come back to a finished library with OCR text, covers and cloud copies. - One volume from the browser. Use the userscript on a page you already have open; the bridge supplies the extra fetch lanes, the OCR and the upload.
- OCR a folder you already have.
mokuro-bridge-ocr ./my-volume/ --title "Volume title"drives a running bridge over HTTP. - Any other client. Anything that can POST page images can use the bridge; there is no store-specific code to satisfy.
Install
Install with pipx or uv tool install, which keeps the bridge in its own environment:
pipx install mokuro-bridge
mokuro-bridge
Or from a checkout:
git clone https://github.com/GolyBidoof/mokuro-bridge && cd mokuro-bridge
python3 -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
./run.sh
The base install is only fastapi, uvicorn, python-multipart, httpx and keyring. The OCR engine is optional because it pulls in PyTorch, which is several GB. Either engine works:
pip install "mokuro @ git+https://github.com/GolyBidoof/mokuro" # the fork, batched, about 1.8x
pip install -r requirements-ocr.txt # stock mokuro, slower
Without an engine the bridge still runs, /health reports mokuro_installed: false, and only OCR is unavailable. An upload provider's SDK also stays out of the base install, and its setup wizard offers to install the right requirements file when one is missing. pip install "mokuro-bridge[cloud]" adds both Google Drive and OneDrive without PyTorch.
The fork is the faster engine, and mokuro-bridge --install-mokuro replaces whichever mokuro is installed in the environment that runs the service, then verifies the import. /health reports which engine is loaded as mokuro_flavor. The exact commands, how to go back to upstream, and the per-environment caveat are in docs/mokuro.md.
Quick start
Start the bridge, then OCR a folder of pages you already have:
mokuro-bridge-ocr ./my-volume/ --title "Volume title"
Or let a client drive the whole pipeline, folder hand-off first and streaming capture second:
dokuha --mokuro 'https://bookwalker.jp/de00000000-0000-4000-8000-000000000001/'
Configure a cloud destination once and it stays the default:
mokuro-bridge --setup-upload mega
mokuro-bridge --list-uploads
On macOS, ./install-launchd.sh installs a launchd agent that starts the bridge at login. When a newer release exists, the service logs one line about it at startup, and mokuro-bridge --check-update reports it without changing anything (exit 0 up to date, 1 update available, 2 check failed). mokuro-bridge --update is the one command that acts: it detects whether this copy came from pipx, uv tool, a plain pip install or a git checkout, prints the exact upgrade command, runs it and prints how to restart the service. Nothing restarts by itself, because a restart mid-OCR loses work.
The bridge is unauthenticated and binds to 127.0.0.1, which is the whole access control. A library outside your home directory needs MOKURO_BRIDGE_INGEST_ROOTS. CORS, the fetch allowlist and the file-descriptor cost of 48 proxy ports are covered in docs/architecture.md.
Docs
| docs/endpoints.md | Every HTTP route: method, path, form fields, response shape, error codes and test coverage |
| docs/destinations.md | Upload targets, named accounts, credential stores and the sticky default |
| docs/clients.md | How dokuha-cli and dokuha-userscript drive the bridge, with the exact request sequence |
| docs/architecture.md | Request lifecycle, sessions, scheduling, the fetch proxy and the security posture |
| docs/troubleshooting.md | Install failures, missing OCR, file-descriptor limits, 403s |
| docs/mokuro.md | The faster mokuro fork: why it is faster, the one install command, going back to upstream |
| CHANGELOG.md | What changed, release by release |
| Releases | The prebuilt wheel and sdist |
Development
pip install -r requirements-dev.txt
python3 -m pytest # 292 tests, about 10s, hermetic
python3 -m ruff check .
Credits and licence
MIT, see LICENSE.
OCR runs on the mokuro fork, which adds batched recognition and is the recommended engine. It forks kha-white's original mokuro, still supported as the slower fallback under its own licence. Cloud delivery uses the MEGA, Google Drive and OneDrive clients, each under its own terms.
The code was written by DeepSeek V4.1 Flash.
Metadata
Release files for mokuro-bridge 0.8.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| mokuro_bridge-0.8.1.tar.gz | 185.7 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mokuro_bridge-0.8.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 318.0 kB
Release files / mokuro_bridge-0.8.1.tar.gz
| Download URL | mokuro_bridge-0.8.1.tar.gz |
|---|---|
| Size | 185.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ef3efb4142f1a8dfc57a40b6399662adb2c3f75ace5b1b03d2a3011d6a08d6dd
|
|
BLAKE2b-256 checksum How to use checksums |
a3820b8c24c565845932ed8cc286d8839e8e0342cf0ca0be207786c34b8ea9b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / mokuro_bridge-0.8.1-py3-none-any.whl
| Download URL | mokuro_bridge-0.8.1-py3-none-any.whl |
|---|---|
| Size | 132.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5d155fb440a9b48d292d6af0865a4d2a918e8359b508fc9053b87c1c30a36a37
|
|
BLAKE2b-256 checksum How to use checksums |
2274c66266e36e9704ed3f118e9bedb5a5efceff620b6cec87a61b41f832c177
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logSecurity for mokuro-bridge 0.8.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for mokuro_bridge-0.8.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.