# PanelCleaner's own feature list and its own limitations disagree about colour

> VoxelCubes/PanelCleaner finds text in manga speech bubbles with a machine learning detector, grows a mask around it, and skips any bubble it cannot clean cleanly. The pipeline is conservative by design, the interface and the restrictions are both spelled out in detail, and two claims in the documentation contradict each other on colour and on in-painting.

**VoxelCubes/PanelCleaner** — An AI-powered tool to clean manga panels.

- Repository: https://github.com/VoxelCubes/PanelCleaner
- Stars: 485 · Forks: 64
- Language: Python
- License: GPL-3.0
- Published: 2026-09-10 · Updated: 2026-09-10 · Language: en
- Canonical page: https://hysenlabs.com/projects/voxelcubes-panelcleaner

## The feature list promises any colour, the limitations say grayscale

Two contradictions sit inside one document, and both are load-bearing for anyone deciding whether to use this.

The feature list says the program can handle bubbles on any solid background color. Twenty lines later, the limitations say that for masks only grayscale is currently supported, which means it can cover text in white, black, or gray bubbles but not coloured ones. For a cleaner whose pages are full of coloured speech balloons, those two lines point in opposite directions and there is no configuration between them.

The second contradiction is about in-painting. The opening description says the tool is designed to clean easy bubbles and that no in-painting or out-of-bubble text removal is done. The feature list then says it inpaints bubbles, with LaMa machine learning, that cannot simply be masked out. Both can be true if in-painting is the exception path rather than the default, but the opening sentence is worded as a flat exclusion.

What is unambiguous is the third limitation: text outside a bubble is not touched at all. SFX, narration boxes, and hand lettering sitting on artwork are outside the scope, which is a much larger boundary than bubble cleaning sounds to someone hearing the name.

## Four passes build the mask, and only the last one is cosmetic

The mask is constructed in visible stages, and the project's own colour coding is the clearest description of the algorithm.

The first stage draws boxes wherever the detector found text. The second is a precise green mask over exactly what was detected. The third, in purple, expands those masks to swallow nearby text that was missed and the jpeg artifacts left behind by compression. The fourth, in blue, applies only to masks that are a tight fit, where the border around the edge of the mask is denoised for final clean-up without touching the rest of the image.

So three of the four stages are about recovering from detector misses, and only the last one is cosmetic. That ordering is the design: the tool expects the detector to be wrong about small details and tries to cover the damage rather than to re-derive the text.

Output is offered in two shapes, and you pick. The program can emit just the transparent mask layer, or the mask applied to the original image with the text gone. There is also a third use it mentions separately, cutting the text out from the rest of the image so it can be pasted over a coloured rendition, which is the opposite operation from cleaning and shares the same detection pass.

## Skipping a bubble is the conservative choice, not a bug

The single most useful thing to understand about this tool is that it is built to decline work.

Mask selection is deliberately conservative. If the program cannot clean a bubble to a satisfying degree it skips that bubble outright rather than turning in a half result. The stated benefit is that this also prevents false positives, which is the trade: some bubbles stay dirty, and in exchange nothing gets painted over that was not text.

The detector underneath is a separate project, comic-text-detector, which was not created here and is used as a starting point whose output this program improves on. It is imperfect by nature. Sometimes it misses a small piece of text, and sometimes it decides part of the bubble belongs to the text, and in the second case the bubble will not be cleaned at all. The project's own figure for how often that happens is 2 to 8 percent of bubbles, varying with your settings.

There is a third skip, and it is not about confidence. Bubbles containing only symbols or numbers are ignored, on the grounds that they do not need translation. If your workflow translates sound effects inside bubbles, that is a silent gap rather than a failure.

The consequence for a working cleaner is that the output needs review, and the program is built around that: it offers detailed analytics on the cleaning process so you can see how a setting changed the result, and it lets you review the cleaning and OCR output and edit that output interactively before saving.

## Pre-built binaries and CUDA cannot both be had

Installation is a choice with a catch in it. There are two packages on PyPI.

