Cover

The Console Conjurers

a short illustrated tutorial on setting up the agentic-AI workstation

by Sean Spratt

🎧 Full audiobook · 40 min · 3 voices · 8 chapter markers
⬇ Download MP3~20 MB · open in a podcast app to see chapters
Lor
Lorthe methodical one · reads the docs
Vex
Vexthe chaotic enthusiast · types first
Cricket
Cricketcat · supervisor
Step 1

The Empty Console

🎧
Listen · Step 1

The kitchen is doing its best impression of an ordinary kitchen. Copper pans, a kettle warming on the low gas burner, a brick of butter softening on the counter, a small bowl of tomatoes Lor has been ignoring for two days. The window above the sink is open to the wrong horizon — a sandstone temple half-swallowed by violet-blue vines, a sky the colour of old maps — but neither of them pays it any mind anymore. The horizon is just where they live. The kitchen is where they cook.

Lor sets the new laptop on the wooden table between them and opens the lid like she's untying a parcel. The screen wakes up; the screen-glow paints a soft warm rectangle onto her cheekbones and onto Vex's, who is leaning so far over her shoulder that his hair is almost in her mouth.

The Open Lid
The Open Lid

"Move back," she says, without looking.

"I'm assisting."

"You're respirating on me."

"That's an intimate form of assistance." He drops back into his chair, picks up the mug she put down for him, and inhales the steam like he's auditioning for a coffee commercial. "So. Day one. Brand new Mac. Empty as a fresh page."

"Empty as a fresh page is a writer's metaphor. This is an OS install with about twelve gigs of pre-loaded fonts."

"You really know how to set a mood, Lor."

Move Back
Move Back

She gives him the eyebrow. It is the eyebrow — the one that says I have read three blog posts about this thing while you were learning what a kettle is. He grins at her. She does not grin back, but the dry small smile is in her eyes.

Dealing The Cards
Dealing The Cards

"Okay," he says, hands flat on the table like he's about to deal cards. "The wager."

"The wager."

"By the time we're done, this thing—" he points at the laptop "—runs us a game of D&D. Real game. Real dice. Goblins. Lasers. Whatever."

"Lasers aren't in D&D."

"Mine has lasers."

She breathes in. "By the time we're done," she repeats, ignoring the lasers, "the laptop has Claude Code installed. The Choir CLI working with at least three model providers. A skill loaded into Claude Code that auto-triggers from a description. An image-generation hack wired up that lets Claude draw by shelling out to somebody else's API. And a small PROCESS.md that runs a solo D&D loop end-to-end."

"And the loser?"

"Writes the PROCESS.md by hand."

Cricket Votes
Cricket Votes

He whistles. "That's actually the fun part."

Off The Lid
Off The Lid

"That's why it's the prize."

He leans back, considers her. "You know I'm going to win."

"You're going to type fastest, which is different."

Cricket the cat, smoky blue-grey with white socks and the most unimpressed face in the kingdom, walks across the keyboard from left to right and sits down precisely on the trackpad. The cursor on the screen leaps into the upper-left corner and stays there.

"Cricket," Vex says solemnly, "is voting with her feet."

Open Terminal
Open Terminal

"Cricket is closing the lid. With her whole body."

Lor scoops her gently onto the floor and turns the laptop slightly toward Vex. "Open Terminal."

"Open it how?"

She points at the keyboard. "Command-Space. Type terminal. Press return. That's the whole motion."

He does. The dock animates. A window opens — a dark rectangle, a slow-blinking cursor, a single line that says nothing and waits.

"Huh," he says, flat. "Neat."

"That's the whole machine," Lor says. "That's where everything you ever build with it starts. You type a thing. The thing happens. The machine says what happened. You read what it said. You type the next thing."

"It's a conversation."

"It's a conversation where one of you has to know the vocabulary."

The Cursor
The Cursor

"I have a partner with the vocabulary."

"Lucky you."

He looks at her, then at the empty Terminal, then back at her, then at his mug. The cursor blinks. Outside the window, somewhere on the slate-cloud horizon, a flock of something with wings turns in a long lazy arc and slides behind the temple.

"What's the first thing we type?" he says.

She considers him for a long second. Then she takes the laptop and pulls it toward herself.

"brew --version," she says. "But first — we don't have brew yet. So we install it. That's chapter two."

He raises his mug.

Vista Of Worlds
Vista Of Worlds

"To chapter two."

Cricket, from the floor, narrows her eyes at both of them.

Step 2

Homebrew, the Foundation

🎧
Listen · Step 2

"Foundation," Lor says, "is the most important word in this whole book."

"Foundation is the most boring word in this whole book."

Pointing At The Code Block
Pointing At The Code Block

"Boring is what foundations are for."

Homebrew website with the one-line install command
brew.sh — the install line — The brew.sh homepage. The exact install line they paste into Terminal is the black-on-cream block in the middle.

She pulls up a web browser tab and types brew.sh. The page is a single very long paragraph and one black-on-cream code block in the middle. She points at the code block. Vex squints.

"That's it?"

"That's it."

"That's one line."

"It's one line that downloads ten thousand lines and runs them."

"Are we concerned about that?"

