Skip to content

Lint Manim before you render

Qual is the Manim-aware linter. It catches render-time errors, silent visual bugs, and per-frame performance traps without importing Manim or running your scene.

Get started Browse all 92 rules

uv tool install qual-manim
qual check .

Think Ruff for Manim scenes, with an understanding of Scene.play, mobject lifecycles, updaters, Cairo/OpenGL behavior, and render cost. Ruff and Pyright still check Python itself; Qual checks what Manim will do with it.

  • Catch crashes early

    Invalid Scene.play arguments, missing targets or saved state, invalid callback signatures, and other errors that otherwise surface during a render.

  • Find the wrong picture

    Lifecycle, renderer, ordering, updater, TeX, asset, and geometry mistakes that can finish successfully while producing the wrong result.

  • Explain render cost

    Per-frame construction, growing scene graphs, expensive callbacks, and resource-key growth with conservative multiplicity evidence.

  • Stay safe by default

    Qual never imports or executes Manim, plugins, or analyzed user code. An unresolved value becomes Unknown, not a high-confidence guess.

A general Python linter cannot see this

self.play(square.shift(RIGHT))
#                  ^ MLC102: shift() returns the mobject, not an Animation
label = always_redraw(
    lambda: MathTex(f"x={tracker.get_value():.2f}")
)
# MLP226: a frame-varying TeX key may create one disk asset per rendered frame

Qual resolves imports and aliases, follows project-local helpers, models Scene membership and animation cleanup, and distinguishes code that runs once from code that runs every frame. It reports a number only when the source and selected render profile prove it.

Choose your path

Current support

Qual 0.3 targets Manim Community 0.20. It ships 92 implemented rules and native binaries for Linux, macOS, and Windows.