npx claudepluginhub andyed/muriel --plugin murielThis skill uses the workspace's default tool permissions.
Each channel has a dedicated subfile with deep recipes, tooling, and lessons. This top-level index is the map; the subfiles are the territory.
channels/SCHEMA.mdchannels/diagrams.mdchannels/dimensions.mdchannels/gaze.mdchannels/heatmaps.mdchannels/infographics.mdchannels/interactive.mdchannels/raster.mdchannels/science.mdchannels/style-guides.mdchannels/svg.mdchannels/terminal.mdchannels/video.mdchannels/web.mdexamples/critique-fixtures/README.mdexamples/diagrams/cycle-evolver.svgexamples/diagrams/matrix-sat-opt.svgexamples/drop-caps/gen_dropcap.pyexamples/drop-caps/gen_foveated_dropcap.pyexamples/drop-caps/output/dropcap-adaptive-F.pngCreates self-contained HTML visualizations like slide decks, infographics, dashboards, flowcharts, diagrams, timelines, and org charts from any content or idea.
Generates gallery-quality branded presentations and carousels from canvas philosophy and style constraints. Outputs PDF first, then converts to editable PPTX for visual content creation.
Generates professional infographics using Gemini AI via Nano Banana MCP. Guides through content analysis, visualizable concepts, visualization approaches, and on-brand image creation for social media.
Share bugs, ideas, or general feedback.
Each channel has a dedicated subfile with deep recipes, tooling, and lessons. This top-level index is the map; the subfiles are the territory.
| Channel | Format | Deep dive |
|---|---|---|
| Raster | PNG/JPG | channels/raster.md β Pillow, typeset.py, store dimensions, fonts, inline pattern |
| Vector | SVG | channels/svg.md β svgwrite, cairosvg, Mermaid, Excalidraw, viewBox theming |
| Web | HTML + CSS | channels/web.md β marginalia, pandoc filter, Playwright/weasyprint capture, data-URI |
| Interactive | WebGL / Canvas / D3 | channels/interactive.md β single-file scaffold, PermalinkManager, CodePen, Observable |
| Video | MP4 / GIF | channels/video.md β ffmpeg + desktop-control + tooltip burn + editing recipes |
| Terminal | Unicode | channels/terminal.md β chart.py bar charts, sparklines, tables |
| Density viz | PNG | channels/heatmaps.md β Tobii-style Gaussian overlays |
| Gaze plots | PNG / SVG / JS | channels/gaze.md β scanpath, bubble, AOI timeline, saccade rose |
| Science | matplotlib + LaTeX | channels/science.md β rcparams, stats reporting, notebook editorial, paper figures |
| Dimensions | cross-channel reference | channels/dimensions.md β social cards, device footprints, viewport tiers, video, paper/print, favicons, scale factors |
| Style guides | brand schema | channels/style-guides.md β brand.toml schema, loader, rule enforcement, CSS/matplotlibrc derivation, example brand.toml files |
| Infographics | SVG β PNG | channels/infographics.md β 10 types Γ layout patterns Γ colorblind-safe palettes, deterministic SVG (not AI), 60-30-10 color / 60-40 viz:text rule, 5-point quality rubric at 8:1 |
| Diagrams | SVG | channels/diagrams.md β rhetorical primitives (2Γ2 matrix, N-step cycle, Venn shipped; comparison pair, funnel, stack, DAG, spectrum, pyramid, heat-grid queued). Each preset carries an epistemic precondition and an anti-prescription. |
Design grammars worth naming explicitly when a project's visual register calls for something specific. A menu of established traditions β borrow their conventions, don't reinvent them.
vocabularies/fui.md β Fantasy / Fictional User Interface. Sci-fi HUDs. Perception NYC, Territory Studio, Ash Thorp, GMUNK lineage. Thin strokes, mono numerics, staggered reveals, radial geometry, restrained palettes.vocabularies/visible-language.md β Visible Language Workshop. The MIT Media Lab design tradition (Cooper, Small, Ishizaki, Maeda β Processing β pretext). Information landscapes, multi-scale typography, typography as data structure. Contemporary substrate: @chenglou/pretext. See also channels/interactive.md for the pretext API and the pretext-coachella reference exemplar.vocabularies/pixijs.md β PixiJS 2D WebGL/WebGPU substrate. When Canvas/D3 runs out of headroom and Three.js is overkill. Particle-dense gaze overlays, shader-driven foveation demos, audio-reactive visuals. Pin to ^8.18. Lifted from pixijs/pixijs-skills (MIT) β they did the documentation work; we curated the relevant subset. Read upstream for depth.vocabularies/kinetic-typography.md β Letters that move with intent. Saul Bass β Kyle Cooper β Territory Studio lineage. Max contrast, strategic motion, rehearsed emotional vocabulary, SDF alpha rule. Substrate options: pretext for typographic Canvas2D animation, iblipper for a full animation-as-language pipeline (single-frame social graphics and animated kinetic type), Troika SDF for 3D scenes. Invoke /iblipper when the output itself is the animated artifact or the rhetorical-typography social-graphic still.vocabularies/katex.md β KaTeX math typesetting for the web. When prose has math in it and the artifact lands on a web surface (marginalia essay, blog post, in-page explainer). MIT, CDN-clean, no bundler. Pin to ^0.16. Reference exemplar: inside_the_math β .eq-block pattern, sectional background accents, auto-render config. Don't use for paper figures (use channels/science.md matplotlib + LaTeX); don't use for moving math (use Manim CE).vocabularies/muriel-brand.md β muriel's own brand identity. Inward-facing β canonical spec for the six-bar mark (MΓΌller-Brockmann grid + Cooper VLW lineage), color tokens (#e6e4d2 cream, #0a0a0f near-black, #50b4c8 cyan accent), wordmark conventions (muriel always lowercase, built with muriel as canonical attribution), sizing rules including the subpixel rendering floor, and drop-in HTML/SVG snippets for inline + block "built with muriel" credits. Reach for this any time a project wants to attribute muriel β never trace the favicon.Additional vocabularies (Swiss grid, editorial, brutalist, newsprint) can be added here without restructuring the skill.
Codified from per-project bug fixes β apply to every channel:
opacity on text (it composites the effective ratio below the raw value and erodes glyph thickness). When in doubt, promote color, bump size, add weight β in that order. (See channels/science.md for the matplotlib version.)viewBox / getBoundingClientRect first; auto-shrink on overflow.(230,228,210) cream on (10,10,15) near-black. Pure white is too harsh.For data-driven channels (raster plots, SVG, interactive JS, science), apply Tufte/Bertin/CRAP via three high-leverage patterns:
Reference: ~/Documents/dev/ascii-charts/docs/PERMUTE.md β full Tufte/Bertin/Gestalt/CRAP framing.
When building interactive demos or UI affordances around the visuals, the design choices have empirical anchors:
a + bΒ·logβ(D/W + 1). Big targets close to the cursor are fast; small targets far away are slow. Implication: primary controls go large and near the user's current attention point. Fisheye expansion is Fitts's Law made visible.a + bΒ·logβ(n + 1). Decision time grows logarithmically with options. Implication: collapse n>7 options into hierarchy or progressive disclosure.vocabularies/visible-language.md for the full MIT Media Lab lineage this is drawn from.Use these as design rationale in figure captions and blog posts β the vocabulary is precise, the laws are quantified, and the lineage runs from psychophysics through typography to interaction design.
Whenever the user needs a visual artifact for human eyes β store assets, paper figures, blog post explainers, video demos, terminal output, scientific plots, infographics, screenshots, gaze visualizations. Invoke with /muriel followed by what's needed.
When the task lands in a specific channel, read the corresponding subfile first before executing:
| If the task is⦠| Read |
|---|---|
| App store assets, icons, banners, wordmarks, Pillow compositing | channels/raster.md |
| Paper figures, data-driven diagrams, SVG theming, Mermaid, Excalidraw | channels/svg.md |
| Blog posts, marginalia pages, pandoc β HTML/PDF, web capture, data-URI | channels/web.md |
| Interactive demos, WebGL/Canvas/D3, CodePen, Observable, permalink state | channels/interactive.md |
| Product demo videos, ffmpeg, tooltip burn, GIF generation | channels/video.md |
| Unicode bar charts, sparklines, terminal output, README tables | channels/terminal.md |
| Tobii-style density heatmaps from fixation data | channels/heatmaps.md |
| Scanpath plots, AOI timelines, bubble scanpaths, saccade roses | channels/gaze.md |
| matplotlib figures, stats reporting, notebook editorial, LaTeX hooks | channels/science.md |
| "What size should this be?" β social card / device / viewport / paper / video dimensions | channels/dimensions.md |
| Loading a brand's design tokens, enforcing brand ownership rules, deriving CSS / rcparams from a brand | channels/style-guides.md |
| Social-shareable explainers, LinkedIn/X cards, README hero images, single-image infographics | channels/infographics.md |
| Sci-fi HUD aesthetic, FUI grammar, Territory/Perception lineage | vocabularies/fui.md |
| Multi-scale typography, information landscapes, pretext, Cooper/Small lineage | vocabularies/visible-language.md |
| Particle-dense gaze overlays, shader filters, PixiJS v8 patterns | vocabularies/pixijs.md |
| Animated typography, emotional motion vocabulary, Bass/Cooper/Territory lineage | vocabularies/kinetic-typography.md |
For a multi-channel task (e.g., a blog post with an interactive demo captured as a paper figure), read the relevant subfiles in order of primary channel first.
ImageFilter.GaussianBlur in render_text() shadow effect.ascii-charts/typeset.py ships amazon-icon, amazon-small-icon, tvos-topshelf, play-feature templates via render_asset(template=...).generate_from_manifest("assets.json") in typeset.py.The screenshot-beautifier category (Pika, Shots.so, CleanShot X, Screely, BrandBird, Canva screenshot editor, Screen Studio, Rotato, Previewed, Mockdrop, Screenshot.rocks, BrowserFrame, Figma mockup plugins) has converged on a fairly standard feature set. Port the useful ones into muriel's raster channel as opinionated presets. We're stealing the feature menu, not the products.
P0 β table stakes (ship first):
drop_shadow(offset, blur, color, spread) β multi-layer ambient + key shadows, Material-3 style. Existing render_text() shadow handles text only; this is for composited screenshots/images.fade_edge(side, ramp_px, curve="linear"|"ease") β progressive alpha ramp on any side (top/right/bottom/left) or radial. Andy's seed feature; rare as a preset outside Pika + Screen Studio.border_radius(r) β rounded corners on the screenshot/image before compositing.background(kind, β¦) β unified API with kinds: solid, linear_gradient, radial_gradient, mesh_gradient (3β5 color blobs), image_blur, noise_overlay, transparent.caption(text, position, style_token) β bound to brand tokens; enforces 8:1 contrast at render time, not as lint pass.channels/dimensions.md; confirm coverage: IPHONE_69_PORTRAIT 1290Γ2796, IPAD_13_PORTRAIT 2064Γ2752, OG_IMAGE 1200Γ630, X_CARD 1200Γ675, IG_SQUARE 1080Γ1080, IG_STORY 1080Γ1920, PRODUCT_HUNT 1270Γ760.P1 β distinctive, low effort:
tilt(angle_deg, axis) β 2D affine shear (cheap fake-3D). Real perspective later.device_frame(kind) β PNG overlay library. Minimum kit: iphone_15_pro_dynamic_island, macbook_pro, browser_chrome_light, browser_chrome_dark, browser_safari_mac, ipad.browser_url_bar(url, title) β editable text rendered into the chrome asset (the URL is half the joke).spotlight(x, y, radius, falloff) β radial bright spot for "look here" emphasis.vignette(strength, shape="oval"|"rect") β classic framing effect.noise(amount) β post-filter; fights banding on gradients.glow(color, blur, intensity) β outer glow (Psychodeli audio-reactive aesthetic).P2 β differentiators:
glass_panel(rect, blur, tint) β frosted backdrop card behind device (2023β2026 aesthetic).numbered_callout(x, y, n, leader_to=(x,y)) β step markers 1β¦n with leader line (BrandBird / CleanShot).reflection(height_frac, opacity) β iPod-style mirror under device.bento_grid(cells) β template compositor for N screenshots + brand palette (Pika).glass_reflection_overlay(asset) β pre-baked highlight PNG multiplied over screen for fake HDRI (Rotato lite).auto_blur_regions(detector) β heuristic blur for emails/tokens in debug captures. Scrutinizer-relevant when publishing validation screenshots.magnifier(x, y, radius, zoom) β BrandBird's "Highlight Product Feature" tool. Circular zoom-in lens on a specific UI region.annotation(arrow|rect|circle|emoji, x, y, β¦) β BrandBird/CleanShot annotation primitives.P3 β out of channel (skip or defer elsewhere):
channels/video.md.typeset.svg.gaze_ribbon(fixations) reusable across AdSERP / RecGaze work.roughness:0, Helvetica, solid fills.--mg-* palette.permalink.js β Pull the PermalinkManager pattern out of Scrutinizer/Psychodeli for demos outside those repos.<mg-demo src="..."> custom element that lazy-loads an iframe..html.muriel/capture.py. capture_responsive(url, tiers=..., output_dir=...) writes retina PNGs for every tier in one call. CLI: python -m muriel.capture <url>. Playwright optional dependency.capture.py but captures parameter sweeps, not viewport sweeps.)@page rules for A4 + letter, figure captions, bibliography.marginalia/pandoc/marginalia.lua filter β Shipped as commit 4c66c16 on the marginalia repo.marginalia/pandoc/template.html β Shipped alongside filter.marginalia/pandoc/examples/us-constitution.md.channels/science.md subsection β rcparams defaults, stats reporting, notebook editorial, LaTeX hooks, worked recipes.muriel/matplotlibrc_dark.py + _light.py β Both rcparams blocks shipped as importable modules with graceful fallback when matplotlib is absent. Light variant matches the F explainer warm editorial palette.muriel/stats.py ships format_comparison, format_null, format_correlation, format_auc, format_chi2, format_exploratory, cohens_d, cohens_d_paired, fisher_ci, apa_number, format_p, format_ci. Standard library only. Enforces U+2212 minus signs, APA leading-zero stripping, detection-limit phrasing for nulls.muriel/contrast.py WCAG audit β Standard-library-only module with contrast_ratio, check_text_pair, audit_svg, and a python -m muriel.contrast file.svg CLI (exit 0 / 1 / 2 for CI use). Classifies CSS selectors as text / decorative / ambiguous via substring hints. Used for the 8:1 compliance audit that caught three failing text roles in word-fingerprints and four failing tokens in marginalia's light theme.muriel/dimensions.py screen-size constants β Size / Device / PaperSize NamedTuples with aspect labels and scale methods. 34 dotted-name registry entries (social cards, video, viewports), 17 device footprints with physical + CSS + scale factor, 5 paper sizes with DPI-aware pixel conversion, figsize_for() helper for 7 academic venues (CHI/ACM/IUI/IEEE/PNAS/Nature/LNCS), CLI self-test. Paired with channels/dimensions.md.muriel/contrast.py inline-fill + legibility pass β Current audit only walks <style> CSS; add a second pass that walks <text fill="β¦"> attributes for SVGs that set fills inline (silent-PASS bug surfaced 2026-04-26 on docs/v1-orientation-columns.svg β audit reported 0 text rules on a file with five <text> elements). Same pass should detect the legibility floor: font-size β€ 14 + font-weight < 500 + opacity < 1 β warn even when ratio passes (rule from universal-rules section, currently only enforced verbally in channels/science.md).muriel/contrast.py marginalia-token audit β Add a audit_marginalia_tokens() helper that reads marginalia.css and verifies every --mg-* custom property against both theme backgrounds.channels/web.md now has a section on the F-explainer pattern, with the .outer-note / .stats-detail / .has-dropcap / staged-h2 extensions catalogued..outer-note and .stats-detail back into marginalia β Currently F-explainer-only; worth promoting to the main library if a second project adopts them.marginalia-md.js for projects that prefer browser-side conversion over pandoc.channels/video.md β Recordly + desktop-control + ffmpeg + burn-tooltips.sh recipes shipped.npx skills add heygen-com/hyperframes -y -g β registers /hyperframes, /hyperframes-cli, /hyperframes-registry, /website-to-hyperframes, /gsap as slash commands. Documented in channels/video.md with pick-the-substrate-by-source-of-truth decision table.scrutinizer-www/src/blog/drafts/video-script-v2.6.md and video-script-minecraft-fast-demo.md into hyperframes compositions. First proof that the HTML β MP4 path works for Scrutinizer release announcements. Bonus: the scripts already have precise timecodes + tooltip text.scrutinizer.app β promo video β invoke /website-to-hyperframes against scrutinizer.app and produce a 30β60s promo. Benchmark auto-generated quality vs hand-authored compositions.K-Dense AI's
scientific-agent-skillsis an MIT-licensed family of research skills. Several overlap muriel's territory enough to borrow structure, templates, or tooling from. These are ports / adaptations, not wholesale adoption β muriel has its own brand rules and palette commitments.
channels/infographics.md. 10 types Γ layout patterns Γ 8:1-strict rubric, Wong/IBM/Tol colorblind-safe palettes named. Deterministic SVG (not AI image generation) β muriel's lane. K-Dense's AI pipeline explicitly not adopted. First exemplar: Scrutinizer foveation explainer at scrutinizer-www/src/img/explainers/foveation.{svg,png,py} β portrait 1080Γ1920, Anatomical + Statistical + Comparison hybrid, passes muriel/contrast.py at 8:1 across all 9 text roles.channels/market-research.md. 50+ page templated report: Front matter (5pp) β Core analysis (35pp: market definition, TAM/SAM/SOM sizing, PESTLE, Porter's Five Forces, segmentation, technology trends, regulatory, risk) β Strategic section (10pp: recommendations, roadmap, financials) β Back matter (5pp). LaTeX + market_research.sty or weasyprint+marginalia. 5β6 core visuals minimum at 300 DPI. Directly relevant to PM work (Quora/Poe, future roles). Source: K-Dense market-research-reports.channels/pptx.md. Swipe the infrastructure (not the rigid templates): pptxgenjs (JS, muriel-native) for generation β LibreOffice soffice for PDF conversion β pdftoppm for per-slide PNG β Pillow thumbnail grid for visual inspection. This is the real gold: the generate β render β inspect β fix loop. Include K-Dense's 10 palettes + font pairings + the "no accent lines under titles" AI-tell heuristic as brand defaults. Skip K-Dense's fixed templates β they converge to sameness, which fights muriel's multi-constraint-solver ethos. Source: K-Dense pptx.channels/style-guides.md alongside the OLED/editorial palettes. Ship as importable constants in muriel/palettes.py (or extend muriel/matplotlibrc_*.py with CATEGORICAL_WONG, CATEGORICAL_IBM, CATEGORICAL_TOL). Cross-reference from channels/science.md color section.scientific-schematics skill as a mandatory dependency for figures (PRISMA diagrams, flowcharts, synthesis maps). If muriel wants to interoperate with the K-Dense workflow, expose a compatible interface (Python entry point that matches their expected call signature) that delegates to muriel's SVG + raster channels. Low-priority until a project actually needs it.markitdown converts 15+ formats to markdown. K-Dense wraps it with AI image descriptions. Build a thin pipe: markitdown file.pdf | marginalia-inject > out.md that adds marginalia callout syntax (.outer-note, pull-quotes, sidenotes) to markdown output. If it proves useful, propose upstream as a markitdown plugin rather than forking.