"We're concerned-but-doing-it-anyway, which is most things." She clicks the little copy icon. "The thing on the other end is a community-maintained package manager called Homebrew. Half the open-source Mac world has installed it from this exact line for fifteen years. The author signs releases. We've already decided we trust it."

"That's a lot of decisions."

Hover On Return
Hover On Return

"That's one decision: trust this URL. Open Terminal."

Waterfall Of Install
Waterfall Of Install

Vex switches windows. The empty Terminal is still waiting, the cursor patient as a cat. He pastes.

He hovers his finger over Return.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/brew/HEAD/install/install.sh)"

"Press return."

"What does it do?"

"It downloads an install script, runs it in bash, the script asks you for your password to install some files into /opt/homebrew, and ten minutes later you have brew on your PATH."

"PATH?"

"The list of folders your shell searches when you type the name of a command. Adding to your PATH is how 'a thing you installed' becomes 'a thing you can type the name of.'"

"You said ten minutes."

"I said ten minutes. Do you want to press return or do you want to keep poking at the metaphor."

Password Silence
Password Silence

He presses return.

Cricket Asleep By Kettle
Cricket Asleep By Kettle

The screen does the thing.

Lines of pale output cascade upward — a slow waterfall of installation chatter, none of it readable to him at this speed, all of it perfectly fine. After about three seconds it asks him for his password.

"It's not showing my keystrokes."

"It's not supposed to. The dots-and-asterisks thing is a UI convention. Old Unix doesn't even do that — it just goes silent. It's not broken. Type. Press return."

He types his Mac password. Nothing happens visibly. He presses return.

The waterfall resumes. Lor leans back, picks up her own mug, and watches him watch the screen.

"You're nervous."

Brew Version Returns
Brew Version Returns

"I am thirty-one years old and I have just trusted a website with the keys to my computer."

$ brew --version
Homebrew 5.1.6

$ jq --version
jq-1.7.1-apple
brew --version — After the install finishes — the first confirmation that the package manager is live, and the first tool installed on top of it.

"You have also installed every single piece of software you've ever owned on this computer the same way, in principle. This is just the part where you watch it."

Cricket reappears on the table. She steps with great care around the laptop, settles into a perfect compact loaf by the kettle, and closes her eyes. The waterfall continues. The kitchen smells of bread crust and brewing tea. The window-horizon has shaded toward a softer amber.

Eight minutes later the Terminal prints something short and goes quiet. The prompt comes back. The cursor blinks.

Vex types, very carefully:

brew --version

The Terminal answers with a single line — a name, a number, a date.

"There," Lor says. "You have a package manager."

"I have a — what now?"

"A package manager is a catalog plus an installer. You ask it for a thing by name, it knows where to fetch the thing, where to unpack the thing, how to put the thing on your PATH so you can use the thing. Want a new tool? You don't go website-hunting. You go to your package manager."

"And ask for what."

"Try this. It's good practice." She points; he types:

Brew Install Jq
Brew Install Jq
brew install jq

Thirty seconds of waterfall. The prompt returns. He types jq --version. The Terminal answers.

"What does jq do?"

"It eats JSON and lets you ask it questions. Everything we're going to install for the rest of the book talks JSON. jq is the smallest possible Swiss-army knife. Now you have one."

"Two tools," he says, holding up two fingers.

"Foundation." She tilts her head toward the screen. "Brew is the foundation. Everything else gets installed by brew or installed by something brew installed. The whole stack lives here now."

"Foundation. Got it. Boring. Important."

Cricket makes a soft chirping sound — a sleeping-cat noise — without opening her eyes. Outside the window, far on the alien horizon, the temple has gone the colour of new pennies in the dropping light.

"Next chapter," Lor says, "we put Claude in your Terminal."

Vex stares at the cursor.

Two Tools
Two Tools

"I am unreasonably excited about this."

"That tracks."

Step 3

The Claude in Your Terminal

🎧
Listen · Step 3

"Okay," Vex says, rolling his sleeves up like a man about to wrestle. "Put a Claude in my Terminal."

"That's such a weird sentence."

Brew Install Claude Code
Brew Install Claude Code

"Two years ago that was a science fiction sentence. Now it's a Tuesday."

Claude Code overview page from the Anthropic docs
Claude Code docs — Claude Code lives at code.claude.com/docs. Native install is one line; Homebrew is one line; both land you in the same place.

Lor pulls the laptop toward her and types two characters that change Vex's life. He doesn't realise that yet.

brew install claude-code

The waterfall returns — shorter this time, brisker; brew is warmed up. Vex watches the install lines tumble past like he's seeing the names of horses on a board.

"You can also npm i -g @anthropic-ai/claude-code if you want the manual route," she says. "Two paths up the same mountain. Brew, for us. Brew handles updates."

When the prompt comes back she types one word and presses return.

claude

The Terminal changes. Not the colours — the shape. The dark rectangle becomes a wider darker rectangle with a faint warm border, and there is now a different cursor. A thinking cursor. A box with rounded corners that pulses very softly. The space at the bottom invites them to type. There is a status line at the top, several friendly utilities at the bottom, and the strong sense that the room has gained a third presence.

Vex says, "Hi."

Claude Session Opens
Claude Session Opens

