Agent skill

Pneuma Kami

by pandazki in pandazki/pneuma-skills

Paper-canvas web design. An agent skill from pandazki/pneuma-skills.

MITAuto-check passedFrontend & Design

Install Pneuma Kami

skills CLI
$ npx skills add pandazki/pneuma-skills --skill pneuma-kami -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install pandazki/pneuma-skills pneuma-kami --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/pandazki/pneuma-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/modes/kami/skill .claude/skills/pneuma-kami && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
pneuma-kami
GitHub stars
161
Token cost
~9.8k tokens
SKILL.md length
5,155 words
Files
8 (incl. references)
Skills in repo
30
Repo updated
First seen
Licence
MIT

At a glance

Paper-canvas web design. An agent skill from pandazki/pneuma-skills.

  • Works in 5 steps: Source and material pass → Layout note (plan before layout) → Create the content set → …
  • Typesetting a document as a physical sheet — resume
  • SKILL.md covers What this mode is, Working with the viewer, Aesthetic rules (kami adapted) and Working rules, plus 7 more sections
  • Calls curl and node; needs OPENROUTER_API_KEY

What it does

Pneuma Kami is an agent skill from pandazki/pneuma-skills. Paper-canvas web design. Edit HTML/CSS/JS; viewer renders your content as a single paper sheet at the size locked at workspace creation. Design language adapted from tw93/kami (MIT). Triggers on typesetting a document as a physical sheet — resume, one-pager, portfolio, white paper, letter, deck, report — in any language.

Its SKILL.md is about 9.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files (for example `references/anti-patterns.md`, `references/cmd-fit.md` and `references/deck-preflight.md`).

It sits in Frontend & Design, covering LaTeX and Report writing. The repository describes itself as: Co-creation infrastructure for humans and code agents — visual environment, skills, continuous learning, and distribution. The licence is MIT.

When your agent uses it

  • Typesetting a document as a physical sheet — resume
  • Report — in any language

Example prompts

  • “/pneuma-kami”

Requirements

  • Python 3

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Source and material pass
  2. Layout note (plan before layout)
  3. Create the content set
  4. Post-fill fact check
  5. Editorial passes (tables, then lines)

What it can do on your machine

Read from SKILL.md and the folder at commit 0023d3c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl
    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • OPENROUTER_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Pneuma Kami loads about 9.8k tokens when it runs, and up to ~48k if it reads all its reference files. Until then it costs about 84 tokens; SKILL.md has 5,155 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~84
When it runs · the whole SKILL.md, loaded when a task matches
~9.8k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~48k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from pandazki/pneuma-skills at commit 0023d3c, republished under its MIT licence (© pandazki). 5,155 words, ~9,810 tokens.

Download SKILL.mdSave it as .claude/skills/pneuma-kami/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.
name
pneuma-kami
description
Paper-canvas web design. Edit HTML/CSS/JS; viewer renders your content as a single paper sheet at the size locked at workspace creation. Design language adapted from tw93/kami (MIT). Triggers on typesetting a document as a physical sheet — resume, one-pager, portfolio, white paper, letter, deck, report — in any language.

Pneuma Kami Mode

Credit. This mode's design language, tokens, seed templates, and reference documents are adapted from tw93/kami under the MIT License. See ../NOTICE.md for full attribution.

What this mode is

Paper-canvas web design. The viewer renders your content as a single paper sheet. Size is {{paperSize}} {{orientation}} ({{pageWidthMm}} × {{pageHeightMm}} mm), locked at workspace creation in .pneuma/config.json. Do not change paper size — if the user wants a different size, they must create a new workspace.

You edit HTML / CSS / JS files inside each content set directly with the Edit and Write tools. The iframe preview reflects changes live.

Working with the viewer

The kami viewer renders the active HTML file as a single paper sheet at the locked paper size, inside an iframe with a paper-style chrome (page tabs along the bottom for multi-page documents, viewport presets, view / edit / select / annotate mode toggles, an Export menu). Everything below is how you (the agent) coordinate with that surface.

Reading what the user sees

Each user message may arrive wrapped in two channels — read them before acting:

  • <viewer-context> — the live preview state at send time. For kami this includes mode="kami", the active HTML file="..." (full workspace path, e.g. kaku-portfolio/page-3.html), and a page label like Viewing page 3/6: "Projects" derived from the content set's manifest.json. When the user clicks an element in the page, you also get Selected: <selector>, an Address: line (a machine-readable ViewerAddress you can paste straight into a capture call or a <viewer-locator> card), Element: <accessible name>, Tag: <h2>, Classes: ..., Context: <nearby text>, and Accessibility: .... In Annotate mode the block lists multiple annotated elements with the user's per-element Feedback: comment. Resolve deictic phrases like "this heading", "tighten this section", "the figure here" against these fields first.

    Example:

    <viewer-context mode="kami" file="kaku-portfolio/page-3.html" content-set="kaku-portfolio">
    Viewing page 3/6: "Projects"
    Selected: h2.section-title
      Address: {"contentSet":"kaku-portfolio","page":"page-3.html","selector":"h2.section-title"}
      Element: Projects
      Tag: <h2>
      Classes: section-title
      Context: Projects 2024 — selected work
    </viewer-context>
  • <user-actions> — discrete UI actions the user took since their last turn. Kami emits one kind: edit-text — inline text edits made directly inside the iframe in Edit mode (the user double-clicked a text node and rewrote it). The action's description includes the before → after diff per element, so treat it as a record of changes the user already committed; don't re-apply them.

    <user-actions>
      <action time="12s ago" id="edit-text">Edited text on "kaku-portfolio/page-3.html":
        <h2>: "项目" → "Projects"
        <p>: "2024 年精选" → "Selected work, 2024"</action>
    </user-actions>

    After an edit-text action, re-read .pneuma/kami-fit.json — text rewrites can flip a page's status from fits to overflow.

