Process · version 1.0 · November 2026

Frontend with Claude Code

The process and method behind 30+ design system and dark mode PRs now in production, and what I learned along the way. I own product and visual decisions; Claude acts as a senior developer; engineering reviews and merges.

See the method Get the toolkit
Flow
10 steps in 4 phases
Checkpoints
Plan and evidence
Lessons
8, and what changed because of them
On this page
    The idea01

    The method in one sentence

    Each card becomes one Claude session, in its own worktree, with a clear kickoff prompt and two checkpoints: the plan and the evidence. Claude handles everything else (code, checks, screenshots, tests, PR) and shows me the result. Commits and PRs happen only when I ask.

    What changed the outcome most was making the decision boundary explicit: Claude settles anything technical and reversible on its own, and checks with me when the decision is about product or visuals, involves someone else, or can't be undone.

    • ScopeDesignerCard scope and what's left outClaudeTechnical organization: files, commits, order
    • VisualsDesignerVisuals, patterns, behavior the user seesClaudeWhich design system component to use, tokens, safe refactors
    • PlanDesignerApprove the plan before any editClaudeChecks: lint, types, tests, E2E, performance
    • EvidenceDesignerApprove the evidence (before and after screenshots)ClaudeScreenshots, comparisons, evidence log
    • DeliveryDesignerAsk for the commit and PRClaudeOpen the PR in the team's format and move the card
    • ReviewDesignerLead the conversation with reviewers and decide what changesClaudeFix the review bot's findings and apply what we agreed on
    How a PR moves02

    The flow of a PR

    Ten steps in four phases. Pick a step on the timeline or use the arrow keys. Checkpoints are in yellow: Claude stops and waits for my call.

    PrepareDesigner

    Small card

    A short title (about 40 characters), a clear scope and a list of what not to touch. One PR per card. If the scope grows midway, it becomes another card.

    In practice

    A card that grew midway became two: two smaller PRs, reviewed faster.

    PrepareClaude

    Dedicated session and worktree

    One session per card, renamed with the ID and title so each one is easy to find in the sidebar, in a fresh worktree off an up-to-date main branch. Never an old branch: it shows screens that no longer exist.

    Claude runs the team's setup: dependencies, internal libraries, environment variables and database.

    Example

    DS-14 PR 3: sign-up fields

    Heads-up

    Before any screenshot, check where the environment is running from.

    PrepareDesigner

    Kickoff prompt

    Instead of re-explaining the task from memory every time, paste a prompt with the goal, the visual reference, what's out of scope, the rules and the checkpoints. With the skill installed, it stays short.

    In the toolkit

    The prompt generator builds one for a PR and one for the orchestrator.

    PrepareDesigner approves

    The plan Checkpoint

    Before editing any file, Claude sends the plan: files, the components it will use, what stays the same, and risks. I approve or correct it. It's the step that saves the most rework.

    Claude sends something like this

    “Plan for DS-14: 3 files on the Orders screen. I'll swap the list's hardcoded background for the surface token and the status labels for the design system Badge; validation and payload stay the same. Risk: the yellow warning may lose contrast in light mode; I'll check it in the screenshots. OK to proceed?”

    BuildClaude

    Building, with fixed rules

    • Design system first. An alternative library only when the design system lacks the component; never a component marked as draft.
    • Don't rebuild what already exists. Given a reference screen, Claude uses the same component and adjusts it only through props and classes.
    • Semantic tokens, light and dark. No hardcoded colors.
    • A visual swap doesn't change behavior. Validation, copy, payload and data-testid stay the same.
    • The laziness ladder. Does it need to exist? Does it already exist in the repo? Only then write the minimum.
    • Bugs: fix the root cause. Once, at the source, not on every screen.
    Meanwhile

    I follow along in the app's browser and check the screen in light and dark mode. Visual tweaks are my call.

    ProveDesigner approves

    Evidence Checkpoint

    • Before and after screenshots, light and dark, including error and disabled states.
    • E2E for the area on both branches. A failure that already happens on main isn't the PR's fault.
    • Performance: LCP, CLS and long tasks, measured back to back, in the same time window.
    • Recorded in an evidence file, on the card and in the PR description.
    See

    The comparison layout and the performance criteria.

    ProveClaude

    Checks and docs

    The team's checks, only on the packages touched: lint, types, tests, dead code. If the team requires documentation for visible changes, it goes in the same PR.

    Heads-up

    Global checks and large builds with the environment running overload the machine. Anything heavy runs with the environment stopped.

    ProveClaude

    Independent review

    A separate reviewer (a subagent or another session acting as reviewer) looks only at the diff, hunting for bugs. If anything changes afterward, it runs again.

    Insight

    The second round often catches side effects introduced by the first round's fix.

    DeliverDesigner asks

    Commit and PR only when I ask

    • Stage only the files in scope; the diff against main must not contain anything else.
    • PR in the team's format and the card moved to “in review”, with the link.
    • A review request written in the team's format, ready for me to send.
    DeliverClaude and designer

    After it's open

    Findings from the review bot: Claude fixes what's in scope and replies in the thread.

    Comments from people: the conversation is mine. Claude brings the technical context for each point when I ask and applies what we agree on.

    What I learned doing it03

    Lessons

    The method above didn't come out fully formed. Each rule came from something that went wrong, or that worked better than expected.

    1. 01

      Before and after is the deliverable

      Without the comparison, fix-up work goes unnoticed: reviewers can't see what changed, and users never knew there was a problem. That's why evidence is a checkpoint, not an attachment.

    2. 02

      The scoreboard lives in code, not in a spreadsheet

      A script counts, on every merge, how many uses of the old component remain, and a lint rule blocks new ones. Without that guardrail, five new files using the old component showed up in four days.

    3. 03

      Measure back to back, in the same window

      A performance run done hours apart showed a 21% regression that didn't exist. Once both branches were measured back to back, the difference disappeared.

    4. 04

      Swapping components is an audit

      The most serious bugs were on screens nobody had asked me to look at. Opening each screen to swap the component exposes what was already broken around it.

    5. 05

      AI executes; design judgment decides

      The AI rewrote a set of tabs to make them “cleaner” and broke the platform's identity. That became a rule: don't rebuild what already exists, and reuse the component from the reference screen.

    6. 06

      Independent review catches what the author misses

      A second session, looking only at the diff, found a bug that was already in production. Since then, the review runs again whenever something changes after it.

    7. 07

      Measure before you promise, one area per PR

      The number comes before the commitment. And each PR touches a single area, so it can be rolled back without undoing the rest.

    8. 08

      A fixed mistake becomes memory

      When Claude makes a mistake that must not happen again, the fix goes into the project memory, along with the reason. Over time, the process lives in memories and rules files, and prompts get short.

    Proof, not promises04

    Evidence

    The comparison is always the same grid: before on the left, after on the right; light on top, dark below. Reviewers spot the difference without reading a word.

    Example: in dark mode, the list had a hardcoded light background and the status labels disappeared. After, it uses the surface token; light mode doesn't change. When the swap is invisible to users, like a forms library, the comparison shows the error state: the same messages, in the same place.

    Performance criteria

    LCP
    No regression above 10%
    CLS
    No increase
    Long tasks
    No new ones above 50 ms
    Several PRs at once05

    The orchestrator session

    Each PR runs in its own session and worktree, but there's usually only one local environment: fixed ports, one database. Only one worktree can be running at a time. The orchestrator is its sole owner and decides who gets it.

    Why it exists

    Switching the environment by hand, PR by PR, didn't scale: every switch depended on someone being available right then, and PRs sat waiting. With the orchestrator owning the environment, the queue moves on its own.

    What it does

    • Starts, switches and stops the environment
    • Keeps the queue of who's next
    • Checks the machine's load before starting
    • Maintains STATUS.md, the status board for every PR
    • Flags PRs that depend on each other
    • Prepares the card and prompt for the next PR

    What it doesn't do

    • Doesn't write the PRs' code
    • Doesn't decide visuals or product
    • Doesn't commit or open PRs for other sessions
    • Doesn't talk to reviewers on the PRs' behalf

    Design decisions, commits and PRs still come straight to me.

    Organizing the app

    • Orchestrator pinned to the top. It's the session I open most.
    • One group per workstream, with all the PR sessions inside.
    • Every session named after its card, with the PR number up front.
    • Delivered sessions get out of the way: marked done and, with my OK, archived.

    Simulator: switching the environment

    An afternoon with two PRs and the orchestrator. Step through it; the note below explains why each thing happens.

    Environment
    Queue
    STATUS.md

    Ground rules

    • One environment at a time, always. Starting one can kill any extra server, including the main-branch server used for the “before” screenshots. Start that one afterward.
    • Nothing heavy while the environment is running. Global type checks and large builds overload the machine.
    • Infrastructure is shared. Don't start the database and queues from inside a worktree: that can create a new, empty database.
    • Two PRs in flight at most: one builds, the other proves and documents. More than that just creates queues and conflicts.
    • Tell the team before touching an area, especially whoever is changing the same screens.
    What has gone wrong before06

    Known pitfalls

    And how to avoid each one. The skill warns Claude about all of them.

    • What happenedA screen in an unexpected theme: the environment was running from an outdated branchHow to avoid itA fresh worktree off main for each card; check where the environment is running from before taking screenshots.
    • What happenedA fresh worktree with dozens of “module not found” errorsHow to avoid itRun the setup (install and build the internal libraries) before running any checks.
    • What happenedA file regenerated by the local server ended up in the PRHow to avoid itNever git add -A with the environment running; stage only what's in scope and check the diff before pushing.
    • What happenedA global check with the environment running froze the machineHow to avoid itCheck only the packages touched; anything heavy runs with the environment stopped.
    • What happenedFrontend written against an endpoint the backend hadn't shipped yetHow to avoid itConfirm it exists in the API contract or the generated types before starting.
    • What happenedA component rewritten from scratch drifted from the visual identityHow to avoid itReuse the component from the reference screen and adjust it only through props and classes.
    • What happenedPerformance measured at different times showed a false 21% regressionHow to avoid itBoth branches back to back, in the same time window.
    • What happenedSwitching the environment by hand turned into a waiting lineHow to avoid itThe orchestrator takes over the switching, keeping the machine awake while there's work.
    Adopting it07

    Getting started: two paths

    Start with A. When the work is bigger than one PR, move on to B.

    One PR, one person driving the session. No orchestration, evidence folder or scripts needed.

    1. Install the skill and fill in the team configuration.
    2. Pick a small, visual card: a dark mode bug on a single screen is perfect.
    3. Open a new session in the app, in the repository folder, and paste the kickoff prompt.
    4. Approve the plan before any edit.
    5. Follow along in the app's browser, in light and dark mode.
    6. Approve the evidence: before and after screenshots, E2E and independent review.
    7. Only then ask for the commit and PR.

    Setting up the local environment the first time is the hardest part: it's worth doing with someone from engineering.

    Take it with you08

    The full toolkit

    Version 1.0 · free · no sign-up

    Bring the method to your team

    The skill makes Claude follow the process on its own; the guide walks through each step in plain language. Copy, download and adapt them to your team.

    Or install it with one command, in the terminal where you run Claude Code:

    Then fill in the team configuration at the top of the file (Claude asks about anything left blank the first time) and call it by name in a new session: “use processo-frontend on card DS-14” or /processo-frontend.

    View the skill
    Loading…

    Optional: get an email when a new version is out. Nothing else, no newsletter.

    Prompt templates

    Fill in, then copy. Missing fields show in yellow. Everything is saved only in this browser.

    Your team's setup fill in once
    Branch:
    
                    
                  

    Evidence template

    evidence-<card>.md
    # Evidence · <ID> <title>
    
    ## Screenshots
    Before (main) on the left, after (branch) on the right; light on top, dark below.
    - <screen>: default, error, disabled
    
    ## E2E for the area
    - Main: <x of y> · Branch: <x of y>
    - Pre-existing (already failing on main): <test and reason>
    
    ## Performance (both back to back, in the same window)
    | Screen | LCP before | LCP after | Difference | CLS before | CLS after | New long tasks |
    |-|-|-|-|-|-|-|
    
    ## Behavior
    - Validation, copy, payload and data-testid unchanged: <how it was checked>
    
    ## Checks
    - <lint, types, tests>: <result>
    - Didn't run, and why: <...>
    
    ## Independent review
    - Round 1: <findings and what changed>
    - Round 2: <if anything changed afterward>
    No jargon09

    Glossary

    Every technical term on this page. In the text, terms have a dotted underline; click one to see its definition.

    Session
    A Claude Code conversation with its own context. Each card gets its own.
    Orchestrator
    The session that coordinates the others and is the sole owner of the local environment.
    Main branch
    The main line of the code, the one that goes to production. Every new change starts from an up-to-date copy of it.
    Branch
    A parallel line of the code where a change happens, until it becomes a PR and is merged into main.
    Worktree
    A second folder of the same repository with another branch checked out. It lets several PRs move at once without stepping on each other.
    Design system
    The set of components and tokens the product uses. The first source for any screen.
    Semantic token
    A color named for its role (surface, secondary text) instead of a fixed value. It switches between light and dark on its own.
    E2E
    An automated test that opens the browser and uses the screen like a person would: clicks, types, saves.
    data-testid
    An invisible label tests use to find buttons and fields. It must not change in a visual swap.
    LCP
    How long the largest element on the screen takes to appear. It measures loading.
    CLS
    How much the layout “jumps” while it loads. Lower is better.
    Long task
    A browser freeze longer than 50 ms; people feel it as a stutter while typing.
    Payload
    The data the screen sends to the API on save. It has to come out the same before and after.
    Review bot
    An automated reviewer that comments on PRs. Claude fixes what it flags within scope.