danielmiessler/lifeos/art
Claude Code and agent skill by danielmiessler/lifeos
- community
Checking that the SKILL.md file is still in the repository.
Static visual content in 20+ formats (diagrams, infographics, comics, icons, wallpaper) via Nano Banana Pro by default, Nano Banana, and Flux, plus technical diagrams and a few essay illustrations that draw themselves as looping GIFs. USE WHEN art, illustration, diagram, flowchart, animated diagram, diagram GIF, animated essay image, animated header, infographic, header image, blog social thumbnail, generate image, mermaid, comic, icon, blog art, framework diagram, D3 chart, remove background, wallpaper. NOT FOR any request that says visualize (Visualize owns every "visualize X" and may embed Art output), YouTube/video thumbnails (the video skill), other video or animation (HyperFrames), web UI design (Webdesign).
Install
npx vskill@latest install danielmiessler/lifeos/artSKILL.md
Art Skill
Contents: Ideal State · Intent Routing · Safety gates · Tool contract · Data & Config · Gotchas · Examples
Generates static visual content across 20+ formats — blog headers, technical and architecture diagrams, frameworks, taxonomies, timelines, comparisons, stat cards, comics, icons, wallpapers, D3 charts, Mermaid diagrams — using Flux and Nano Banana Pro (Gemini 3 Pro). <!-- public PR #2009, @jbmml --> Every request routes through a named intent that encodes the technique and palette, then calls Generate.ts with --intent=<name> plus model/size/output flags, and Generate.ts itself enforces that the intent was followed. Output defaults to $LIFEOS_DOWNLOADS_DIR (default ~/Downloads/ when unset) unless --output names another path, so every intent passes --output into a working directory outside Downloads (§ Output staging). Blog headers run with --thumbnail to ship both a transparent inline PNG and an opaque listing thumbnail on the page ground (ArtConfig.json thumbnailGround); the site builds its social card separately (References/BlogHeaders.md).
Ideal State
- Every image comes from the intent that matches the request, and its composition is reasoned from the specific argument or content it illustrates: scene concepts weighed against each other, every element in the frame carrying a narrative role, never a subject list dropped into a prompt.
- Every image holds its intent's technique and palette, or the style
PREFERENCES.mdsets, unless the principal names another style, and every person in it follows the figure treatment described in Gotchas. - Every label, number, value and arrow in a diagram, stat card or annotated image is factually correct and spelled exactly as the source has it; one misspelled word, garbled digit or wrong hex value fails the image however good the art is. When the request asks for an image rendered from authored SVG, the delivered file comes from that SVG, never from an image model.
- An edit of an existing photo or reference image changes only what the request names: the subject's identity, and every element the request did not mention, read the same in the output as in the source.
- A set of images made for one deck or page reads as one set: the same medium, palette, ground and figure style as the style references the request names.
- Every image is rendered in a working directory outside Downloads (or the staging directory its intent names), passes the ArtDirection quality loop there, and reaches Downloads only through ArtDirection's
Deliver.ts; nothing is copied into a project before that hand-off, except where an intent wires its own winner in without handing back. - A finished file is verified, not assumed: it was looked at with the Read tool in this turn,
filereports real RGBA where transparency was the point, its native dimensions fit the destination, and a blog header ships both the transparent inline image and the opaque-thumb.pngand carries the signature stamp the Essay intent applies. - A one-of-a-kind generation survives any background cut: its raw stays on disk until the cut PNG has been read and every subject in it confirmed present.
Intent Routing
| Intent | Trigger | File | |
|---|---|---|---|
| Essay | Blog header or editorial essay illustration | Intents/Essay.md | |
| AnimatedEssay | Animate a finished Essay still as a looping GIF (rare: at most 3 per deck; Tools/AnimatedEssay.ts, no Generate.ts) | Intents/AnimatedEssay.md | |
| RemoveBackground | Background removal only | Intents/RemoveBackground.md | |
| LogoWallpaper | brand-logo wallpaper with logo integration | Intents/LogoWallpaper.md | |
| EmbossedLogoWallpaper | Embossed logo wallpaper | Intents/EmbossedLogoWallpaper.md | |
| D3Dashboards | D3.js interactive chart or dashboard | Intents/D3Dashboards.md | |
| Visualize | Generic visualization (none of the other intents fit) | Intents/Visualize.md | |
| Mermaid | Mermaid flowchart or sequence diagram | Intents/Mermaid.md | |
| TechnicalDiagrams | Technical or architecture diagram, static or animated GIF (animated: § Animated Option, Tools/AnimatedDiagram.ts, no Generate.ts) | Intents/TechnicalDiagrams.md | |
| LifeOSHero | LifeOS philosophy card hero (One Block series: one cube changed by one move, transparent cut-out, card accent) | Intents/LifeOSHero.md | |
| Taxonomies | Taxonomy, hierarchy or classification grid | Intents/Taxonomies.md | |
| Timelines | Timeline or chronological progression | Intents/Timelines.md | |
| Frameworks | Framework, 2x2 or matrix | Intents/Frameworks.md | |
| Comparisons | Comparison or X vs Y | Intents/Comparisons.md | |
| AnnotatedScreenshots | Annotated screenshot | Intents/AnnotatedScreenshots.md | |
| RecipeCards | Recipe card or step-by-step | Intents/RecipeCards.md | |
| Aphorisms | Aphorism or quote card | Intents/Aphorisms.md | |
| Maps | Map, conceptual map or territory | Intents/Maps.md | |
| Stats | Stat card or big number visual | Intents/Stats.md | |
| Comics | Comic or sequential panels | Intents/Comics.md | |
| SalesVisual | Square charcoal sales or value-proposition sketch (Presentation Pitch calls it) | Intents/SalesVisual.md |
YouTube, channel and video thumbnails are not this skill: the video skill owns thumbnails end-to-end with its own vendored art intents and compositors (moved out of Art 2026-08-28).
| File | Read when | |
|---|---|---|
EvalState.md | checking the latest scores of the Art eval suites (machine-written by skills/Assay/Tools/EvalState.ts) | |
References/Models.md | changing model or --size, passing --reference-image (includes the reference-edit gotcha), or mapping an Essay request's words to flags | |
References/BlogHeaders.md | making, cutting or wiring a blog header (Essay, any --thumbnail run): the command, transparency rules, verification, post wiring, and the white-box and interior-white gotchas | |
References/EssayComposition.md | an Essay run designing composition.md: problem types, emotional registers and warm:cool ratios, and worked Opposite-Concept iconography tables | |
References/EssayRounds.md | reading an Essay EvalRound.ts table, or rewriting the next round's prompt after a candidate fails a Validation Checklist row | |
Tools/ | running a tool directly: each <Tool>.help.md (AnimatedDiagram, AnimatedEssay, CutHero, EvalRound) is that tool's contract | |
Setup.md | first-time setup: the image-model keys, rembg and ImageMagick, the dependencies to install, and a dry-run proof |
Safety gates
Generate.ts intent gate
Generate.ts refuses to run unless it gets --intent=<name> (or the explicit --freeform-confirmed opt-out), and exits non-zero with the intent lookup table. The rule was markdown-only until it was silently ignored and one session produced a run of rejected diagrams (incident 2026-04-30); it now lives in code. The --intent=<name> flag asserts that the matching intent file was read and its prompt template followed: the intent templates encode the technique, palette, composition rules and validation gate the bare model fails to honor, and a freeform prompt shipped straight to Generate.ts is refused.
The one exception: the user explicitly says "freeform" / "skip the intent" / "just run Generate.ts directly with this prompt: ...". Then pass --freeform-confirmed, which logs the explicit opt-out to stderr for audit. Without that instruction from the user, pick the matching intent and pass --intent=<name>.
If no intent matches the request, stop and surface it to the user before generating, proposing (a) the closest existing intent, (b) Visualize.md as the generic catch-all, or (c) a new intent created first through the CreateSkill skill.
Output staging
Every generated image, in every intent, is rendered first into a working directory outside Downloads (for example scratchpad/art/<slug>/, written $ART_DIR in the commands below) or the staging directory its intent names, never directly into Downloads or a project's public/images/ directory: images pushed straight to repos have failed several times. Once the image has passed the quality loop below and the verification under Tool contract, it is handed off with bun ~/.claude/skills/ArtDirection/Tools/Deliver.ts --artifact <file> --to ~/Downloads. A file is copied into a project (e.g., cms/public/images/) only after that hand-off, and the WebP and thumbnail versions are made from the staged file. Whether the principal approves before that move is the intent's rule: the Essay intent wires its picked winner into the site without handing back (principal directive, 2026-09-22), and an intent that says nothing waits for the principal's review.
Quality loop
Nothing this skill produces reaches the principal as a first draft (principal directive, 2026-09-17). The artifact goes through Skill("ArtDirection"): a direction council before new or large work, then the cross-vendor critique panel (skills/ArtDirection/Tools/Critique.ts) scores it against the rubric and names defects, then this skill iterates on those defects until the bar or reports the shortfall. For still images, one round is one command: Tools/EvalRound.ts runs the asserts, blind describer and meaning ladder, cross-vendor critique, and flipped tournament in parallel, picks the winner in code, and takes 2 minutes or less (contract: Tools/EvalRound.help.md). Hand-over is skills/ArtDirection/Tools/Deliver.ts, which refuses without a passing critique. Record the principal's verdict with skills/ArtDirection/Tools/Calibrate.ts.
Vendors
Generate.ts ships only the models listed under Tool contract. Removed model names (gpt-image-1, gpt-image-2, the dual-provider compare mode) exit with an error pointing at nano-banana-pro. Which image vendors this install allows is the principal's call, recorded in <configRoot>/LIFEOS/USER/CUSTOMIZATIONS/SKILLS/Art/PREFERENCES.md § Vendors; read it before changing a model path. Do not add a vendor as a substitute when a round fails: adding a new vendor to any lane requires the principal's explicit approval.
Tool contract
<IntentName> matches a file under Intents/ without .md. API keys are in <configRoot>/.env (~/.claude/.env by default; Generate.ts also checks ${LIFEOS_DIR}/.env first); Setup.md lists them.
The default model is nano-banana-pro unless PREFERENCES.md pins another; flux and nano-banana take an aspect ratio in --size, and the per-model sizes, the model-per-job table and reference-image use are in References/Models.md. A blog header adds --thumbnail; its command, transparency rules, verification and post wiring are in References/BlogHeaders.md.
Data & Config
User customizations live at <configRoot>/LIFEOS/USER/CUSTOMIZATIONS/SKILLS/Art/ (configRoot is $CLAUDE_CONFIG_DIR when set, else ~/.claude). When the directory exists, its files override the defaults here; when it does not, the skill defaults stand. First-time setup (accounts, keys, config, a proof it works) is in Setup.md.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingLifeOS/install/skills/Art/SKILL.md
Popularity
- Repository stars
- 19,063
- Repository forks
- 2,469
- 7-day trend score
- 49
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/danielmiessler/lifeos/art)