# LanPaint: the package declares no dependencies and no supported Python version, and the manifest lags its own tag

> LanPaint is a sampler for ComfyUI that does mask-constrained inpainting with models that were never trained for it, letting the sampler iterate before denoising so you can spend more compute on a mask. It is the published implementation of a journal paper, with a separate benchmark repository and a separate library port. What its packaging and configuration files reveal is a project shaped entirely by its host application.

**scraed/LanPaint** — High quality training free inpaint for every stable diffusion model. Supports ComfyUI

- Repository: https://github.com/scraed/LanPaint
- Stars: 1,430 · Forks: 54
- Language: Python
- License: GPL-3.0
- Published: 2026-09-10 · Updated: 2026-09-10 · Language: en
- Canonical page: https://hysenlabs.com/projects/scraed-lanpaint

## The package declares no dependencies and no Python version

Open the packaging metadata and the dependency list is literally empty:

```toml
dependencies = [

]
```

No runtime requirements at all, in a project whose job is to run inside a diffusion sampler. That is not an oversight, it is the custom node convention: the host application supplies the framework, and a node that pinned its own versions would fight the host's. The consequence is that the package cannot be installed and used on its own, and importing it outside that host is an unsupported configuration rather than a supported one with defaults. The next thing missing from the same table is a supported Python version, and there is none declared at all, while the linter is separately configured to target one specific older version. So the two pieces of metadata that would tell you whether the package can run on your interpreter are, respectively, silent and absent.

## The manifest is one release behind its tag and the tags disagree on their prefix

The version in the packaging metadata is two point one point zero:

```toml
version = "2.1.0"
```

The three most recent releases are two point one point zero, two point two point zero and two point zero point zero, and the newest tag, two point two point zero, carries the same timestamp as the most recent commit to the default branch. So the newest tag postdates the manifest by one release, which means installing from source at the tip and installing the tagged release can give you different code with the same documentation. The tag naming also alternates: two of the three recent tags carry a version prefix and the newest does not, so a script or a changelog generator that assumes the prefix will miss the most recent release. Neither of these is unusual in a project releasing from a default branch, and both are easy to check for yourself by comparing the manifest against the release list before you pin anything.

## The only lint exception waives undefined-name checks in the node module

The lint configuration selects four groups, and two of them are named rather than families:

```toml
    "S102",  # exec-builtin
    "S307",  # eval-used
```

Banning the two ways Python turns a string into code is a sensible first move for a node package, and it tells you something about how the author thinks about the trust boundary. The other two selected groups are whitespace on blank lines and the pyflakes family. Then there is a single per-file exception in the whole configuration, and it targets the node module by path, disabling exactly two pyflakes checks. Those two are the star-import rules, the pair that report undefined names coming from a wildcard import. So the one file where the linter is told to stop complaining about undefined names is the file that defines the nodes users interact with, which is a reasonable trade and also the place to look first when a name resolves differently at runtime than it reads.

## Think mode is a step count, and the examples name it in their anchor links

The headline mechanism is that the sampler thinks through several iterations before it denoises, so you can spend more computation on one mask. That is the whole feature, and in the documentation it is expressed almost entirely through link anchor names, which read like a specification. The anchors are of the form node, sampler, then a number, then steps of thinking. You can see two steps, three steps and five steps across the example list, and one entry that says custom sampler advanced with five steps rather than naming a plain sampler. That is genuinely useful information, since the step count is the quality versus compute dial, and it is also the only place the dial's range appears: no parameter documentation, no default, no statement of what happens above five. For a sampler whose entire pitch is spending more compute deliberately, that is the number a reader most wants, and it is inferable only from example link text.

## Nine stacked announcements are the changelog

The readme has no release section. Instead it accumulates a wall of dated announcements, each one a heading announcing support for a new model family, and by the visible text there are nine of them: a transparency and masked editing model, a video and audio family, a base image model and a base variant of it, a video model, and then one each for four more families. Underneath that sits a table of contents whose image example section alone runs to more than thirty anchors, covering two generations of one video model at several sizes, two Flux variants, an image editing model at three separate revisions, a text-to-image model, and others. Each of those examples has its own anchor naming its sampler and its thinking steps. The practical consequence is that the readme is simultaneously the introduction, the model support matrix, the manual and the changelog, and the support matrix is the part that goes stale fastest.