```bash
pip install pcleaner
pip install pcleaner-cli
```

The first gives you both the command line interface and the graphical interface and needs Python 3.10 or newer. The second is command line only. They can sit side by side, though the documentation notes the CLI-only package would then be redundant. A third route is the Arch User Repository package, which installs into a pipx environment so that pytorch can download the CUDA build matching your system, and that is called out as the best method of installation. It provides both a `pcleaner` and a `pcleaner-gui` command plus a desktop file for the GUI.

The catch is stated plainly: the pre-built exe and elf binaries in the releases section, which are recommended for most users, do not support CUDA acceleration at all. GPU support requires the pip route plus a pytorch build chosen for your system.

Either way there is a fixed first-run cost. Every version downloads model data on first launch, approximately 500MB, and does not download it again when the program updates. After that the program needs no internet connection, which is what makes batch processing over a local folder of pages workable.

## Two setup.cfg files turn one source tree into two packages

The packaging layout explains why there are two pip packages. pyproject.toml opens with a comment stating that no project section is given, because all of the metadata lives in the setup.cfg files, which differ for the gui and cli versions. Two files do the work: setup-cli-gui.cfg and setup-cli.cfg. The shim that ties them together is three lines long, importing setup from setuptools and calling it.

Dependencies are grouped rather than listed flat. runtime-base holds the working set, from opencv-python, numpy, and scipy through pyclipper and shapely for geometry, manga_ocr for Japanese text recognition, pytesseract, simple_lama_inpainting for the LaMa pass, and psd-tools for the one export format that is not a raster image. runtime-torch is torch and torchvision on their own, runtime-gui is PySide6, and runtime-dbus is dbus-python with a platform marker that restricts it to Linux. dev-tools adds build, pytest, pyinstaller, and twine. Three Windows-only packages, pywin32, win10toast, and pyuac, carry the same platform marker, and strenum is pinned to Python versions below 3.11.

The requirement files are a separate story. requirements.txt, requirements_tested.txt, and build_requirements.txt all exist, and requirements.txt ends with PyYAML and an inline comment explaining that it is only used for building the icon cache, is not needed at run time, and is therefore excluded from the wheel. A dependency listed in the requirements file and deliberately left out of the wheel is the kind of thing that breaks a hand-rolled install.

Formatting is pinned at line-length 100 under tool.black.

## The container installs from PyPI, on Buster, and lands you in a shell

The Dockerfile is short enough to read in full, and it tells you what the maintainers use for testing.

```dockerfile
FROM python:3.10.10-buster
RUN apt-get update && apt-get install -y --no-install-recommends libgl1 libglib2.0-0 libdbus-1-dev dbus vim nano
RUN pip install pcleaner
CMD bash
```

Four choices stand out. The base is Debian Buster through a pinned Python 3.10.10 tag, an old foundation rather than a current one. The program is installed with pip from PyPI, not from the source tree that sits next to the Dockerfile, so this image exercises the published release rather than anything in the repository. The entrypoint is bash, which makes the image a development and profiling environment rather than an application container. And vim and nano are installed deliberately, with the comment saying they are there so profiles can be edited.

That last point connects back to the feature list, which offers a large number of options for customising the cleaning process and the ability to save multiple presets as profiles. Editing a profile inside the container means the image is meant for tuning a configuration, not for running a batch job headlessly. The container also creates a non-root user named pcleaner with uid 1000 and puts its home on the path with `.local/bin` prepended, which is where a pipx-style install of the program would land.

## Tag 2.11.11 is titled Release 2.11.0, and both are from 2024

The release history needs reading carefully before you download anything.

Three releases are listed: 2.11.11, 2.10.0, and 2.9.3, published on 2024-12-02, 2024-11-11, and 2024-10-08. The newest tag, 2.11.11, carries the release title Release 2.11.0, so the download name and the release notes disagree about the version number by two patch levels. That is a small thing until a script pins on the title.