The cursor pulses. A response begins to appear — words assembling in real time, the same way the waterfall earlier was lines, but slower, deliberate, the way a person types when they're being careful.

"It's talking back," Vex says.

"That's the point."

"No, but, look — it's talking back and it can see the folder we're in. It can run shells. It can read files. It can write files. This isn't a chatbot."

"This is a colleague who lives in your shell. Different thing."

"You said you'd explain the money."

"Yes." She holds up two fingers. "Two ways to pay. One: a subscription. Flat monthly fee. You sign in with an account; the subscription gives you a generous-but-soft budget per session. If you push hard, you eventually get told to slow down for a few hours. Most days you'll never see the cap."

"And the other?"

"API credits. From the Anthropic Console. You pre-load a balance; each token in and out costs a small fraction of a cent depending on the model. There's no daily cap; there's just the balance going down."

"So which do we use?"

"Subscription. You're learning. Subscription is all-you-can-eat-but-please-don't-be-a-jerk-about-it. Once you start automating things — fan-outs, batched generations, anything where you might run a thousand requests overnight — that's when you mix in credits, because credits don't get rate-limited the same way."

"And the model under the hood?"

Lor Smiles At Haiku
Lor Smiles At Haiku

"You get to pick. Default's a strong one. For drafting code, the bigger model. For quick classifications, the smaller cheaper one. For art-direction stuff, you mix."

Vex Sees Lor Smile
Vex Sees Lor Smile

Vex turns back to the screen. He types:

$ which claude
/Users/seansp/.local/bin/claude

$ claude --version
2.1.86 (Claude Code)
claude --version — Confirming Claude Code is on PATH. The version string is the version of the CLI, not of the underlying model — the CLI picks a model per session.

> Write me a haiku about cast iron, but it has to make Lor smile.

The thinking-cursor pulses. The reply assembles, line by gentle line. Three short lines. Lor reads them silently. Her face does a thing — a small, brief, traitorous thing — and Vex sees it.

"Ha! I saw that. You smiled."

"I was appraising."

"Smiled. Confirmed. The Terminal made you smile."

"The Terminal is showing off because you asked it to."

Approve The Shell
Approve The Shell

"This is the whole point. You can ask it to do real things." He types again:

> Make a folder called dnd in my home directory. Then create a file inside it called README.md that just says: This is going to be a game.

The cursor pulses. A box appears asking him to approve a shell command. He approves. The shell runs. A second box asks to write the file. He approves. The file is written. He opens it. The two of them stare at one short sentence in a brand-new file in a brand-new folder.

"That folder did not exist forty seconds ago," Vex says.

"That folder didn't exist forty seconds ago," Lor agrees.

"Promise me something."

"What."

"Promise me we will never lose this feeling."

"Press Ctrl-D to end the session."

"Wait, what — Ctrl-D?"

"It tells the shell you're done. It closes the session cleanly. Hold on — you don't have to lose the feeling. You can lose the session. Sessions are cheap."

He presses Ctrl-D. The Terminal returns to its smaller, quieter shape. The cursor blinks again, normal-sized.

Cricket reappears, jumps onto his lap from a height that should not have been physically possible, and settles in like she has always lived there.

Folder Did Not Exist
Folder Did Not Exist

"So next time we run claude," Vex says, "it's a new session?"

Promise Me
Promise Me

"New session. Fresh head. Same colleague."

The Anthropic Console sign-in page
console.anthropic.com — If you go the API-credits route, you create an account at console.anthropic.com, load a small balance, and generate a key. The subscription route does not need this page.

"And the colleague — what's its name?"

"Claude."

"I'm gonna call him Claudia."

"Claude is a personal name."

"Claudia is more elegant."

"You're impossible."

"You said colleague."

She sighs, but her shoulders are loose. Outside the window the temple has gone full umber, like a coal at the end of a fire.

Cricket Falls Off
Cricket Falls Off

"Next chapter," she says. "We summon the choir."

Vex sits up so fast Cricket falls off.

Step 4

The Choir Materializes

🎧
Listen · Step 4

"Okay," Vex says. "So we have one Claude. We have one colleague. Why are we installing more?"

"Because one colleague has one opinion."

Clone Choir
Clone Choir

"That's not even slightly fair to Claude."

The Choir project page on sean-makes-stuff.com
sean-makes-stuff.com/projects/choir.html — Choir lives at sean-makes-stuff.com/projects/choir.html. macOS app, CLI, and Claude Code skill in one bundle — routes to OpenAI, Anthropic, Google Gemini, xAI Grok, DeepSeek, Mistral, Groq, Cerebras, Perplexity, OpenRouter, Ollama, or any OpenAI-compatible endpoint. The signed `.dmg` is at github.com/404seannotfound/seanwebsite/blob/main/Choir-1.6.dmg — download, drag to Applications, and the `choir` CLI installs alongside it.

"It's not about fair. It's about fan-out. Watch."

Lor flips the laptop back toward herself. Cricket is still sulking under the table about the falling incident. The window-horizon is doing that thing where two of the smaller crystal spires catch the dropping sun and look briefly like candles. Lor types.

git clone https://github.com/404seannotfound/choir.git ~/code/choir
cd ~/code/choir
swift build -c release
sudo cp .build/release/choir /usr/local/bin/

