Manim plugin and lecture-site CLI for Simplex presentations.
Project description
Simplex
Simplex is a toolkit for Manim lecture projects. The repository is named
simplex, and the PyPI distribution is named manim-simplex because the bare
simplex package name is already taken on PyPI. It ships one Python package
namespace, simplex, with:
- a Manim plugin (
plugins = simplex); - theme tokens, mobjects, layout regions, slide bases, and animation helpers;
- a deck manifest schema and render reconciliation pipeline;
- the
simplexCLI for deck scaffolding, rendering, site building, serving, testing, and diagnostics; - a static lecture portal with notes, citations, math rendering, thumbnails, RevealJS playback, and GitHub Pages-friendly output.
The CLI and plugin intentionally live in one distribution so consumers only
depend on manim-simplex.
Requirements
- Python 3.13+
- Manim Community 0.20.1+
- manim-slides 5.1.7+
- FFmpeg, Cairo, Pango, and a TeX distribution when rendering TeX. See the Manim installation guide: https://docs.manim.community/en/stable/installation.html
Typical system packages:
sudo apt-get install texlive-latex-extra texlive-fonts-recommended ffmpeg \
libcairo2-dev libpango1.0-dev
winget install MiKTeX.MiKTeX
winget install Gyan.FFmpeg
Install
pip install manim-simplex
With uv:
uv add manim-simplex
Verify that Manim can discover the plugin:
python -m manim plugins -l
The output should include simplex.
Configure Manim
Enable the plugin in the manim.cfg next to your scenes or deck:
[CLI]
plugins = simplex
save_sections = True
Manim imports simplex.plugin through the manim.plugins entry point. The
plugin applies the active Simplex theme to Manim defaults, registers Pygments
styles, sets the TeX template, sets the background color, and enables section
JSON output.
Quick Start
from manim import ORIGIN, MathTex, Write
from simplex import Slide
class HelloSlide(Slide):
def setup(self) -> None:
super().setup()
self.setup_chrome(header="Hello, Simplex")
def construct(self) -> None:
eq = MathTex(r"e^{i\pi} + 1 = 0")
self.region.place(eq, ORIGIN)
self.play(Write(eq))
self.next_slide()
Render as a slide deck:
uv run manim-slides render path/to/scene.py HelloSlide
uv run manim-slides present HelloSlide
Or create a lecture-site deck and build the portal:
uv run simplex new algorithms/hash-tables
uv run simplex render hash-tables
uv run simplex build
uv run simplex serve
Public Surface
| Module | Public surface |
|---|---|
simplex.plugin |
activate() entry point used by Manim. |
simplex.slides |
Slide, ThreeDSlide, OutlineScene, OutlinePart, Chrome, make_chrome. |
simplex.engine |
Region, ExitAnim, clear_scene, exit_for, register_exit, set_exit_animation, HighlightResult, apply_theme_defaults. |
simplex.mobjects |
Node, Edge, ArrayMob, ArrayEntry, ArrayPointer, OutlineProgressBar, Paper, ShowPaper, DismissPaper, PickPage. |
simplex.theme |
Theme, Palette, Typography, Spacing, Motion, LatexProfile, WebPalette, active_theme, get_active_theme, presets, render_web_css. |
simplex.manifest |
DeckManifest, MainSlide, Subsection, the manifest schema written by the render pipeline. |
simplex.deck |
DeckConfig, discover, scaffold, section metadata, bundled deck template. |
simplex.render |
Manim runner, manifest reconciliation, thumbnails, HTML, PDF, PPTX, notes PDF, filenames. |
simplex.web |
Portal builder, notes renderer, citations, refs, templates, static assets, live reload. |
simplex.cli |
Typer application installed as the simplex command. |
CLI
| Command | Purpose |
|---|---|
simplex new <slug> |
Create decks/<slug>/ from the bundled template. |
simplex new <section>/<slug> |
Create a deck inside a named section. |
simplex init [dir] |
Create a lectures repo from the GitHub template. |
simplex render <slug> |
Render one deck into site/decks/<slug>/. |
simplex render <slug>::<Scene> |
Render one scene from a deck. |
simplex build |
Render decks and build the static portal under site/. |
simplex build --no-render |
Rebuild portal HTML from existing render output. |
simplex serve [--watch] |
Serve site/ locally, optionally with live reload. |
simplex test |
Smoke-render decks by rendering only the first animation. |
simplex clean |
Remove generated site/ and media/ output. |
simplex doctor |
Check required binaries on PATH. |
Deck Layout
simplex new hash-tables creates:
decks/hash-tables/
|-- deck.toml
|-- manim.cfg
|-- notes.md
|-- refs.bib
|-- assets/
`-- slides/
|-- __init__.py
`-- intro.py
The important fields in deck.toml are:
slug = "hash-tables"
title = "Hash Tables"
summary = "A one-line deck summary."
theme = "simplex_dark"
quality = "high_quality"
entrypoints = ["slides.intro:Intro", "slides.intro:KeyIdea"]
[slides."Key Idea"]
notes_anchor = "key-idea"
Append @opengl to one entrypoint when a scene should render with ManimCE's
OpenGL renderer:
entrypoints = ["slides.intro:Intro", "slides.surface:SurfaceColoring@opengl"]
Development
git clone https://github.com/shlomi-perles/simplex.git
cd simplex
uv sync --all-extras
uv run pre-commit install
Useful checks:
python tools/check_readmes.py
uv run ruff check .
uv run ruff format --check .
uv run basedpyright
uv run pytest -q
uv run python tools/vendor_web_assets.py
uv build --no-sources
uvx twine check dist/*
Run smoke tests locally:
uv run python -c "import simplex.plugin; simplex.plugin.activate(); print('ok')"
uv run manim plugins -l
uv run simplex --help
uv run simplex test --only showcase
Release
Releases are automated through Release Please and PyPI Trusted Publishing.
Commit changes using Conventional Commits (feat:, fix:, chore:). When
changes land on main, Release Please opens or updates a release PR. Merging
that PR creates the GitHub release, builds the package with uv, publishes
manim-simplex to PyPI via OIDC, and dispatches a template update workflow.
Manual version bumps and chained simplex-web releases are no longer part of
the release process.
License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file manim_simplex-0.8.0.tar.gz.
File metadata
- Download URL: manim_simplex-0.8.0.tar.gz
- Upload date:
- Size: 873.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
998589f4bf4557a4ec115c7bf397bdacd7e831192073896ad53e2e258df349a9
|
|
| MD5 |
1612db8487197a6c86e30e1f5fccaf26
|
|
| BLAKE2b-256 |
ebb6fd584f8307c1a7eebc51e2ce8b5886b1cd08e3d4a0f5b48f3c34c70e92b5
|
File details
Details for the file manim_simplex-0.8.0-py3-none-any.whl.
File metadata
- Download URL: manim_simplex-0.8.0-py3-none-any.whl
- Upload date:
- Size: 772.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
669d541fac80d6c06d11120c5118273202726181e1b12b0575c95ef978516d88
|
|
| MD5 |
833fca586e296d8b4facc9dc32f15f17
|
|
| BLAKE2b-256 |
f88161722020894e97f0084e3a2ee1231dd59ebaf348a337c807d8669cdd1e66
|