3Blue1Brown — How I animate 3Blue1Brown | A Manim demo with Ben Sparks
Why this is in the vault
A 53-minute screen-share of Grant Sanderson driving Manim through a Hello World, then building a multi-trajectory Lorenz attractor visualization with Ben Sparks asking the questions a mid-level Python user would actually ask. It belongs in the vault because it is a worked example of bespoke-tool economics: Sanderson built and maintains a custom animation library for a single use case (his own videos), explicitly forked off the community-supported version because he didn’t have the temperament to manage open source, and demonstrates an iteration loop — checkpoint-paste from the editor into a live IPython session inside the scene — that is faster than anything off-the-shelf. The takeaway is not “you should build your own animation tool.” The takeaway is the pattern: when your iteration loop is the bottleneck, custom > best-available, even if best-available has 10x the documentation. That’s the same calculus RDCO faces with Claude Code skills versus generic MCP tooling and with internal scripts versus general-purpose CLIs.
Core argument
- The custom version exists because the iteration loop is the bottleneck, not the rendering. Sanderson explicitly contrasts his workflow (highlight code, command-R to run a snippet inside an embedded IPython session that retains scene state) against the Manim Community workflow (run from command line, render full MP4, view, edit, repeat). The render is similar in both. The time-to-see-effect is dramatically different. He says: “the iteration cycle is a little more annoying if every single time you’re making an update and you want to see it. So it was later in the game… to also have the interactive shell version, such that the process of creating just is like, highlight the code and see what the code does. And that’s a fundamental change to the workflow.”
- Open-source maintenance is a personality fit, not a moral imperative. Sanderson is unusually candid: “I don’t, as a personality type, really have the constitution to manage an open source project, I also don’t really have the capacity for it while I’m making videos, so I wasn’t the most attentive to issues and pull requests.” The community fork (Manim Community) exists because someone with a different constitution wanted that responsibility. The lesson: don’t run an open-source project as a tax on shipping. Either commit to it or fork it off to people who will commit to it.
- Checkpoint paste = “make a script behave like a notebook, but keep the script.” The mechanism: when copied code begins with a comment marker, the embedded shell looks up a cached scene-state for that marker and reverts before re-executing. This gets the per-cell re-runnability of Jupyter without giving up the single-text-file structure or the version-control story. It’s a worked example of “take the one good property of a notebook and graft it onto a script.”
- LLMs are good for cross-library bootstrapping, bad for in-domain coding when you have deep context. Sanderson uses ChatGPT to generate a SciPy
solve_ivpboilerplate for the Lorenz equations because he doesn’t routinely use SciPy. He explicitly does NOT use Copilot inside Manim: “I don’t like using Copilot with Manim because I know what I want to do and it doesn’t quite know what I want to do. It’s really nice if you’re like engaging with a new library of code but I don’t know I just find like dumber auto complete tools to be the thing I actually want.” Two-axis lesson: LLM autocomplete is a function of (your familiarity with the domain × LLM’s familiarity with the domain). High × Low: skip. Low × High: use. - The cursed
globals().update(locals())line is honest debt, not best practice. Sanderson writes it, demos it working, then in a future-Grant insert explains why it’s wrong and what the correct pattern is (default-argument capture). He does NOT edit the live demo to remove it — he leaves the wart in and adds the meta-commentary. This is a craft choice with a real cost (some viewers will copy the cursed line) and a real benefit (it’s how the workflow actually looks when you’re not performing). - Type errors at the wrong layer waste hours. “Color is not a string or real number” was raised because
glow_dot’s positional arg expected a coordinate, not a color. He notes: “there could be a better certainly a better type error message that’s that rather than this is kicking off to this is where people are like who know Python.” Filed as a self-criticism of his own library. Generalizes: the value of good error messages is unlocking the next 10 minutes of work, not satisfying typed-purist instinct.
Mapping against Ray Data Co
- The custom-vs-community calculus directly applies to the Claude Code skills layer. RDCO has 70+ skills in
~/.claude/skills/, most of which are bespoke wrappers over generic MCP tools. The legitimate question is “should we be using off-the-shelf tooling instead?” Sanderson’s answer is only if the off-the-shelf tooling collapses your iteration loop to comparable speed. For RDCO, the iteration loop is “founder asks → Ray executes → vault gets filed.” Off-the-shelf MCP tools force per-tool ergonomics; bespoke skills compose them into the founder-facing surface. That’s the analog of checkpoint-paste vs. command-line-Manim. Worth a recurring check (annually): what generic MCP tool, if upgraded, would let us delete a custom skill? If none, the custom layer is earning its keep. - The open-source-maintenance constitution lesson maps to RDCO’s “do we open-source the skills” question. The current answer is: probably no, because the maintenance tax is real and the founder has named bandwidth as the constraint. Sanderson’s framing makes the cost concrete: it’s not “should we open-source this,” it’s “do we have a constitution and a calendar that supports issue-and-PR responsiveness for the next 24 months.” If no, don’t ship it as OSS — write up the patterns and let others fork. This connects to the existing voice / vault philosophy.
- Checkpoint-paste is exactly the pattern the
working-context.mdscratchpad is groping toward. That file is the text-script-with-checkpointed-state version of “make a Claude session behave like a notebook.” Currently it’s manually maintained. Worth investigating: can the equivalent of checkpoint-paste be encoded as a skill — when the founder pastes a chunk of context with a marker comment, Ray reverts to that marker’s saved state before processing? Probably 1-day build, big leverage on long iterating-on-newsletters sessions. - The LLM-use heuristic (high your-familiarity × low LLM-familiarity = skip; reverse = use) is the cleanest articulation of when to spawn sub-agents. RDCO already does the SciPy version of this (use a sub-agent for newsletter HTML extraction because the LLM is much better at HTML than the parent process is being asked to be). It does NOT yet have a clear rule for when not to spawn a sub-agent for a domain the parent is fluent in. Sanderson’s framing fixes that. Worth adding to the global SKILL.md template as guidance.
- The “leave the cursed line in and add meta-commentary” approach is a valid editorial choice for Sanity Check. Most newsletter publishing tries to look polished. Sanderson shows that visible roughness + honest annotation builds more trust than polish. Worth experimenting with: a Sanity Check issue that includes a “what I tried first and why it didn’t work” section, instead of presenting only the final framing. Pairs with 2026-04-20-3blue1brown-grovers-algorithm-clarification (same channel, same vault cycle, on post-publication corrections).
- Not directly applicable — RDCO does not currently produce mathematical animation. Resist the urge to file a “should we use Manim for newsletter visuals?” follow-up. The visuals layer is far enough from text-newsletter-distribution to not pay back.
Open follow-ups
- Annual “what generic tool would let us delete a skill?” audit. Built into a recurring
/looptask or quarterly cron. ~30min review. - Investigate checkpoint-paste analog for Claude Code working-context.md. Marker-comment-keyed state reversion. ~1 day build, big leverage on long sessions.
- Add “when not to spawn a sub-agent” guidance to the global SKILL.md template. Heuristic: if the parent context is already deeply fluent in the domain AND the artifact fits without context-rot, do NOT spawn. ~15min edit.
- Pilot a “what I tried first” section in one Sanity Check issue. Editorial experiment. Measure subscriber response.
- No further Manim-specific follow-up. This video is a pattern reference, not a tooling adoption recommendation.
Related
- ~/rdco-vault/06-reference/transcripts/2026-04-20-3blue1brown-manim-demo-ben-sparks-transcript.md — raw transcript
- ~/rdco-vault/06-reference/2026-04-20-3blue1brown-grovers-algorithm-clarification.md — same channel, same cycle, post-publication correction craft
- ~/rdco-vault/06-reference/2026-04-20-3blue1brown-exploration-epiphany-paul-dancstep.md — same channel, same cycle, on the discovery process this animation tool ultimately serves