In useDesign workflow · Lyearn

Design to code, without the handoff.

I ship production front end straight into Lyearn’s codebase with Claude Code as my engineering pair. I describe the change, it builds from our design system, I check it live, and a developer reviews and merges the pull request.

Claude CodeFront-end repo · local
If the person resigned, retired, exited or their contract ended, ask what to do with them: suspend, exit with a date, or do nothing.
On it. I’ll check what already exists before building anything.
Searched the design system Select · Button group · Date picker · Form
Found the existing suspend reasons and exit action Reusing both, nothing new invented
Built the new fields from existing parts English and Spanish strings added
Format, lint and type checks passed
Adjust the spacing between the fields.
Measured the gaps in the live app 16px → 20px, re-measured
Checked all seven leaving reasons, without submitting
Looks right. Open the PR.
Opened the pull request Fixed the reviewer’s comment in all three places
Ask Claude to build or change a screen…
localhost · People › Org structure
Remove personRiya Nair · UI/UX Designer 2
Reason for leaving
Resigned
What should happen to Riya?
SuspendExit with a dateDo nothing
Last working day
31 Oct 2026
Note
Saved to the draft. Nothing changes until you publish.
CancelRemove
16px16px
OpenRemove and Replace ask what happens to someone leaving
+339−8811 files All checks passed
Reviewer

Use date-fns here instead of the hand-written date conversion.

Claude · via the designer

Switched to date-fns in all three places in this change, not just this line.

Step 1 of 5

A plain-language request

Recreation of a real change from October 2026, shortened. The person’s name is illustrative.

The brief · what this workflow solved

Most front-end cost on UI work is handoff, not code. I removed it: I describe the change, Claude builds it from our design system, I check it live, and a developer reviews and merges the PR.

  1. 01The problem

    Five hands between design and production.

    Specs, ticket queues, guessed states and fix rounds. Small polish requests cost an engineer a context switch each, so many never shipped at all.

  2. 02What I built

    One loop from request to merged PR.

    Claude Code works in the local repo, builds from the shared design system, checks its work in the running app and opens the PR when I approve.

  3. 03What changes

    Engineers review instead of rebuilding.

    Seventeen PRs merged in one week, each reviewed and merged by a developer on GitHub. Engineering time moves from building screens to reviewing them and owning architecture.

RoleProduct designerFrom request to merged PR
PairClaude CodeBuilds, checks, opens PRs
Review & mergeDevelopersThey review and merge on GitHub
Window9–16 Oct 202617 pull requests merged
01The problem

The cost was in the handoff, not the typing.

In the usual flow a design passes through five hands before it ships. Each pass loses a little detail, and every fix goes back in the queue.

  1. 1
    SpecDesigner

    Frame plus written spacing, states and edge cases.

  2. 2
    QueueWaiting

    Waits behind feature work.

  3. 3
    BuildEngineer

    Built from the spec; missing states get guessed.

  4. 4
    ReviewDesigner

    Fixes filed: wrong gap, token or state.

  5. 5
    RepeatBack in queue

    Fixes join the queue again.

Small requests, big cost

The smallest requests were the most expensive per unit of value.

D
Push this a little lowerKeep the row height the same in every tabBetter copy here
each one costs

1 context switchfor an engineer, each time

A day of waitingfor the designer, each time

02The setup

Claude Code sits between me and every tool.

Everything runs on my laptop. Claude Code works in the local clone of our front-end repo, drives the running app in a browser, and reaches Figma and GitHub through connectors that are already signed in. Our engineers build the backend and APIs first and hand me the schemas and Markdown docs, so they exist before any design.

DesignerAsks, checks the live screen, approves
Figma librarySame components and tokens
API schemas + docsWritten first by our engineers
Claude CodeOn my laptop
  1. Reads the repo’s rulebook
  2. Searches the design system first
  3. Builds, then runs the checks
  4. Measures the result live
Local repoApp screens, design-system library, rulebook
Dev server + browserThe app, signed in with my own session
GitHubPR on my approval; a developer reviews and merges
03System and rules

One shared library. One written rulebook.

Two things keep Claude’s output on-brand and up to standard: a design system that exists in both Figma and React, and the team’s conventions written down in the repo, where machines can check them.