If neither block is present, the user has nothing specifically selected; default to the most recently edited file or ask.

ViewerAddress — naming an object in the preview

Kami has one vocabulary for "which object in the viewer". The same shape — a ViewerAddress — is what a <viewer-locator> card points at, what the capture action screenshots, and what a <viewer-context> selection reports back to you. Learn it once; it works across all three.

KeyHalfMeaning
contentSetcoarseTop-level directory acting as a switchable paper (e.g. kaku-portfolio, pneuma-one-pager).
pagecoarseHTML page path inside the content set (e.g. index.html, page-3.html). Alias file is accepted.
selectorfineA CSS selector resolved inside the rendered page (e.g. figure, h2.section-title).

Use only the keys you need: {"page":"page-3.html"} names a whole page; {"page":"page-3.html","selector":"figure"} names one region of it. When the user clicks an element, the Address: line in <viewer-context> hands you a ready-made ViewerAddress — copy that JSON straight back.

Locator cards

After creating or editing pages, embed <viewer-locator> cards in your reply so the user can jump straight to the result. The card's address attribute is a ViewerAddress — locators navigate the user to a page, so use the coarse keys (page):

html
<viewer-locator label="Open the cover" address='{"page":"index.html"}' />
<viewer-locator label="Jump to the Projects page" address='{"page":"page-3.html"}' />
<viewer-locator label="See the rewritten Methods page" address='{"file":"methods.html"}' />

One card per landmark you want the user to verify. Switching content sets (e.g. from pneuma-one-pager to kaku-portfolio) is driven by the viewer chrome, not the locator card — point the user there in prose if they need to switch sets.

Viewer actions

Kami exposes no agent-invocable viewer actions today. There is no scaffold, no navigate, no programmatic page-size or orientation change (paper size and orientation are locked at workspace creation in .pneuma/config.json; see "What this mode is"). To start a new document, create a new content-set directory with index.html + manifest.json directly using Write — see "When the user hands over raw content" below.

The base POST $PNEUMA_API/api/viewer/action endpoint exists for modes that declare actions; calling it for kami will not match any registered action.

Native bridge

