Manga Image Translator takes a page of manga, a comic or any image with text, finds each speech bubble and caption, reads it with OCR, translates it, paints over the original lettering and typesets the translation in its place. It mainly targets Japanese but also handles Chinese, English and around 20 other languages, and can colourise and upscale pages along the way.
What makes it useful is the choice of translators. Offline models such as Sugoi, NLLB, M2M100, mBART and Qwen2 run on your own machine with no key, while DeepL, OpenAI, Gemini, DeepSeek, Groq and others are available if you supply an API key. You can run it as a batch command over a folder, as a local web interface, or as an API server, and a glossary and replacement dictionary help keep names consistent.
It is GPL-3.0, with about 10,500 stars and 104 contributors. The code is still updated, but there has been no tagged release since 2022 and the README calls the project early-stage, so expect rough edges. The hosted demo linked from the repo is no longer reliable, and the Docker image is about 15 GB.
- Repository: github.com/zyddnys/manga-image-translator
- Licence: GPL-3.0 (GNU General Public License v3.0)
- Language: Python. Stars: 10.5K. Forks: 1,080. Last push: Oct 11, 2026.
- Scan: safe, Oct 26, 2026, commit d6de6ab
Who it is for
Manga and comic readers who want to read untranslated chapters, scanlation hobbyists who want a first pass, and anyone who needs to translate text inside screenshots or images.
Getting started
1. Clone the repo (Python 3.12 or later)
git clone https://github.com/zyddnys/manga-image-translator.git && cd manga-image-translator2. Install the dependencies, ideally in a virtual environment
pip install -r requirements.txt3. Translate a folder or a single image
python -m manga_translator local -v -i <path>Models download to ./models on first run. For GPU use, install the PyTorch build that matches your CUDA version first. Windows users need the Microsoft C++ Build Tools before pip install.
Safety scan
We cloned zyddnys/manga-image-translator at commit d6de6ab on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- No secrets, no suspicious patterns and no committed binaries across 323 files and about 62,400 lines of Python and TypeScript.
- Two setup.py files, pip-modules/mit-renderer and training/ocr, use a custom build command to compile their native extensions; the 3-line run.sh only starts the program. None fetches anything at install time.
- 116 known advisories (2 critical, 54 high), all in front/package-lock.json, the new browser interface: React Router, Express and build tooling. They matter if you run that interface where others can reach it; keep it on localhost. No advisories in the Python requirements files.
- Offline translators keep everything on your machine. Cloud translators such as DeepL, OpenAI and Gemini receive the recognised text with your own key.
- 3 workflows, none using pull_request_target; 1 of 4 third-party actions pinned to a commit. No security policy, Dependabot or CodeQL.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | None found. |
| Suspicious code | None found. |
| Install-time code | 2 setup.py files with custom install logic. 1 installer script |
| Committed binaries | None. |
| CI workflows | 3 workflows. None use pull_request_target. 3 of 4 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often github.com, arxiv.org, stackoverflow.com, www.gnu.org. No URLs to bare IP addresses. |
| Known vulnerabilities | 116 advisories across 584 pinned packages: 2 critical, 54 high, 46 moderate, 14 low. front/package-lock.json: 536 packages, 116 advisories; requirements-dev.txt: 6 packages, 0 advisories; requirements.txt: 61 packages, 0 advisories. |
| Project hygiene | Has licence file. Missing security policy, automated dependency updates, CodeQL, contributing guide. |
| OpenSSF Scorecard | Not scored: the project is not in Scorecard's weekly index. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Installer scripts (1)
- run.sh, 3 lines
Worst known vulnerabilities (24 of 116)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-9583-h5hc-x8cw | critical | @react-router/node@7.3.0 | React Router has Path Traversal in File Session Storage |
| GHSA-jqcg-44mw-7w3h | critical | proxy-addr@2.0.7 | proxy-addr vulnerable to IP spoofing via IPv4-mapped IPv6 trust subnet |
| GHSA-4q56-crqp-v477 | high | @react-router/express@7.3.0 | Remix and React Router allow URL manipulation via Host / X-Forwarded-Host headers |
| GHSA-3jxr-9vmj-r5cp | high | brace-expansion@1.1.11 | brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups |
| GHSA-6j4f-fj2g-mc7p | high | brace-expansion@1.1.11 | brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion |
| GHSA-mh99-v99m-4gvg | high | brace-expansion@1.1.11 | brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash |
| GHSA-qhr7-859c-m2p7 | high | brace-expansion@1.1.11 | brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion |
| GHSA-rgw5-rvv9-x895 | high | brace-expansion@1.1.11 | brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation |
| GHSA-23c5-xmqv-rm74 | high | minimatch@3.1.2 | minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions |
| GHSA-3ppc-4f35-3m26 | high | minimatch@3.1.2 | minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern |
| GHSA-7r86-cg39-jmmj | high | minimatch@3.1.2 | minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments |
| GHSA-27r3-jxmh-p828 | high | body-parser@1.20.3 | body-parser vulnerable to Denial of Service via trailing bytes after a compressed request body |
| GHSA-3jxr-9vmj-r5cp | high | brace-expansion@2.0.1 | brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups |
| GHSA-6j4f-fj2g-mc7p | high | brace-expansion@2.0.1 | brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion |
| GHSA-mh99-v99m-4gvg | high | brace-expansion@2.0.1 | brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash |
| GHSA-qhr7-859c-m2p7 | high | brace-expansion@2.0.1 | brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion |
| GHSA-rgw5-rvv9-x895 | high | brace-expansion@2.0.1 | brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation |
| GHSA-73wf-gq98-2v4g | high | browserslist@4.24.4 | Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.json custom stats (normalizeStats) |
| GHSA-c83g-rgw3-j3cx | high | browserslist@4.24.4 | Browserslist: Unbounded memory growth (no cache eviction) via distinct query results, leading to eventual OOM |
| GHSA-vc2v-76pw-4v95 | high | compression@1.8.0 | compression vulnerable to Denial of Service via memory leak on premature response close |
| GHSA-23c5-xmqv-rm74 | high | minimatch@9.0.1 | minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions |
| GHSA-3ppc-4f35-3m26 | high | minimatch@9.0.1 | minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern |
| GHSA-7r86-cg39-jmmj | high | minimatch@9.0.1 | minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments |
| GHSA-5j98-mcp5-4vw2 | high | glob@10.4.5 | glob CLI: Command injection via -c/--cmd executes matches with shell:true |
By the numbers
| Stars | 10.5K |
|---|---|
| Forks | 1,080 |
| Contributors | 104 |
| Commits | 2,030 |
| Open issues | 127 |
| Open pull requests | 19 |
| Releases | 5 |
| Latest release | beta-0.3 |
| Licence | GPL-3.0 |
| Main language | Python |
| Project age | 5 years |
| Last push | Oct 11, 2026 |
| Tracked files | 323 |
| Lines of code | 62.4K |
| Checkout size | 101 MB |
Lines by language: Python 50.3K, Markdown 3,502, HTML 2,191, TypeScript 1,756, JSON 1,316, CUDA 1,300.
Questions
Is Manga Image Translator free?
Yes. It is GPL-3.0 and free. Offline translation costs nothing; online translators such as DeepL or OpenAI bill you through your own API key.
Can it work completely offline?
Yes. Pick an offline translator such as sugoi, nllb, m2m100 or the general offline option, and detection, OCR, inpainting and translation all run locally once the models have downloaded.
Do I need a GPU?
No, it runs on the CPU, but slowly. An NVIDIA GPU with the matching PyTorch build, turned on with --use-gpu, makes batches of pages far quicker.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