"What's this?"

"This is the choir CLI. It's a small command-line tool that takes one prompt and fans it out across several model providers simultaneously, then gives you all their answers back side-by-side."

"All of them at once."

Adding Api Keys
Adding Api Keys

"All of them at once. OpenAI's models, Anthropic's models, Google's Gemini, xAI's Grok, even local Ollama. One command. N raw answers. You pick the one you like, or you have another model judge them, or you save the run and come back to it later."

$ which choir
/Users/seansp/.local/bin/choir

$ choir --help
OVERVIEW: Route LLM calls across providers, share config with the Choir macOS
app.

USAGE: choir <subcommand>

OPTIONS:
  --version               Show the version.
  -h, --help              Show help information.

SUBCOMMANDS:
  ask (default)           Send a prompt to one or more configured models.
  models                  List, add, or modify the configured LLM models.
  keys                    Manage API keys (stored in the same DB as the GUI).
  runs                    List, inspect, and re-summarize saved comparison runs
                          (shared with the Choir GUI history).
choir --help — After `swift build` finishes and the binary is on PATH, this is what the CLI looks like. `ask` for one-shot prompts, `models` for the provider catalog, `keys` for credentials, `runs` for saved fan-outs.

The build finishes. The Terminal returns to its quiet patient self.

"Keys," she says.

"Keys?"

"API keys. Each provider needs one. You go to each provider's console — OpenAI's, Anthropic's, Google's, xAI's — you create an account, you put a small payment method on file, you generate a key. The key is a long string that authenticates you. Treat it like a password. It goes in .env. It does not go in git. It does not go in Slack. It does not go in a screenshot. It does not go on a cocktail napkin."

"It does not go on a cocktail napkin."

"It does not go on a cocktail napkin."

She opens the .env.example, copies it to .env, and the two of them spend a calm five minutes pasting in keys from the consoles she had open in browser tabs. Vex's shoulders ratchet up two notches when he pastes; he is suddenly aware that he is handling money.

"Now," Lor says, when the file is saved, "watch."

choir "Write a haiku about cast iron pans" --models gpt-5,opus-4-7,gemini-3,grok-4

Four spinners. Four quiet seconds. Then four blocks of output, fanned across the terminal like cards on a table. Four haiku. Each in a slightly different voice.

Four Tablets Of Light
Four Tablets Of Light

"Look at that," Vex says, reverent.

Reading The Four
Reading The Four

"Each model has a temperament. Opus is the warm theatrical one. GPT-5 is the precise polished one. Gemini is the dryly clean one. Grok will roast you and the cast iron pan."

$ choir models list

[OpenAI]
  • GPT-5  —  gpt-5
  • GPT-5 Mini  —  gpt-5-mini
  • GPT-4o  —  gpt-4o
  • GPT-4.1  —  gpt-4.1
  • o3  —  o3
  • o4 Mini  —  o4-mini

[Anthropic]
  • Claude Opus 4.7  —  claude-opus-4-7
  • Claude Opus 4.6  —  claude-opus-4-6
  • Claude Sonnet 4.6  —  claude-sonnet-4-6
  • Claude Haiku 4.5  —  claude-haiku-4-5-20251001

[Google Gemini]
  • Gemini 3 Pro  —  gemini-3-pro-preview
  • Gemini 3 Flash  —  gemini-3-flash-preview
  • Gemini 2.5 Pro  —  gemini-2.5-pro
choir models list — The catalog of providers Choir can route to. The names on the right are the IDs you pass to `choir ask --models <id>,<id>,…`. Mix-and-match at will.

"Read them out."

She reads. Vex laughs at one. Lor pauses on one. They both quietly admire one. Cricket, from under the table, makes a soft chirp of judgement at a fourth.

"Now look at this," Lor says, and types:

choir "Write a haiku about cast iron pans" --models gpt-5,opus-4-7,gemini-3,grok-4 --save

"Same thing?"

Choir Judge
Choir Judge

"Same thing, but saved. Gets a run ID."

A short string appears.

choir runs list

The run is in the list. She types:

choir runs compare <id> --with claude-opus-4-7

Opus reads all four haiku and writes a short judgement on each.

Vex sits back. He runs both hands through his hair, which does not help his hair situation. "Wait, wait, wait."

"I'm waiting."

"This — this — is the point. I don't have to pick one model and be loyal to it. I can ask all of them and use a different one as a judge."

"Yes."

"And I can save the result and review it later. I can build a pipeline on top of this."

Vex Hands In Hair
Vex Hands In Hair

"Yes."

"This is the whole game."

"This is one part of the whole game. But yes. The way you'll actually use it in scripts — you call choir from inside a Claude Code session, you tell Claude to fan out a hard prompt across three models, judge them with a fourth, and feed the winner back into the next step. Claude becomes the conductor. Choir is the orchestra. Each model is an instrument."

He's quiet for a moment. Outside, the horizon has gone the colour of wine.

"Claudia is gonna love an orchestra," he says.

"I am divorcing you over the name Claudia."

"Did you smile."

"I did not smile."

Wine-Colored Horizon
Wine-Colored Horizon

"You smiled."

Cricket Approves
Cricket Approves

