M Mullin Agency Keynote · The Collapsed Design Cycle · 2026
Mullin Agency · Keynote · 2026

The collapsed
design cycle.

A 30-minute walkthrough of using Claude to design and ship in days, not months. From blank canvas to live site — and every step in between.

30 minutes ~5,000 words A Mullin Agency talk Scottsdale, 2026
TL;DR

The whole talk
in thirty seconds.

The three rules

  1. 01
    Show, don't tell. Paste examples — references, screenshots, code, voice samples. Words are lossy. Examples are perfect.
  2. 02
    Spec first. Ask never. Specifications get specifications back. Questions get hedging. You're the senior; Claude is the smart junior.
  3. 03
    Three Claudes, one project. Chat for thinking. Cowork for files. Code for shipping. Match the tool to the moment.

Eight habits that compound

  1. 01Paste, don't describe.
  2. 02One conversation, per project.
  3. 03Ask for three versions, not one.
  4. 04Make it critique itself.
  5. 05Plan in Chat. Build in Code.
  6. 06Push back. Hard.
  7. 07Save the prompts that worked.
  8. 08The Linear test.

That's the talk. The next twenty-eight minutes are the why and the how.

Read the full talk
Cold open

You've probably read the predictions.

AI is going to replace designers. Or AI is going to make designers ten times more productive. Or some other twitter-thread-sized take. Most of it's wrong.

Here's what's actually true. If you know how to use it — really use it — Claude doesn't replace the work. It removes the parts of the work that were never the interesting part.

The wireframe nobody wanted to draw. The schema you procrastinated on. The fifteenth version of marketing copy. The empty-state designs you always promised to finish.

What's left, after Claude eats all of that, is the part you were always good at. Just more of it. Faster. With better tooling on the boring stuff.

In the next thirty minutes I'm going to walk you through the exact process we use at Mullin Agency for shipping work — start to finish — on two kinds of projects. A piece of functional software. And a marketing landing page. I'll show you the steps, the tools, the moments where Claude earns its rent, and the moments where Claude is the wrong answer.

At the end I'll give you three rules. If you remember nothing else from this talk — three rules. They'll get you eighty percent of the value.

Let's start.

The cycle

One pass.
Twelve stations.

Every project — software or marketing — passes through these stations. The order is roughly fixed. What changes is the depth at each station and which Claude surface you reach for.

01

Discovery

Record the call. Drop the transcript into Claude Chat. Get structured intake in 90 seconds.

Station 1 of 12
Part One

Functional
software.

You're building a SaaS dashboard. An internal tool. A B2B admin panel. Anything where the deliverable is a system that has to actually work — not just a beautiful surface. This is the harder case. So I'll start here.

Station 01
01
Recording → Transcript → Structured intake

Record. Transcribe.
Structure in 90 seconds.

You're on a Zoom call with the founder. They're describing their problem. Half of what they're saying is "Salesforce won't do this thing" and the other half is "I want it to feel like Linear."

The old way: scribble notes. Write a recap. Hope you got the gist. Send the recap a week later. Wait for the founder to correct you.

The new way: record the call. Drop the transcript into Claude Chat. Ask: "What are the actual problems being described? What are the stated requirements? What's emerging from between the lines?"

You get a structured intake document in ninety seconds. The founder hasn't even left the call.

Why this matters The single biggest source of project failure is "we built the wrong thing." Discovery is the moment that decides which side of that line you end up on. The faster you can structure what you heard, the faster you can verify with the founder that you got it right.
Station 02
02
All project context, one place

The intake document.
Single source of truth.

The intake document becomes the spine of the whole project. Stakeholders. Constraints. Success criteria. Vague aesthetic preferences. Competitive landscape. The "we tried this once and it failed" landmines.

Drop it in Claude Cowork. From now on, every conversation about this project starts with that context already loaded. No more rebriefing yourself every Monday.

You'll add to it as the project unfolds. Decisions get logged. Open questions get tagged. By week three the document is the project — everything else is a derivative.

The four pillars

What Claude needs to do great work.

Most intakes fail by being either too thin (vibes only) or too sprawling (a hundred edge cases, no priorities). A great intake is structured around four pillars. Each one has 3–4 components. If any pillar is missing, your output will be generic at exactly that pillar.

Problem

What's broken. What "fixed" looks like.

  • The real problem (not the symptom)
  • Why now — what changed?
  • Three measurable success criteria
  • The one metric that matters most
Example "Sales team manually exports CSVs from 4 systems daily. Cut export-to-quote from 60min → under 2min. The metric: median time-to-quote."
People

Who decides. Who uses it. Who not to bother.

  • Decision-maker (one person, named)
  • Day-to-day collaborator
  • End user — context, sophistication, alternative
  • The silent killers (anyone with veto power)
Example "Decides: Sarah, CEO. Day-to-day: Marcus, Head of Design. CC on everything: Eli, advisor. Don't bother: engineering."
Pattern

What to imitate. What to avoid.

  • 5–10 reference URLs they actually like
  • Existing brand assets (logo, type, palette)
  • Voice samples (how they actually talk)
  • What they explicitly don't want
Example "Likes: Linear, Stripe Dashboard, Vercel. Hates: Salesforce (overwhelming), HubSpot (corporate), anything with 'AI Magic ✨'."
History

What's been tried. Why it failed.

  • Past attempts and what went wrong
  • Hard constraints (tech, budget, timeline, compliance)
  • The "we tried this once" stories
  • The lessons the team has actually learned
Example "2024 — Retool prototype, abandoned in 3 weeks (too rigid). 2023 — Two contractors, ghosted at 80%. Lesson: trust is low. Demos > promises."
Why this is so powerful

Five things the intake unlocks that nothing else can.

A static brief in a Notion page is fine. A brief in Claude Cowork is something else entirely — it stops being a document and becomes a working partner. Here's what changes the moment your intake is loaded.

  1. 01
    Memory
    Ambient memory across the entire project.

    Once the intake lives in Cowork, every downstream conversation — wireframes, schema, copy, code review — starts with full context already loaded. You never re-brief. Decisions get logged automatically. New person joins on day 14? Drop them into the conversation; they're caught up in 30 seconds. The intake stops being a document and becomes the project's living memory.

    What this kills: the "wait, did we already decide that?" Slack thread. The "let me catch you up" hour. The fourth meeting that retreads ground from week two.
  2. 02
    Gap analysis
    Tells you what you didn't ask.

    Drop your draft intake into Claude and ask: "What's missing? What questions haven't I asked the founder?" Claude finds the blindspots — at machine scale, with no ego. The "we never thought to ask" trap that kills projects in week six? Solved before you commit to a direction.

    Real output: "You said the timeline is 8 weeks but you haven't named who decides scope changes. You've defined the success metric but not how it's measured. The audience is 'inside sales reps' — is that 5 people or 50? You've named the founder but not who can override her."
  3. 03
    Pressure-test
    Stress-tests every assumption.

    Claude challenges every claim. Surfaces the fragile assumptions before they sink the project. Makes you defend the parts you skimmed past. It's the senior partner you can't always afford — at 3am, on demand, with no fatigue.

    Real output: "You said the audience is 25–40 and 'tech-comfortable.' Is that founder belief, customer interview data, or your assumption? If wrong, the entire UX direction shifts. Worth confirming before Station 06."
  4. 04
    Derivatives
    One source of truth. Infinite views.

    Same intake document. Claude reformats it for any audience: an engineering spec, a board update, a sales positioning paragraph, a designer's brief, an investor one-pager. One source. Many derivatives. All in sync. No more four documents that say almost the same thing but contradict each other in week six.

    The prompt: "Generate the engineering version of this intake — focused on data shapes, integration points, auth model, and SOC 2 implications. Keep the constraints. Drop the audience prose." Two minutes later, the spec is ready.
  5. 05
    Reach
    A research surface area no human team can match.

    Discovery surfaces references — competitor sites, the founder's LinkedIn and Substack, industry articles, the moodboard URLs, the audience's social presence. Claude crawls, parses, and synthesizes all of it in minutes. Every downstream decision sits on a research foundation no human team could assemble at this speed — and that competitive teardown that used to take a junior two days now takes Claude two minutes.

    The prompt: "Crawl the eight competitor URLs in the intake. Pull pricing, positioning, primary CTA, onboarding flow. Identify the white space. Then crawl the founder's last 20 LinkedIn posts and extract her exact voice — phrases she uses, words she avoids, the cadence of her sentences."
In full

What an excellent intake actually looks like.

Below is a real-shape intake document for a fictional project called Loopstack — a sales-ops internal tool. Notice how short it is. Notice how each section is opinionated, not exhaustive. Notice how every word would change Claude's output.

~/projects/loopstack/intake.md

# Intake — Loopstack

v3·last edited May 12, 2026· APPROVED · Sarah Chen
PROJECT BASICS
Project basics
  • Codename: Loopstack
  • Type: B2B SaaS internal tool
  • Stage: Zero to one
  • Timeline: 8 weeks to demo-ready
  • Hard deadline: Aug 14 — board meeting (non-negotiable)
PROBLEM
The real problem
Sales team manually exports CSVs from 4 systems each morning. ~10 hours/week wasted per rep. We've lost 2 deals last quarter from delayed quotes (>6hr response time).

The trigger: Q3 sales hire is hitting wall #1 on day one. We need this before they quit.
SUCCESS
What "fixed" looks like
  • Cut export-to-quote from 60min → under 2min
  • Active reps using daily: 12 → 35 (whole team)
  • Customer-facing time saved: ~8hr/week per rep
The one metric: median time-to-quote.
PEOPLE
Stakeholders
  • Decides: Sarah Chen, CEO
  • Day-to-day: Marcus Bell, Head of Design
  • CC on everything: Eli Park, Founder/Advisor
  • Don't bother: Engineering team (heads-down on platform v2)
AUDIENCE
End users
Inside sales reps. Ages 25–40. Tech-comfortable but not engineers. Desktop during work hours, currently in Excel + email all day.

Their alternative if we don't ship: the spreadsheet jungle continues. They will not stop quoting — they'll just hate it.
CONSTRAINTS
Constraints
  • Must: Embed in Salesforce. SOC 2 ready architecture from day one.
  • Stack: TypeScript + React preferred (team comfort)
  • Budget: $40K design + build · $4K/mo ongoing
  • Mobile: Not needed for v1. Maybe v2.
PATTERN
References & voice
Likes: Linear (clean, fast, opinionated). Stripe Dashboard (data-dense but readable). Vercel (motion, polish, modernity).
Hates: Salesforce (overwhelming). HubSpot (corporate). Anything with "AI Magic ✨" in the marketing.

Voice for any UI copy: Direct. Self-aware. Not too clever.
"Three quotes ready to send"
"AI-powered quote generation completed"
HISTORY
Past attempts & landmines
  • 2024 — Retool prototype. Built in 2 weeks, abandoned in 3. Too rigid; couldn't customize the workflow steps.
  • 2023 — Two contractors. Shipped 6 weeks late. Bug-ridden. Last contractor ghosted at 80% complete. Codebase abandoned.
The lesson: trust is low. Demos beat promises. Bias toward shipping small things often over big things eventually.
Station 03
03
Real references in, visual grammar out

Moodboard, the
right way.

This is where most people misuse Claude. They prompt: "create a moodboard for a fintech dashboard." They get something generic. They get frustrated. They go back to scrolling Dribbble.

What works: collect eight to twelve actual reference screenshots yourself. Real products you actually like. Paste them all into Claude Chat. Ask: "What's the visual grammar here? What do these have in common?"

You'll get specific, useful observations. Color palette tendencies. Type pairings. Density choices. The role of negative space. The treatment of data viz.

Now you have a brief for the visual system. Grounded in things you like — not in the average of the internet.

What to extract

Eight dimensions of visual grammar.

"What do these have in common" is too broad. Ask Claude to analyze each reference across these eight dimensions, then summarize the shared rules. The summary becomes your design brief.

01 / Palette
What colors recur. What roles they play.

Don't just collect hex codes — note which colors are canvas, which are accents, which are decoration only.

Output: "Klein blue accent on cream canvas. Ink for text. Ochre + sage decoration only — never as backgrounds."
02 / Type
Display, body, mono. How they pair.

Serif/sans/mono mix. Display + body pairing. Italic usage. Letter-spacing on labels.

Output: "Variable serif (Fraunces) for display, geometric sans (Inter) for body, mono (JetBrains) for labels."
03 / Density
How packed. Where the whitespace lives.

Negative space ratio. Hero height. Content max-width. Padding scale.

Output: "60–70% empty. Hero ~70vh. Content blocks max 60ch. Generous padding around section heads."
04 / Motion
Subtle, expressive, or absent.

Reveal style on scroll. Hover behavior. Page transitions. What's animated and what's not.

Output: "Subtle. Reveal on scroll only. Magnetic hover on CTAs (4–6px max). No autoplay, no parallax."
05 / Photography
Photo, illustration, or none.

If photo: editorial vs product vs lifestyle. If illustration: line vs flat vs textural. If none: what fills the visual moments.

Output: "No photography. Custom SVG illustrations and brand-color blocks only. Charts use 1.5px line strokes."
06 / Iconography
Line vs filled. Custom vs stock.

Stroke weight. Joins (rounded vs miter). Whether icons sit in containers or stand alone.

Output: "1.5px stroke, rounded joins. Custom set, not Heroicons. Icons sit at body-text scale, no decoration circles."
07 / Grid
12-col, asymmetric, or modular.

Column structure. Symmetry vs intentional asymmetry. Magazine vs SaaS vs portfolio layouts.

Output: "Asymmetric hero (1.65fr / 0.85fr). 12-col body. Magazine-style work grid alternating left/right."
08 / Voice
How the UI actually talks.

Sentence case vs Title Case. Punctuation habits. Numerals vs words. Length of microcopy.

Output: "Direct, sentence case. No exclamation marks. Numerals over words ('3 cards' not 'three cards'). Short labels."
The prompt that works

Copy this. Paste your references.

The exact prompt we use at Mullin Agency. Reusable across every project. Notice how specific the output format is — that's what gets you a usable analysis instead of a paragraph of vibes.

I'm building [project type] for [audience]. Below are 8 references — products and designs I admire.

For each reference, observe across these dimensions:

  1. Palette — colors and their roles
  2. Type — display, body, mono and how they pair
  3. Density — how packed, where the negative space is
  4. Motion — subtle, expressive, or absent
  5. Photography — photo, illustration, abstract, or none
  6. Iconography — line vs filled, stroke weight, custom or stock
  7. Grid — 12-col, asymmetric, magazine, modular
  8. Voice — the tone of UI copy and labels

Then tell me what these references SHARE. That shared grammar becomes my brief.

Bonus: what are these designs deliberately NOT doing? What's the negative space in this taste?

Output as a structured document I can paste into a new project.
Pro tip · Range
Add three non-design references.

A film still (Wes Anderson, Lynne Ramsay). A magazine spread (Apartamento, The Gentlewoman). An album cover. An architectural photo. Pure-design references converge toward an average. Non-design references break you out of the SaaS gravity well.

Pro tip · Negative space
Ask what they're NOT doing.

"What are these references deliberately avoiding?" The answer is where your taste actually lives. "No carousels. No drop shadows. No 'AI magic ✨' decoration." Knowing the no's matters more than knowing the yes's.

In full

What an excellent moodboard analysis actually looks like.

The Loopstack moodboard analysis, derived from 8 references plus 3 non-design ones. Note how it ends with a copy-pasteable design tokens block — directly handoffable to Station 10 (mockups).

~/projects/loopstack/moodboard.md

# Moodboard analysis — Loopstack