Same component names, same variants, same tokens. A Figma screen is a list of parts Claude can already import, not a picture to redraw.

LayerIn FigmaIn code
TokensColour, type, radius and shadow stylesTheme tokens in Tailwind
Base componentsButtons, inputs, selects, tabs, badges28 accessible base components
Composed piecesTables, empty states, progress stepsAbout 290 component files
StatesLoading, empty and error framesShared loading, empty and skeleton views
FormsField, label, hint and errorA configurable form with typed fields

Search before you build. Claude looks in the design system first, then for an existing screen doing the same job, then in installed libraries, and only then writes something new. A genuinely missing part gets added to the library, never hand-rolled inside a page.

04Access, safely

My session, never my credentials.

Claude works on my own laptop and signs in to the running app with my own session. It never handles a password or token itself.

01

Works on my machine

Claude runs in the desktop app with the local repo as its working folder. It starts the dev server and opens the app in a built-in browser, separate from my own.

Local only
02

I sign in, Claude doesn’t

A small local page, kept out of git, takes a fresh token that I paste myself. Claude never types passwords or tokens, and won’t use one pasted into chat.

No secrets in chat
03

Tests touch drafts only

Changes made while testing land in a draft, never live data. Any submit that writes something is confirmed with me first.

Confirm before submit
05The working loop

Every change is checked live before it becomes a PR.

Every request runs the same loop. I judge only the live result; Claude handles everything between the request and the PR, and a developer reviews and merges it.

Way in 01

From a Figma frame

When a screen starts in Figma, Claude reads the frame through the Figma connector and rebuilds it from the same library parts, so the code matches the design.

Figma frameClaudeLibrary parts
Way in 02

Straight from the API

When engineers ship the API first, Claude reads their schemas and Markdown docs, so I design with the real data and its limits, directly in code.

API schemaClaudeLive screen
yesno: designer gives feedback01Requestplain language02Searchdesign system + repo03Buildfrom parts04Checkformat, lint, types05Verify livemeasure in the app06Open PRon my approval07Code reviewby a developer08Mergedby the reviewerLooks right?
  1. Requestplain language
  2. Searchdesign system + repo
  3. Buildfrom parts
  4. Checkformat, lint, types
  5. Verify livemeasure in the app
  6. Looks right?no: feedback goes back to Build
  7. Open PRon my approval
  8. Code reviewby a developer
  9. Mergedby the reviewer

Worked example Asking what happens to someone leaving · merged 16 Oct

  1. Request

    “If the person resigned, exited, retired or their contract ended, ask what to do with them: suspend, exit with a date, or do nothing.”

  2. Search

    Claude found what the person drawer already allows for each status, the existing suspend reasons and exit action, and the form parts in the design system. Nothing new was invented.

  3. Build & check

    New fields in the modal, English and Spanish strings, and the extra data in the query. The file grew past the size limit, so the logic moved into its own hook. Checks passed.

  4. Verify live

    All seven leaving reasons checked in the running app (four ask the question, three don’t), each option’s fields and the draft note, without submitting.

  5. Feedback

    “Adjust the spacing”: gaps measured at 16px, raised to 20px, re-measured. “Same options on Replace”: added.

  6. Review & merge

    The reviewer asked for a date library in one helper; Claude switched all three hand-written conversions and replied, and the developer merged it the same day.

06Shipped work

Seventeen PRs in eight days.

From small polish to whole flows: onboarding, the career profile, bulk invite and org setup. Engineers review the code; I decide on the live product.

Every PR opened 9–16 October 2026. Sizes are lines added and removed, as GitHub reports them.

