{"id":"843d9af3-ee84-4e58-b573-123138553c34","slug":"deck-visuals","kind":"skill","name":"deck-visuals","summary":"Claude Code plugin: decides where a visual belongs in an HTML deck and builds it. Inline-SVG diagrams, validated dataviz charts, icons, and verified GIF levity. Composes frontend-slides + iceberg.","owner":"gagoar","repoUrl":"https://github.com/gagoar/deck-visuals","license":"MIT","licenseTier":"permissive","trust":"community","stars":1,"match":null,"fewStars":true,"format":"skill","createdAt":"2026-09-16T12:10:36.000Z","addedAt":"2026-10-21T10:25:56.774Z","logoUrl":"https://avatars.githubusercontent.com/u/226559?u=0b69d86abb550637519680c44f7aef0f959ad0bc&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["developer-tools","browser-web","data-analytics"],"tags":["claude-code","claude-code-plugin","data-visualization","dataviz","html","plugin","presentations","slides"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-26T07:43:19.380Z","sample":false,"url":"https://conduits.dev/tools/deck-visuals","language":"HTML","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<p><img src=\"docs/assets/favicon.svg\" alt=\"deck-visuals icon\" width=\"96\" height=\"96\"></p>\n\n# deck-visuals\n\n**Your deck already reads. Make it land.**\n\n[![Release](https://img.shields.io/github/v/release/gagoar/deck-visuals?color=2894EB)](https://github.com/gagoar/deck-visuals/releases)\n[![License: MIT](https://img.shields.io/badge/license-MIT-199E70)](LICENSE)\n[![Claude Code plugin](https://img.shields.io/badge/Claude%20Code-plugin-1B1F22)](https://gagoar.github.io/deck-visuals/)\n[![Stars](https://img.shields.io/github/stars/gagoar/deck-visuals?style=flat&color=2894EB)](https://github.com/gagoar/deck-visuals/stargazers)\n\ndeck-visuals is a Claude Code plugin that decides where a visual belongs in an HTML\ndeck and which kind, then hands back a ready-to-inject fragment. Inline-SVG concept\ndiagrams, charts with a validated palette, icon anchors, and GIFs it checks\nbefore they ship. It does not render decks.\n\n![A slide of four bullet points, then the same slide with the bar chart deck-visuals injects](docs/assets/before-after.png)\n\n*Four bullets in, one chart out. The numbers are the same; the argument lands.*\n\nSee it live: [gallery](https://gagoar.github.io/deck-visuals/gallery.html) ·\n[showcase](https://gagoar.github.io/deck-visuals/showcase.html) ·\n[how it decides](https://gagoar.github.io/deck-visuals/reference.html) ·\n[site](https://gagoar.github.io/deck-visuals/)\n\n## Install\n\n```\n/plugin marketplace add gagoar/gago-plugins\n/plugin install deck-visuals@gago-plugins\n/reload-plugins\n```\n\n## The three pillars\n\n1. **Impactful visuals.** Inline-SVG concept diagrams for relationships, flows,\n   and architecture. Icon anchors for single ideas. AI illustrations for hero\n   moments are deferred — this build has no image-generation dependency to\n   satisfy that case yet.\n2. **Data-viz principles.** Charts lean on the built-in `dataviz` skill for form,\n   marks, and interaction, paired with a validated brand palette instead of\n   `dataviz`'s brand-neutral default. Every chart ships with a reachable table\n   view.\n3. **Levity.** Real GIFs by direct media URL, at a deliberate cadence — openers,\n   section breaks, the payoff — with alt text and a `prefers-reduced-motion`\n   fallback on every one. A swipe onboarding flow rebuilds the presenter's\n   pop-culture profile so the matcher always has options, backed by a meme library\n   for when nothing else fits.\n\n## Guidance and injection, not rendering\n\n`frontend-slides` renders decks: the HTML shell, the fixed stage, the theme, the\nanimations. `deck-visuals` never touches that layer. It reads a deck's content,\ndecides where a visual belongs, builds that one visual as a self-contained\nfragment with its own scoped styles, and hands it back for injection into the\nslide that's already there. `iceberg` still owns the copy pass, run on prose\nbefore it enters the deck — never on the finished `.html` file.\n\nSee `skills/deck-visuals/SKILL.md` for the full five-step pipeline and\n`skills/deck-visuals/references/` for the per-flavor rules.\n\n## Usage\n\nAsk in natural language once a deck exists:\n\n- \"Add visuals to my deck.\"\n- \"Make this slide impactful.\"\n- \"Chart this number.\"\n- \"Add a GIF/levity slide here.\"\n- \"Inject a diagram for this architecture slide.\"\n\nThe skill reads the deck, applies the decision rule in\n`skills/deck-visuals/references/visual-concepts.md`, and returns the fragment to\ninject — it does not rewrite the deck's shell or theme.\n\n## What's inside\n\n```\nskills/deck-visuals/\n  SKILL.md                    orchestrator: pipeline + trigger phrases\n  references/                 decision rules, per-flavor guidance\n                              (incl. onboarding.md)\n  assets/\n    brand-palette.md          validated 8-slot categorical palette + ramps\n    show-catalog.md           the ~50-title swipe catalog (onboarding)\n    meme-library.md           evergreen meme fallback for levity\n    familiar-sources.md       the presenter's curated analogy pool\n    VERSION                   release tag the wrappers download from\n    run-binary.sh             shared fetch + verify + cache + build-fallback\n    tools/                    dv-tools: Go source for the palette validator,\n                              media-URL check, and coverage report\n      dv-tools                POSIX wrapper: fetches the pinned binary for this\n                              machine on first use, then runs it\n      SHA256SUMS              pinned hashes of the released dv-tools binaries\n      build.sh                reproducible cross-compile; rewrites SHA256SUMS\n    icons/                    curated Lucide-style icon set\n    fragments/                injectable HTML fragments\n    onboarding/\n      picker.html             onboarding swipe page (local tool)\n      levity-picker.html      deck-time levity GIF chooser (local tool)\n      palette-picker.html     accent-theme chooser (local tool)\n      picker.css              shared styling for all three: the site's cream and orange look\n      fonts/                  Fraunces + IBM Plex, compiled into the binary (OFL licenses inside)\n      dv-onboard              POSIX wrapper for the picker binary (same scheme)\n      SHA256SUMS              pinned hashes of the released dv-onboard binaries\n      server/                 Go source for the picker binary\n```\n\nThe same picker server also powers a **deck-time levity picker**: once Claude\nproposes 2-3 candidate GIFs per slide, run it with `--form levity` to choose each one\nvisually instead of in chat.\n\n## Helper binaries\n\n`dv-tools` (palette validator, media-URL check, coverage) and `dv-onboard` (the picker\nserver) are Go programs. Their binaries are **not committed**. The wrappers\n(`assets/tools/dv-tools`, `assets/onboarding/dv-onboard`) download the binary for the\ninstalled release on first use, run it only if it matches the pinned `SHA256SUMS`, and\ncache it. They need **network access to GitHub, or Go installed** the first time; after\nthat they work offline. Maintainers: bump `assets/VERSION`, `.claude-plugin/plugin.json`\nand the `SHA256SUMS` files (run both `build.sh` scripts) together, then push a `v<version>`\ntag so `release-binaries.yml` publishes the assets.\n\n## Onboard your references\n\n```\n\"Onboard me\" / \"update my familiar sources\"\n```\n\nSwipe through ~50 shows in a local page — each a still plus a signature GIF —\nmarking what you recognize, and give your talk length and audience. The picks feed\nback through a small local-only binary (nothing leaves the machine) and rebuild\n`familiar-sources.md`, with a coverage check that proves the matcher has ~3 options\nper concept shape.\n\n## License\n\nMIT. See `LICENSE`. The icon set carries its own provenance note and license\ntext in `skills/deck-visuals/assets/icons/LICENSE`.\n\n## Automated gate\n\nCI runs `scripts/check-plugin-safety.ts` and `claude plugin validate --strict` on every PR. Run both before you push:\n\n```\nnode scripts/check-plugin-safety.ts .\nclaude plugin validate . --strict\n```\n\nThe gate fails on three things the plugin-directory upload scanner holds for review:\n\n- A skill, agent, or command that pre-approves `Write`, `Edit`, or `Bash` with no path scope. Write `Write(./docs/**)`, not `Write`.\n- Shipped code that copies the whole environment (`...process.env`, `Object.keys(process.env)`). Read the named variables you need.\n- A committed native executable. The scanner cannot read it.\n"}