danielmiessler/lifeos/art

Claude Code and agent skill by danielmiessler/lifeos

Trust tier 3
  • community
Source check pending

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/art

SKILL.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.md sets, 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, file reports 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.png and 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

IntentTriggerFile
EssayBlog header or editorial essay illustrationIntents/Essay.md
AnimatedEssayAnimate a finished Essay still as a looping GIF (rare: at most 3 per deck; Tools/AnimatedEssay.ts, no Generate.ts)Intents/AnimatedEssay.md
RemoveBackgroundBackground removal onlyIntents/RemoveBackground.md
LogoWallpaperbrand-logo wallpaper with logo integrationIntents/LogoWallpaper.md
EmbossedLogoWallpaperEmbossed logo wallpaperIntents/EmbossedLogoWallpaper.md
D3DashboardsD3.js interactive chart or dashboardIntents/D3Dashboards.md
VisualizeGeneric visualization (none of the other intents fit)Intents/Visualize.md
MermaidMermaid flowchart or sequence diagramIntents/Mermaid.md
TechnicalDiagramsTechnical or architecture diagram, static or animated GIF (animated: § Animated Option, Tools/AnimatedDiagram.ts, no Generate.ts)Intents/TechnicalDiagrams.md
LifeOSHeroLifeOS philosophy card hero (One Block series: one cube changed by one move, transparent cut-out, card accent)Intents/LifeOSHero.md
TaxonomiesTaxonomy, hierarchy or classification gridIntents/Taxonomies.md
TimelinesTimeline or chronological progressionIntents/Timelines.md
FrameworksFramework, 2x2 or matrixIntents/Frameworks.md
ComparisonsComparison or X vs YIntents/Comparisons.md
AnnotatedScreenshotsAnnotated screenshotIntents/AnnotatedScreenshots.md
RecipeCardsRecipe card or step-by-stepIntents/RecipeCards.md
AphorismsAphorism or quote cardIntents/Aphorisms.md
MapsMap, conceptual map or territoryIntents/Maps.md
StatsStat card or big number visualIntents/Stats.md
ComicsComic or sequential panelsIntents/Comics.md
SalesVisualSquare 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).

FileRead when
EvalState.mdchecking the latest scores of the Art eval suites (machine-written by skills/Assay/Tools/EvalState.ts)
References/Models.mdchanging model or --size, passing --reference-image (includes the reference-edit gotcha), or mapping an Essay request's words to flags
References/BlogHeaders.mdmaking, 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.mdan Essay run designing composition.md: problem types, emotional registers and warm:cool ratios, and worked Opposite-Concept iconography tables
References/EssayRounds.mdreading 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.mdfirst-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

bash
bun ~/.claude/skills/Art/Tools/Generate.ts \
--intent=<IntentName> \
--model nano-banana-pro \
--prompt "..." \
--size 2K \
--aspect-ratio 16:9 \
--output "$ART_DIR"/<filename>.png

<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

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
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/danielmiessler/lifeos/art/badge)](https://verified-skill.com/skills/danielmiessler/lifeos/art)

Something wrong with this skill or its page? Tell us.