Skip to content
Back to skills

Visualize

ASecurity

Draws ASCII diagrams, screen mockups and HTML previews, in a message or inside a document.

  • 30 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 19, 2026
toolsgoreactaws

Works with

  • terminal

Security analysis

A100/100

Pro scans all 9 files and shows the line behind each finding

Scanned October 3, 2026

npx -y skills add Adrian333Dev/flow --skill visualize --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Visualize?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Visualize
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/adrian333dev-visualize/badge)](https://www.skillsdirectory.com/skills/adrian333dev-visualize)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: visualize
description: Draws ASCII diagrams, screen mockups and HTML previews, in a message or inside a document.
---

# Visualize

Pick the medium, pick the method, then draw it.

## Pick the medium: prose, a list, ASCII, or HTML

Decide this **before** drawing anything.

- **Prose**: a rule, a reason, a sequence of events. The default, and what an ordinary answer uses.
- **A list**: several items with the same shape and role, compared.
- **ASCII**: structure, ownership, flow, containment.
- **ASCII frame**: layout and proportion of a real screen → `references/draw-mockups.md`.
- **HTML preview**: colour, shade, density, elevation, type weight, spacing feel → `references/draw-mockups.md`.

**ASCII first, especially for layout.** Settle structure in a frame, then dress it in colour.

**Reach for HTML only where ASCII genuinely cannot carry the component.**

**Name what the artifact leaves out**: "This frame is structure only: the palette is a separate step."

## How to draw it

3 methods, in order of preference.

- **Typed directly: 1–2k tokens.** The default, and correct for anything with few moving parts.
- **A generator, row by row: 2–3k tokens per round.** Build each output row as one string, then join. Right when every row is an independent horizontal slice, which a page mockup is.
- **A generator, on a canvas.** Allocate the whole picture as a grid of blank cells, then draw shapes by coordinate. Right when elements span many rows: a long connector, a tall container, anything nested. `scripts/canvas.js` carries the grid, the container convention and every check below.

Reach for a generator when the artifact is obviously complex, or when the typed attempt came out wrong. A dense mockup takes several rounds.

**Every generator checks itself before it prints:**

- **Every write lands on the grid.** A coordinate past the edge fails.
- **Collision on write**: refuse to overwrite an occupied cell with a different character, with an explicit allowance where one element is meant to sit in front.
- **A label fits the line it sits in**, checked before centring it into a connector or a box.
- **Equal row length**, wherever a row-by-row generator builds a frame.

## Diagram rules: every diagram, including invented ones

- **Prose first.** Draw only when structure genuinely beats text.
- **No SVG, no mermaid, no HTML for structure.**
- **One idea per diagram.** Needing a legend means 2 ideas: split into an overview carrying the backbone and a small frame per detail.
- **Split wherever a connector outruns one screen.**
- **Spacious.** Few boxes (~5–6 per idea), a blank line inside boxes between title and content.
- **Everything defined above it.** No element appears that the prose didn't already define.
- **Plain labels.** No internal codes. Label arrows with what actually flows: `play()`, "plain text".
- **The 5-second test.** The one idea lands near-instantly, or the diagram failed. Simplify or split.
- **Never draw a sequence diagram**, in any medium: lifelines down the page with arrows between them. Draw the exchange as a vertical flow instead, one box per step with the actor named inside it.
- **Dynamics go in prose.** Interactions and message flows are short prose steps. When the *direction* of flow is itself the idea, a layered stack with labeled directional arrows carries it.

## ASCII mechanics

### Characters

3 tiers, each set by drawing the character and looking at it.

**Exact, safe anywhere:**

- Box drawing: `─ │ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼`
- Arrowheads and markers: `▲ ▼ ► ◄ ▸ ▾ ● ■ ▪ ▌ ·`
- Rules and walls: `━ ¦ ‖ ╏ ╌`
- Punctuation: `… → —`

**Slightly over one cell: `◆ ◇ ☰ ❚ ⇆ ↻ ◁ ▷`. One per row at most, never several in a row, never in a border.**

**Broken: `▶ ◀ ∣ ❘ ❙ ⏸ ⏵`.** Use `►` and `◄` in place of `▶` and `◀`. `⏸` and `⏵` align in a terminal and break in a file: a diagram must hold in chat, file and diff.

Widgets are ASCII only: `[x]` `[ ]` `(*)` `( )` `>` `v`.

**Never predict a character's width from a property**: width class, Unicode category, emoji capability. **A character is safe once it has been drawn and looked at.** Show one not listed above to the user on its own first.

**Never pad around a wide character**: no whole number of spaces cancels its fractional width.

### Connectors

- **A stroke arriving from below and turning right is `┌`, never `└`.**
- **Label both ends of a long connector**: `from X` where it leaves, `to Y` where it lands.
- **At a crossing the vertical passes and the horizontal breaks**, every time. Never `┼`, which means joined.
- **Never draw a connector that starts and ends on the same element.** Work an element does to itself becomes a note beside it.
- **Labels ride inside the connector**, never on the row above.
- **Where several connectors merge, join them into one line** at the vertical midpoint of their sources, so no short stub runs the full height.
- **Arrows need not touch a box.** One column of clearance, and no junction character where an arrow meets a box.

```
┌────────────┐                                                    ┌────────────┐
│  Web app   │ ─── to Search ─┐                   ┌─ from Cron ─► │   Cache    │
└────────────┘                │                   │               └────────────┘
                              │                   │
┌────────────┐                │                   │               ┌────────────┐
│   Queue    │ ───────────────│───────────────────│─ from Queue ► │  Metrics   │
└────────────┘                │                   │               └────────────┘
                              │                   │
┌────────────┐                │                   │
│    Cron    │ ───────────────│── to Cache ───────┘
└────────────┘                │
                              │
                              │                                   ┌────────────┐
                              └───────── from Web app ──────────► │   Search   │
                                                                  └────────────┘
```

### Containers

- **A container's wall is `¦`; its top and bottom edges are dashed.** Never a solid wall: it reads as a connector.
- **Name a group at both ends**: top-left in the top edge, bottom-right in the bottom edge.
- **Inset the name into the edge itself.**
- **Break the edge where a connector crosses it.**

```
                        │
┌─  AGENTIC LOOP ─ ─ ─  │  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐
¦                       │                                   ¦
¦ ┌─  EACH TURN  ─ ─ ─  │  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐           ¦
¦ ¦                     ▼                       ¦           ¦
¦ ¦       ┌─────────────────────────────┐       ¦           ¦
¦ ¦       │         PreToolUse          │       ¦           ¦
¦ ¦       └─────────────────────────────┘       ¦           ¦
¦ ¦                     │                       ¦           ¦
¦ ¦                     │                       ¦           ¦
¦ └─ ─ ─ ─ ─ ─ ─ ─ ─ ─  │  ─ ─ ─ ─ EACH TURN ─ ─┘           ¦
¦                       │                                   ¦
└─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  │  ─ ─ ─ ─ ─ ─ ─ ─  AGENTIC LOOP ─ ─┘
                        ▼
```

### Proportion and alignment

- **The whole frame carries the aspect ratio, never one part of it.** `rows = cols / (ratio × 2.2)`, where 2.2 is the terminal cell's height-to-width ratio. A 16:9 video area with controls stacked under it is a square.
- **Relative size is a claim the reader checks.** A player's control strip is about a tenth of its height, not a third.
- **Give a UI-rich screen more room than feels necessary.** A full page needs about 150 columns; 113 is cramped.
- **Anything spanning the frame spans it edge to edge**, a progress bar included.
- **Reserve 50% extra width for a small dense component** carrying text and nested layout: tabs, an accordion. A plain frame does not need it.
- **Lock every vertical border to a fixed column.** `│` and its connectors `┌ ├ └ ┐ ┤ ┘ ┬ ┼ ┴` all sit at the same character index, top to bottom.
- **Don't overload interior labels.** Several descriptors go on their own lines, or get trimmed to one word each.
- **Truncation is a defect.** Hand-wrap a long label rather than cutting it mid-word.
- **Match the source's flow direction** when converting an existing diagram.

## Pattern vocabulary: a menu, not a template

Proven layouts. Pick one, combine several, or invent a better-fitting layout: the rules above bind whatever you invent.

### Layered stack

**When:** components with ownership and command/data flow: "who owns what, who tells whom."
**How:** one box per layer (name + tech, an `owns:`/`state:` line inside); arrows labeled with the actual calls or data; where flow is two-way, separate the directions.
**Failure:** more than ~3 layers, or crossing arrows. Split, or zoom into one seam.

```
┌─────────────────────────────┐
│         UI  (React)         │
│                             │
│  state: cart / products     │
└─────────────────────────────┘
      │ addItem(id)      ▲ cart changed
      ▼                  │
┌─────────────────────────────┐
│        CART SERVICE         │
│                             │
│  owns: pricing / totals     │
└─────────────────────────────┘
```

### Pipeline

**When:** input transforms through stages.
**How:** vertical; arrow labels are the data between stages; a short annotation beside each box says what it does.
**Failure:** stuffing a stage's internals into the overview: an interesting stage gets its own diagram.

```
   raw markdown
        │
        ▼
 ┌──────────────┐
 │    RENDER    │   strip syntax, keep the words
 └──────────────┘
        │  plain text
        ▼
 ┌──────────────┐
 │   SEGMENT    │   cut into sentence-sized chunks
 └──────────────┘
```

### Flow with return paths

**When:** a lifecycle, a state machine, a loop with escapes: a spine of ordered steps where some steps jump back.
**How:** the spine runs straight down the middle; each return path gets its own column to the right, labelled at both ends; containers group the phases.
**Failure:** a return path taller than the screen. That is where it splits into 2 diagrams.
**At scale:** `references/hooks-lifecycle.md`: 113 × 97, a 15-step spine, 2 nested containers, 3 return paths.

```
┌─  EACH TURN  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
¦                                                              ¦
¦     ┌─────────────────────────┐                              ¦
¦     │      PromptSubmit       │ ◄─ from PreToolUse ──┐       ¦
¦     └─────────────────────────┘                      │       ¦
¦                  │                                   │       ¦
¦                  │                                   │       ¦
¦                  ▼                                   │       ¦
¦     ┌─────────────────────────┐                      │       ¦
¦     │       PreToolUse        │ ── to PromptSubmit ──┘       ¦
¦     └─────────────────────────┘                              ¦
¦                                                              ¦
└─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─  EACH TURN  ─ ┘
```

### Tree

**When:** hierarchy or containment: file layouts, nesting, decision trees.
**How:** indented text tree with inline annotations. Almost never boxes inside boxes.

```
core/
├─ pipeline/    render -> segment -> synthesize
├─ playback/    the controller (no React here)
└─ cache/       content-key -> audio + timings
```

### Side-by-side

**When:** comparing 2 options or states.
**How:** 2 columns, same skeleton so the differences pop; verdict labels up front so the headers alone tell the story.
**Failure:** if the columns are just attribute rows, nothing is being drawn. Use a list.

```
   TIMER IN REACT (drifts)          CONTROLLER-DRIVEN (exact)

   setInterval guesses the           the audio clock IS the
   position on schedule              position: read, not guessed
```

### Rarer forms

- **A schedule, a data model, or two representations that must map onto each other** → `references/rarer-forms.md`, which defines and draws all 3.
- **A screen, or anything floating over one** → `references/draw-mockups.md`.

## Structure: adapt it, don't fill it in

No fixed template. The default **for a design proposal**:

> the proposal itself → components defined from zero → one whole-picture diagram → the load-bearing rule, with depth → key interactions as short prose steps → "what you're deciding"

Other shapes adapt. A *mechanism* explanation ends with "what this means for us," not decision points. A *comparison* leads with the recommendation and differentiates options only on the axes that matter. A *walkthrough* orders by time.

Use the sentences the material actually needs: no padding, and no artificial squeezing. Only the opener is deliberately short.

`references/worked-example.md` runs this shape once end to end, on a real architecture, and shows how much depth the load-bearing rule gets.

Files in this skill

  • SKILL.md17.5 KB
  • future-ideas/channel-architecture-dark.svg3.2 KB
  • future-ideas/hooks-lifecycle-dark.svg14 KB
  • references/draw-mockups.md6.5 KB
  • references/hooks-lifecycle.md14.3 KB
  • references/rarer-forms.md5.4 KB
  • references/worked-example.md3.5 KB
  • references/youtube-page.md11.6 KB
  • scripts/canvas.js4.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…