She did not. (She did.)

Step 5

The Spellbook — Adding a Skill

🎧
Listen · Step 5

"Right," Lor says, "moment of truth. What's a skill."

"A spell."

The Spellbook
The Spellbook

"Closer than you think."

Claude Code skills documentation page
Claude Code Skills docs — The official skills documentation. A skill is a folder, a SKILL.md, and a description string. Claude reads the description and chooses the skill when the description matches what the user asked for.

She pulls up a fresh claude session. The Terminal does its slow expand into the wider rectangle. The thinking-cursor pulses patient.

"Here is the thing nobody tells you when they show off Claude Code," she says. "Claude is not just a chatbot in your shell. Claude is a dispatcher. Inside Claude live a bunch of little capability folders. Each folder is one recipe — a piece of Markdown that says, for this kind of request, do this procedure. Each recipe also has a description at the top — one paragraph that says I am the recipe for X, you should call me when the user wants X. Claude reads the descriptions. When you ask for a thing, Claude looks across all its skills and picks the one whose description matches what you asked for. Then it runs that recipe."

"Description-driven dispatch."

"Description-driven dispatch."

"That's cute."

"That's powerful. It means the way you teach Claude new behaviour is: you write a folder with a Markdown file in it, you put a really clear description at the top, and the next time the user says something that matches your description, the skill fires automatically."

She opens a Finder window and navigates to ~/.claude/skills/. There are a few folders there already. She drags a copy of one in from a spare drive she had on the table — Vex hadn't even seen her plug it in — and the folder appears in the skills list.

Dragging A Skill
Dragging A Skill

"scriptorium," he reads. "What does it do?"

"It builds illustrated novels. It's the skill that turns a four-sentence brief into a finished book — story arcs, characters, watercolour illustrations, the whole pipeline. Sean wrote it. It's generous. We're going to trigger it."

She types claude in the Terminal, which she had not yet — wait, no, she had already, the session is up — and she types nothing herself. Instead she swivels the laptop toward Vex.

"You drive."

"What do I say?"

"Say something that the description of scriptorium would match. Don't name the skill. Don't even hint at it."

He thinks. He drums his fingers on the laptop case. Cricket, returned from her sulk, climbs onto his shoulder and watches the Terminal too. He types:

> I want to write a short illustrated novella about a frog detective named Garbanzo who solves crimes in a noir city of lily pads. Help me build it.

He presses return.

The cursor pulses. A short pause. Then a single line of soft output appears:

> Reaching for the scriptorium skill — your request matches its description.

Vex Drives
Vex Drives

"It picked it up," Vex says, sitting bolt upright. "I didn't tell it. It just knew."

Skill Reaches
Skill Reaches

"It read the description. The description says I build illustrated novels by interviewing the inspirer about the story seed, fanning out story arcs, picking visual styles, weaving chapters, illustrating chapters, and compiling the final novel HTML. You asked for an illustrated novella. The description matched. Claude reached."

$ ls ~/.claude/skills/
choir
scriptorium
Installed skills — Two skills installed: choir (multi-model fan-out) and scriptorium (illustrated-novel pipeline). Each is a folder under ~/.claude/skills/ with a SKILL.md inside.

"And the recipe is — just a Markdown file?"

"The recipe is just a Markdown file. With a clear description, some instructions, and pointers to sub-skills if needed. The instructions tell Claude what stages to do, in what order. Claude executes them. Skills are folders of process. You can write your own this afternoon."

Vex looks at her for a long moment, then back at the Terminal, then at his cat.

"Cricket," he says, "I think we should write the Cricket-finds-the-laser-pointer skill."

"Cricket already has a skill. It's called being a cat."

Description Driven Dispatch
Description Driven Dispatch

"I'm making her a skill."

"You will teach her bad habits."

He's already typing. He stops the scriptorium-skill mid-flow with a polite Ctrl-C and asks instead:

> Tell me the absolute simplest possible structure of a skill folder. Pretend I am six years old. Pretend I have a cat named Cricket and I want to make her a skill that helps me find lost objects in our apartment. What's the minimum?

The cursor pulses. The answer arrives. A skill folder is one directory, one Markdown file, one description string, one short body. Frontmatter at the top with a name and a description. That's the whole thing. The description should sound like I am the recipe for situations like X, use me when the user says things like X. Claude does the rest.

"That's it?"

"That's it."

"I am going to make many skills."

"You are going to test them before you commit them, because a too-broad description grabs every request and a too-narrow description grabs none."

"Yeah, yeah." He's already in the skills folder. He's already named the file find-cricket.md. He's writing the description out loud, which she does not stop him from doing.

"I am the recipe," he reads as he types, "for finding any small object in the apartment that has been moved by a cat. Use me when the user says things like — okay, what do they say?"

Vex Writes A Skill
Vex Writes A Skill

"Have you seen — ?"

Cricket On Shoulder
Cricket On Shoulder

"Have you seen. Yes. Where did I put. Yes. Cricket again."

"Cricket again is going in there?"

"It's thematically critical."

She lets him. He commits the skill. He restarts the Claude session — Ctrl-D, then claude again. He types, casually:

> Have you seen the spare battery for my camera?

The cursor pulses.