v1·derived from 8 + 3 references· APPROVED · Marcus Bell
PALETTE
Palette & roles
Single bold accent (Klein blue) against near-neutral canvas. Decoration colors (ochre, sage, tomato) appear at small scale only — never as backgrounds.
#1B1AFF
#F4EFE6
#0F0F0F
#E8B33D
#FF4E2B
#8A9A6B
TYPE
Type system
Variable serif paired with a clean sans. Mono used only for labels and metadata. Italic accents on display.
AaDisplay: Fraunces — variable, italic-friendly. H1 96px / line-height 0.94 / italic accents.
AaBody: Inter — 17px / line-height 1.55. Weights 400/500/600.
AaMono: JetBrains — labels at 11px, letter-spacing 0.18em, UPPERCASE.
DENSITY
Density & whitespace
60–70% empty space. Generous whitespace around section headers. Content blocks capped at 60–64ch. Hero takes ~70vh.
MOTION
Motion principles
Subtle and earned. Reveal on scroll (fade + small translateY). Magnetic hover on primary CTAs (4–6px max). No autoplay. No parallax. No scroll-jacking.
PHOTOGRAPHY · ICONOGRAPHY · GRID
Visual language
Photography: none. Custom SVG illustrations and brand-color blocks only.
Iconography: 1.5px stroke, rounded joins. Custom set (not Heroicons). Icons at body-text scale.
Grid: Asymmetric hero (1.65fr / 0.85fr). 12-col body. Magazine-style work grid alternating left/right.
VOICE
UI voice
Direct, sentence case, no marketing speak. No exclamation marks. Numerals over words.
"Three quotes ready"
"Your AI-powered quotes await! ✨"
ANTI-REFERENCES
What these designs deliberately don't do
  • No gradients on text (text stays solid)
  • No drop shadows on UI cards (use borders or single dividers)
  • No icon-in-a-circle decoration
  • No carousel components (anything important gets its own moment)
  • No "AI magic ✨" language. The word "AI" appears only when essential.
TRANSLATION
Design tokens — ready for Station 10
/* Palette */
--blue: #1B1AFF;
--cream: #F4EFE6;
--cream-2: #EAE3D4;
--ink: #0F0F0F;
--ochre: #E8B33D;
--tomato: #FF4E2B;
--sage: #8A9A6B;

/* Type */
--f-display: "Fraunces", ui-serif, Georgia, serif;
--f-body: "Inter", system-ui, sans-serif;
--f-mono: "JetBrains Mono", monospace;

/* Layout */
--pad-x: clamp(20px, 4vw, 56px);
--max: 1440px;
--r: 14px;
--ease: cubic-bezier(0.2, 0.7, 0.2, 1);
Station 04
04
One page. Six sections. Signed off before any design.

Product brief.
One page. Signed off.

Combine the intake document with the moodboard analysis. Have Claude draft the product brief. One page.

It contains: the positioning, the audience, the three things the product must do, the three things it explicitly will not do, the rough scope and timeline.

Read it. Edit it. Send it to the founder. Get written sign-off before you've designed a single screen.

This step alone saves two weeks downstream. Most projects don't fail because of bad design. They fail because the team disagreed about what they were building, and the disagreement didn't surface until week six.

Anatomy of a great brief

Six sections. Every word earns its place.

The brief is not a long-form document. It's a contract. Six tightly scoped sections, ~250 words total. If a section can be deleted without changing the project — delete it.

Positioning

One sentence. What this product is.

  • Format: "X is a Y for Z that does W"
  • Specific enough to exclude what it isn't
  • Survives reading aloud to a stranger
Example "Loopstack is a quote-builder for inside sales teams that turns Salesforce, Stripe, and HubSpot data into customer-ready quotes in under 2 minutes."
Why now

The trigger. The pressure.

  • What changed (hire, deal, board, cycle)
  • What happens if nothing ships
  • The forcing function
Example "Q3 sales hire hits wall #1 on day one. Two deals lost last quarter to slow quotes. Without this, attrition this quarter."
Three musts

The only three things this product must do.

  • Concrete capabilities, ranked
  • Each one is a verb + object + measurable bar
  • Three. Never five. Never ten.
Example "1. Pull live data in one click. 2. Generate branded PDF in <30s. 3. Track quote → close conversion per rep."
Three nots

The three things it explicitly will not do.

  • Hard scope boundaries
  • Each "not" prevents a future "wait, but…"
  • The bravest section in the brief
Example "Not custom contract logic (lives in CPQ). Not mobile-first (v2). Not multi-currency (USD only at launch)."
Success

What "done" actually means.

  • Measurable outcomes (numbers, not vibes)
  • The one metric you'd live and die by
  • The launch milestone with a date
Example "Median time-to-quote: 60min → under 2min. Active reps daily: 12 → 35. Demo-ready by Aug 14."
Risky bet

The one assumption that, if wrong, sinks it.

  • State the bet plainly
  • State the mitigation plainly
  • State the circuit-breaker (when do we revisit?)
Example "That sales reps will adopt a new tool with no mandate. Mitigation: weekly demos, friction logging. Circuit-breaker: if adoption < 60% by week 4, revisit."
The prompt that works

Hand Claude the intake + moodboard. Ask for the brief.

The constraint is the magic. Notice the word cap, the format requirement, and the "every sentence must change the project" test. That's what produces a brief instead of a slide deck.

Draft a one-page brief for [project codename].

You have:
  — The intake document (attached)
  — The moodboard analysis (attached)

Write the brief with these six sections, in this order:

  1. POSITIONING — one sentence: "X is a Y for Z that does W"
  2. WHY NOW — the trigger; what changed
  3. THREE MUSTS — the only three things this product must do
  4. THREE NOTS — the three things it explicitly will not do
  5. SUCCESS — the measurable outcome that defines "done"
  6. RISKY BET — the one assumption that, if wrong, sinks the project

Constraints:
  — ONE PAGE total. Maximum 250 words.
  — Active voice. Sentence case. No marketing fluff.
  — Every sentence must change the project if removed. If a sentence could survive deletion, delete it.

Output as a structured markdown document I can paste into the project folder and send to the founder for sign-off.
Pro tip · Constraint
Three is sacred.

Force three. Not five. Not ten. THREE. The constraint is the magic. When you allow ten, you get ten generic capabilities that mean nothing. When you force three, you get the three that actually matter — sharply argued because they had to fight for the slot.

Pro tip · The wallpaper test
Print it. Tape it to the wall.

Have someone unrelated walk by and read it. Ask: "What is this product?" If they can't say it back to you in one sentence — the brief is wrong. Edit. Repeat. A great brief survives a stranger reading it cold.

In full

What an excellent brief actually looks like.

The Loopstack brief — drafted from the intake (Station 02) and the moodboard (Station 03), one page, locked, signed. The third document in the artifact chain. Notice how every sentence carries weight; nothing is filler.

~/projects/loopstack/brief.md

# Brief — Loopstack

v1·ONE PAGE · LOCKED · 247 words· APPROVED · Sarah Chen · May 14, 2026
POSITIONING
What Loopstack is
Loopstack is a quote-builder for inside sales teams that turns Salesforce, Stripe, and HubSpot data into customer-ready quotes in under 2 minutes.
WHY NOW
The trigger
Q3 sales hire is hitting wall #1 on day one. We've lost 2 deals last quarter to slow quotes (>6hr response time). Without this, we expect attrition this quarter — and we miss the back-half number.
THREE MUSTS
The only three things this product must do
  • Pull live data from Salesforce, Stripe, and HubSpot in one click
  • Generate a branded PDF quote in under 30 seconds
  • Track quote → close conversion per rep
THREE NOTS
What it explicitly will not do
  • Custom contract logic (lives in Salesforce CPQ already)
  • Mobile-first (desktop-only for v1; mobile is v2)
  • Multi-currency (USD only at launch)
SUCCESS
What "done" looks like
Median time-to-quote: 60min → under 2min.
Active reps daily: 12 → 35.
Demo-ready by Aug 14 — board meeting (non-negotiable).
RISKY BET
The one assumption that, if wrong, sinks it
That sales reps will adopt a new tool with no mandate.
Mitigation: weekly demos, friction logging, immediate iteration.
Circuit-breaker: if adoption is below 60% by week 4, we revisit the approach (not the deadline).
SIGN-OFF
The contract
Approved by Sarah Chen, CEO — May 14, 2026.
Brief locked. Begin design. Scope changes from this point require a new conversation, not a new email.
Station 05
05
React to options, don't start from blank

Brand identity.
Five directions in ten minutes.

For internal software, brand is usually thin. Logo, color, type, voice. Maybe a small icon set. For marketing or external products, the brand is most of the design — and most of the conversation with the founder.

Either way, the move is the same: react to options instead of starting from blank. I use Claude Cowork to generate four to five distinct directions, then refine the one that lands. Ten minutes from the moodboard analysis to having a real direction in front of the founder.

Anatomy of a brand direction

Six things every direction must include.

A "direction" is not a logo and three colors. A real direction is a system you could hand to another designer and have them build something coherent. Six components. Each one defensible.

Concept

One line. What this brand feels like.

  • An evocative metaphor, not a description
  • Survives reading aloud to a stranger
  • Defensible: you could argue for it in a sentence
Example "Loopstack feels like a private trading desk: ink, focus, and one bright signal."
Palette

Colors with defined roles.

  • Primary, accent, ink, surface, decoration
  • Hex codes, not vibes
  • Each color has a job — none are interchangeable
Example "Klein blue #1B1AFF = single accent. Ink #0F0F0F = text. Cream #F4EFE6 = canvas. Ochre = decoration only."
Type pairing

Display, body, mono — and why.

  • Display sets the personality
  • Body carries the workload
  • Mono earns its place on labels and metadata
Example "Fraunces (display, italic-friendly). Inter (body, neutral workhorse). JetBrains Mono (labels, metadata, code)."
Voice

How the brand actually talks.

  • Three concrete voice rules
  • One ✓ example, one ✗ example for each
  • Sentence case, punctuation habits, numerals
Example "Direct. Sentence case. No exclamations.
Three quotes ready.
Your AI quotes are here! ✨"
Visual style

Photo, illustration, abstract, or none.

  • What fills visual moments — and what doesn't
  • Iconography rules (line weight, joins, custom vs stock)
  • Charts, data viz treatment
Example "No photography. Custom SVG illustrations + brand-color blocks. Charts: 1.5px line, no fills. Icons: rounded joins, custom set."
Hero pattern

The signature visual move.

  • The one thing every page does
  • The visual fingerprint a stranger would recognize
  • The "you'd know it anywhere" detail
Example "Italic display word as the hero focus, set on a single line with a kinetic rotating accent. Recurs in every section title."
The prompt that works

Force five truly distinct directions.

The default failure mode of a brand prompt is getting five variations of the same idea. The fix is structural: force the output format, ground every direction in the moodboard, and demand defensibility.

Generate five distinct brand identity directions for [project codename].

You have:
  — The intake document (attached)
  — The moodboard analysis (attached)
  — The brief (attached)

For each direction, output:

  1. NAME — one word that captures the direction (e.g., "Editorial", "Klein", "Sunset")
  2. CONCEPT — one evocative sentence (a metaphor, not a description)
  3. PALETTE — primary, accent, ink, surface, decoration — with hex codes and roles
  4. TYPE PAIRING — display, body, mono families with brief reasoning
  5. VOICE — three rules, each with one ✓ and one ✗ example
  6. VISUAL STYLE — photography / illustration / abstract / none + iconography
  7. HERO PATTERN — the signature visual move that shows up on every page
  8. WHAT KIND OF PRODUCT THIS SUGGESTS — the company that should pick this

Constraints:
  — Five truly DIFFERENT concepts. Not five variations of one idea.
  — Each must be defensible against the brief. State WHY it fits.
  — At least one direction should be slightly risky/memorable.
  — No safe-five. If two directions could be merged, kill one and replace it.

Output as a side-by-side comparison document I can show the founder for sign-off.
Pro tip · Logo last
Build the system. The mark falls out of it.

Most people start with the logo. Don't. The logo is the last 5%, not the first 50%. The brand SYSTEM — color, type, voice, signature pattern — is what makes a brand recognizable. The mark is the cherry on a brand that already works without it. Build the system first. The mark almost designs itself.

Pro tip · Pick the nervous one
Same rule as the positioning sentence.

When five directions sit in front of you, the safe one is forgettable. The direction that makes you slightly nervous is almost always the right one. It's the one with a point of view. The one that risks being wrong. The one a stranger would describe back to you in their own words. Safe brands die quietly. Risky brands get remembered.

In full

What five directions actually look like.

The Loopstack brand-directions document — five truly distinct concepts, each defensible against the brief. Then the SELECTED direction (Editorial) expanded into the full system. Continues the artifact chain: intake → moodboard → brief → brand.

~/projects/loopstack/brand-directions.md

# Brand directions — Loopstack

v1·five directions· SELECTED · Editorial · May 16, 2026
01 Klein

"A private trading desk. Ink, focus, one bright signal."

Inter + Mono · Single accent · Mathematical
SELECTED 02 Editorial

"A trade publication, not an app. Read this seriously."

Fraunces + Inter + Mono · Italic accents
03 Sunset

"Warm and approachable. Sales is human work."

Söhne + Tiempos · Optimistic · Photo-friendly
04 Sage

"Quiet competence. Built by adults, for adults."

GT America + Mono · Mature · Earth-tone
05 Mono

"Pure utility. Zero decoration. Just the work."

JetBrains Mono for everything · Single accent
SELECTED · 02 Editorial — full system applied
Palette
canvas · #F4EFE6
ink · #0F0F0F
accent · #1B1AFF
decor · #E8B33D
decor · #FF4E2B
decor · #8A9A6B
Type
AaDisplay: Fraunces 96px / italic accents / line-height 0.94
AaBody: Inter 17px / weights 400 / 500 / 600
AaMono: JetBrains 11px / 0.18em / UPPERCASE labels
Voice rules
1. Direct. Sentence case.
   "Three quotes ready."
   "Your quotes await! ✨"

2. Specific over abstract.
   "Quote in 2 minutes."
   "Streamline your workflow."

3. Numerals over words.
   "3 deals at risk."
   "Three deals at risk."
Hero pattern
The italic moment. Every hero headline pairs a roman display with one italic word in Klein blue. The italic word rotates in the homepage hero ("close deals" / "tell stories" / "do the work"). The italic recurs in section titles, work titles, and the final close. It's the brand fingerprint.
Sample headlines (in voice)
Quotes that close themselves.
Built for the next 35 reps.
From four systems to one screen.
Station 06
06
Sections, sub-sections, modals, states

UI map.
The tree that everything hangs on.

This is where I always used to procrastinate. Sitting down in Figma and drawing boxes that represent screens. Day three of any project, I'd still be staring at an empty canvas.

Now: I describe the product to Claude Chat in a paragraph, hand it the brief, and ask for the full information architecture. I get a tree, edit it, and within an hour have a real map.

I get a tree. I edit the tree. The tree becomes the source of truth for everything downstream. Every wireframe will reference it. Every screen will live somewhere in it.

Anatomy of a UI map

Six layers. Most maps only have one.

A real UI map isn't just the tree of screens. It's six layers stacked on top of each other. Skip any one and you'll discover the gap in week eight, when the engineer says "wait, what happens if there's no data here?"

Routes

Every screen has a stable URL.

  • Top-level paths match top-level sections
  • Detail views use :id params
  • Filter / view state lives in query params
Example "/quotes, /quotes/new, /quotes/:id, /quotes/:id/edit, /customers/:id?tab=quotes"
Hierarchy

The tree itself. Max depth: 3.

  • 5 top-level sections or fewer
  • Sub-sections under each, never more than 5
  • Depth never beyond 3 — anything deeper is a UX problem
Example "Dashboard · Quotes · Customers · Settings — each with 2–3 sub-sections. Total 14 distinct screens."
Modals

First-class. Named. With state logic.

  • Every modal has a name, not "and then a popup"
  • Trigger location and dismiss path defined
  • Treated as their own screen for design purposes
Example "InviteTeammate — triggered from Settings → Team header. Dismiss returns to Team list."
States

Empty, loading, error, success, disabled.

  • Every major view needs at least empty + loading designed
  • Error states for every form
  • Success confirmations that aren't toast notifications
Example "Dashboard: empty (no data day 1) · loading (skeleton) · standard · error (data fetch failed)."
Flows

The dynamic layer. Paths through the tree.

  • New user onboarding (signup → first action → return)
  • Daily returning use (login → primary task → exit)
  • Edge cases (admin actions, recovery, deletion)