The gap is larger. The newest release is from December 2024, while the branch itself was last pushed on 2026-09-22 and is not archived. So the binary recommended for most users in the installation section is around two years behind the tree you would clone, and there is no release that contains whatever the last two years of commits changed.

The default branch is master rather than main, and the localisation setup is Crowdin-based, with a crowdin.yml at the root, a translations directory, and an interface shipped in English, German, Bulgarian, and Spanish. Adding a language is documented in translations/TRANSLATING.md.

One layout detail that bites shell scripts: the top level contains a directory called post-action examples, with a space in the name, alongside tools, tests, docs, icons, media, flatpak, Windows scripts, and a PanelCleaner.desktop file.

## Japanese and English for cleaning, Japanese only for OCR

Language coverage is stated once and it is short. Only Japanese and English text are supported for cleaning, and success varies with other languages. OCR is Japanese only.

That is a narrower promise than the feature list reads like, because the feature list offers OCR on pages with output to a file, interactive editing of that OCR output before saving, and the ability to review the cleaning and OCR output together. All of that works, and all of it is on the Japanese side. Nothing in the documentation says what the English cleaning path uses for recognition, and the dependency list does not settle it either: manga_ocr is a Japanese OCR model and pytesseract is a wrapper around Tesseract, which is multilingual but appears in the runtime base set without a language model being named.

Supported input formats are listed as .jpeg, .jpg, .png, .bmp, .tiff, .tif, .jp2, .dib, .webp, and .ppm. The export side adds exactly one non-raster format, .psd, which is why psd-tools is pinned at 1.11.0 or newer in the dependency group.

The remaining capability worth naming is batch work: the program handles batches of images and whole directories, and it does not need a network connection once the model data is in place.

## Conclusion

PanelCleaner suits a cleaner with a stack of monochrome speech bubbles who wants the repetitive part handled and does not mind reviewing what it skips. It does not suit coloured bubbles, text sitting outside a bubble, or anything but Japanese and English, and the promise of any solid background colour does not survive the limitations section sitting further down the same page. Decide how you want the program before installing: the pre-built release is the easy route and the only one without CUDA, the pip route adds GPU support and asks for Python 3.10 or newer, and the Arch User Repository package is a pipx environment that lets pytorch fetch the matching CUDA build. Whichever you pick, the first launch pulls roughly 500MB of model data, and the newest tagged release, 2.11.11, was published on 2024-12-02 while the branch itself was last pushed on 2026-09-22.

## FAQ

### What does PanelCleaner actually remove from a manga page?

Text inside easy speech bubbles, which it locates with a machine learning detector and covers with a generated mask. Text outside a bubble is not removed, and the documentation says plainly that no out-of-bubble text removal is done.

### Can PanelCleaner clean coloured speech bubbles?

The feature list says it can handle bubbles on any solid background color, but the limitations section says only grayscale is supported for masks, covering white, black, or gray bubbles and not coloured ones. The two statements contradict each other and no configuration is offered between them.

### Does PanelCleaner use my GPU for acceleration?

Only when it is installed as a Python package and the hardware supports it. The pre-built exe and elf binaries in the releases section do not support CUDA acceleration, so GPU use requires a pip install together with the pytorch build for your system.

### What does PanelCleaner download the first time it runs?

Model data of approximately 500MB, on first launch only. It is not downloaded again when the program updates, and after that the documentation states no internet connection is required.

### Which languages can PanelCleaner clean and read?

Japanese and English for cleaning, with success varying for other languages, and Japanese only for OCR. The interface itself ships in English, German, Bulgarian, and Spanish.

## Sources

- [Issues](https://github.com/VoxelCubes/PanelCleaner/issues)
- [License: GPL-3.0](https://github.com/VoxelCubes/PanelCleaner/blob/master/LICENSE)
- [README](https://github.com/VoxelCubes/PanelCleaner/blob/master/README.md)
- [Releases](https://github.com/VoxelCubes/PanelCleaner/releases)
- [VoxelCubes/PanelCleaner on GitHub](https://github.com/VoxelCubes/PanelCleaner)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/voxelcubes-panelcleaner
