# Wiremark

> Read and write wiremark, the text-based wireframe DSL rendered from fenced wireframe code blocks and .wiremark files. Use when creating, editing, or interpreting wireframes, screen sketches, screen flows, or low-fidelity UI mockups in markdown documents.

- Skill: `blackburn-labs/wiremark` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add blackburn-labs/wiremark`
- Raw SKILL.md: https://api.skillmd.com/api/skills/blackburn-labs/wiremark/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: Blackburn-Labs (https://skillmd.com/u/blackburn-labs)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/blackburn-labs/wiremark

---


# wiremark

wiremark is a plain-text wireframe format: an indented outline of component
names that renders to a hand-drawn SVG sketch. Source lives in a fenced code
block tagged `wireframe` (or a standalone `.wiremark` file).

```wireframe
Wireframe #login mobile
  Stack column gap=2
    Typography h4 "Sign in"
    TextField "Email" type=email
    TextField "Password" type=password
    Button "Sign in" contained to=#dashboard
```

Before using a component not shown above, check `reference.md` in this skill
folder -- it lists every component with its props, enum values, and defaults.
Do not invent components.

## Rules

- Every line is `Component [keyless-value | key=value]*`. Components are
  PascalCase names (`Stack`, `Card`, `TextField`, `AppBar`, ...). Many feel
  familiar from UI libraries, but the vocabulary is wiremark's own -- never
  guess a name; check `reference.md`.
- Indentation is containment: a line indented under another is its child. Two
  spaces per level, never tabs. Only components marked `[c]` in `reference.md`
  take children -- children under a leaf are dropped *silently*.
- Quoted = drawn text, and quoting it is mandatory (`TextField "Email"`, never
  `TextField Email`). Bare = setting: enum value (`outlined`), boolean flag
  (`checked`), sizing token, number, or icon name. Never quote a setting:
  `variant="outlined"` and `gap="2"` are hard errors. No bare text lines --
  wrap text in its owner (`Typography "..."`).
- Keyless values resolve by type/value alone, in any order:
  `TextField "Email" outlined` == `TextField label="Email" variant=outlined`.
- Sizing is `width height`, in that order, bare tokens only (no `width=` key),
  on components marked `[w h]`: `240px` (pixels), `30%`, `*` (fill), bare
  number (flex weight). `Box 240px *` is a fixed-width, full-height rail.
  Omit for natural content size.
- Defaults do the work: bare `Img` draws a placeholder image, bare `Button`
  reads "Button". For placeholder text give a filler amount token on a
  component marked `[~]`: `~3` (sentences/lines), `~5w` (words), `~2l`
  (lines), or `_`/`__`/`___`. Filler style: `filler=squiggle|lorem|blocks` on
  the `Wireframe` root.
- Comments are `//` to end of line.
- Frames: `Wireframe #id mobile|landscape|portrait` (or both `w=` and `h=`),
  one or more per document. `visible=false` hides a shared-shell frame;
  `background=#shell` composes it underneath another frame; `Anchor #region`
  + `anchor=#region` places foreground content inside the shell (drop the
  preset when using `anchor=`); `direction=TD|LR` orients multi-frame flow.
- Every element accepts `to=#frame-id`, making it a link; the navigation graph
  is inferred from those links (frames only, no deep links). Multiple visible
  frames render as a flow chart automatically.
- Icon props take Material icon names, forgivingly spelled (`Icon Search`,
  `Button "Save" startIcon=Check`); unknown names degrade to a placeholder.
- Hard errors (must fix): tabs, unquoted text, quoted enum/number, unknown
  component/prop, bad enum value. Soft warnings (still renders): missing
  background/anchor target, unknown icon. Silent (check yourself): a `to=`
  link to a nonexistent frame, children nested under a leaf component.
- Out of scope: styling (`style=`/`sx=`/colors), breakpoints, x/y coordinates.

## Gotchas

Button variants are `text|outlined|contained` (use `contained` for a primary
action, never `primary`); Typography body variants are `body1`/`body2` (not
`body`); checkboxes/switches are `Control checkbox` / `Control switch`
(+ `checked`); companion components you may know from UI libraries do not
exist (no `DialogTitle`/`DialogContent`, `IconButton`, `Menu`, `Container`,
`Paper`, `ListItemText` -- nest content directly, use a bare `Icon`, quote
the `ListItem` label).

## Checking your work

After writing or editing a wireframe, validate it: save the source as
`x.wiremark` and run `npx @wiremark/cli x.wiremark -o x.svg` (Node 18+). Hard
errors exit non-zero with a line number; warnings print to stderr while the
SVG is still written. Dead `to=` links and children under leaf components are
silent -- re-read those yourself.

Further reading: <https://docs.wiremark.dev> (human docs),
<https://docs.wiremark.dev/reference/icons> (icon gallery).