OpenedWhat shippedSizeFiles
16 OctRemove and Replace ask what happens to someone leaving: suspend, exit with a date, or nothing+339 / −8811
16 OctBulk invite review: issues shown inline in the table instead of stacked error cards+748 / −1,14617
15 OctCareer paths: tidier draft banner, skeleton tracks for early drafts+88 / −737
14 OctProfile: name field in Edit Profile+47 / −127
14 OctSkills: new skill-level picker component+560 / −15222
14 OctOnboarding: Slack out of setup, profile-link hints and checks+246 / −4317
13 OctOnboarding: drop the top back button, lift the steps+7 / −306
13 OctOnboarding: smooth, staggered fetching lines+101 / −303
13 OctOnboarding: change skill levels on profile review+195 / −199
13 OctOnboarding: “edit later” hint on profile review+52 / −136
13 OctOnboarding: confirm team LinkedIn first, pace the profile reveal+100 / −316
13 OctOnboarding: rotating fetch copy, slow-scan skip, centred steps+256 / −11510
13 OctProfile: aspiration history drawer and ladder position markers+741 / −5021
12 OctOnboarding: redesigned profile setup, review and loading steps+1,186 / −29636
9 OctProfile: readiness over time spans every level held+86 / −6010
9 OctProfile: readiness table fills its row, titles capitalised+19 / −183
9 OctProfile: career tab with career path and readiness over time+2,291 / −17039

Most PRs are reviewed and merged by a developer on GitHub; occasionally, for a small fix, I merge my own after the checks pass. One of them removed more code than it added: moving errors into the table let the old stacked-card interface go.

07Measuring impact

Fast to merge, and honest about what’s missing.

All figures come from GitHub for the 17 PRs opened 9–16 October 2026. They measure review speed and size, not yet a cost saving.

Review speed
0.5 hmedian, PR opened to merged
Merged within 3 hours
14
Waited overnight, 17–22 h
3

The one review comment that needed a code change was fixed and merged within the hour.

17PRs merged
+7,062 −2,346Lines added / removed
230Files changed
195Median lines added per PR
Baseline needed

Open-to-merge time leaves out the design and build time before a PR opens, so it shows review friction, not total effort. The next step is a baseline: engineer days for three to five comparable screens built the old way. That turns these numbers into a cost saving.

08The shift

Shipping front end went from occasional to routine.

Before the loop, I shipped a front-end change now and then, mostly by hand. Once it was in place, shipping became part of my everyday design work, and most of what I have merged since was made with Claude Code.

83%Of my merged PRs made with Claude Code
80%Of the lines I added, written with Claude
9,139Lines added to production front end
From handing off to shippingOne merged PR, made with Claude Code
Before the loop
  1. Designin Figma
  2. Specredlines and states
  3. Ticketwaits in the queue
  4. Engineerbuilds from the spec
  5. Fix roundsback to the queue

HandoffI designed, engineers built from my specs. Shipping code myself was the exception.

With the loop · first month
18PRs merged,
all made with Claude Code
Built from the design systemChecked liveReviewed by a developer

New components

The merged PRs added 36 new component files and 8 new hooks, most of them from Claude-made PRs.

36New component files
25Of them from Claude-made PRs
8New hooks, all made with Claude
New library parts

3 new parts

added to the shared design system, ready for every screen

Skill-level pickerProgress stepsSlack icon
Reuse

4 app files

already use the new skill-level picker. That is the point of adding parts to the library, not to a page.

Where Claude-made components went
Career path on the profile15
Onboarding5
Org setup2

Counted from GitHub, April to October 2026. A PR counts as made with Claude when its description or a commit credits Claude Code. Closed, unmerged PRs are left out of the line totals.

09Lessons and limits

The designer decides. The repo’s rules stay the bar.

The loop works because I stay the decision-maker and the repo’s rules stay the standard. It speeds up design-to-code; it doesn’t replace engineering judgement.

What made it work

Correct the pattern, not the instance

Feedback like “tabs are always visible” is a rule, so it’s applied to every state.

Ask when there are two readings

Ambiguous intent gets options and a recommendation, not a guess.

Verify the property, not the change

“Spacing looks uneven” is checked by measuring gaps in the browser.

Keep the PR to the request

Each commit stages only that feature’s files.

Limits to plan for

Engineers own the hard parts

API contracts, data models and architecture. Backend gaps get raised, not worked around.

The live app is fiddly

Sessions expire every couple of hours and screenshots can lag, so Claude reads the page text to confirm.

Testing touches real drafts

A misclick once created an empty draft, so submits are confirmed first and full submit runs become a QA step.

Rules only help when written down

Every repeated correction becomes a rulebook line or a library component.

Read next · In testing

Employee productivity

An engine that reads work from the tools a team already uses and turns it into a live report card, with next steps.

Read case study