## The acceleration claim has no number and the mask artefact is an open issue

Two statements in the announcements deserve to be reported as claims rather than findings. The first says the point one release significantly accelerates the sampler with a new schedule mechanism, and fixes one model family's support on the latest host version. The word significantly is doing the work; there is no figure, no comparison and no benchmark reference attached to it, although the project does publish a separate benchmark repository that might contain one. The second statement is better, because it names a failure and points at it: if your results have a weird mask boundary, described as glowing or broken, the readme sends you to a specific issue number. That is the honest form, acknowledging an artefact at the seam where the mask meets the generated region and leaving the diagnosis to the tracker. One number does appear anywhere in the examples, a frame count for a video consistency example, and it is the only figure in the file.

## Reproduction lives in two other repositories

The research section lists four artefacts and only one of them is this repository. There is the paper, presented as asymptotically exact and fast conditional sampling, published in a machine learning journal in 2025, with a machine readable citation that names three researchers. There is this repository as the host-application implementation. There is a separate library port by another author for a different Python library, linked with their handle. And there is a benchmark and reproduction repository. So the claim that the method is training-free and needs no fine-tuning or backpropagation is verifiable outside this repository, which is a better position than most research code is in. It also means the two implementations will drift from each other and from the paper, and the readme's model support list describes only the host-application one. A reader who wants to use the library port is working from a different set of supported models with no table to compare them against.

## Publisher metadata ships an empty icon and the author field is the project name

Two small metadata choices are worth noting because they affect what a registry shows. The host application's publisher block names a publisher identifier, a display name, and then an icon field that is empty, so the entry renders without artwork until someone fills it in. The author field, meanwhile, is the project name rather than any of the people who wrote the paper, with a contact address at a university domain. That is the right call for a package rather than a publication, and it is the opposite of what the citation does. The repository root also carries a handful of loose images: two example screenshots with generic names, and two files named for a specific model family, one showing a canvas state and one named as a fix. Screenshots committed at the root are convenient in a pull request and permanent in a release, and nothing in the visible documentation refers to them.

## Conclusion

LanPaint fits someone already running ComfyUI with the model families it names, who wants masked editing without training a second model and is willing to trade sampling steps for quality. It does not fit someone who wants a library they can import, because the package deliberately declares no dependencies and no supported Python version, and importing it outside the host application is not a supported use. Four things to check before you install it. Which version you have, since the newest release tag is ahead of the version in the manifest and the tags disagree about whether they carry a prefix. Which model you intend to use, since the support list in the readme is a stack of dated announcements and the example list is the more complete inventory. What think mode costs, because the claim that the new schedule accelerates it arrives without a number. And whether the mask artefact is one you can live with, since a glowing or broken boundary is acknowledged in the readme as an open issue rather than fixed.

## FAQ

### What does LanPaint add to ComfyUI?

A sampler node that does mask-constrained inpainting with pretrained diffusion and rectified flow models, without fine-tuning or backpropagation. The sampler iterates before denoising, so you can spend more computation on a mask and get a better result.

### Does LanPaint require training a model?

No. The readme describes it as a training-free partial conditional sampler that works with pretrained diffusion and rectified flow models, with no fine-tuning and no backpropagation. It is positioned as an alternative to needing a specialised inpainting model.

### Which models does LanPaint support?

The announcements name a transparency and masked editing model, a video and audio family, a base image model and a base variant, a video model, and four more families, while the example list also covers two generations of a video model at several sizes, two Flux variants, an editing model at three revisions, and a text-to-image model.

### What does think mode do in LanPaint?

The sampler runs multiple iterations before denoising, trading computation for quality. The examples are named with two, three or five thinking steps, and one uses a custom advanced sampler variant. No default value or upper bound is documented.

### Is there a known problem with LanPaint mask boundaries?

Yes. The readme says results can have a weird mask boundary, described as glowing or broken, and points readers at a specific issue number to follow. That artefact is acknowledged rather than hidden.

### How is LanPaint installed and does it need dependencies?

It ships as a node for its host application, with publisher and display name fields for that application's registry. Its own packaging metadata declares an empty runtime dependency list and no supported Python version, because the host supplies the framework and the node is not meant to run standalone.

## Sources

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

---

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