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.
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.playarguments, 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¶
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¶
- Scene authors: start with installation and your first check, then browse the rule catalog.
- Existing projects: use baselines, suppressions, and safe fixes for gradual adoption.
- Performance work: use the cost and coverage reports.
- Tool builders: use the versioned machine APIs and JSON schemas.
- Contributors: read the architecture and authoritative design specification.
Current support
Qual 0.3 targets Manim Community 0.20. It ships 92 implemented rules and native binaries for Linux, macOS, and Windows.