> Reaching for the find-cricket skill — your request matches its description.

"NO."

Have You Seen The Battery
Have You Seen The Battery

"YES."

The kitchen-spaceport, briefly, becomes the loudest room in any of the worlds outside the window.

Step 6

The Drawing Hack

🎧
Listen · Step 6

"So here's a thing," Vex says, pacing now, which is a sign he is thinking hard. "Claude can read files. Claude can write files. Claude can run shells. Claude is very good at writing words."

"Yes."

Twenty Lines Of Shell
Twenty Lines Of Shell

"Claude cannot draw."

"Correct."

"That feels like a gap."

"That's because you haven't seen the hack yet." Lor pulls the laptop back. "Watch."

She opens a new terminal pane and pastes a single short shell script into a file called genimg.sh. About twenty lines, no more. She makes it executable. Vex reads over her shoulder.

#!/usr/bin/env bash
# genimg.sh — call an image-gen HTTP endpoint, save bytes, print path
set -euo pipefail
out="$1"; prompt="$2"; provider="${3:-openai}"
case "$provider" in
  openai)
    curl -s https://api.openai.com/v1/images/generations \
      -H "Authorization: Bearer $OPENAI_API_KEY" \
      -H "Content-Type: application/json" \
      --data "$(jq -nc --arg p "$prompt" '{model:"gpt-image-1",prompt:$p,n:1,size:"1024x1024"}')" \
      | jq -r '.data[0].b64_json' | base64 -D > "$out" ;;
  xai)
    # ... grok-imagine-image endpoint ;;
  gemini)
    # ... imagen endpoint ;;
esac
echo "$out"

"That's it?"

"That's it. Twenty lines. POST the prompt at the image-gen endpoint. Decode the base64. Write the bytes to disk. Print the path."

"And this works because —"

Reading Over Shoulder
Reading Over Shoulder

"— because all these image-gen products are just HTTP endpoints. You pay per-image, the API returns the bytes, you save them. The fancy chat-UI image generators you've seen are doing exactly this under the hood. You're just doing it yourself."

"So now what?"

"Now we tell Claude about the script." She opens a CLAUDE.md file in her project root and types:

> I have a script at ./genimg.sh. Usage: ./genimg.sh <output_path> <prompt> [openai|xai|gemini]. The script saves a generated image to the output path. When the user asks you to make an image, run this script.

She saves the file. She runs claude. She turns to Vex.

"You drive again. Ask it to draw something."

He types:

> Make me a watercolour image of a frog detective in a trench coat under a lily pad streetlamp at night. Save it to ./frog.png.

The thinking-cursor pulses. A box appears asking permission to run the shell script. Vex approves it. The script runs. The Terminal prints a path. Vex opens the file.

A frog. In a trench coat. Under a lily pad streetlamp. At night. Watercolour. Beautifully painted.

"Claude drew," Vex says, slowly.

"Claude orchestrated. Big distinction. Claude wrote a request, the request went to OpenAI's image endpoint, OpenAI's image model made the image, the bytes came back, the shell saved them, the file appeared. Claude held the baton. Somebody else played the notes."

Asking Claude To Draw
Asking Claude To Draw

"This is the whole pattern."

Approval Dialog
Approval Dialog

"This is the whole pattern."

He turns and faces her like he's about to give a speech. He doesn't give a speech. He just opens both his hands.

"Claude can do anything that has an HTTP endpoint."

"Anything."

"Image. Audio. Video. Embeddings. Search. Weather. Stock prices. Sending an email. Posting to a forum. Anything."

"Anything. You write the little script. You teach Claude about it. Claude calls it when it makes sense to call it."

"And the script can call another model too — like Choir does."

Frog Detective Revealed
Frog Detective Revealed

"Now you're getting it. Skills + shell scripts + model APIs is the whole language for building agentic things. You're not stuck inside one model's brain anymore. You're a director. Each tool you give Claude is an instrument."

"Conductor metaphor again."

"It's a good metaphor."

"Fine."

He sits down. Cricket emerges from somewhere — probably the cabinet under the sink, where she sometimes goes for moral reasons — and curls up on the closed lid of his laptop case. Vex stares at the file with the frog detective.

"Lor."

"Yeah."

"We have to make a game."

"Yes we do."

"A real one."

"Yes."

"With Claude."

"Yes."

Claude Orchestrated
Claude Orchestrated

"And dice."

"Real dice."

"And the PROCESS.md."

She nods, slow. Outside the window, the temple has gone dim and the violet vines have started to bioluminesce, very faintly, the way they sometimes do at evening. Inside the kitchen, the laptop is the warmest light in the room.

"Last bits of theory before the build," she says. "Chapter seven, we write the PROCESS.md. Chapter eight, we play."

"I am going to win the wager."

"You're going to type the PROCESS.md, which I have realised is what you wanted to do all along."

"... yes."

"Then we're both winning."

"I love this game."

Cricket On Closed Lid
Cricket On Closed Lid

"It hasn't started yet."

Bioluminescent Vines
Bioluminescent Vines

He grins, sits back, and lets Cricket sleep.

Step 7

Cooking the Game — PROCESS.md

🎧
Listen · Step 7

"Okay," Vex says, cracking his knuckles in a way that makes Lor wince. "We're doing it."