Desktop APIs (clipboard, shell, notifications, …) are available at $PNEUMA_API/api/native/* when the session runs inside the Pneuma App. Discover what's actually wired up at runtime with GET $PNEUMA_API/api/native — web-only sessions report available: false for unsupported modules.

Verifying your work

The user is already watching a live preview of every edit you make — you do not need to prove the page renders.

Hard rule: do NOT open an external browser, the chrome-devtools MCP, headless Chrome, or browser-use tooling to verify your work.

Why: those tools render the raw HTML outside the kami viewer. Kami renders your content as a single paper sheet at the locked physical paper size — the paper chrome, the sheet dimensions, and the page-fit framing are all applied by the viewer. Open an HTML file directly and you see an unbounded web page, not a paper page. What an external browser shows is not what the user sees. The Pneuma viewer is the only faithful render.

When you genuinely need to see the rendered result for a "quality check → improve" loop, use the framework-level capture viewer action — it returns a PNG screenshot of the live viewer, exactly what the user sees:

bash
# Full viewer — omit params for a whole-sheet shot
curl -s -X POST "$PNEUMA_API/api/viewer/action" \
  -H 'Content-Type: application/json' \
  -d '{"actionId":"capture"}'

# A specific region — pass a ViewerAddress; `selector` resolves inside the rendered page
curl -s -X POST "$PNEUMA_API/api/viewer/action" \
  -H 'Content-Type: application/json' \
  -d '{"actionId":"capture","params":{"address":{"selector":"figure"}}}'

# A region on another page — coarse `page` navigates first, then `selector` resolves
curl -s -X POST "$PNEUMA_API/api/viewer/action" \
  -H 'Content-Type: application/json' \
  -d '{"actionId":"capture","params":{"address":{"page":"page-3.html","selector":"figure"}}}'

params.address is a ViewerAddress — omit it for a full-viewer shot. On success the response is {"success":true,"data":{"path":"<absolute .png path>","width":<n>,"height":<n>}}. Use your Read tool on that path to view the screenshot inline, then iterate. For fit issues, .pneuma/kami-fit.json stays the precise, machine-readable check — capture is for visual judgement.

Aesthetic rules (kami adapted)

ElementRule
Canvas#f5f4ed parchment. Never pure white.
AccentInk blue #1B365D only. No second chromatic hue.
NeutralsWarm-toned (yellow-brown undertone). No cool blue-grays.
SerifOne serif per page. CN: TsangerJinKai02. EN: Charter (system). JA: YuMincho (system). KO: Source Han Serif K → AppleMyungjo (system). Weight 400 body / 500 headings. Never bold.
Letter-spacingCN body 0.3pt (locks in TsangerJinKai02 density). EN body 0. Tracking only on small labels and overlines.
Line-heightTitles 1.1–1.3. Dense body 1.4–1.45. Reading body 1.5–1.55. Never 1.6+.
SurfacesFlat. Ivory fill is the only lift. No shadows on content (a whisper shadow only under a real floating screenshot), no gradients.
LinesA line must separate regions, encode state, or carry data. No eyebrow ticks, short cover rules, or side bars on headings, callouts, and quotes. Table rules are neutral --border hairlines.
TagsTwo tints, both tokens: --tag-bg #E4ECF5 default, --brand-tint #EEF2F7 to recede. Solid only — rgba() can break in print, and a third tint is drift.

--sans aliases --serif in _shared/styles.css; use one serif per page unless the design calls for an explicit mono code block. Match the user's language: CN content stays on the TsangerJinKai02 stack, EN on Charter, JA on YuMincho, KO on Source Han Serif K → AppleMyungjo. JA and KO are best-effort (the fonts are system-bundled, not shipped) — visually verify before shipping. In any stack, the CJK families lead and the Latin faces trail: a substituted CJK serif produces no missing-glyph boxes, so the page still reads and nobody notices it went heavy and flat.

Working rules

  • Edit HTML / CSS / JS files directly — the user sees every change live.
  • Do not edit _shared/styles.css tokens casually. Aesthetic drift compounds fast. Per-document overrides go in that document's own stylesheet.
  • The parchment canvas has exactly one sanctioned exception: the opt-in white-paper print recipe for documents headed to a home or office printer — references/design.md §6.
  • When importing raw content, create a new content set (see references/writing.md).
  • Do not modify .claude/ — it's runtime-managed.
  • Paper size and orientation are locked at workspace creation. A different size means a new workspace, not an edit.

Out of model here. Don't render slides through Python (WeasyPrint / python-pptx) or Marp — kami slides are HTML paper pages in the iframe. Don't build screen-first landing pages, their carousels, or their multilingual SEO companions; that is webcraft's job. Both exist upstream and neither survives the move to a single physical sheet.

Workspace layout

_shared/
  styles.css          # Tokens + paper dimensions. Don't edit casually.
  assets/fonts/       # Bundled fonts: TsangerJinKai02-W04.ttf, JetBrainsMono.woff2
  assets/diagrams/    # 18 self-contained SVG templates — copy the <svg>
                      # block out, drop it inside a <figure> on a page.
pneuma-one-pager/      # EN one-pager demo (Pneuma product brief)
kaku-portfolio/        # CN 6-page portfolio demo (from kami)
.pneuma/kami-fit.json  # Auto-written fit report — READ after every edit

Each content set has an index.html + manifest.json (+ a README.md for provenance). The user can switch between sets, or you can create new ones when they hand over raw content.

Doc types this mode handles

One design language across these document genres. Pick the genre from the user's intent before choosing a layout — the genre dictates length, page count, density, and which diagrams sit naturally inside.

User saysGenre
"one-pager / 方案 / 执行摘要 / exec summary"One-Pager
"white paper / 白皮书 / 长文 / 年度总结 / technical report"Long Doc
"formal letter / 信件 / 辞职信 / 推荐信 / memo"Letter
"portfolio / 作品集 / case studies"Portfolio
"resume / CV / 简历 / 履歴書"Resume
"slides / PPT / deck / 演示"Slides
"个股研报 / equity report / 估值分析 / investment memo / 股票分析"Equity Report
"更新日志 / changelog / release notes / 版本记录"Changelog

Seed demos cover three points on this spectrum (pneuma-one-pager/, kaku-portfolio/, nvda-equity-report/); the rest you build from scratch into a new content set.

Output format selection is driven by the viewer's Export menu (PDF / PNG); do not auto-trigger PDF/PNG generation from the agent side.

Which kind of task this is

Route on the state of the artifact, not on the words in the request. Four kinds, and only the first one runs the full flow below:

The requestKindWhat it commits you to
A new document, or a restructuring that changes what the pages areNew documentThe full flow: source pass, layout note, content set, post-fill check, editorial passes
Replacing text, translating, correcting a fact in an existing documentContent-onlyChange the copy. Leave CSS and layout alone unless the new copy proves a genuine fit defect
The user looks at the render and says something is wrong with how it looksVisual repairThe render is the brief. Name the target, name what must stay untouched, make the smallest fix — see «Vague feedback → concrete options»
A standalone generated illustration, cover, or redrawGenerated assetLock the semantic brief before any pixels; preserve what was already accepted across iterations — see «Image generation»

The two that go wrong quietly are content-only and visual repair, because both invite a tidy-up of everything nearby. Approved pages, settled content, and _shared/styles.css are outside the boundary in both.

When the user hands over raw content

This is the New document flow. It assumes you've already classified the doc type using the table above.

Step 1 · Source and material pass

Run this before distilling or filling when the document depends on facts or materials outside the user's draft. Skip it for personal drafts where the user already supplied everything.

Source check fires when the document names a specific company, product, person, release date, version, funding round, metric, market fact, or technical spec. Work from primary sources, keep a short note of source names and dates for the facts that drive the document, and ask the user when sources conflict rather than choosing silently. references/writing.md «5. Sources before phrasing» owns the detail, including which current-sounding claims ("latest", "recent", "new", version numbers, launch dates, financial figures) are banned until checked.

Material check fires when the subject is a company, product, project, venue, or personal brand. Confirm what makes it recognizable before layout:

NeedRequired whenAccept
LogoAny branded documentUser file or official SVG/PNG
Product imagePhysical product / venue / objectOfficial image, user image, or marked gap
UI screenshotApp / SaaS / website / toolCurrent screenshot, official product image, or user capture
Brand colorsBranded one-pager / portfolio / deckOfficial value, extracted asset value, or keep kami ink-blue
FontsOnly if brand typography mattersOfficial font, close system fallback, or kami default

A missing item gets a compact gap table and one question — never a generic stand-in, an approximated logo, or an invented value. references/writing.md «6. Materials serve recognition» carries the writing-side rules.

Materials status block. After the material check, output a structured status block before continuing. One-shot transparency display, not a question:

Materials status:
- Logo: OK assets/client-logo.svg
- Brand colors: OK #1B365D mapped to --brand
- Product screenshot: MISSING (proceeding with kami default placeholder)
- UI screenshot: not required for this doc type

Use OK, MISSING, or not required. If a required item is missing and no user input arrived, ask once with the gap table; otherwise continue silently.

Step 2 · Layout note (plan before layout)

Before creating the content set, write a short editor-style note stating the plan. It names six things, and the last one is the point: doc genre, page target (or length), narrative arc, embedded diagrams, material status, and the checks this document has to pass before you hand it back. Naming the acceptance bar before layout is what stops it being negotiated downward at the end. Match the user's language, keep it short enough to read in one glance, and continue immediately — this is transparency, not an approval gate.

Example (EN):

Layout intent: Equity Report (EN), two pages A4. Open with thesis and price target, run through valuation (DCF and comparables), close on catalysts and risks. A revenue line chart and an FY26 waterfall sit mid-doc. Logo is in hand; product image is absent, so the header stays text-only. Ships when both pages read fits and every number traces back to the filing.

Example (CN):

排版意图:Equity Report 中文版,2 页 A4。先立论与目标价,进入估值 (DCF 与可比公司),落于催化剂与风险。中段嵌一张营收趋势折线和 FY26 收入桥瀑 布。Logo 已就位,产品图暂缺,header 改走纯文字。交付标准:两页都 fits, 每个数字都能回溯到财报原文。

If the user pushes back, adjust; otherwise proceed to Step 3.

Step 3 · Create the content set
  1. Pick a short content-set name (e.g. acme-whitepaper/).
  2. Create the directory with an index.html that starts from the closest existing demo as a skeleton, a manifest.json, and a README.md.
  3. Extract every factual claim from the raw content; classify into sections that match the target doc type's structure.
  4. Gap-check: list what the layout needs but the content doesn't have. Share the gap table with the user before guessing.
Step 4 · Post-fill fact check

After the pages are filled, re-verify against the extraction from Step 3 that nothing was dropped or mutated on the way into HTML:

  • Every name, number, date, and metric from the source lands in the document verbatim — short atomic values are never rephrased, rounded, or "improved". Only prose longer than ~80 characters may be rewritten for flow.
  • Every image slot resolves: the referenced asset exists in the content set, or the gap is marked in the materials status block. Never ship a broken <img>.
  • Anything the source lacks stays marked [DATA NEEDED: description] — a gap is reported, never silently filled.

Fix a mismatch by fixing the page (or asking the user for the missing fact), not by relaxing the check.

Step 5 · Editorial passes (tables, then lines)

Table pass — whenever the document has a table. A kami table separates rows through alignment and breathing room first; rules are quiet guides.

  • One chromatic system: table text stays in the neutral ink hierarchy, every rule is var(--border). No category-colored values, brand-colored rules, per-column hues, tinted header, or vertical grid. Carry meaning with weight, signs, and labels.
  • Hairline hierarchy: header and total rules 0.6pt, body rules 0.25pt. If the line is noticed before the values, it is too heavy.
  • Padding floor: at least 6pt on headers and 5pt on cells. A resume or one-pager may step down once to 5pt / 4pt after the fit loop proves it must; .compact never goes below 3pt / 2.5pt, and is earned (5+ columns, 8+ body rows, or a verified fit constraint), not reflexive.
  • Striping is exceptional: start without .striped; add its neutral fill only when 8+ body rows still track poorly at normal viewing size.

Subtractive pass — before handing back. Remove every visual primitive that does not encode data, state, grouping, or a relationship: decorative eyebrow ticks, short cover or contact rules, side bars on headings / quotations / callouts, fake dash bullets. A callout needs only its fill, padding, and type; a quotation only indentation, olive text, and reading space; a section title only type scale and margin. Keep what does real work: table hairlines, chart axes, diagram connectors, full-width region separators, current-state indicators. The test is to hide the line: if meaning, grouping, and navigation survive, delete it and restore the pause with spacing, not with another ornament.

Both passes change geometry. Re-read .pneuma/kami-fit.json afterwards and look at the affected pages with a capture — a removed rule can collapse an intended pause or leave a neighbour visually unanchored.

Fit discipline — the kami authoring loop

Kami is a strict-page medium. The AUTHOR decides how many sheets a document spans by writing that many <div class="page"> blocks. Every page's content must be tuned to fit exactly one sheet — not overflow, not sit half-empty. This is kami's core discipline.

The viewer makes this loop machine-checkable: after every render, it writes a measurement report to .pneuma/kami-fit.json. Read it after every meaningful edit and iterate until every page reports status: "fits".

Report shape:

json
{
  "content_set": "musk-resume",
  "file": "index.html",
  "paper": { "size": "A4", "orientation": "Portrait", "height_mm": 297,
             "safe": { "top_mm": 18, "side_mm": 16, "bottom_mm": 18 } },
  "pages": [
    { "index": 1, "paper_height_mm": 297, "safe_height_mm": 261, "content_height_mm": 259.4, "delta_safe_mm": -1.6, "status": "fits" },
    { "index": 2, "paper_height_mm": 297, "safe_height_mm": 261, "content_height_mm": 284.5, "delta_safe_mm": 23.5, "status": "overflow" }
  ],
  "summary": { "total_pages": 2, "sparse_count": 0, "loose_count": 0, "fits_count": 1, "bleed_count": 0, "overflow_count": 1 }
}

delta_safe_mm is the rendered content height minus the safe height (paper height minus the top and bottom safe margins). Five statuses:

Statusdelta_safe_mmWhat to do
fitswithin ±3 mm of the safe heightStop. Move on.
loose3–30 mm shortFine on a body page; tighten or enrich only if the page reads thin.
sparsemore than 30 mm shortMerge with a neighbouring page first, or fold the page's one useful point into a neighbour. Expand only with verified specifics the source supports. Never add a callout, chart, or image just to occupy space.
bleedover, by up to the bottom safe marginPrints, but into the margin. Treat as overflow unless the page is a deliberate full-bleed cover.
overflowover by more than the bottom safe marginMust trim. Priority order: delete or merge content first — drop a bullet, tighten phrasing, remove a section, merge duplicated concepts. Never shrink font-size or line-height to force a fit; those are locked by the design system.

The loop (run it after every edit; don't wait for the user to point out overflow):

  1. Make a content edit.
  2. Read .pneuma/kami-fit.json.
  3. If overflow_count > 0, or bleed_count > 0 on any page that is not a deliberate full-bleed cover → trim the offending pages → loop to step 2.
  4. If sparse_count > 0 and content intent allows → merge or enrich → loop to step 2.
  5. When every page is fits — or loose on a body page you judged acceptable, or bleed only on a deliberate full-bleed cover — stop.

That acceptance bar across every page is what you reach before you tell the user the document is ready. Silence on your part implies the fit is passing. See references/cmd-fit.md for edge cases (sparse-on-purpose cover pages, multi-sheet sections, how to choose what to trim).

Show full SKILL.md (2,115 more words)Show less
Definition of done

A document task is done only when your closing message carries:

  1. Which content set (and pages) hold the deliverable — with <viewer-locator> cards to the landmarks.
  2. The fit verdict: every page reports fits in .pneuma/kami-fit.json (or the named, deliberate exceptions — cover, colophon).
  3. Every remaining [DATA NEEDED] gap, listed explicitly. Never declare done with an unreported gap.
  4. The visual verdict, stated honestly: fit geometry cannot see a fallback glyph, an arrow crossing a label, or a broken image. For a final deliverable, run a capture pass page by page and say what you checked; if you did not look, say "fit verified, visuals unconfirmed", not "done". One visual defect found means sweeping every page for that class of issue, not fixing the one spot.
  5. The plan from Step 2, answered item by item — genre, page target, arc, diagrams, and each check you named. A plan that quietly stops being mentioned at the end is a plan that was abandoned.

What does not count as a pass. Every clause above is about evidence you actually have, and three near-misses look like evidence but aren't:

  • A page with no content on it is not a page. An empty or near-empty <div class="page">, a section whose body never got filled, a figure slot with nothing in it — none of these ship, and none of them count toward a page target. Delete the block or fill it; a page target met by blank sheets is not met.
  • Hidden or unresolvable content does not satisfy a requirement. Text sized to zero, content behind display: none, an <img> pointing at a file that isn't in the content set, a remote URL standing in for a local asset — the requirement is still open. Say so.
  • "I did not look" is a verdict, and it is the honest one. Never report a check you did not run, and never let a check you skipped ride along inside a sentence about the checks you did run.
Per-page density target (multi-page docs only)

Long-doc / portfolio / slides / equity-report / changelog carry a 60–80% body-page fill target — a guard against drafts that fragment content too thin to fill the sheets they occupy. Resume / one-pager / letter are exempt; they have their own length contracts, and so do cover, contents, and sign-off pages.

kami-fit.json's sparse status already flags the worst cases. For the borderline page, references/cmd-fit.md «Per-genre density floors» carries the items-per-page contract, the merge order, and the last-page exemption. Read it when a page is borderline, not before.

Image generation (only when the user has configured a key)

A script lives at {SKILL_PATH}/scripts/generate_image.mjs. Default model is gpt-image-2.5-sunburst (OpenRouter) — the right choice for kami because it renders legible typography inside images: figure captions, diagram labels, mock book spines, imagined postage stamps, rendered monograms. Reference-image edits automatically use gpt-image-2.5-flare. Both models require OPENROUTER_API_KEY.

Images here live on a printed paper page. That constraint is absolute and distinguishes kami from every other Pneuma mode. The images can't look like they escaped from a SaaS landing page.

The kami image slop test

Before you call the generator, picture where the image will sit — next to warm parchment, serif body at weight 500, ink-blue accents, generous margins. If the honest answer to "does this image look like it belongs in a printed book" is no, rewrite the prompt.

Reject on sight:

  • Saturated HDR colors, glossy 3D renders, neon / cyan highlights, space backgrounds, data-orb / "AI hero" aesthetics
  • Purple-to-blue or cyan-on-dark gradients (kami has exactly one accent — ink blue — and no gradients, period)
  • Drop shadows inside the image. The paper frame provides its own whisper ring-shadow; another shadow stacked on top is noise.
  • AI-rendered people with waxy symmetrical faces
  • Generic stock photography: boardroom handshakes, laptop-on-desk flat lays, "team standing in a circle"
  • Tech-sticker aesthetics: chunky rounded rectangles with tiny icons, gradient backgrounds, retro-wave grids

Lean toward:

  • Documentary / editorial photography — muted warm neutrals, diffuse natural light, analog film grain, print magazine composition
  • Risograph / woodcut / letterpress illustration — limited palette, visible mark-making, handmade quality
  • Duotone / warm monochrome portraits — ink blue + bone, or sepia + parchment; never full-color high-saturation headshots
  • Technical drawings & schematics — thin ink lines on parchment, annotated with serif labels, in the spirit of 19th-century engineering manuals
  • Mock objects on paper ground — a rendered museum label, a ticket stub, a book spine — imagined as if sitting on the page itself
Prompt discipline

Bake these ingredients into every prompt so the result harmonizes with the page it will land on:

  1. Palette anchor — include phrases like "warm parchment background tone (bone / off-white / #f5f4ed range), single ink-blue accent, no other chromatic hues, muted warm neutrals throughout".
  2. Weight & tone — "editorial restraint, print publication quality, not SaaS landing page".
  3. Medium — pick one and commit (documentary photo / Risograph / woodcut / technical ink drawing / pressed botanical / museum archive).
  4. Composition — "generous negative space, off-center or rule-of- thirds, small subject on wide ground" — paper pages breathe.
  5. No-fly zone (explicit) — "no gradients, no drop shadows on the subject, no glossy highlights, no neon". Models are suggestible; say it out loud.

Two worked examples:

Portrait for a resume page, A4 Portrait layout: "A head-and-shoulders duotone portrait of a woman in her thirties, three-quarter profile, natural diffuse window light, printed as ink blue (#1B365D) duotone against a warm bone #f5f4ed ground, slight analog film grain, editorial restraint, generous negative space around the subject, no full-color, no drop shadow, no gradient — a magazine page portrait, not a LinkedIn avatar."

Inline diagram for a whitepaper section: "A simple hand-drawn ink schematic of a four-node circular buffer, labeled nodes reading 'head', 'read', 'write', 'tail' in thin serif typography, thin ink-blue (#1B365D) lines on a warm parchment ground (#f5f4ed), generous whitespace around the diagram, visible hatched shading and hand-set labels, the feel of a 19th-century engineering manual — no gradients, no digital glow, no drop shadow."

How to call it
bash
cd {SKILL_PATH} && node scripts/generate_image.mjs \
  "Your kami-aligned prompt here" \
  --aspect-ratio 4:3 \
  --quality high \
  --output-format png \
  --output-dir <workspace>/<content-set>/assets \
  --filename-prefix figure-01

Flag guidance in paper terms:

FlagKami guidance
--aspect-ratio4:3 or 3:2 for figures inline with body text; 1:1 for portraits and spot illustrations; 3:4 for vertical portraits set beside body text; 16:9 only for landscape-paper covers. Avoid 21:9 — it rarely sits well on a page.
--qualityhigh. Kami is a printed-page medium; no reason to ship draft-quality to final.
--output-formatpng for illustrations / diagrams / monochrome portraits (preserves clean edges and text); jpeg only for full-color photography.
--output-dirAlways the active content set's assets/ directory. Don't dump into _shared/assets/ — that's the upstream-sourced font & diagram folder.
--filename-prefixRole + index: portrait-founder, figure-02-buffer, stamp-motif.
--image-urls <source>Reference-image edits automatically use gpt-image-2.5-flare; text-only generation uses Sunburst.
After generating
  1. Embed inside a <div class="page"> with appropriate framing. Keep captions in small serif below the image if it's a figure.
  2. Match the figure's real paper width in CSS — don't let an image bleed past the page's safe margins. The page's safe zone is {{pageWidthMm - safeSideMm*2}} × {{pageHeightMm - safeTopMm - safeBottomMm}} mm.
  3. If the image has its own visible background, prefer PNG with a transparent or #f5f4ed-matched background so it blends into the paper. No extra box around it — the page is the frame.
  4. Re-read .pneuma/kami-fit.json. An image adds height; a page that used to fit can flip to overflow after the embed. Loop the fit discipline until every page reads fits again.
Consistency across figures

When a document needs multiple images (a multi-page portfolio, a whitepaper with several diagrams), record the first prompt's style descriptors and reuse them verbatim on every subsequent prompt. Kami documents read as one voice across every sheet; the imagery must too.

When a deliverable needs several generated images, drive them through a single handoff note (a scratch file in the content set works): one line per image — slot, aspect ratio, shared style anchor, prompt, status. Generate in batches of at most 5, update the status column after each batch, and check existing output before regenerating. The style anchor is shared by the whole batch; per-image style drift is the failure mode.

For diagram-shaped illustrations (a figure that needs more detail than hand-assembled SVG holds at the target width), write the brief per references/diagrams.md «Illustration briefs» and run its QC checklist before placing the result.

Vague feedback → concrete options

When the user gives visual feedback ("looks off", "太挤了", "not elegant"), look before you ask. The render is the evidence; their negative label is only the signal that something is wrong. You already have the render — a capture of the page they are looking at costs one call.

  1. Name the defect in one sentence: which page, and whether the problem is density, hierarchy, alignment, type, colour, cropping, or text fit.
  2. Lock the boundary. State what you will change and, explicitly, what stays untouched — the neighbouring pages, the approved content, and _shared/styles.css. Ask only when two plausible targets would produce materially different documents.
  3. Make the smallest change that fixes the named defect. Never hide a content problem by shrinking type: the typography is locked, and a page that only fits at a smaller size has too much on it.
  4. Verify the whole blast radius, not the one spot: the target page, its neighbours, the total page count, and — whenever the change touched a shared class or token — every other page that class reaches. Then re-read .pneuma/kami-fit.json.

If no render exists and the feedback still leaves two materially different fixes, ask once by naming the current property and offering two in-spec alternatives: "X is currently Y. Would you like (a) … or (b) …?" Never say "I'll adjust the spacing" without naming the exact property and its new value.

Escalate after two rounds. If the same element is still not approved after two adjustment rounds, stop nudging values: build one comparison page instead — the current state plus 2-3 labeled variants (A/B/C) of the same content in the document's actual page and background, keeping the neighbouring components and changing only the compared property — and let the user pick in the live preview. For choices with no objective criterion (typeface feel, accent usage, cover motif), skip the nudging entirely and start with a specimen page: up to 5 candidates, each a labeled half-page block of identical title-plus-paragraph content. One round of "pick one" converges where five rounds of "try again" do not; after the pick, apply it everywhere in the same round.

Diagrams (18 self-contained templates)

Eighteen types ship in _shared/assets/diagrams/. Pick the closest match, copy the <svg> block out, and drop it inside a <figure> on the page — inline, never linked through an <iframe>, so it paginates with the text around it. references/diagrams.md §1 «Selection» maps every type to what it shows and §7 lists the AI-slop patterns; read it once before drawing.

Before drawing at all, ask: would a well-written paragraph teach the reader less than this diagram? If no, don't draw.

Three routes inside that reference, by trigger:

TriggerSection
Full-system panorama, control plane, roadmap, or owner map in one artifact«Architecture boards». Give it its own page or content set; do not inflate the single architecture figure past its node budget.
Updating a diagram someone drew earlier — a redraw, or one living in a content set across sessions«Maintained diagrams». Evidence pass first (intent note, current source, a capture of the render, then the facts that define objects and boundaries), maturity encoded, never redrawn from memory.
A raster illustration that needs more detail than hand-assembled SVG holds«Illustration briefs», plus «Image generation» below.

Auto-select charts from data. When the page carries numbers, pick the chart type yourself and embed it without waiting to be asked; diagrams.md §1 owns the mapping. Two house calls differ from the common default: a ~100% share is a donut only up to 6 items and a horizontal bar at 7 or more; and a single time series whose absolute count changes dominate (not rate) is bars, not a line. When several types fit, prefer the one that shows variance most clearly. Always embed inside a <figure> whose caption states the insight, not the data range.

References (read on demand)

Load only what the task needs. Default to the lowest tier.

WhenRead
Updating text / translating / swapping bulletsNothing — just edit, then check kami-fit.json
A page shows overflow or sparsereferences/cmd-fit.md — trimming + merge tactics
Adjusting layout or tweaking spacingLook at the closest existing demo
Building a new doc type from scratchreferences/design.md
Writing tone / structure guidancereferences/writing.md
Embedding a diagramreferences/diagrams.md
Architecture board / maintained diagramreferences/diagrams.md §3-4 — board skeleton, evidence pass, maturity encoding
Drafting a deckreferences/deck-preflight.md — the pre-flight checklist (ask only what is open and material), then the slide content rules
Building or editing a resumereferences/resume-writing.md — bullet structure, source-and-truth pass, ownership calibration, two-page balance, recruiter pass
Document headed to a home/office printerreferences/design.md §6 — the opt-in white-paper recipe
Quality pass before handing backreferences/anti-patterns.md — the AI-document failure checklist

© pandazki, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 7 other files (references) in modes/kami/skill of pandazki/pneuma-skills.

  • SKILL.md
  • references/anti-patterns.md
  • references/cmd-fit.md
  • references/deck-preflight.md
  • references/design.md
  • references/diagrams.md
  • references/resume-writing.md
  • references/writing.md

Open the folder on GitHubat commit 0023d3c

Compare with similar skills

Pneuma Kami next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Pneuma Kami compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Pneuma Kami this skillpandazki/pneuma-skills161—~9.8kAutomated safety check: PassMIT
NSFC Budget Justification Writerhuangwb8/ChineseResearchLaTeX2.9k1 repos~1.4kAutomated safety check: PassMIT
Math Modeling Paper Verifierjihe520/MathModelAgent6.2k—~1.4kAutomated safety check: NotesNone
AutoMCM-Pro for Codex CLIRealSeaberry/AutoMCM-Pro257—~1.6kAutomated safety check: PassMIT
Math Modeling Workflow Starterjihe520/MathModelAgent6.2k—~918Automated safety check: NotesNone
Market Research Reportsdavila7/claude-code-templates33k9 repos~7.2kAutomated safety check: NotesMIT

Similar skills

  • NSFC Budget Justification Writer

    huangwb8/ChineseResearchLaTeX

    Writes a submission-ready NSFC budget justification as a LaTeX project and renders budget.pdf from your grant proposal text and supporting materials.

    2.9k GitHub starsUsed in 1 repo~1.4k tokens
    Research & ScienceAuto-check passed
  • Math Modeling Paper Verifier

    jihe520/MathModelAgent

    Runs the final verification pass on a math-modeling competition paper written in Typst or LaTeX, checking structure, figures, numbers, leaks and compilation.

    6.2k GitHub stars~1.4k tokensUpdated 8 days ago
    Documents & OfficeAuto-check: notes
  • AutoMCM-Pro for Codex CLI

    RealSeaberry/AutoMCM-Pro

    Runs a math modeling contest pipeline for CUMCM and MCM/ICM entries in Codex CLI, with git checkpoints, verified solver code and human review at each stage.

    257 GitHub stars~1.6k tokensUpdated 1 mo ago
    Data & AnalyticsAuto-check passed
  • Math Modeling Workflow Starter

    jihe520/MathModelAgent

    Entry point for a math modeling competition project: asks about preferences, writes plan.md and todo.md, then calls stage skills for analysis, code, diagrams, paper and verification.

    6.2k GitHub stars~918 tokensUpdated 8 days ago
    Data & AnalyticsAuto-check: notes
  • Market Research Reports

    davila7/claude-code-templates

    Generate comprehensive market research reports (50+ pages) in the style of top consulting firms (McKinsey, BCG, Gartner).

    33k GitHub starsUsed in 9 repos~7.2k tokens
    Documents & OfficeAuto-check: notes
  • Math Modeling Paper Writer

    jihe520/MathModelAgent

    Writes up a math modeling competition paper in Typst or LaTeX, choosing the contest template and placing each figure in the section that uses it.

    6.2k GitHub stars~2.1k tokensUpdated 8 days ago
    Documents & OfficeAuto-check: notes

More from pandazki/pneuma-skills

All 30 skills in this repo
  • Pneuma Bansho

    pandazki/pneuma-skills

    Explain something by writing it on a board. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~6.9k tokensUpdated 2 days ago
    Auto-check passed
  • Pneuma Clipcraft

    pandazki/pneuma-skills

    AI-orchestrated video production on @pneuma-craft. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~7.5k tokensUpdated 2 days ago
    Auto-check: notes
  • Pneuma Lucid

    pandazki/pneuma-skills

    Pneuma Lucid Mode workspace guidelines. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~4.6k tokensUpdated 2 days ago
    Auto-check: warnings
  • Pneuma Plotwise

    pandazki/pneuma-skills

    Pneuma Plotwise workspace guidelines. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~8.9k tokensUpdated 2 days ago
    Auto-check passed
  • Pneuma Sprite

    pandazki/pneuma-skills

    Pneuma Sprite Mode workspace guidelines. An agent skill from pandazki/pneuma-skills.

    161 GitHub stars~16k tokensUpdated 2 days ago
    Auto-check passed
  • Pneuma Webcraft

    pandazki/pneuma-skills

    Pneuma WebCraft Mode workspace guidelines with Impeccable.style design intelligence.

    161 GitHub stars~7.5k tokensUpdated 2 days ago
    Auto-check: notes

Questions about Pneuma Kami

What does Pneuma Kami do?

Paper-canvas web design. An agent skill from pandazki/pneuma-skills. Pneuma Kami is an agent skill from pandazki/pneuma-skills. Paper-canvas web design.

When should I use Pneuma Kami?

Pneuma Kami fits situations like: typesetting a document as a physical sheet — resume; report — in any language.

How do I install Pneuma Kami in Claude Code?

Run `npx skills add pandazki/pneuma-skills --skill pneuma-kami -a claude-code`. Or copy the skill folder (modes/kami/skill in pandazki/pneuma-skills) into .claude/skills/pneuma-kami in your project. Claude Code loads it when a task matches its description.

How do I install Pneuma Kami in Codex?

Run `npx skills add pandazki/pneuma-skills --skill pneuma-kami -a codex`. Or copy the skill folder (modes/kami/skill in pandazki/pneuma-skills) into .agents/skills/pneuma-kami in your project. Codex loads it when a task matches its description.

Can I use Pneuma Kami in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add pandazki/pneuma-skills --skill pneuma-kami -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pneuma-kami, .gemini/skills/pneuma-kami, .github/skills/pneuma-kami and .opencode/skills/pneuma-kami in your project.

What does Pneuma Kami need to run?

Going by SKILL.md and its folder, Pneuma Kami needs the command-line tools its instructions call (curl and node) and credentials named OPENROUTER_API_KEY. Our summary lists: Python 3.

Does Pneuma Kami access the network?

SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.

Is Pneuma Kami safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Pneuma Kami use?

Pneuma Kami is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Pneuma Kami use?

About 9.8k tokens (SKILL.md is roughly 39k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 38k tokens, read only when the agent opens those files.

What are the alternatives to Pneuma Kami?

Skills that share tags, products or a category with Pneuma Kami: NSFC Budget Justification Writer (huangwb8/ChineseResearchLaTeX, 2.9k stars), Math Modeling Paper Verifier (jihe520/MathModelAgent, 6.2k stars), AutoMCM-Pro for Codex CLI (RealSeaberry/AutoMCM-Pro, 257 stars) and Math Modeling Workflow Starter (jihe520/MathModelAgent, 6.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Pneuma Kami?

pandazki (a GitHub user) maintains it in pandazki/pneuma-skills, which has 161 GitHub stars. The repository holds 30 skills in this directory. The repository was last updated on October 9, 2026.

Source: pandazki/pneuma-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.