Example "NEW REP: /login → /onboarding → integration setup → /dashboard → CTA: build first quote."
Access

Who can see what.

  • Roles defined explicitly (Admin / Manager / Member / Public)
  • Permissions matrix — every role × every section
  • What logged-out users see (the marketing layer)
Example "Admin → full settings. Rep → only own quotes. Logged-out → /login + marketing only."
The prompt that works

All six layers. In one ask.

The default failure mode is getting back a tree without states, or routes without flows. Force all six layers in the same prompt. The output becomes a real spec, not a mind map.

Draft the complete UI map for [project codename].

You have:
  — The intake document (attached)
  — The brief (attached)
  — The brand directions (attached)

Output the UI map with all six layers:

  1. ROUTES — every screen with its URL path
  2. HIERARCHY — sections and sub-sections (max depth 3)
  3. MODALS — every dialog with name, trigger, dismiss path
  4. STATES — for every major view: empty / loading / error / success / disabled
  5. FLOWS — three named user flows (new user, returning user, admin)
  6. ACCESS — a matrix of which role sees what (Admin / Manager / Member / Public)

Constraints:
  — Max 5 top-level sections. If you need more, you're missing a parent.
  — Max 3 levels deep. Anything deeper is a UX problem.
  — Every screen must be reachable from at least 2 other screens. No orphans.
  — Every section must have its empty state designed first.
  — Use the brand voice from the brand directions for all UI copy.

Output as a structured markdown document I can paste into the project folder and hand to engineering.
Pro tip · Empty first
Design the empty state first.

Before the polished hero, before the populated table — design the day-one moment. Most products die in the empty state. A blank table. A "no results" message. An awkward "add your first item" button. Get this right and the rest of the product feels mature. Get it wrong and the whole thing feels half-finished, no matter how good the populated state is.

Pro tip · No orphans
Two ways in. Always.

Every screen in your map must be reachable from at least two other places. Nav link plus a contextual link. Breadcrumb plus a back button. Orphan screens become bugs you find in week eight — the "I clicked something and now I can't get back" moment. Audit the map. Find the orphans. Add the second route.

In full

What an excellent UI map actually looks like.

The Loopstack UI map — six layers, ready to hand to engineering. Continues the artifact chain: intake → moodboard → brief → brand → UI map. Each artifact tighter and more concrete than the last.

~/projects/loopstack/ui-map.md

# UI map — Loopstack

v1·derived from brief· APPROVED · Marcus Bell · May 17, 2026
ROUTES
Every screen, every URL
/ Dashboard
/quotes Quote list
/quotes/new Quote builder (new)
/quotes/:id Quote detail
/quotes/:id/edit Quote builder (editing)
/customers Customer list
/customers/:id Customer detail (tabs: quotes, notes, history)
/settings Settings index (admin only)
/settings/team Team management
/settings/integrations SF / Stripe / HubSpot connectors
/settings/billing Subscription & usage
/login Auth
/onboarding First-time setup wizard
HIERARCHY
The tree (max depth 3)
Dashboard
  └── Activity feed
  └── KPI cards

Quotes
  └── Active
  └── Drafts
  └── Sent

Customers
  └── List
  └── Detail (Quotes / Notes / History)

Settings (admin only)
  └── Team
  └── Integrations
  └── Billing
MODALS
First-class dialogs
InviteTeammate · trigger: Settings → Team header · dismiss: Team list
ConfirmDelete · trigger: any list row "delete" · dismiss: same view
IntegrationSetup · trigger: Settings → Integrations · dismiss: success or cancel
QuoteSent · trigger: after Send action · dismiss: redirect to Quote detail
ConflictWarning · trigger: two reps quote same customer · dismiss: choose primary
STATES
The unglamorous five
Dashboard: empty (no data — onboarding incomplete) · loading (skeleton) · standard · error (data fetch failed; CTA: retry)

Quote list: empty (no quotes — CTA: build first quote) · loading · standard · filtered-empty (filters yield no results)

Quote builder: standard · saving (autosave indicator) · error (validation failed) · success (transition to Quote detail)

Settings → Integrations: not connected (3 cards, all empty) · partial (1 of 3 connected) · connected (all 3) · error (auth expired)
FLOWS
Three named paths through the tree
1. NEW REP ONBOARDING
  /login /onboarding integration setup /dashboard "build first quote" CTA

2. RETURNING USER (daily)
  /login /dashboard /quotes (active) /quotes/new Send QuoteSent modal

3. ADMIN INVITES TEAM
  /settings/team InviteTeammate modal email sent invitee accepts via link /onboarding
ACCESS
Who can see what
Role Dashboard Quotes Customers Settings Team Billing
Admin full full full full full full
Manager full full full view view none
Rep own only own own none none none
Logged-out none none none none none none
Station 07
07
HTML wireframes, clickable on day three

Wireframes.
In HTML, not Figma.

Old way: open Figma. Draw boxes. Move boxes. Three days later, have wireframes.

New way: have Claude Code generate raw HTML wireframes of every screen in your UI map. Black borders. Gray fills. System font. No design.

Why HTML and not Figma? Because HTML is real. You can click through it on your phone. You can put it in front of the founder on day three.

The wireframes are throwaway. But the act of building them clarifies the product. "Wait, why does this require three nested modals to do?" is the kind of question you only ask once you've tried to wireframe it.

Anatomy of a great wireframe

Six things that separate truth from theatre.

Most wireframes are theatre. They look like wireframes but they don't do the job — they don't surface the real product questions. A great HTML wireframe forces you to confront six things that Figma lets you skip.

Skeleton

Semantic HTML. Real DOM structure.

  • Use real elements: header, nav, main, section, footer
  • Real headings (h1, h2, h3) with real hierarchy
  • Real form elements, not divs pretending to be inputs
Why it matters The skeleton is the only thing that survives from the wireframe to the build. Get it right now, save a week later.
Real copy

No lorem ipsum. Brand voice from day one.

  • Headlines in the actual brand voice
  • Button labels that say what they do
  • Empty-state copy you'd actually ship
Why it matters Lorem ipsum lies. Real copy turns wireframes into truth-tellers — you find the labels that don't work before they're fixed in design.
Real data

Realistic shapes. Not "Lorem Customer Inc".

  • Table headers match the API contract
  • Form fields use realistic field names + types
  • Numbers, dates, status pills look real
Why it matters Real data exposes density problems. "Wait, that table needs 9 columns?" is the kind of question you only ask once you see realistic content.
Working interactions

Forms submit. Modals open. Nav goes places.

  • Every link points to a real URL in the wireframe set
  • Modal triggers actually open (even if just an alert)
  • Forms have a submit handler (even if it just logs)
Why it matters You can hand the URL to the founder and they can click around. You don't have to narrate the demo.
Mobile-first

Wireframe at 380px before anything else.

  • Build for mobile viewport first
  • Expand to tablet, then desktop
  • Catch the "this needs three columns" problem on day one
Why it matters Desktop hides sins. If it works on a phone, it works everywhere — including the founder reviewing it on the train.
Both states

Empty + populated. Always two files.

  • Every list view: list.html + list-empty.html
  • Every form: standard + error state stub
  • Every dashboard: day-one + populated
Why it matters The empty state is where most products die. Make it a separate wireframe so it gets the same care as the populated state.
The prompt that works

Hand the UI map to Claude Code. Get a clickable repo back.

Notice the demand for both states, semantic HTML, and a deployable repo. The wireframes aren't a deliverable — they're a working environment.

Generate raw HTML wireframes for [project codename].

You have:
  — The brief (attached)
  — The brand directions (attached)
  — The UI map (attached)

For every route in the UI map, output a wireframe HTML file.

Each wireframe must include:
  1. SEMANTIC HTML — real header, nav, main, section, footer
  2. REAL COPY — no lorem ipsum. Use the voice rules from brand directions
  3. REAL DATA — realistic table headers, button labels, form fields
  4. WORKING NAV — every link goes somewhere; back button always works
  5. MOBILE-FIRST — design at 380px viewport first, then expand
  6. BOTH STATES — render empty AND populated for any list/dashboard
  7. NO STYLING beyond the bare minimum (system font, max-width, dashed borders)

Output structure:
  — One HTML file per route in /wireframes/
  — One index.html linking to all of them
  — One README.md describing how to navigate
  — All in a single git repo I can host on Netlify in 60 seconds

Constraints:
  — Skeleton only. No CSS beyond bare minimum.
  — Every screen must include the modal triggers from the UI map.
  — Every form must have at least one error-state stub.
  — Throwaway-grade code. Not production.
Pro tip · Real copy
Wireframes with lorem lie.

Lorem ipsum makes every screen look the same length, the same density, the same vibe. Use REAL copy — drafted from the brand voice — and three problems surface immediately: a header that's too long, a label that's confusing, a button that says nothing. Real copy turns wireframes from theatre into truth-tellers.

Pro tip · Phone test
Open the URL on your phone.

Then walk around with it for 10 minutes. Try to do the primary task. Find every awkward tap, every missing back button, every place you have to pinch-zoom. Fix them before the founder ever sees the wireframes. Desktop hides too many sins. The phone is the ultimate stress test.

In full

What an excellent wireframe set actually looks like.

The Loopstack wireframes — a deployable repo with one file per route, both states for every list, real copy, real data. The sixth artifact in the chain: intake → moodboard → brief → brand → ui-map → wireframes.

~/projects/loopstack-wireframes/

# Wireframes — Loopstack

v1·22 wireframes · clickable· DEPLOYED · loopstack-wf.netlify.app
REPO STRUCTURE
One file per route. One repo. One Netlify deploy.
loopstack-wireframes/
├── index.html · landing + nav to all wireframes
├── README.md · how to navigate this set
├── _shared.css · bare minimum styles only
├── dashboard.html · /
├── quotes/
│  ├── list.html · /quotes
│  ├── list-empty.html · empty state variant
│  ├── new.html · /quotes/new
│  ├── detail.html · /quotes/:id
│  └── edit.html · /quotes/:id/edit
├── customers/
│  ├── list.html · /customers
│  ├── list-empty.html · empty state variant
│  └── detail.html · /customers/:id (tabs)
├── settings/
│  ├── index.html · /settings
│  ├── team.html · /settings/team
│  ├── integrations.html · /settings/integrations
│  └── billing.html · /settings/billing
├── auth/
│  ├── login.html · /login
│  └── onboarding.html · /onboarding
└── modals/
   ├── invite-teammate.html
   ├── confirm-delete.html
   ├── integration-setup.html
   ├── quote-sent.html
   └── conflict-warning.html
SAMPLE WIREFRAME
What one wireframe actually looks like
The dashboard wireframe — semantic HTML, real copy in the brand voice, real data shapes, working nav. 22 lines of HTML you could open on a phone right now.
<!-- /dashboard.html · empty state in dashboard-empty.html -->
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>Dashboard · Loopstack</title>
  <link rel="stylesheet" href="/_shared.css" />
</head>
<body>

<header>
  <a href="/">Loopstack</a>
  <nav>
    <a href="/">Dashboard</a>
    <a href="/quotes/list.html">Quotes</a>
    <a href="/customers/list.html">Customers</a>
    <a href="/settings/index.html">Settings</a>
  </nav>
</header>

<main>
  <section aria-labelledby="welcome">
    <h1 id="welcome">Good afternoon, John.</h1>
    <p>3 new signups since yesterday · 2 quotes need follow-up</p>
  </section>

  <section aria-labelledby="kpis">
    <h2 id="kpis">This week</h2>
    <ul>
      <li><strong>$184,210</strong> MRR · +12.4% vs last week</li>
      <li><strong>3,421</strong> Active users · +8.2%</li>
      <li><strong>2.1%</strong> Churn · −0.3%</li>
    </ul>
  </section>

  <a href="/quotes/new.html">Build a quote →</a>
</main>

<footer>Loopstack · v0.1 wireframe · localhost</footer>
</body></html>
WHAT STAYS · WHAT GOES
The wireframe is throwaway. Mostly.
Stays into production: the DOM structure · the routes · the component naming · the nav model · the form fields · the empty-state copy

Throwaway: the dashed borders · any inline styles · the placeholder values · the bare-minimum CSS · the "wireframe" indicators

The 50% rule: when you start the real build at Station 11, half of the wireframe code becomes the foundation of the production code. The other half gets deleted in commit one.
Station 08
08
Most design problems are data problems in a wig

Database schema.
Even if you don't build it.

Here's where most designers tap out. Database schema isn't a designer thing.

I'm going to push back. Even if you don't build the schema yourself, draft it. Because your design will live or die based on what data exists and what the system can return.

Have Claude Code write a schema. Have it explain the relationships. Push back on what doesn't make sense. Edit it. Make it match the actual product.

Most "design problems" are actually data problems wearing a wig. The act of getting the schema right is the act of getting the product right.

Anatomy of a great schema

Six things you can't retro-fit later.

Schemas calcify the second they ship. The decisions you make in the first hour become the constraints engineering lives with for years. These six are the ones that, if missed, cost weeks of migration pain.

Tables

Nouns. Each one earns its existence.

  • One table per real-world noun in the brief
  • If two tables describe the same thing, merge them
  • If one table describes two things, split it
Loopstack example "orgs · users · customers · quotes · line_items · integrations · audit_log" — seven nouns, each pulling its own weight.
Relationships

Foreign keys. With ON DELETE behavior.

  • Every relationship is an explicit FK, not implied
  • Every FK declares its ON DELETE behavior
  • CASCADE for owned, RESTRICT for referenced, SET NULL for optional
Example "quote.customer_id REFERENCES customers(id) ON DELETE RESTRICT" — you can't delete a customer that has quotes. The DB protects you.
Constraints

NOT NULL · UNIQUE · CHECK.

  • NOT NULL on every required field (most fields)
  • UNIQUE on natural keys (email, slug, etc.)
  • CHECK for enums and value ranges
Example "status text NOT NULL CHECK (status IN ('draft','sent','accepted','rejected'))" — invalid statuses become impossible at the DB layer.
Audit fields

Three columns. On every table.

  • created_at — when this row first existed
  • updated_at — when it last changed
  • deleted_at — soft delete, never hard
Why They cost nothing to add up-front. They cost weeks to add later. The data you accidentally delete in week 4 is recoverable. The data you hard-delete in week 12 is not.
Multi-tenancy

How org_id propagates.

  • Every tenant-scoped table has org_id as a column
  • Every query filters by org_id (enforced at query layer)
  • Cross-tenant data leaks become impossible by design
Example "quotes.org_id, customers.org_id, audit_log.org_id" — denormalized on purpose. The DB-layer firewall against the worst incident class.
Indexes

Where the queries actually need them.

  • One index on every foreign key (always)
  • One index on every frequently-filtered column
  • Partial indexes for common WHERE clauses (e.g., WHERE deleted_at IS NULL)
Example "CREATE INDEX quotes_status_idx ON quotes(status) WHERE deleted_at IS NULL" — the dashboard query stays fast at 10M rows.
The prompt that works

Hand the brief and UI map. Ask for the schema.

Notice the explicit constraints — Postgres syntax, UUIDs, snake_case, soft deletes, and the demand to explain every table's purpose. Without these, you get a schema that looks right and falls apart at scale.

Draft the database schema for [project codename].

You have:
  — The brief (attached)
  — The UI map (attached)

Generate schema.sql with:

  1. TABLES — one per real-world noun in the brief
  2. RELATIONSHIPS — explicit foreign keys with ON DELETE behavior (CASCADE/RESTRICT/SET NULL)
  3. CONSTRAINTS — NOT NULL, UNIQUE, CHECK where appropriate
  4. AUDIT FIELDS — created_at, updated_at, deleted_at on every table
  5. MULTI-TENANCY — org_id on every tenant-scoped table
  6. INDEXES — every foreign key + every frequently-filtered column

Constraints:
  — Postgres syntax, no MySQL-isms
  — UUIDs for primary keys (gen_random_uuid())
  — Lowercase snake_case for all names
  — Plural table names (users, not user)
  — Soft deletes (deleted_at), never hard deletes
  — Enums via CHECK, not Postgres ENUM type
  — No JSON columns unless absolutely required (and document why)