"We're doing it."

Knuckles Crack
Knuckles Crack

"D&D."

"Solo D&D. Single-player. You against the world. Claude as the DM."

"Why a PROCESS.md? Why not just say to Claude be my dungeon master?"

"You can just say that, and you'll get something. But it'll be vibes. Every session will be different. Sometimes the DM will roll dice for you in their head and lie about the numbers. Sometimes they'll forget you have eight hit points. Sometimes they'll narrate for an hour without letting you act. Vibes are great until they aren't."

"And a PROCESS.md fixes that how?"

"A PROCESS.md is a small written-down loop. You put it in your project folder. You tell Claude read this file. Follow it. Always. And suddenly the same flexible model becomes a reliable subsystem. Because the loop is on paper. Claude doesn't have to remember it; Claude has to look at it."

Writing The Loop
Writing The Loop

She opens a new file: ~/.claude/projects/dnd/PROCESS.md.

"Together?"

"Together."

They write it in maybe twenty minutes. It is shorter than they expect. Vex types, Lor edits, Cricket walks across the keyboard once and is gently bumped off, and it ends up looking something like this:

# PROCESS.md — Solo D&D one-shot

This file is the source of truth. Read it every turn. Follow it exactly.

## State (always update; never invent)
- `character.md`: name, race, class, level (start 1), ability scores
  (4d6 drop-lowest, six rolls, assigned by player), HP, AC, gear,
  spells if applicable.
- `scene.md`: current scene description, present NPCs, exits, any
  ongoing effects.
- `log.md`: append-only narrative log. Every turn ends here.

## Turn loop
1. The player describes an intent ("I sneak around the goblin").
2. You restate it briefly. Ask a clarifying question only if the
   intent is genuinely unclear.
3. If a roll is required, name the ability + the DC, then pause
   and wait. The PLAYER rolls a real die and types the number.
4. On receipt of the number, narrate the outcome (success, partial,
   failure). One short paragraph. End with: what's happening now,
   what the player perceives.
5. Append the turn to `log.md`. Update `scene.md` if the scene state
   changed. Update `character.md` if HP, gear, or status changed.
6. Hand back to the player.

## Rules of engagement
- You DO NOT roll for the player. The player rolls real dice. You
  may roll for NPCs and the environment.
- You DO NOT lie about state. If the player asks "what's my HP?",
  answer honestly from `character.md`.
- Narration is tight: 2–4 sentences per turn unless the scene
  changes hard.
- Combat is theater of the mind unless the player asks for a sketch.
- If the player goes silent or types "menu", offer: continue, save,
  rewind one turn, summarise, or quit.

## Starting
On `claude` start in this folder: roll a fresh 1st-level character
following the state rules. Generate one opening scene (a small
location, one clear hook, two clear exits). Hand to the player.

"That's it?"

"That's it."

"That's a recipe."

"That's a recipe. The lesson — and this is the whole lesson of this book — is: process beats prompt. A clever prompt is a moment. A clever process is a machine."

Notebook Of Loops
Notebook Of Loops

"A small machine."

Rolling The Character
Rolling The Character

"A small machine that you can read end-to-end in three minutes and that produces correct behaviour over and over."

Vex saves the file. He starts a new Claude session in the dnd folder. He types one line:

> Read PROCESS.md. Follow it.

The cursor pulses. Soft output begins to assemble — a calm acknowledgement, then a brief silence, then:

> Rolling your character. Please wait for the results.

Naming Vesper
Naming Vesper

The model rolls — actually rolls; the numbers appear honest, with a tiny note of the seed. A 16, a 14, a 13, a 12, a 10, an 8. A half-elven rogue. Then it stops.

> Assign these to STR / DEX / CON / INT / WIS / CHA. Decide your name. Tell me when you're ready.

Vex looks at the numbers. He looks at Lor. He looks at Cricket. He looks at the numbers.

"Vesper," he announces, "the half-elven cleric."

"Not a rogue?"

"Not a rogue. I want to cast spells."

He types Vesper. He assigns the scores — 16 to WIS, of course; 14 to CON, 13 to DEX, the rest down. Claude reshuffles, confirms, asks about a domain. Vex picks Light. Claude updates character.md. The Terminal prints a soft acknowledgement.

> Vesper is ready. Generating opening scene.

A pause. Then:

Opening Scene
Opening Scene

> You wake in a ruined temple. The pillars are mossed; the windows > are gone; one corner of the floor has fallen away into a dark hole. > A faint blue light flickers from somewhere below. To the north, > a heavy stone door, slightly ajar. To the south, an arched > doorway opening on a forest of unfamiliar trees. Roll perception > if you'd like to take a closer look at the hole, the door, or > the forest.

Velvet Pouch
Velvet Pouch

Vex closes his hands around an imaginary die. Lor reaches into her belt and produces a real one — a velvet pouch with a single dark d20 in it, the polish a little worn at the edges. She sets it on the table next to the laptop.

"You brought dice."

"I read the docs."

He doesn't say anything for a moment. Then he picks up the d20, weighs it in his palm, and looks at her across the table.

"This is the best thing we have ever done."

"It hasn't started yet."

Die In Palm
Die In Palm

