npx skills add ...
npx skills add bradfrost/skills --skill ds-ascii
Render UI wireframes as labeled ASCII art where every region maps to a real component in YOUR design system. Use when someone asks for an ASCII prototype, a text wireframe, a monospace mockup, or wants to sketch a page layout inside a chat, PR, issue, or Slack thread without opening a design tool. Triggers include "make me an ASCII prototype of…", "wireframe this as text", "sketch a homepage for…", "mock this up in ASCII", "show me this page as ASCII". Builds a one-time profile of the design system's component vocabulary, then renders against it. Typography hierarchy is drawn, not described.
npx skills add bradfrost/skills --skill ds-ascii
Turn a plain-language brief into a monospace wireframe where every region is a labeled component from your own design system, and the type hierarchy is visible rather than described.
It's a real spec you can read anywhere text goes: a chat, a PR description, a code comment, a Slack thread. No rendering pipeline, no context switch, and because the constraint is a monospace grid, it forces the ruthless boxes-and-arrows thinking that good wireframing wants anyway.
The part that makes it more than doodling is that every region maps to a component that actually exists in your system, with its real name. That turns a picture into something a designer or a developer can build from.
GRAMMAR.md — how to draw. The frame, the border weights, the
shading ramp, the type ramp, the button ranks. Universal, and it never
names a component.ARCHETYPES.md — what to draw. Fourteen shapes: page shell, header,
hero, section, grid, card, button, field, form, table, list, media,
overlay, footer. Also universal.ds-ascii/PROFILE.md — what your team calls it. The binding table
from archetype to real component name, built once by
intake/PROFILE-INTAKE.md and kept in the user's project.Archetypes are stable across design systems. Component names never are. That split is the whole design: every system has a card, and no two agree on what its zones are called.
ds-ascii/PROFILE.md if it exists and confirm
it's current ("this profile was verified on , still good?"). If
there's no profile, run intake/PROFILE-INTAKE.md first. It takes a
couple of minutes and everything after it is faster.tools/build_example.py so
widths are exact by construction. Hand-counting is where renders break.DEVIATIONS note if you had to bend the grammar.Run intake/PROFILE-INTAKE.md. Also the right move when a render produced a
name someone couldn't find, or when the system shipped a major version.
Same brief, different profile. Useful for comparing what two systems make
easy, and it's how the proof gate in examples/ works.
<unmapped: hero> in the
legend. Most component libraries ship nothing for page layout, so this
comes up constantly and it is not a failure. A render that says so is
telling you something true about your system.[verified]; one a human told you is [reported]. If a render leans on
[reported] bindings, say so under the legend.GRAMMAR.md — the universal rendering grammarARCHETYPES.md — the fourteen shapes and their binding questionsintake/PROFILE-INTAKE.md — the evidence chain that builds a profileprofiles/PROFILE-FORMAT.md — the profile file formatprofiles/material-web.md, profiles/eddie.md — two real, verified
profiles, deliberately oppositereference/CAPABILITIES.md — what this skill can and cannot doreference/FIGMA-ACCESS.md — reaching a design library, and what each
bridge actually seesexamples/ — the same brief rendered against both profilestools/build_example.py — the padding helperIf you can write files, keep the profile there. If you can't, produce it as a message the user can save and paste back next time.