For each table, also explain:
  — What it represents
  — Why it's separate from related tables
  — Which UI screens read/write it (reference the UI map)

Output as a single annotated schema.sql ready for engineering review.
Pro tip · Schema is the X-ray
If you can't model it cleanly, you don't understand it.

Tortured tables. Polymorphic relationships. Enums that should be tables. JSON columns where structure should be. The schema is the X-ray. When the schema feels muddy, go back and re-read the brief. The product is the muddy thing — not the schema.

Pro tip · Audit on everything
Three columns. Every table. Always.

created_at, updated_at, deleted_at. No exceptions. They cost nothing now, weeks later. Soft deletes prevent the "oh god, we lost the data" incident every product has at least once. The audit fields are insurance you don't realize you needed until you do.

In full

What an excellent schema actually looks like.

The Loopstack schema — seven tables, multi-tenant, soft-deleted, indexed for the actual queries the UI needs. Annotated for engineering review. The seventh artifact in the chain: intake → moodboard → brief → brand → ui-map → wireframes → schema.

~/projects/loopstack/db/schema.sql

# Schema — Loopstack

v1·7 tables · 12 indexes · Postgres 15· REVIEWED · Marcus + Eng · May 18
SCHEMA.SQL
Annotated, soft-deleted, multi-tenant
Seven tables. Every FK declares ON DELETE. Every table carries org_id and audit fields. Every query path has an index. Comments above each table say what it is, why it's separate, and which UI surfaces touch it.
-- schema.sql · Loopstack · v1
-- Generated by Claude. Reviewed by Marcus. Approved May 18.

-- ─── Tenants ────────────────────────────────────────
-- The root of multi-tenancy. Every other table FKs to here.
CREATE TABLE orgs (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  name text NOT NULL,
  plan text NOT NULL CHECK (plan IN ('trial','pro','enterprise')),
  seats int NOT NULL DEFAULT 5,
  trial_ends timestamptz,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now(),
  deleted_at timestamptz
);

-- ─── Users ──────────────────────────────────────────
-- Reads: dashboard, settings/team, quote builder.
-- Writes: invite flow, signup, profile edit.
CREATE TABLE users (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  org_id uuid NOT NULL REFERENCES orgs(id) ON DELETE CASCADE,
  email text NOT NULL UNIQUE,
  name text,
  role text NOT NULL CHECK (role IN ('admin','manager','rep')),
  last_seen timestamptz,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now(),
  deleted_at timestamptz
);
CREATE INDEX users_org_idx ON users(org_id);

-- ─── Customers ──────────────────────────────────────
-- External CRM IDs let us reconcile across SF / HubSpot.
CREATE TABLE customers (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  org_id uuid NOT NULL REFERENCES orgs(id) ON DELETE CASCADE,
  name text NOT NULL,
  domain text,
  source_sf_id text, -- Salesforce account ID
  source_hs_id text, -- HubSpot company ID
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now(),
  deleted_at timestamptz
);
CREATE INDEX customers_org_idx ON customers(org_id);

-- ─── Quotes ─────────────────────────────────────────
-- The core artifact. Status is the most-queried field.
CREATE TABLE quotes (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  org_id uuid NOT NULL REFERENCES orgs(id) ON DELETE CASCADE,
  customer_id uuid NOT NULL REFERENCES customers(id) ON DELETE RESTRICT,
  rep_id uuid NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
  status text NOT NULL CHECK (status IN ('draft','sent','accepted','rejected','expired')),
  amount numeric(12,2) NOT NULL,
  currency text NOT NULL DEFAULT 'USD',
  sent_at timestamptz,
  closed_at timestamptz,
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now(),
  deleted_at timestamptz
);
CREATE INDEX quotes_customer_idx ON quotes(customer_id);
CREATE INDEX quotes_rep_idx ON quotes(rep_id);
CREATE INDEX quotes_status_idx ON quotes(status) WHERE deleted_at IS NULL;