"It has absolutely started."

He rolls.

Step 8

Press Play

🎧
Listen · Step 8

The d20 hits the wooden table with a small clean tock. It tumbles. It comes up nineteen.

"NINETEEN," Vex announces.

Die On Wood
Die On Wood

"Type it in."

He types it in. The cursor pulses.

> Perception 19 — well above the DC. As Vesper, you crouch by the > fallen corner of the floor and listen. The blue light below > flickers in a rhythm; not a fire, more like a slow breath. You > can hear, very faintly, the sound of something muttering. Not > in any language you know. The mutter has a shape, though — three > beats, a pause, three beats, a pause. Almost like counting.

"Lor. The hole is muttering."

"The hole is muttering."

"What do I do?"

"What does Vesper do?"

He thinks. Cricket has climbed onto his shoulder, which she does when she likes what he's doing. He types:

> Vesper draws her holy symbol and whispers a prayer for guidance. > She does not approach the hole yet. She moves first to the heavy > stone door to the north and listens.

Blue Light From Below
Blue Light From Below

The cursor pulses.

> The door is silent. A breath of warmer, drier air comes through > the crack. You smell smoke, the kind from a hearth, faint but > alive. Whoever or whatever is on the other side of this door is > settled. Roll perception again, or push the door open, or > retreat.

He rolls. A six. He types in the six. Claude continues, kind:

> Perception 6 — your ear catches nothing more. You'll have to act > on what you have.

He pushes the door open. The narration arrives: a long stone corridor lit by guttering torches; a small, hunched green figure sitting on the floor, talking to itself, beads laid out in a row, counting them in threes. A goblin. Holding a knife. Cooking a piece of meat over a tiny banked fire.

"It's making dinner," Vex whispers.

"It is making dinner."

"Should I — kill it?"

"That's a you question."

Vex looks at the screen. Looks at Cricket. Looks at the d20. Types:

> Vesper steps forward into the corridor, one hand raised palm-out, > the other on her holy symbol. She says, "Friend, I don't want a > fight. Will you share your fire?"

A pause. The cursor pulses, longer this time, as if Claude is enjoying this.

> The goblin freezes. Its knife is still raised. The beads it was > counting roll a little. Its eyes, golden in the firelight, find > yours. It tilts its head. Roll Charisma. DC 14.

Stone Door Ajar
Stone Door Ajar

Vex picks up the die again. Lor watches, dry-amused. Cricket on Vex's shoulder swivels her ears forward. He rolls.

Goblin Counting Beads
Goblin Counting Beads

A twenty.

The d20 sits perfect-faced-up on the wood. Vex stares at it. Then at Lor.

"That's a natural twenty."

"That's a natural twenty."

"Type it in."

He types it in. The cursor pulses. The reply, when it comes, is beautiful.

> The goblin lowers the knife. Slowly, like he isn't sure he is > doing it. He scoots a polished bead toward you across the > corridor floor. He gestures at the fire — there is a small log > next to it that could serve as a stool. He says one word, in > a voice creakier than you expected: "Khoss." You don't know > the word. But you know the tone. > > You sit. The two of you eat together. He gives you a strip of > meat that is, to your surprise, well-seasoned. You give him a > tiny silver coin from your pouch. He weighs it in his palm > like a treasure. > > When you leave, half an hour later, the goblin watches you go > from the corridor mouth. He raises a small clawed hand. You > raise yours. The blue light in the hole behind you has, you > notice, stopped muttering.

Friend
Friend

Lor reads it. Lor reads it again. Lor pushes the laptop a small way toward Vex.

"You broke it," she says, quietly. "In the best way."

"It thought I was going to fight."

"It did. But you didn't."

"That's what the process was for. Right? It's just a loop. Anything can happen inside the loop. The loop holds the shape of the game. You and Claude and the dice fill in the content."

"That's exactly what it's for."

He sits back. His hair has fallen completely into his face and he doesn't bother pushing it back. Cricket purrs against his neck. The kitchen has gone the colour of butter and dark wood. Outside the window, the temple is gone — the horizon has moved on; a new vista is sliding into place: a city of crystal towers rising out of a sea, distant ships, a wide ochre sky reaching for evening.

"Lor."

"Hm."

"The wager."

"I know."

"I wrote the PROCESS.md."

"You did."

Natural Twenty
Natural Twenty

"So I lose."

Sharing The Fire
Sharing The Fire

"You wrote a thing that works. That's the only thing in this house worth more than dishes. You win."

"I do the dishes anyway."

"You do the dishes anyway."

"It's a tie."

"It's a tie."

He closes the laptop. The screen-glow fades. The kitchen is suddenly only what the kitchen always is: copper pans, terracotta pots, a small grey cat, a warm window onto a vast unfamiliar horizon.

"Lor."

"Yeah."

"What do we build next?"

She picks up the d20 and rolls it on the wood. It comes up nineteen. She looks at the number. She looks at him. She looks at the window.

Many Worlds Beyond
Many Worlds Beyond

"Whatever you can write a small loop for," she says. "Which is everything."

Outside, far in the haze, the crystal towers catch the last of the light.

Process beats prompt. Anything with an HTTP endpoint can be a tool. Now go press play on something of your own.