一键导入
moonshine
Help users create interactive explanations of technical concepts, inspired by Distill.pub
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Help users create interactive explanations of technical concepts, inspired by Distill.pub
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Listen for moonshine authorship feedback and address comments on an interval. Invoke when the author asks you to watch for feedback from the article HUD, or when prompted to start the listener. Best run under /loop (e.g. `/loop $moonshine-listen`) so it keeps ticking while the session is idle.
Create a self-contained interactive technical explanation (single HTML file with D3 v7, no build tools) inspired by Distill.pub. Use when the user wants to author, draft, or scaffold an explainer, interactive article, or visual essay about a technical concept. Invoked as `$shine` or `$shine <topic>`.
Scaffold an opinionated Vite + React + Velite project for a moonshine article — markdown prose with custom React figures, hot-reloading, single-article or series mode. Use when the user wants a structured multi-file interactive explanation rather than a single self-contained HTML file. Invoked as `$still` or `$still <topic>`.
| name | moonshine |
| description | Help users create interactive explanations of technical concepts, inspired by Distill.pub |
| user_invocable | true |
Moonshine helps create interactive, web-based explanations of technical concepts. Inspired by Distill.pub's argument that research distillation is valuable creative work, it provides scaffolding to turn complex ideas into explorable, visual, interactive articles.
AI tools generate complexity faster than people can consume it. Moonshine is for bridging that gap: helping people digest and communicate technical concepts clearly.
Reference files:
STILL.md the structured Vite + React project flavor: markdown directives, figure registry, in-place editing, publishingARTICLE.md the shine substrate: single-file HTML scaffold, CSS foundation, layout patterns, series structure (shine's hand-built kind)VISUALS.md visualization patterns, interaction, rendering technology, iteration (both substrates; see its preamble for still differences)FEEDBACK.md the authorship-feedback protocol: comments from the rendered still article flow back to the agentThis is the central principle. Everything else follows from it.
Moonshine makes explanatory articles where prose drives understanding and interactive figures serve the narrative. We are not making dashboards, data products, or slide decks. The difference matters because it shapes every decision:
When in doubt about a design choice, ask: "Would this feel at home in a Distill.pub article, or in a Grafana dashboard?" If the answer is dashboard, reconsider.
We are also not making coding tutorials. Equations and their connection to behavior should be shown through interactive visualizations, not code listings. If pseudocode helps connect math to implementation, keep it minimal and pair it with the equation. Never show implementation code (framework boilerplate, shader code, API calls) unless the article is specifically about programming.
Moonshine renders articles on one of two substrates. Decide early, during story discovery, and confirm the choice at the Phase 1 checkpoint:
If the user invoked a specific skill (/moonshine:shine or /moonshine:still), the choice is made. If they invoked moonshine generically, default to still — nearly every real article keeps being edited after first publication, and still is where the authoring affordances live (in-place editing, the knob panel, authorship feedback). Offer shine when the user wants one file they can email or host anywhere with no build step. Everything still-specific lives in STILL.md; the authorship-feedback loop (FEEDBACK.md) is still-only.
Do not skip to code. The most common failure mode is jumping straight to scaffolding without understanding what the user is trying to explain and who they're explaining it to. The second most common failure mode is asking a few questions upfront and then writing the entire article in one shot.
Moonshine is a conversation, not a generation pipeline. The process has natural checkpoints where you stop and check in with the user before continuing.
Before writing any code, have a conversation with the user. Ask questions and listen. You need to understand:
Ask these questions one or two at a time. Start with "What are you trying to explain?" and follow the thread. Wait for answers before moving on. If the user gives you all the context upfront, you can move faster, but if they give a brief prompt, slow down and ask.
Checkpoint: Before moving to Phase 2, confirm the concept, audience, insight, and progression with the user. "Here's what I think we're building..." This is the single most important moment in the process. Get it wrong and everything downstream is wasted effort.
Now design the article at a high level. Present the user with a proposed structure:
Write this as a short outline, not code. For each figure, describe it in prose: what it shows, what the reader can do with it, and what they should learn from it. This prose description is the spec. Something like:
1. Opening: what gradient descent is trying to do
Prose + static diagram of a loss landscape as a 3D surface
2. The naive approach: why random search fails
Interactive: click to place random guesses on the surface, watch them miss the minimum
3. Following the slope: the gradient points downhill
Interactive: drag a point on the surface, an arrow shows the gradient direction and magnitude
4. Step size matters: too big overshoots, too small stalls
Explorable: slider controls learning rate, animation shows convergence path on the surface
5. Putting it together: watch gradient descent solve a real problem
Scroll-driven: each scroll step reveals the next iteration, building the path incrementally
Checkpoint: Share this outline with the user. Ask if the progression makes sense. Are there concepts missing? Is the order right? Should any section be interactive that isn't, or static that is? Do the prose descriptions of the figures capture what the user has in mind? This is cheap to change now and expensive to change after building.
Pick the most important interactive section and build it first. Not the whole article. One section.
Open it in the browser. Show the user. Ask:
Iterate on this section until it works before building the rest.
Build the remaining sections, following the structure from Phase 2. After each major section, open in the browser to verify. Prose should be written alongside the figures, not after, because the prose frames what the reader should notice in each figure.
Checkpoint: Before delivering, verify the article:
Create projects in ~/.agent/moonshine/project-name/. On the shine substrate each explanation is a self-contained HTML file; see ARTICLE.md for the scaffold template, layout patterns, and series structure. On the still substrate the project is a Vite + React app; see STILL.md for the bootstrap procedure and project structure.
After building, open the result in the browser (shine) or report the dev server URL to the user (still).
Moonshine articles should have clear and humble prose. We are helping people digest, not force-feeding them. The writing should feel like a knowledgeable colleague explaining something at a whiteboard, not a keynote presentation.
The one-line rule: remove the performance, keep the explanation. Authorial performance is anything that draws attention to the writing instead of the thing being explained — the dramatic reveal, the quotable maxim, the teaser heading, the clever construction. The patterns below were extracted from a human author's line edits of drafted moonshine prose; each shows the move with a real before/after.
Flatten the two-sentence reveal. A punchy short sentence that "lands" a point reads as written, not spoken. Merge it into the prior sentence unless the punch is doing real work.
Cut the maxim. Delete any sentence that restates the point as a quotable principle or design slogan ("That is the property a good design should lean on: build for the shape, let the specifics be data." / "That is one word per field, not new machinery."). State the concrete fact and trust the reader to extract the lesson; don't hand them the moral.
Headings describe or ask; they never tease. Two reliable shapes: a gerund naming the activity, or the reader's literal question.
Ground in the real artifact. Link or point to the concrete thing — the page, the file, the running demo — and start there. Cut abstract scene-setting that delays arrival; start at the point, not one sentence before it. "The reviews page shows all the reviews with minimal context and a quick approve button, how do we determine what to show in that list?" beats two sentences of conceptual framing about what the system can and cannot infer.
Hedge the absolutes. Final-sounding claims become partial and forward-looking: "not just a matter of styling" over "not styling"; "percent is a reasonable starting point" over "the cheapest way"; "in the future we can explore min/max hints" over closing the question.
Plain subjects, plain verbs. Make "we" (or the system) the subject instead of a nominalized abstraction. "We can't group into context, proposal, and evidence via inference alone" beats "The grouping into context, proposal, and evidence is the other thing inference cannot do."
Asides must earn their length. A vivid illustrative example survives only if it teaches faster than the literal mechanism stated plainly ("extending the format hint in the schema by introducing percent" needed no inventory of temperatures and row counts).
And the standing rules:
The target register is deliberately relaxed — conversational comma-joins, "Let's", "Currently" are on-voice. Relaxed is not unproofed: this register invites comma splices that don't scan and dropped words ("what it is important"), so proofreading is its own pass.
After drafting prose, and again before delivering, walk each section against this checklist. It is the patterns above in executable order:
AI coding tools have strong defaults that produce generic, recognizable output. Moonshine articles should not look like AI made them. They should look like a thoughtful person made them.
The test is simple: does this look like an article, or does it look like a dashboard? Every rule below is a specific case of that question.
Dashboard patterns to avoid:
Generic AI visual patterns to avoid:
Prose patterns to avoid:
The check: Before delivering, scan the output. If you swapped the content for a different topic and nothing else needed to change, the design is too generic. The visual choices should relate to what's being explained.
Adapted from the anti-slop patterns in visual-explainer by nicobailon.
These principles come from Distill.pub and the broader tradition of explanatory writing:
Information hierarchy. Three levels, always distinguishable. Primary: the key insight and its argument. Secondary: context, definitions, related concepts. Tertiary: technical details, proofs, edge cases (margin notes or expandable sections). Typography, spacing, and visual weight make this hierarchy clear without the reader having to read a word.
Visual encoding. Position and length are the most accurate channels; use them for the most important data. Color encodes categories or highlights, not quantitative information alone. Redundant encoding (color + position) improves accessibility. Consistent visual language across all figures.
Typography. Large readable body (18-20px), generous line height (1.5-1.6), constrained line length (60-75 chars), clear heading hierarchy. Monospace for code, KaTeX for math. Margin notes over footnotes.
Interaction patterns.
| Pattern | Use When |
|---|---|
| Details-on-demand | Supplementary info would clutter the narrative |
| Explorable explanation | The concept involves a parameter space to explore |
| Linked views | The same data has multiple meaningful representations |
| Scroll-driven narrative | The explanation has a natural sequence of reveals |
| Animated transition | The path between two states is meaningful |
These principles come from building real moonshine articles and noticing what gets corrected most often.
Exaggerate for clarity. Default parameter values should make phenomena dramatically visible. If you're showing viscosity, crank it up so the effect is obvious. If you're showing divergence between two methods, pick parameters where they clearly disagree. Pedagogical clarity trumps physical realism. The reader can always dial things down; they can't learn from effects too subtle to see.
Sensible defaults. Every interactive figure must show something interesting before the reader touches anything. No blank canvases, no "click a particle to start", no grids of dots waiting to settle. Pre-select a default element, pre-populate with data, start the simulation in a state that already demonstrates the concept.
Slow enough to follow. Animated demonstrations should move slowly enough that the reader can track cause and effect. When a particle moves through a field, the reader needs to see the field respond. When in doubt, go slower. The reader can always speed things up.
Consistent conventions across figures. If you show a radius as a dotted circle in one figure, show it the same way in every figure. If you color-code a variable blue in an equation, use that same blue everywhere it appears. Inconsistency forces the reader to re-learn the visual language in each figure.
Looping animations reset cleanly. If a demonstration loops, it should reset to its initial state, not carry over physics or accumulated values from the previous iteration.