-- ─── Line items ─────────────────────────────────────
-- Owned by quotes. Cascade delete when quote dies.
CREATE TABLE line_items (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  quote_id uuid NOT NULL REFERENCES quotes(id) ON DELETE CASCADE,
  sku text NOT NULL,
  description text,
  quantity int NOT NULL DEFAULT 1 CHECK (quantity > 0),
  unit_price numeric(12,2) NOT NULL,
  position int NOT NULL,
  created_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX line_items_quote_idx ON line_items(quote_id);

-- ─── Integrations ───────────────────────────────────
-- One row per (org, provider). Config is the only justified jsonb.
CREATE TABLE integrations (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  org_id uuid NOT NULL REFERENCES orgs(id) ON DELETE CASCADE,
  provider text NOT NULL CHECK (provider IN ('salesforce','stripe','hubspot')),
  status text NOT NULL CHECK (status IN ('connected','expired','disconnected')),
  last_synced timestamptz,
  config jsonb NOT NULL DEFAULT '{}'::jsonb, -- per-provider settings
  created_at timestamptz NOT NULL DEFAULT now(),
  updated_at timestamptz NOT NULL DEFAULT now()
);
CREATE UNIQUE INDEX integrations_org_provider_idx ON integrations(org_id, provider);

-- ─── Audit log ──────────────────────────────────────
-- Append-only. Powers the activity feed + compliance.
CREATE TABLE audit_log (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  org_id uuid NOT NULL REFERENCES orgs(id) ON DELETE CASCADE,
  actor_id uuid REFERENCES users(id), -- null = system
  action text NOT NULL, -- 'quote.sent', 'user.invited'
  target_type text NOT NULL, -- 'quote', 'customer', 'user'
  target_id uuid NOT NULL,
  metadata jsonb,
  created_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX audit_log_org_created_idx ON audit_log(org_id, created_at DESC);
CREATE INDEX audit_log_target_idx ON audit_log(target_type, target_id);
Station 09
09
Know what the system can return before you design it

API specs.
Design assumptions, tested early.

Have Claude Code generate the API specs from the schema. Endpoints. Request/response shapes. The auth model. The error states.

You're not committing to these specs forever. You're using them to test your design assumptions. "If the API can only return X, can the dashboard show Y?"

If the answer is no — redesign now, while you're still in HTML wireframes. Not after you've built three weeks of high-fidelity mockups that the system can't actually populate.

Anatomy of a great API spec

Six things most specs get wrong.

Most API specs are a list of endpoints and a happy-path JSON example. That's not a spec — that's a sketch. A real spec defines the contract for everything that can happen, including the failures, the slow responses, and the requests that retry.

Endpoints

REST routes. Organized by resource.

  • One path per resource collection (plural noun)
  • Path params for identity (/quotes/:id)
  • Action verbs only as sub-resources (/quotes/:id/send)
Loopstack example "GET /v1/quotes · POST /v1/quotes · POST /v1/quotes/:id/send" — REST, not RPC. The verb lives in the HTTP method, not the URL.
Auth model

Bearer tokens. Org inferred.

  • Token in Authorization header (not cookies, not query strings)
  • Token lifecycle: issue, refresh, revoke
  • Scopes match user role; org context inferred from token
Example header "Authorization: Bearer lpst_live_3kf8..." — clients never pass org_id. The token already knows.
Request shapes

JSON body. Idempotency keys.

  • JSON for everything (no XML, no form-encoded)
  • Query params for filters and pagination
  • Idempotency-Key header required on every unsafe method
Why idempotency Network retries are inevitable. Without idempotency keys, the user sees their quote sent twice. With them, the second request returns the first result.
Response shapes

Standard envelope. Always.

  • Wrap data in a { "data": ... } envelope
  • Include meta with request_id, timestamps, pagination
  • Consistent naming (snake_case keys, ISO 8601 UTC times)
Example "{ \"data\": {...}, \"meta\": { \"request_id\": \"req_abc...\", \"timestamp\": \"2026-05-19T...\" } }"
Error model

Code, message, field, request_id.

  • Single error envelope across the whole API
  • HTTP status maps to error category (4xx client, 5xx server)
  • Retry semantics declared (429 = retry after N seconds)
Example "{ \"error\": { \"code\": \"validation_failed\", \"field\": \"email\", \"message\": \"Email is required\", \"request_id\": \"req_...\" } }"
Pagination + filtering

Cursor-based. Never offset.

  • ?cursor=...&limit=N (max 100, default 25)
  • Response includes meta.next_cursor
  • Filter via query params; sort via ?sort=field,direction
Why cursor over offset Offset breaks at scale. Insert one row mid-iteration and the next page skips or duplicates a row. Cursors are stable.
The prompt that works

Hand the schema and UI map. Get a real spec back.

Notice the per-endpoint requirements: which roles can call it, which UI screens use it, which most-likely error to return. Without these, you get an endpoint list. With them, you get a contract.

Draft the API spec for [project codename].

You have:
  — The brief (attached)
  — The UI map (attached)
  — The schema.sql (attached)

Generate api-spec.md with:

  1. AUTH MODEL — token type, header, scopes, lifecycle
  2. STANDARD ENVELOPES — success and error response shapes
  3. ENDPOINTS — RESTful routes grouped by resource
  4. REQUEST SHAPES — body, query params, required headers
  5. RESPONSE SHAPES — with realistic example data
  6. ERROR MODEL — code, message, field, request_id; HTTP status mapping
  7. PAGINATION — cursor-based; how to navigate and filter

For each endpoint:
  — HTTP method + path
  — What it does (one sentence)
  — Required permissions (which roles can call it)
  — Request shape (with example body / params)
  — Response shape (success + most likely error)
  — Which UI screens use it (reference the UI map)

Constraints:
  — REST, not RPC (resources, not actions)
  — JSON for everything (no XML, no form-encoding)
  — Cursor pagination, never offset
  — Idempotency-Key header required on POST/PATCH/PUT/DELETE
  — Versioned via /v1/ prefix
  — All times in ISO 8601 UTC
  — snake_case for all JSON field names

Output as a single annotated api-spec.md ready for backend implementation.
Pro tip · Mock first
Mock the API before it exists.

Have Claude generate a mock server from the spec — using the example responses. Now designers wire wireframes to real fetch() calls instead of hardcoded stubs. Engineers build the real backend in parallel against the same spec. Both halves of the team work at full speed for two weeks instead of one. When the real API ships, swap the base URL. Done.

Pro tip · Errors are first-class
Design the failure with the same care as the success.

Most APIs treat errors as an afterthought. {"message": "failed"} is a UX disaster — you can't show the user anything specific. A great error envelope has code (machine-parseable), message (human-readable), field (which input failed), request_id (so support can trace it). The error UX is half the product.

In full

What an excellent API spec actually looks like.

The Loopstack api-spec.md — auth model, standard envelopes, cursor pagination, full Quote endpoints with real JSON. The eighth artifact: intake → moodboard → brief → brand → ui-map → wireframes → schema → api-spec.

~/projects/loopstack/api-spec.md

# API spec — Loopstack

v1·base: https://api.loopstack.io/v1· APPROVED · Eng + Marcus · May 19
AUTH
Bearer tokens. Org context inferred.
All requests authenticate via Bearer token in the Authorization header.

Authorization: Bearer lpst_live_3kf8a2c1...

Token issued via POST /v1/auth/login
Token refreshed via POST /v1/auth/refresh
Token revoked via POST /v1/auth/logout

Token scopes match user.role: admin · manager · rep
Org context is inferred from the token — clients never pass org_id.
STANDARD ENVELOPES
Every response wraps data + meta. Every error follows one shape.
The envelope is non-negotiable. Clients should be able to write one response handler for the whole API.
{
  "data": { /* resource or array */ },
  "meta": {
    "request_id": "req_8h2k...",
    "timestamp": "2026-05-19T14:22:00Z",
    "next_cursor": "cur_xyz..." // only on collections
  }
}
{
  "error": {
    "code": "validation_failed", // machine-parseable
    "message": "Email is required", // human-readable
    "field": "email", // which input failed
    "request_id": "req_8h2k..." // for support tracing
  }
}
PAGINATION
Cursor-based. Stable under concurrent writes.
GET /v1/quotes?cursor=cur_xyz&limit=25&status=sent

cursor opaque token from previous response's meta.next_cursor
limit max 100, default 25
status filter by enum value
sort ?sort=created_at,desc — comma-separated field,direction

Response includes meta.next_cursor — null when no more pages.
ENDPOINTS · QUOTES
Six endpoints. The full quote lifecycle.
GET /v1/quotes · List quotes (filter: status, customer, rep)
POST /v1/quotes · Create a draft quote
GET /v1/quotes/:id · Fetch one quote with line items
PATCH /v1/quotes/:id · Update a draft quote
POST /v1/quotes/:id/send · Send the quote (status: draft → sent)
DELETE /v1/quotes/:id · Soft-delete a draft (manager+ only)
POST /v1/quotes — Used by: /quotes/new (Quote builder). Required: Idempotency-Key header.
Idempotency-Key: qt_create_5f2a1...

{
  "customer_id": "cu_8jk2...",
  "amount": "12450.00",
  "currency": "USD",
  "line_items": [
    { "sku": "PRO-SEAT", "quantity": 25, "unit_price": "498.00" }
  ]
}
{
  "data": {
    "id": "qt_4k1...",
    "status": "draft",
    "amount": "12450.00",
    "currency": "USD",
    "customer": { "id": "cu_8jk2...", "name": "Acme Corp" },
    "rep": { "id": "us_2h7...", "name": "Sarah Chen" },
    "line_items": [ /* echoed back with ids */ ],
    "created_at": "2026-05-19T14:22:00Z"
  },
  "meta": { "request_id": "req_8h2k..." }
}
{
  "error": {
    "code": "validation_failed",
    "message": "Customer not found in your org",
    "field": "customer_id",
    "request_id": "req_8h2k..."
  }
}
ERROR CODES
Every code is documented. Every status code maps to one.
CodeHTTPMeaning
validation_failed422One or more inputs invalid (see field)
not_found404Resource doesn't exist (or not in your org)
unauthorized401Missing or invalid token
forbidden403Token valid but lacks scope
conflict409Resource state prevents action (e.g., editing a sent quote)
rate_limited429Retry after meta.retry_after seconds
internal_error500Server failure — retry with exponential backoff
Every error response includes request_id for support tracing. When a customer reports an issue, the request_id resolves it in 30 seconds instead of 30 minutes.
Station 10
10
High-fi screen, designed in the medium it ships in

High-fidelity mockups.
Designed in the medium.

Now you design.

But notice what's different. You're designing with full knowledge of what's possible. The IA is locked. The schema supports what you're drawing. The API can return what you're showing.

You're not designing in a vacuum and then asking engineering "can you build this?" — you ARE engineering. The translation problem evaporates.

I use Claude Cowork to draft initial mockups as HTML. Then round-trip to Figma where pure visual decisions are easier. Then back to HTML to ship.

Anatomy of a great high-fi mockup

Six things that separate a system from a screenshot.

The line between "polished wireframe" and "real high-fi" is whether the screen composes from a system. These six are the difference between a Figma file you'll throw away and a design system you'll ship.

Tokens applied

Every value comes from the brand directions.

  • Colors via CSS variables, never hardcoded
  • Spacing on a fixed scale (4 / 8 / 12 / 16 / 24 / 32)
  • Type sizes on a fixed scale, every line-height defined
Why it matters When the founder says "make all the buttons a little bigger," you change one variable. Not fifty files.
Component library

Built once. Used everywhere.

  • Button, input, card, badge, pill, chip, avatar, modal
  • Each has documented variants and states
  • If you're styling a one-off, stop. Add it to the library first.
Why it matters The library forces consistency by default. One-off styles in mockups become bugs in production.
All states designed

Empty · loading · populated · error.

  • Every list has both empty and populated mockups
  • Every form has standard, focus, error, success states
  • Every dashboard has the day-one state, not just the polished hero
Why it matters Most products die in the empty state. If you didn't design it, your eng team will improvise — badly.
Responsive across breakpoints

380px · 768px · 1280px.

  • Same content, layouts shift
  • Mobile-first CSS — start narrow, expand
  • Test on a real phone before review
Why it matters If it works on a phone, it works everywhere. Including the founder reviewing it on the train at 7am.
Real content, real data

Continues from the wireframe. Polishes it.

  • Brand voice copy, not lorem (already locked in Station 03)
  • Realistic data (account names, dates, statuses)
  • Long copy AND short copy variants — both must work
Why it matters Real content reveals layout fragility. The 3-character status pill that breaks at 12 characters never appears in lorem.
Production-grade HTML

Semantic. Accessible. Performant.

  • Real semantic elements — not div soup
  • ARIA where it matters; keyboard nav by default
  • Lighthouse score 95+ before review
Why it matters The mockup IS the foundation of the build. If it's div soup now, you're rewriting it in week eight. If it's semantic now, week eight is polish, not rebuild.
The prompt that works

Hand the whole stack. Get a mockup repo back.

By Station 10 you have the full chain — brief, brand, ui-map, wireframes, schema, api-spec. The prompt's job is to make Claude USE all of it. Tokens from brand. Routes from ui-map. Data shapes from api-spec. States from ui-map.

Generate high-fidelity mockups for [project codename].

You have:
  — The brief, brand directions, ui-map, wireframes, schema, api-spec (all attached)

For every route in the ui-map, produce a high-fi mockup file.

Each mockup must:

  1. APPLY DESIGN TOKENS — every color, type size, spacing value comes from the brand-directions tokens
  2. USE THE COMPONENT LIBRARY — every button, input, card, badge composes from the shared library
  3. INCLUDE ALL STATES — empty, loading, populated, error — not just the hero state
  4. RESPONSIVE — designs work at 380px, 768px, 1280px
  5. REAL CONTENT — extend the wireframe copy in brand voice; populate from realistic api-spec response shapes
  6. PRODUCTION-GRADE HTML — semantic, accessible, no div soup

Output structure:
  /high-fi/
    _tokens.css — CSS variables from brand-directions
    _components.css — button, input, card, badge, pill
    dashboard.html
    quotes/list.html
    quotes/builder.html
    customers/detail.html
    … one per route
    README.md

Constraints:
  — Use the design tokens. NO hardcoded colors or spacing.
  — Components ONLY from the library. If you need a new variant, add it first, then use it.
  — Mobile-first CSS — start at 380px, scale up.
  — No JavaScript beyond what's needed to demonstrate states.
  — Throwaway-grade beautiful: a mockup that ships, not a production app.
Pro tip · Tokens first
Build the system before any screen.

Build the design tokens (colors, spacing, type scale) before any screen exists. Every screen then composes from the system. When the founder says "can we make all the buttons a little bigger?" you change one variable instead of editing fifty files. The token layer is what separates a design system from a pile of mockups.

Pro tip · Round-trip with intent
HTML for system. Figma for moments.

Use HTML for layout, system, and interaction decisions. Use Figma for one-off visual moments (the hero illustration, an ad creative, a presentation deck). Don't fight the medium. Each tool is good at what it's good at. The mistake is doing layout work in Figma — that's where the translation problem you eliminated comes back.

Custom imagery — beyond the system

The 5% the component library can't make.

The system handles 95% of the interface. The other 5% — hero illustrations, marketing imagery, brand visuals, OG cards, motion clips — needs custom generation. Here's how to get great results without spending three days in Midjourney.

CLAUDE · SVG
Vector marks. Hand-editable.

Generates clean, structured SVG for icons, brand marks, simple illustrations. The output is code — color-tunable, scale-perfect, instantly editable.

Reach for it when: you need vector output you can hand-tune to brand tokens

MIDJOURNEY
Photographic mood.

Atmospheric, cinematic, magazine-quality imagery. The undisputed leader for "feeling-driven" hero shots and editorial imagery.

Reach for it when: the brief calls for "mood" — not specifics

IDEOGRAM
Typography-aware compositions.

The only image generator that handles text reliably. Posters, badges with copy, typographic compositions where the words have to be readable.

Reach for it when: the image needs words that aren't gibberish

FLUX
Photoreal product shots.

High-realism photography. Product on backdrop, lifestyle scenes, technical accuracy. The successor to SD3 for "this needs to look like a real photograph" briefs.

Reach for it when: the result must look like a photograph, not an illustration

RECRAFT
Style-locked vector sets.

Vector illustrations that hold visual consistency across a series. Train on a few brand examples, then generate dozens of on-brand pieces.

Reach for it when: you need a series of brand-consistent illustrations, not a one-off

RUNWAY · PIKA
Short motion clips.

4–10 second video clips. Hero loops, ambient motion, animated brand moments. Image-to-video for turning a still mockup into a marketing GIF.

Reach for it when: the hero needs motion, not a static image

The prompt-for-the-prompt move

Don't write the image prompt yourself. Have Claude write it.

Image-gen prompts have a structure. Composition, palette, style anchors, lighting, aspect ratio, negative prompts. Claude writes them better than most humans because the structure is the easy part — the hard part is the brand context, which is already loaded.

Write a Midjourney prompt for the Loopstack OG card.

You have:
  — The brand-directions (attached)
  — Three reference moodboard images (attached)

The image purpose: a 1200×630 social-share card that conveys "quotes that close themselves" — fast, focused, premium. Will appear on iMessage, Slack, LinkedIn link previews.

Output a structured Midjourney prompt with:

  1. SUBJECT — what's in the frame
  2. COMPOSITION — angle, depth, focal point, rule-of-thirds
  3. PALETTE ANCHOR — Klein blue + cream + ink, no other colors
  4. STYLE — editorial photography, Wallpaper magazine, large format
  5. LIGHTING — soft directional, warm, late-afternoon
  6. NEGATIVE PROMPT — what to exclude (gradients, drop shadows, AI clichés, watermarks)
  7. PARAMETERS — aspect ratio 1200:630, --style raw, --v 6.1

Then generate three variants of the prompt, with one moderately risky direction.

I'll pick one, run it, and we'll iterate from there.
Imagery tip · Style key
Write a reusable "style key."

Build one paragraph that locks the visual identity — palette, type, lighting, mood, surface. Paste it into every image-gen prompt for the project. The same style key across 30 generations is what makes a brand visually coherent. Skip it and every image looks like it's from a different company.

Imagery tip · Negative prompt
Specify what NOT to include.

Image generators default to a "house style" full of clichés. Negative prompts are how you escape it. "No drop shadows. No gradients on text. No AI sparkles. No oversaturated colors. No stock-photo lighting. No watermark. No text in the image." Specificity wins.

Imagery tip · Critique loop
Generate 4. Critique 4. Regenerate.

Don't try to one-shot the perfect image. Generate four variants. Then ask Claude: "Which of these best matches the brief? What would you change in the prompt to push the strongest one further?" Two passes beats ten one-shots. The critique step is where the brand calibration actually happens.

In full

What an excellent design system actually looks like.

The Loopstack design system — real rendered components built from real tokens. The dashboard wireframe from Station 07 upgraded to high-fi using this system. The ninth artifact: intake → moodboard → brief → brand → ui-map → wireframes → schema → api-spec → design-system.

~/projects/loopstack/high-fi/_components.css

# Design system — Loopstack

v1·tokens applied · live components· SHIPPED · Marcus + Eng · May 21
COMPONENTS
The library, rendering live in this slide
Real HTML components built from the Loopstack tokens. Every variant you see below is the actual rendered version — not a screenshot, not a mockup.
Buttons
Send quote Save draft Cancel Add line item
Inputs
Enter a valid email address
Status pills
Draft Sent Accepted Rejected Expired
KPI cards
MRR $184,210 +12.4% ↗
Active users 3,421 +8.2% ↗
Churn 2.1% −0.3% ↘
BEFORE · AFTER
The dashboard, wireframe → high-fi
Same screen. Same routes. Same nav. The wireframe locked the structure. The high-fi applies the system.
Wireframe · Station 07
High-fi · Station 10
Station 11
11
Component-by-component, with sanity checks

Build and test.
Small commits. Frequent reviews.

Claude Code is the right tool here. Component by component. Page by page. The hi-fi mockup from Station 10 isn't a picture — it's a spec. Hand it to Claude as the source of truth and start building against it.

The discipline is what changes. Small commits. Frequent reviews. Visual sanity checks at every step. Don't let Claude write five hundred lines without you reading them. Don't let Claude touch components you haven't seen rendered. The biggest failure mode in Claude Code isn't bad code — it's too much code, too fast, in directions you didn't sanction.

Ship to staging early. Ship to staging often. The "demo Friday" mindset is back — except every Friday is now every commit. The founder gets a URL. The URL changes. They tell you what's wrong. You change it.

Anatomy of a healthy build session

Six rules that keep Claude on the rails.

Break any one of these and the session degrades. Break two and you're spending more time untangling than building.

01 · Scope
Component-scoped commits

One commit, one component, one mental model. "Add KPI card" not "build dashboard." If the diff doesn't fit on one screen, the commit is too big. Squash later if you want — but commit small now.

02 · Review
Read every diff

The non-negotiable gate before git commit. Not skim. Read. Claude makes its worst decisions in files you didn't open. The five seconds of friction here saves the five hours of debugging later.

03 · Eyeballs
Screenshot-driven sanity

Render → screenshot → eyeball → next. The tests pass and the page looks broken — that's the most common failure mode. A 2-second screenshot catches what a 200-line test suite misses.

04 · Staging
A URL the founder can refresh

Push to staging on every commit. The founder shouldn't ask "is it ready?" — they should refresh the URL and see. Vercel preview, Netlify branch deploy, fly.io app — pick the one your stack already supports.

05 · Tests
Test what breaks, not what works

Playwright on the brittle paths — auth, payment, the 3 user flows that actually matter. Skip the unit tests for pure-render components. Skip the snapshot tests entirely. They lie.

06 · Provenance
Conventional commits + co-authored-by

Every commit message says what changed and who wrote it. Co-Authored-By: Claude in the trailer. Six months later you'll want to know which lines came from where. Tag now, thank yourself later.

The prompt that works

Build the next component against the spec.

Anchor every Claude Code session to three artifacts: the design system, the API spec, and the wireframe. Then end with a hard stop.

Build the MRR sparkline card for the dashboard.

CONTEXT
- Design tokens: design-system/tokens.css
- Component library: design-system/_components.css (use existing Card, Skeleton, Sparkline)
- API contract: api-spec.md → GET /v1/metrics/mrr returns { points: [{date, value}], delta_30d }
- Hi-fi mockup: design-system/dashboard.html → .kpi-card[data-metric="mrr"]
- Existing pattern: see ARR card at src/components/cards/ARRCard.tsx

REQUIREMENTS
- States to render: loading (skeleton), empty (no data), populated, error
- Responsive: full-width on mobile, 1/3 width on desktop
- Numbers: format with Intl.NumberFormat (currency, no cents over $10K)
- Trend arrow: green if delta_30d ≥ 0, tomato if < 0
- A11y: aria-label includes "MRR, $X, up Y% over 30 days"

DELIVERABLES
1. src/components/cards/MRRCard.tsx
2. src/components/cards/MRRCard.test.tsx (Playwright — populated + error states only)
3. Wire into src/pages/Dashboard.tsx (replace the <PlaceholderCard metric="mrr" />)

STOP CONDITIONS
- After writing the files, render the dashboard locally and screenshot it.
- Stop. Show me the screenshot. Wait for sign-off before touching anything else.
- Do NOT refactor neighboring cards. Do NOT modify the design system.
Tip 01
Stop-and-show

Every prompt ends with a hard stop. "Render. Screenshot. Wait." Without it, Claude Code will keep going — refactoring neighbors, adding tests you didn't ask for, "improving" the file structure. That's where sessions go off the rails. The stop is non-negotiable.

Tip 02
The undo tax

When something feels wrong, the cheap move isn't to debug — it's to git reset --hard HEAD and re-prompt with sharper context. Untangling Claude's "almost right" code costs more than re-rolling it. Treat each commit as cheap. Your time isn't.

Tip 03
Visual diff loop

Paste the screenshot back into Claude with the hi-fi mockup. "Here's what you built. Here's what it should look like. List every difference, then fix only what you listed." Forces Claude to commit to a list before changing code — cuts scope creep to zero.

github.com/loopstack/app · pull/47 Loopstack · build session 03
#47 feat: add MRR sparkline to dashboard main ← claude/mrr-card Ready

feat: add MRR sparkline to dashboard

Adds the MRR card spec'd in design-system/dashboard.html. Loading, empty, populated, error states. Wires into the dashboard grid; removes the PlaceholderCard.

What to test
  • Card renders in all four states (loading → empty → populated → error)
  • Trend arrow flips color at delta_30d = 0 boundary
  • Responsive: full-width < 720px, 1/3 width ≥ 720px
  • Aria-label reads correctly in VoiceOver
Before / after
Before PLACEHOLDER metric="mrr"
After MRR · 30D $48.2K ▲ 12.4%
Files changed
  • + src/components/cards/MRRCard.tsx +128 −0
  • + src/components/cards/MRRCard.test.tsx +42 −0
  • M src/pages/Dashboard.tsx +3 −1
Session metadata
Claude time 11 min
Human review 6 min
Re-prompts 2
Diff size +173 / −1
Reviewer note First pass had the trend arrow on the wrong side of the number. Asked Claude to compare the rendered screenshot against dashboard.html line-by-line — caught it on the second pass. Co-Authored-By: Claude.

Test discipline

Heavy on the brittle paths.

Most teams using Claude end up with the wrong test pyramid — top-heavy on unit tests Claude wrote because they were easy, light on the e2e flows that actually break in production.

E2E · auth, checkout, the 3 flows that matterheavy
Integration · API contracts, data shapemedium
Unit · pure functions, formatterslight
Snapshot testsnone
  • Write tests for the things you'd lose sleep over. Auth. Payment. The flow the founder demos. That's it.
  • Skip Claude's "100% coverage" instinct. Coverage is a vanity metric. Confidence is the real one.
  • Snapshot tests lie. They pass when the page is broken. Delete them. Use Playwright + a real assertion instead.
Station 12
12
Production deploy. Same-day iteration.

Ship.
Feedback loop opens.

Production deploy. Real users. Feedback loop opens. The page goes from "the thing we're building" to "the thing they're using" — and that flip changes everything downstream.

The thing that's actually different now: feedback comes in, and you can iterate the same day. Not "let me schedule a sprint." Not "we'll get to that next quarter." Same. Day. A founder messages at 11:42. You push at 12:04. They refresh and it's there. That's the new tempo.

The relationship with the founder changes too. You're not a vendor delivering on a six-month contract anymore. You're a co-designer iterating in real time, and your pricing model has to catch up to that — which we'll get to in a moment.

Anatomy of shipping in 2026

Six pieces of infrastructure that make same-day shipping safe.

"Ship faster" without these is just "break faster." Wire each of these up before the first production deploy and the cycle stays clean.

01 · Preview
Preview on every PR

A unique URL per branch. Vercel, Netlify, Render — they all do it free. The founder lives at pr-47.staging.app while you build, not at "let me schedule a demo."

02 · Deploy
Blue-green, zero downtime

The new version goes live next to the old one. Switch traffic. If something explodes, switch back. Three seconds, not three hours. Confidence to ship comes from confidence to roll back.

03 · Flags
Feature flags as default

Every risky change behind a kill switch. New checkout flow? Flag. Redesigned onboarding? Flag. Ship dark, toggle to 1%, watch, expand. The flag is the difference between shipped and shippable.

04 · Eyes
Observability from commit one

Sentry for errors. Plausible (or PostHog) for behavior. A tiny status page on a subdomain. You should know about a broken page before the founder does. Wire it in before launch, not after the first incident.

05 · Domain
A customer URL, not a staging one

Real domain, real TLS, real name on the door. A page on app.loopstack.com reads as shipped. A page on loopstack-prod.fly.dev reads as still cooking. Treat the URL as part of the launch.

06 · Notes
Changelog as a feature

Release notes live on a public page. Users see what changed. Founders forward them around. Investors notice the cadence. The changelog is marketing — and it's free if you wrote conventional commits in Station 11.

The prompt that ships

Hand the boring deploy choreography to Claude.

Tagging, changelog generation, release notes, Slack post — all of it is mechanical. Claude handles it in one prompt and you stay focused on the work.

Ship a new release.

CONTEXT
- Repo: github.com/loopstack/app
- Last tag: v0.6 (3 days ago)
- Convention: semver, conventional commits, releases live in /releases
- Slack channel for announce: #loopstack-ship (use the pre-configured webhook)

DO IN ORDER
1. List commits since v0.6. Group by type (feat / fix / chore / flag).
2. Decide the bump: feat → minor, fix → patch, breaking → major.
   Show me the version + reasoning. Wait for "go" before tagging.
3. After "go": create the git tag. Generate releases/v{X}.md with:
   - Headline (one sentence, plain English — what the user gets)
   - Highlights (3–5 bullets, founder-readable, not engineer-readable)
   - Behind-the-scenes (anything technical worth surfacing)
   - Flags toggled (if any) and rollout %
4. Push the tag. Trigger the deploy via the GitHub Action.
5. Post to #loopstack-ship: version, headline, link to release notes,
   link to staging diff. Tag @founder.

STOP CONDITIONS
- Stop after step 2. Show me the bump + draft notes. Wait for "go."
- If any commit message looks ambiguous, ask before grouping it.
Tip 01
Stage = production minus DNS

Same env, same secrets, same deploy path. Only the URL differs. Bugs that only show in prod are bugs you didn't catch because stage was lying to you. If your stage has a SQLite shim and prod has Postgres, you don't have a stage — you have a placebo.

Tip 02
The Friday rollback rehearsal

Once a month, deliberately roll back something benign on a Friday afternoon. Not in response to an incident — as a drill. Confidence in rollback IS confidence in shipping. If the team flinches at the rollback button, the cycle is fake.

Tip 03
Feature flag everything risky

The new payment provider, the new dashboard, the redesigned onboarding — all flagged. Default off. Toggle to internal users first, then 1%, then 10%, then everyone. Shipping isn't binary anymore — it's a dial. Use the dial.

releases / v0.7.md Loopstack · published Tue 12:04 PM
v0.7 · LIVE

Six-month range on the MRR sparkline.

authored by Claude + JM 22 min from feedback to deploy rollout: 100% · flag: off
Highlights
  • FEATAdded a 6-month range toggle to the MRR sparkline. Defaults to 30 days; remembers your last choice.
  • FEATTrend percentage now compares against the same range — so 6M shows 6-month trend, 30D shows 30-day trend.
  • FIXFixed spacing on the chart hover tooltip when values exceed five digits.
  • FLAGNew compact_kpi_grid flag shipped dark — internal only. Will roll out next week.
Timeline
  • 11:42Founder: "Can the chart show 6 months too?"
  • 11:43Designer: "On it. Pushing in 20."
  • 11:48Branch claude/mrr-range-toggle opened. Preview URL live at 11:51.
  • 11:58Founder reviews preview. One nit: "default to 30D not 6M." Fixed in 2 min.
  • 12:01PR merged. Production deploy starts.
  • 12:04v0.7 live. Slack post + this page published.
That's the whole loop. Nine commits, one PR, two reviewers, twenty-two minutes. Six months ago this would have been a Notion ticket.
The economics shift

The technical change forces a pricing change.

Old model 12-week build
  • Fixed scope. Statement of work. Change orders for anything new.
  • Six-figure deliverable. Big upfront, then handoff and goodbye.
  • The founder waits. "I'll add it to the next phase" is the standard answer.
  • Vendor relationship. You ship the spec. They sign the invoice.
New model Continuous collab
  • Ongoing retainer. A monthly number that buys access to the loop, not a deliverable.
  • Weekly releases. The changelog is the deliverable. Investors notice the cadence.
  • Founder is in the loop. Slack message in. Deployed change out. Same day.
  • Co-designer relationship. You're part of the team — and you charge accordingly.
End of Part One

Twelve stations. Discovery to deploy. The work didn't get smaller — the cycles did.

That's the technical case. Functional software, shipped continuously, with a founder in the loop and a changelog as the receipt. Now the soft case — because the page that sells the work is its own discipline, with its own twelve.

Part Two · The marketing page
Part Two

Marketing
landing page.

Now the soft case. No backend. No database. The page has to do one thing: convince someone to click the button. The cycle is shorter, the tools are different, the judgment moments are different.

Station 01 — Marketing
01
Capture how they actually talk

Discovery, but
extract the voice.

For marketing, discovery is not about extracting product requirements. It's about extracting the founder's actual voice. The way they describe what they do to a friend at dinner — not the way they write for their homepage. Those are two different people. The dinner version is the one that converts.

Record them talking. Transcribe it. Drop it in Claude Chat. Then ask Claude to build a voice profile — a structured, referenceable artifact that every piece of copy you generate from here forward gets grounded in. Not vibes. A document.

This one move kills the most expensive failure mode in marketing copy: the generic SaaS voice. "We help businesses scale their digital transformation journey." Nobody says that out loud. Nobody. So nobody should write it.

Anatomy of voice extraction

Six things to pull from the raw transcript.

Don't ask Claude for "their voice" in the abstract. Ask for these six specific outputs. Each becomes a section of the profile you'll reference for the rest of the build.

01 · Source
Raw transcript

30+ minutes of the founder talking unscripted. Not a meeting. Not a Zoom panel. A conversation. Whisper it to text and paste the whole thing in. Volume matters — five minutes isn't enough to find a pattern.

02 · Idioms
Idiom inventory

The phrases they reach for repeatedly. "Look, the thing is…", "basically what we do is…", "weirdly enough." These are speech tics — and they're the single fastest way to sound like the actual person.

03 · Banned
Banned-words list

Words this founder would never use. synergy. leverage. solutions. seamless. The list is short but load-bearing — it's the guardrail Claude needs to not slip back into corporate voice on the next prompt.

04 · Signatures
Signature phrases

Three to five lines so specific to them they almost double as branding. "We're not the next Salesforce." "One thing to work." Pull them verbatim. These will show up on the homepage, in the footer, in the OG card.

05 · Stories
Story bank

The two or three anecdotes they fall into when explaining the thing. The customer who said the weird thing. The moment they realized the old way didn't work. Stories > claims. One real anecdote outperforms five bullet points.

06 · Audience
Audience read

Who they're talking to, and who they're talking against. A founder who says "engineers who are tired of building the same dashboard" just told you both the audience and the enemy. Pull both — copy needs the contrast.

The prompt that works

Turn 30 minutes of talking into a structured artifact.

Paste the transcript. Ask for the six outputs explicitly. Don't accept "their voice is direct and friendly" — that's vibes, not a profile.

I'm building a marketing site for the founder below. I need a voice profile
I can hand to a copywriter (or to you, in a future prompt) so every word
sounds like this person — not like generic SaaS.

TRANSCRIPT
[paste 30+ minute transcript of the founder talking unscripted]

OUTPUT — a voice-profile.md file with these six sections:

1. TONE DESCRIPTORS — 3 adjectives that fit this person specifically.
   Not "professional and approachable." Words their friends would use.

2. IDIOM INVENTORY — 8–12 verbatim phrases they reach for repeatedly.
   Quote them exactly. Note frequency where useful.

3. BANNED WORDS — 6–10 words they would never use, with one-line
   explanation of why. Be ruthless about corporate words they avoid.

4. SIGNATURE PHRASES — 3–5 lines so specific they could be on a t-shirt.
   These are headline candidates. Quote verbatim, don't paraphrase.

5. STORY BANK — 2–3 anecdotes they tell. Customer name, situation,
   what made it interesting. One paragraph each.

6. AUDIENCE READ — Who they're talking TO (1 paragraph) and what
   they're talking AGAINST (1 paragraph). Both matter.

CONSTRAINTS
- Quote verbatim where you can. Paraphrasing kills the voice.
- If the transcript doesn't support a section, say so — don't invent.
- Every signature phrase has to appear in the transcript. No new lines.
Tip 01
Record on the phone, not in a meeting

Zoom voice ≠ real voice. Founders perform on Zoom — they slip into pitch mode within thirty seconds. Call them on the phone. Or sit across from them with a coffee. The voice you want shows up in the third minute, when they've stopped explaining and started talking.

Tip 02
Use a podcast they've already done

Best shortcut in the business. If the founder has been on any podcast, the host already did the warm-up for you. Pull the YouTube transcript. Skip the first five minutes (intro). Use the next forty. Free, real, unscripted, 60 minutes long.

brand / voice-profile.md Loopstack · founder Maya Reyes · drawn from 42-min phone call
01 · Tone descriptors

Direct. No hedging, no "kind of," no "we're working on." She says the thing.

Self-aware. Names what they're not. "We're not the next Salesforce" appears 4 times.

Slightly impatient. Cuts off her own sentences when she's already moved to the next thought.

02 · Idiom inventory
"Look, the thing is…" "basically what we do" "to be honest" "the actual problem" "weirdly enough" "one thing to work" "the founders we like" "that's the whole pitch"
03 · Banned words
synergy leverage solutions seamless scale empower unlock journey transformation

She uses scale exactly once in 42 minutes — and only to mock it: "everyone says they help you scale, what does that even mean."

04 · Signature phrases

"We built the thing you were going to hire two engineers to build."

"We're not the next Salesforce. We just want one thing to work."

"It's not a platform, it's a tool. There's a difference."

05 · Story bank

The first customer. A logistics co-op in Oakland — 9 dispatchers, no engineering team, was running on three Google Sheets and a prayer. Bought Loopstack on day two of the trial. Maya tells this story in every sales call.

The Salesforce demo. She sat through one as a customer, in 2022, and walked out swearing she'd never build software like that. The talk literally started "I want to tell you about a really bad demo."

06 · Audience read

Who she's talking to: ops leaders at 20–80 person companies who are one engineer short of building the internal tool they actually need. They have spreadsheets that have outgrown spreadsheets. They've priced Retool and felt poor.

What she's talking against: the "platform" pitch. Anything that takes six months to onboard. Anything that needs a Solutions Engineer. Anything sold by someone in a quarter-zip.

The whole point

Same idea, two voices. Only one converts.

Generic SaaS voice

"Loopstack is a low-code platform that empowers operations teams to seamlessly scale their internal tooling and unlock new efficiencies."

Maya's actual voice

"We built the thing you were going to hire two engineers to build. It's a tool. Not a platform. There's a difference."

Station 02 — Marketing
02
Ten options. Pick the one that scares you.

Positioning.
The first sentence.

The most important sentence on a marketing page is the first one. Not the headline. The first sentence. The one that decides whether anyone keeps scrolling. Get it right, the rest of the page has a chance. Get it wrong, none of the rest matters.

So I ask Claude: "Here's the company. Here's the voice profile from Station 01. Here's the audience. Give me ten different first sentences. The kind where, if your ideal customer read it, they'd immediately know whether to keep reading or close the tab."

Then I pick the one that makes me most nervous. The one that scares me a little. Almost always the right one. The safe ones are forgettable — and forgettable means the page bounces. The scary one earns the click.

Anatomy of a great first sentence

Six tests it has to pass.

If a candidate sentence fails two of these, kill it. Three, and you're being polite — kill it harder. The winning sentence passes all six and still makes you nervous.

01 · Audience
Names the audience

The reader should know in word three whether this is for them. "For ops leaders at 20-person companies" wins over "for modern teams." The page that tries to talk to everyone gets read by no one.

02 · Specific
Is specific

"Hire two engineers" beats "build internal tools." A number, a name, a concrete object — anything you can see. Vague claims are bounce fuel. Specifics earn the next paragraph.

03 · Stakes
Implies stakes

Either there's a cost to ignoring this or there's a payoff to clicking. Often both. The reader should feel a small pull at the end of the sentence. No pull = no click.

04 · Sentence
Is a sentence — not a tagline

Subject. Verb. Object. Punctuation. Taglines feel like ad copy. Sentences feel like someone talking to you. The page is supposed to be a person, not a poster.

05 · Verb
Has a verb you'd say at dinner

"Built," "replaced," "killed," "saved." Skip "empower," "enable," "unlock," "leverage." If you wouldn't use the verb in a sentence to a friend, don't use it on the page.

06 · Threat
Threatens the safe alternative

The best first sentences menace the status quo just a little. "You were going to hire two engineers" implicitly says "you were about to make a $400K mistake." Threat is what makes the safe option feel expensive.

The prompt that works

Ten openers, one paragraph each, then pick.

Don't ask for "the right" first sentence. Ask for ten — including bad ones. The bad ones are how you find the good one.

Generate 10 candidate first sentences for the Loopstack marketing site.

CONTEXT
- Voice profile: brand/voice-profile.md (use the signature phrases &
  banned-words list — if a candidate uses a banned word, mark it red)
- Audience: ops leaders at 20–80 person companies, one engineer short
  of building their internal tool
- Against: the "platform" pitch, six-month onboarding, Solutions Engineers

REQUIREMENTS
- All 10 must be ONE sentence. Subject + verb + object + period.
- Mix of registers: 3 safe / 4 specific / 3 risky.
- For each one, also draft the natural second sentence — so I can see
  where the page actually goes from there. (Sentence 1 sets up sentence 2.)
- For each one, give a one-line gut-read: who it lands with, who it loses.

OUTPUT FORMAT
01. [sentence]
    Then: [the natural next sentence]
    Reads to: [who it lands with]  Loses: [who it loses]

CONSTRAINTS
- No taglines. Every candidate has to be a complete sentence.
- No "we help" openings. They're banned this round.
- Don't tell me which one is best. I pick. Just generate.
Tip 01
The dinner-table test

Read the candidate sentence out loud, the way you'd say it to a friend across a table. If it makes you cringe — good, that means you'd never say it. If it sounds like something you actually would say, ship it. The page is a conversation, not an announcement.

Tip 02
The competitor-steal test

Could Linear's homepage use this sentence? Could Notion's? If the answer is yes, kill it. The good first sentence is one your closest competitor literally cannot say. Either because they don't believe it or because their lawyers wouldn't let them.

Tip 03
The flinch test

Read the top three candidates to the founder. Watch their face. The one that makes them flinch — "oh god, can we really say that?" — is almost always the right one. Their flinch IS the conviction the customer needs to feel.

brand / positioning.md Loopstack · 10 openers + chosen + reasoning
01 Loopstack is a no-code platform for modern operations teams. SaaS soup
02 Build internal tools, faster. Tagline, not sentence
03 The fastest way to spin up your next dashboard. No audience, no stakes
04 For the ops team that's outgrown spreadsheets. Specific audience, but no verb
05 Stop hiring engineers to build your spreadsheets. Strong verb, audience implied
06 If your operations runs on three Google Sheets, this is for you. Specific, but conditional
07 We built the thing you were going to hire two engineers to build. ← THIS
08 Internal tooling, without the engineering headcount. Headline copy, not sentence
09 Software that matches how your ops team actually works. Banned word: "actually"
10 Loopstack: the operating system for ops. Two banned words, one sentence
Why #07 wins

"We built the thing you were going to hire two engineers to build."

Audience: "you were going to hire two engineers" lands in 6 words for the exact ops leader Maya described. Specific: a number — two — not "an engineering team." Stakes: implies the reader was about to spend $400K. Sentence: subject + verb + object + period. Verb: "built" — concrete, past tense, done. Threat: the safe alternative (hiring) just got expensive in 14 words.

Maya flinched when she read it. We shipped it.

Station 03 — Marketing
03
For marketing — the brand IS the founder

Moodboard, brief,
brand identity.

Same flow as functional software. Faster, because marketing has fewer constraints. You have a homepage — not a system. No accessibility matrix, no dark mode, no permission tier. Just a page that has to feel like the founder.

That's the only real rule for a marketing brand: it has to feel like the founder. Internal software can have a sterile brand and survive. Marketing can't. People buy from people they trust, and trust comes from voice — not from a 60-page brand guideline that never gets opened again.

Keep the references human. Pull from their LinkedIn posts, podcast appearances, the books on their desk, the way they describe themselves to friends. That's the brand. Then ask Claude to generate three directions and pick the one that feels most like the person — not the one that looks most like the category.

Anatomy of a marketing brand

Six pieces — none of them "the logo."

The logo is the smallest decision in this list. The biggest is the references. Get those right and the rest falls out.

01 · Voice
Founder voice → brand voice

The voice profile from Station 01 IS the brand voice. Don't rebuild it for the visual layer. The way the founder talks dictates how the type sets, how the words punctuate, how the buttons sound. Visual brand is voice rendered.

02 · Refs
References that aren't competitors

If your moodboard is full of other SaaS sites, you'll build another SaaS site. Pull from magazines, museum sites, restaurant menus, indie bookstores. The brand that stands out in a category came from outside the category.

03 · Palette
Palette pulled from references

Don't open Coolors. Open the references. Eyedrop the colors out of the photograph that made you feel something. Palettes pulled from the real world have weight that Dribbble palettes never do.

04 · Type
A type system with personality

One serif with mood (Fraunces, Tiempos, Source Serif). One clean sans (Inter, Söhne, Mona). Optional mono. The italic of the serif is the personality. If the italic doesn't have a voice, change the serif.

05 · Motion
Motion + feel cues

How does it move? Snappy or slow? Easing curve? Hover style? Motion is half the brand on a marketing site and almost no static moodboard captures it. Write a one-paragraph "feel" description before the first CSS line.

06 · No-list
A "no" list

The most underrated brand artifact. No gradients. No stock photography. No emoji bullets. No floating screenshots at a 7° angle. The "no" list is shorter than the "yes" list and saves three review rounds.

The prompt that works

Three brand directions, not one.

Asking for "the brand" is a trap — you'll get the safe, average direction. Ask for three with deliberately different center-of-gravity. The act of comparing forces the choice.

Generate 3 brand directions for the Loopstack marketing site.

CONTEXT
- Voice profile: brand/voice-profile.md
- Positioning: brand/positioning.md (the chosen first sentence: "We built
  the thing you were going to hire two engineers to build.")
- References (NOT competitors): the New Yorker, A24 film posters, the
  redesigned Pitchfork, Sibyl bookshop in Brooklyn, McSweeney's print
- Audience: ops leaders, 20–80 person companies, allergic to "platform"

OUTPUT — three named directions, each with:

1. NAME & ONE-LINER — direction name + one sentence of feel
2. PALETTE — primary, secondary, accent, neutral, ink. Hex codes.
   Pull colors from the references where possible — say which ref.
3. TYPE — display + body + mono. Why this pairing fits the voice.
4. MOOD — one paragraph. Imagine the homepage scrolled past.
   What does the reader feel in 2 seconds?
5. NO-LIST — 4–6 things this direction is NOT.
6. RISK — what's the case AGAINST this direction? Be specific.

CONSTRAINTS
- Each direction has to be DIFFERENT — not three flavors of the same idea.
- One direction should make me nervous. The other two should be safer.
- Don't recommend. I'll pick. Just present.
Tip 01
Reference outside the category

If you reference Linear and Vercel, you'll build a worse Linear. If you reference the New Yorker and A24, you'll build something a SaaS site has never looked like before. The reference shelf is the brand. Curate it like a museum.

Tip 02
Pull palette from photos, not screenshots

Open the photograph that made you feel something — the one you saved to a Pinterest board you'll never open again — and eyedrop. Real-world palettes have temperature. Screenshot palettes have RGB. Temperature wins.

Tip 03
Test on a 240×140 hero card

Before you commit to a direction, render it as a tiny hero card — palette, type, one sentence. If it doesn't have presence at thumbnail size, it doesn't have presence at full size. The hero card test is 10 minutes and saves a week of "something feels off."

brand / marketing-brand-directions.md Loopstack · 3 directions · winner: Editorial Workshop
Direction 01
Engineering Pop
Inter / JetBrains Mono no serif

Reads as "Linear, but louder." High contrast, mono-heavy, lots of monospace numbers. Confident but starts to feel like every other dev tool by row two.

No · feels like the category
Direction 02 · Winner
Editorial Workshop
Fraunces / Inter / JetBrains italic-led

Cream paper. A serif with an italic that sings. Klein blue as accent, ochre as warning. Reads like a magazine spread that happens to sell software. Pulled from the New Yorker + Sibyl bookshop.

Yes · doesn't look like SaaS
Direction 03
Brutalist Trade
Söhne Mono / Söhne no italic

A wholesale invoice that became a website. All monospace, sage + maroon, raw grid lines, table-like layouts. Bold but might tip into "design portfolio" — too edgy for the audience.

Maybe · risky for ops buyers
Station 04 — Marketing
04
A landing page is a section list, in order

Section structure.
Read it out loud.

A marketing wireframe is just a section list in order. Hero. Social proof. Three benefits. Featured work. FAQ. CTA. The hard part isn't the list — it's the order. Reorder these six sections badly and the page reads like a catalog. Order them well and the page reads like an argument.

Have Claude Code generate the structure as raw HTML — no styling, no images, no CSS. Just blocks of text in correct hierarchy. Then read the whole page out loud, top to bottom, in one breath. If you stumble, the structure stumbled. Fix it before you write a single line of CSS — because every CSS commit you make on a broken structure is a commit you'll throw away.

This is the cheapest review round in the whole pipeline. Five minutes. No design. No code. Just words. And it catches problems that would cost you a week to fix later.

Anatomy of a marketing wireframe

Six rules that make the page read like a sentence.

If a section breaks one of these, it's probably the section that's about to get cut. Test each one before you commit.

01 · Promise
One promise per section

If a section is making two promises, it's two sections. "We help you ship faster AND we have great support" is two sections. Pick one promise. The reader's brain only holds one per scroll-screen anyway.

02 · Order
The order is a script

The page is a one-act play. Hook → believe me → here's why → here's proof → here's the ask. If you can swap two sections and it still works, your structure's too loose. Order matters because argument matters.

03 · Job
Each section has a job

Write the job in one sentence next to the section name. "This section convinces them we've done it before." If you can't name the job, the section is decoration. Decoration is the enemy of conversion.

04 · Standalone
No section explains the next

Every section has to land on its own. "Here's what we'll cover next" is a tell that the order is wrong. The reader is scrolling, not reading a syllabus. If a section needs the next one to make sense, swap them — or kill one.

05 · CTA
The CTA repeats with intent

Once at the top (low commitment), once mid-page (after proof), once at the bottom (high commitment). Not the same CTA. Top is curious. Middle is convinced. Bottom is decided. Tailor the language to the moment.

06 · 90 sec
The page reads in 90 seconds

Out loud, top to bottom, no skipping. If it takes longer than 90 seconds to read, it'll take 5 seconds to bounce. Everything past the 90-second mark is for the convinced — not the converting.

The prompt that works

Generate the structure as raw HTML.

No images, no styles, no CSS classes. Just <h2>s and <p>s. Force the words to do the work — that's the whole point of this stage.

Generate the section structure for the Loopstack marketing site as raw HTML.

CONTEXT
- Voice profile: brand/voice-profile.md
- Positioning: brand/positioning.md (first sentence: "We built the thing
  you were going to hire two engineers to build.")
- Brand direction: Editorial Workshop (per Station 03)
- Audience: ops leaders, 20–80 person companies

OUTPUT FORMAT
A single .html file. No CSS. No images. No <div>s for layout.
Each section is just:
  <section>
    <!-- JOB: [one-sentence job for this section] -->
    <h2>[section headline as written copy]</h2>
    <p>[supporting copy, 1–3 sentences]</p>
    [optional: <ul>, <blockquote>, <a class="cta">CTA text</a>]
  </section>

REQUIREMENTS
- 6 to 8 sections, no more.
- The HERO section uses the chosen first sentence verbatim.
- One section is social proof (logos, customer quote, or number).
- One section is "what makes this different" — be specific, not abstract.
- The CTA appears 3 times, with DIFFERENT copy each time
  (top = low commit, middle = post-proof, bottom = decided).
- Each section's job comment is mandatory. If you can't write the
  job in one sentence, that section is wrong.

THEN
Read the whole file top to bottom as if you're reading aloud.
At the end, tell me where it stumbles. I'll fix from there.
Tip 01
Read it to a stranger

Better than reading it to yourself: read it to someone who has never seen the product. Your partner. The barista. The friend who asked what you're working on. Watch their face. Where their face goes blank is where your structure goes blank.

Tip 02
Cut the third "About" section

Every wireframe Claude generates has at least three sections that are secretly all "about us." Process. Mission. Team. Story. Pick one. Cut the others. The reader doesn't want to be friends with you yet — they want to know if the thing works.

Tip 03
The 90-second test

Open a stopwatch. Read the whole page out loud at normal speed. If it's over 90 seconds before you hit the bottom CTA, the page is too long. Cut the longest section. Re-time. Repeat until you're under. The page that reads in 60 seconds outperforms the page that reads in 3 minutes — every time.

site / marketing-wireframe.html Loopstack · 7 sections · 84 seconds out loud
01 · HERO First sentence + sub + 2 CTAs

"We built the thing you were going to hire two engineers to build. See it or try it free."

02 · SOCIAL PROOF Customer quote + 4 logos

"Oakland Logistics Co-op ships 12 dispatcher tools on Loopstack. So do these four other teams you've heard of."

03 · THE PROBLEM What you almost did instead

"You almost hired two engineers. You almost bought Retool. You almost built it on three Google Sheets. We've watched all three."

04 · THREE WAYS IT DIFFERS 3 specific benefits, no overlap

"One: ship in a week. Two: no engineer required. Three: we don't sell platforms — we sell tools."

05 · FEATURED CUSTOMER One story, told in 3 paragraphs

"Here's Oakland Logistics. Here's what they were doing before. Here's what they shipped on Loopstack. Eight days, no engineer."

06 · FAQ 5 questions, the real ones

"What if it breaks? How is this not Retool? Can we self-host? What's it cost? Why's it called Loopstack?"

07 · BIG CTA Final ask, decided language

"Start a 14-day trial. No card. We'll help you ship the first tool by Friday."

Out-loud test 84 seconds end-to-end at normal pace. Stumbled once at section 04 — the original "Three benefits" headline was abstract ("Faster, cheaper, simpler"), rewrote to be concrete ("ship in a week, no engineer, not a platform"). Now it lands.
Station 05 — Marketing
05
The draft is scaffolding. Your edits are the product.

Copy.
Where Claude earns its rent.

Drop in: the voice profile, the positioning, the brand directions, the section structure. Ask Claude to draft the copy for every section in the chosen voice. It will give you something OK. Don't ship the OK. The OK is scaffolding.

The Claude draft is never the final draft. Your job — the part that earns the retainer — is what comes next: cut forty percent, replace clichés with specifics, replace passive voice with active, replace "we help businesses grow" with "we built the thing you were going to hire two engineers to build."

The pattern is always the same. Draft → cut → re-render. Your edits are the product. Claude wrote the bones. You write the voice.

Anatomy of a copy edit pass

Six moves you make on every Claude draft.

Run these in order on every section. The first three are mechanical — Claude could do them but you'll catch more. The last three are taste.

01 · Cut
Cut 40%

Not 10. Not 20. Forty. The first draft is always over-explaining. The reader doesn't need the warm-up paragraph. Delete it. They got to the page already convinced they had a problem — your job is the verb.

02 · Specifics
Replace clichés with specifics

"Lightning-fast""loads in 200ms." "Loved by teams""used by Oakland Logistics, Field Co, and 1,200 others." Every cliché has a number, name, or noun underneath it. Find it. Use it.

03 · You
Replace "we" with "you" or with a verb

"We help teams ship faster""You ship faster." Or just "Ship faster." The reader doesn't care what you do — they care what they get. "We" is the most expensive word on a marketing page.

04 · Number
Add one number per section

One concrete number lifts a whole section out of the abstract. "In a week." "$0 to start." "Used by 3 of YC's W25 batch." The number is the anchor that the rest of the section earns its credibility from.

05 · Adjectives
Kill non-load-bearing adjectives

If the adjective could be removed without changing the meaning, kill it. "Powerful platform""platform." "Beautifully designed dashboards""dashboards." Every adjective you keep should be doing work. Most aren't.

06 · Loud
Read out loud — again

Same test as Station 04. After every edit pass, read the section out loud. If you trip on a word, your reader will too — they just won't tell you, they'll just leave. The mouth is the most honest editor.

The prompt that works

Draft every section in this voice, at this length.

Specificity in the prompt is everything. Tell Claude the voice profile, the section job, the word budget, and the banned words. Then accept that the draft is a starting point.

Draft the marketing copy for the Loopstack site, section by section.

CONTEXT
- Voice profile: brand/voice-profile.md (load it. Use the signature
  phrases. Avoid every word on the banned list.)
- Positioning: brand/positioning.md (the chosen first sentence is canon —
  do not paraphrase it. Use it verbatim.)
- Wireframe: site/marketing-wireframe.html (every section has a JOB
  comment — that's the brief for that section)

OUTPUT — for each section in the wireframe:

  HEADLINE — 4–10 words. Has to land out loud.
  BODY     — 2–4 sentences max. ~50 words.
  CTA      — 2–4 words. Different per section.

CONSTRAINTS
- No banned words. None. Not even once.
- No "we help." Banned this round.
- One concrete number per section minimum.
- The hero section uses the canonical first sentence verbatim.
- Each section serves the JOB comment from the wireframe — if your
  draft doesn't, rewrite before showing me.

THEN
After each section, do a self-edit pass:
  - count words
  - flag any banned words you slipped past
  - flag any sentence that wouldn't read out loud cleanly
  - cut 20% if possible without losing meaning

Show me the original draft + your self-edited version side by side.
I'll do my own pass on top.
Tip 01
The Hemingway pass

For every sentence, ask: can I delete a word and have it still mean what it means? If yes, delete. Repeat until no. Most marketing copy carries 40% pure scaffolding. Hemingway pass strips it. The remaining sentence is denser, faster, and louder.

Tip 02
The "would they say this?" test

Hold every sentence up against the founder's voice profile. Would Maya say this in a Slack message? If no, rewrite. The test isn't whether the sentence is grammatically correct — it's whether the founder would recognize themselves in it.

Tip 03
Cut the whole sentence first

Before you tweak a clunky sentence, try deleting it entirely. Read what's left. Half the time, the page is better without it. If you genuinely need it, it'll be obvious — and the rewrite will be easier because now you know what work it has to do.

site / copy-pass.md Loopstack · 3 sections · draft → edit → final
§ HERO · Job: hook, in one breath
Claude draft38 words

Loopstack is a powerful low-code platform that helps modern operations teams seamlessly build the internal tools they need to scale, without hiring engineers or waiting months for IT to deliver.

First edit pass22 words

Loopstack is a powerful low-code platform that helps Build modern operations teams seamlessly the internal tools you need — build the internal tools they need to scale, without hiring engineers or waiting months for IT to deliver.

Final · shipped14 words

We built the thing you were going to hire two engineers to build.

§ BENEFIT 02 · Job: name the speed
Claude draft32 words

Lightning-fast development cycles let your team iterate quickly and respond to customer needs in real time, dramatically reducing time-to-market for critical internal tools and dashboards.

First edit pass18 words

Lightning-fast development cycles let Ship a tool your team iterate quickly and respond to customer needs in real time, dramatically reducing in a week. time-to-market for critical internal tools and dashboards. Most ship by Friday.

Final · shipped9 words

Ship a tool in a week. Most ship by Friday.

§ BIG CTA · Job: ask, with momentum
Claude draft28 words

Start your free 14-day trial today. No credit card required. Our team is here to help you get up and running with Loopstack as quickly as possible.

First edit pass15 words

Start your free 14-day trial today. Start a 14-day trial. No credit card required. Our team is here to help you get up and running with Loopstack as quickly as possible. We'll help you ship the first tool by Friday.

Final · shipped14 words

Start a 14-day trial. No card. We'll help you ship the first tool by Friday.

Net cut 98 words → 37 words across three sections. 62% reduction. Same meaning. Three times the punch. The drafts were scaffolding. The edits were the product.
Station 06 — Marketing
06
Three surfaces blur into one workflow

Design in
the medium.

Now the visual layer. You're a designer here — but you're not designing in Figma and translating to code. You're designing in Claude Cowork. Building real HTML, real CSS, real type, real grid, all in the medium the page will ship in. The translation step is gone. The Figma → code tax is gone. The "well, in design it looked like…" conversation is gone.

The three Claude surfaces blur into one workflow. Chat for the big-picture thinking — "what would Pentagram do here?" Cowork for file-aware iteration — "rev v1 of the hero, here's the brand brief." Code for "wire up the smooth-scroll on the CTA." Different surfaces, different moments, same project context.

This is the unlock that took me longest to internalize: the Figma comp is no longer the deliverable. The HTML is the comp. Once you accept that, the cycle compresses by an order of magnitude.

Anatomy of designing in the medium

Six rules that kill the Figma → code tax.

Each one removes a translation step. Stack them and the whole "comp → spec → build → review" pipeline collapses into one continuous edit.

01 · Canvas
HTML is the canvas

Open the .html file. That's your canvas. There's no "design phase" before this. The first thing you push to the file is a section structure with placeholder copy — and you iterate from there.

02 · Type
Real type from the start

Load the actual webfonts on the first commit. Don't design with Helvetica and "swap later." Type sets the rhythm of every other decision — getting it wrong on day one means redesigning on day five.

03 · Grid
Real grid, not a Figma frame

Your grid is CSS Grid or flex — not a 1440-wide artboard. It responds the moment you resize the browser. You can't "design responsive" — you can only build responsive and watch it.

04 · DevTools
Browser DevTools as inspector

DevTools replaces the Figma inspector panel. Tweak padding live, see it instantly, paste the value back into the file. The inspector is the tool, not a separate step. No more "let me update the comp."

05 · Versions
Version-as-you-go

Save hero-v1, hero-v2, hero-v3 as actual files (or branches). You can pull up all three side-by-side in the browser at full fidelity. Try doing that with Figma frames at production type-scale. You can't.

06 · No-tax
No translation tax

Figma → code is where 30% of the design dies. Spacing changes. Type tightens. Cursor states get forgotten. If you design in code, none of that loss happens. The thing you saw at v3 is the thing that ships.

When to use which surface

Three Claude surfaces, one project.

The blur isn't sloppy — it's specialization. Use the right surface for the right moment and the whole project moves faster.

The moment Surface Why
"What would Pentagram / Order / Linear do with this hero?" Chat Pure thinking. No file overhead. Reference-rich.
"Read the voice profile and the wireframe — give me three brand directions." Chat Multi-doc synthesis. No code yet. Move fast on direction.
"Iterate hero.html from v1 → v4. Try a left-aligned variant." Cowork File-aware. You see the diff. Versions live as actual files.
"Generate the OG image as an SVG matching the brand." Cowork Output is a saved file you can drop into the repo.
"Wire up the smooth-scroll on the CTA, then commit." Code Repo-native. Direct to git. Test in the dev server.
"Ship to Netlify, generate the changelog, post the announce." Code Deploy choreography. Code lives where the deploy lives.
Tip 01
The "draft in HTML" rule

For marketing pages, skip Figma entirely. Open Cowork, ask Claude for the section structure as raw HTML, then style it live. You'll be at hero-v3 in the time it would have taken to make the first Figma frame. The fidelity gap closes immediately because there is no fidelity gap.

Tip 02
The screenshot bridge

When you DO need Figma — and you sometimes do, for moodboards or client review decks — keep it upstream of code, never downstream. Figma for thinking, never for handoff. The handoff is the thing being shipped, and the thing being shipped is the HTML.

site / hero.html — versions Loopstack · 3 revs · 47 minutes total
v1 Centered · safe · 12 min

We built the thing
you were going to hire
two engineers to build.

For ops teams, 20–80 people.

Try Loopstack →
v2 Left-aligned · room to breathe · 18 min

We built the thing you were going to hire two engineers to build.

Loopstack is the internal-tools layer your ops team is one engineer short of building. 14-day trial. No card.

Start a trial →
PRODUCT SHOT · DASHBOARD
v3 · shipped Inverted · italic punch · 17 min

We built the thing you were going to hire two engineers to build.

Internal tools, in a week. No engineer required. Most teams ship the first one by Friday.

Start a trial →
PRODUCT SHOT · DASHBOARD
Designed in browser Three production-fidelity hero versions in 47 minutes. All three rendered live in Cowork, side-by-side at full type-scale, viewable on the actual mobile breakpoints. Zero Figma. The translation tax was paid in time saved.
Station 07 — Marketing
07
A quarter of work, compressed into a Tuesday

Polish, ship,
iterate same-day.

Same shape as Part 1, way faster, because there's no backend, no database, no migration. Drag the folder to Netlify. Connect the domain. Set up Plausible. You're live. The whole final-mile is half a Tuesday afternoon — if you've kept the polish list close.

The founder shares the link with three friends. Three pieces of feedback come back in the next hour. You incorporate two of them by lunch. Push the update. The friends see version two by dinner. That's the whole loop. That's the new tempo.

This used to be a quarter of work. Now it's a Tuesday. The page that took 9 weeks last year takes 6 days this year — and the thing that broke loose isn't the design, isn't the code, isn't even the AI. It's the cycle.

Anatomy of marketing-page polish

Six things that make a page feel shipped, not finished.

The difference between a page that bounces and one that converts is rarely the headline — it's whether the polish list got run before launch. Run it.

01 · Identity
Favicon + OG image

The page exists in the browser tab and on every social share. If your favicon is the default globe and your OG card is broken, the page is unfinished — no matter how good the hero is. Both take 20 minutes. Do them.

02 · Speed
200ms perceived load

The page should feel instant. Inline the critical CSS, defer scripts, preconnect the font CDN, ship a single self-contained HTML where you can. Marketing pages live or die on first paint — get it under 200ms or you'll lose the impatient half of the audience.

03 · CTA
Every CTA reachable in one scroll

From any scroll position, the reader should be one swipe away from the next CTA. Sticky footer button, repeated mid-page CTA, big bottom one. Friction kills conversion. Make the click cheap.

04 · Mobile
Loads clean on a subway

Not "responsive in Chrome's DevTools." On an actual phone, on actual 4G, ideally on the founder's actual phone. The desktop preview lies. The phone tells the truth. Test on the phone.

05 · Share
OG card looks right when shared

Drop the URL into Slack, X, iMessage, LinkedIn. Does the preview card make you proud? The OG image is the first impression on every share — bigger reach than the homepage itself, in most launches.

06 · A11y
Accessibility pass

Alt text on every image. AA contrast on every text-on-color combo. Keyboard reachable. Skip the perf flex on Twitter and run axe instead. A page that fails contrast is a page some of your buyers literally can't read.

The prompt that ships

Hand the launch choreography to Claude.

Generating the OG image, drafting the announce post, wiring analytics, posting the changelog — all mechanical. Claude does it in one prompt while you stay focused on the page itself.

Ship the Loopstack marketing site.

CONTEXT
- Site files: /site/
- Brand: brand/marketing-brand-directions.md (Editorial Workshop)
- Voice: brand/voice-profile.md
- Domain: loopstack.com (registered, DNS TBD)
- Hosting: Netlify (drag-deploy from /site/)
- Analytics: Plausible (acct already created, site needs adding)

DO IN ORDER

1. PRE-FLIGHT — run through the polish checklist:
   favicon · OG image · TLS · 404 page · robots.txt · sitemap ·
   alt text · color contrast · mobile breakpoints · sticky CTA
   For each: pass / needs work + one-line note. Stop. Show me.

2. After "go": generate the assets.
   - favicon.svg (use the M lockup, on cream)
   - og-image.svg (1200×630, headline + brand mark + URL)
   - apple-touch-icon.png

3. WRITE the launch posts (don't post yet, draft only).
   - LinkedIn (Maya's voice, 4–6 sentences, 1 link)
   - X/Twitter thread (4 posts max, no hashtags)
   - Customer Slack post (warm, direct, 2 sentences)

4. Wire Plausible + verify the snippet renders.
   Confirm the test ping shows up before you call it done.

5. Generate releases/v1.0.md as the public changelog entry.
   Use the same format as the Loopstack app releases.

STOP CONDITIONS
- Stop after step 1. Show the polish checklist. Wait for "go."
- Don't post anything live. Drafts only.
- Don't change the DNS. I'll do that by hand.
Tip 01
The phone test

Open the page on your actual phone, on actual cell data, ideally not on your home Wi-Fi. The Chrome responsive-mode preview is a lie. The phone has the real font rendering, the real touch targets, the real scroll feel, the real loading speed. Half the bugs you'll fix at this stage are bugs the desktop hid.

Tip 02
The screenshot share test

Take a screenshot of the hero. Would you actually send this to a friend? Would the founder send this to their friends? If no — the polish isn't done. The screenshot is the share unit, not the page. Optimize for the screenshot.

Tip 03
The OG card matters more than you think

For most launches, the OG card gets seen 10–100× more than the homepage. Every Slack share, every X post, every iMessage preview, every LinkedIn embed. Spend an hour on the OG image. It's the single highest-leverage asset on the page.

site / launch-checklist.md Loopstack · 12 items · 8/12 done at first push
Favicon · M lockup, cream + ink 3 min
OG image · 1200×630, headline + URL 22 min
Plausible analytics wired + verified 8 min
DNS pointed to Netlify 5 min
TLS auto-issued, HTTPS forced auto
404 page (branded, not Netlify default) 14 min
robots.txt + sitemap.xml 2 min
Alt text + AA contrast pass (axe clean) 11 min
Phone test on real device + 4G pending
Launch posts drafted (LI, X, Slack) in progress
Founder Slack: "we're live" after phone test
Update agency portfolio + invoice retainer end of week
First-push status Eight of twelve at first push. The remaining four either depend on the founder (phone test, "we're live" Slack) or wait for the launch window. Total polish time: 65 minutes.
Economics shift · marketing edition

The page is a subscription, not a project.

Old model Marketing rebuild project
  • One big project. Discovery → design → dev → handoff. Then goodbye for a year.
  • $35K, three months. Locked scope. Three rounds of stakeholder review.
  • Iteration is a phase 2. "We'll revisit messaging next quarter." Quarter never comes.
  • The page ages out. By month 9, the positioning is stale and nobody owns the rewrite.
New model Page-as-subscription
  • Monthly retainer. Includes the build + ongoing iteration. The founder texts. The page changes.
  • Half the upfront. Buys you the loop, not just the launch. Page improves every week.
  • Iteration is the product. A new headline test on a Tuesday. A new social proof block on a Thursday.
  • The page never ages. Positioning evolves with the company. The changelog is the marketing.
End of Part Two

Seven stations. Voice to launch. The work didn't get smaller — the cycles did. Again.

That's the soft case. A marketing page that used to be a quarter is now a Tuesday — and the page that's retainer-priced is a page that stays alive instead of going stale. Now: what nine weeks looks like next to six days, side by side, with the same humans on both sides of the comparison.

Before / After · same humans, different tempo
Before / After

Six weeks.
Six days.

Same humans. Same brand quality. Different process. Let me make this concrete.

Last year

Fintech marketing site, nine weeks.

Discovery call to live deployment. Three rounds of stakeholder review. Three rounds of design iteration. One round of "wait, can we redo the hero?"

Time to ship
9 WEEKS
Review rounds3
Designer hours~180
Budget$35,000
This year

This site, six days.

Discovery to live. One round of review. Zero stakeholder fights — because the brief was so sharp the stakeholder agreed before we'd designed a single screen.

Time to ship
6 DAYS
Review rounds1
Designer hours~22
Cost~$4,000

What changed? The unglamorous middle of the project collapsed from weeks into hours. Which freed up time for the parts that need a human — the strategy, the taste, the "is this the right thing to ship" moments.

Three rules

If you remember
nothing else.
Three rules.

They'll get you eighty percent of the value. The other twenty percent is taste, and that's on you.

01
Rule One

Show, don't tell.

Claude is a master of inference. It is not a parser of descriptions.

If you want it to design like Pentagram — don't describe Pentagram. Paste five Pentagram projects. If you want it to write like Stewart Butterfield — don't describe Stewart Butterfield's voice. Paste a Stewart Butterfield essay. If you want it to build a dashboard like Linear — don't describe Linear. Paste a Linear screenshot.

Words are lossy. Examples are perfect.

The corollary: if you're getting generic outputs from Claude, the problem is almost always that you gave it generic inputs. The fix is upstream of the prompt.

02
Rule Two

Spec first. Ask never.

Bad prompt: "Can you help me build a dashboard?"

Good prompt: "Build a dashboard with three cards in the top row showing MRR, churn, and active users. Below: a chart of weekly signups over the last twelve weeks. Use Tailwind. Match this attached design. Use this data shape."

Specifications get specifications back. Questions get hedging back.

The exception: if you don't know enough to spec it — write the spec with Claude. But write it. Don't ask "what should I build?" Ask "given X, Y, Z, here's my draft spec — push back on what's missing or wrong."

You're the senior. Claude is the smart junior. Smart juniors are great when you bring a brief. Smart juniors are useless when you bring a vibe.

03
Rule Three

Three Claudes, one project.

Most people use Claude wrong because they use one surface for everything. There are three. They are not the same.

Claude Chat is for thinking. Exploration. The early generative work. The "what if" conversations. Use it for ideation, for analysis, for talking through tradeoffs.

Claude Cowork is for files. For iteration in the middle of a project, when you have artifacts you're working with. Use it for writing, design files, brand kits, marketing copy — anything where the work product is a file on your computer.

Claude Code is for the engineering. For shipping. For actual code, in a real project, with version control. Use it for the build phase — the parts that go to production.

Using Chat to write production code is leaving leverage on the table. Using Code for moodboarding is using a hammer to hang a poster.

Match the tool to the moment. The match itself is most of the skill.

Tips & tricks

Eight more habits
that compound.

The three rules are the structure. These are the texture — small habits that, after a year of doing this every day, separate the people who get a lot out of Claude from the people who get a little.

01

Paste, don't describe.

If something exists, paste it. Screenshots, code, references, voice samples. Claude is a master of imitation — not interpretation.

02

One conversation, per project.

Start it, never restart it. Long context compounds. Each new turn builds on every previous one. Restarting throws away accumulated knowledge.

03

Ask for three versions, not one.

"Give me three different takes on this." Claude does best when it can show range. Pick the strongest — or combine the best parts of each.

04

Make it critique itself.

Generate the output. Then ask: "What are the three weakest parts of this?" Then fix those. Two passes beat one, every time.

05

Plan in Chat. Build in Code.

Chat is for figuring out WHAT to build — the spec, the architecture, the tradeoffs. Code is for building it. Don't try to do both in one tool.

06

Push back. Hard.

When Claude hedges, demand a position. When it over-explains, say "less explanation." Train it to your taste mid-conversation. Don't be polite.

07

Save the prompts that worked.

When you nail an output, save the prompt to a personal library. Reuse. Remix. Most great prompts are riffs on past great prompts.

08

The Linear test.

Before shipping anything Claude wrote — copy, design, code — ask: would this fit at Linear? If no, iterate. Don't let "AI did it" be a quality excuse.

None of these are obvious on day one. All of them are obvious on day three hundred. The point of this talk is to skip you forward.

What this unlocks

Things that
weren't possible before.

Solo designers shipping at agency quality.

Because the boring middle of any project — the schema, the deployment, the integration — is no longer a wall.

Real-time iteration with clients.

Because "let me come back next Tuesday with mockups" becomes "let me come back in twenty minutes with mockups."

Brand systems at startup speed.

Because lockups, rules, components, documentation — all of that takes hours instead of weeks.

Internal tools that don't suck.

Because the marginal cost of polish dropped tenfold. Hover states, empty states, designed loading skeletons. All in.

The bottleneck is no longer time. It's clarity of vision.

Close

Three rules.
Three Claudes.
One cycle.

If you're a designer — or you work with designers — and you're not using these tools the way I just described, you're competing against people who are. They're shipping five times faster than you.

The work doesn't get smaller because Claude got better. The work gets bigger — because the floor on quality rose for everyone. Now we compete on taste, on speed, on judgment. Which is what we always wanted to compete on anyway.

Thank you.

1 / 28