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 onlyI 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.
Use date-fns here instead of the hand-written date conversion.
Switched to date-fns in all three places in this change, not just this line.
A plain-language request
Recreation of a real change from October 2026, shortened. The person’s name is illustrative.
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.
Specs, ticket queues, guessed states and fix rounds. Small polish requests cost an engineer a context switch each, so many never shipped at all.
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.
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.
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.
Frame plus written spacing, states and edge cases.
Waits behind feature work.
Built from the spec; missing states get guessed.
Fixes filed: wrong gap, token or state.
Fixes join the queue again.
The smallest requests were the most expensive per unit of value.
1 context switchfor an engineer, each time
A day of waitingfor the designer, each time
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.
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.
| Layer | In Figma | In code |
|---|---|---|
| Tokens | Colour, type, radius and shadow styles | Theme tokens in Tailwind |
| Base components | Buttons, inputs, selects, tabs, badges | 28 accessible base components |
| Composed pieces | Tables, empty states, progress steps | About 290 component files |
| States | Loading, empty and error frames | Shared loading, empty and skeleton views |
| Forms | Field, label, hint and error | A 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.
| Guardrail | What it enforces |
|---|---|
| Rulebook (CLAUDE.md) | Search before build, tokens instead of raw colours, loading, empty and error states, naming |
| Automated checks | Formatting, lint and types, before any task is called done and again in CI |
| Translations | Every visible string in English and Spanish, with key parity checked |
| Generated API types | Typed queries generated from the schema, never edited by hand |
| Review skill | A pre-PR pass for bugs, generated-code drift and copy rules |
| Approval gates | Commit, push and PR only when I explicitly say so, every time |
Fix the rule, not the line. When a reviewer leaves a comment, the rule behind it is fixed everywhere in the change, then answered on the thread.
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.
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 onlyA 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 chatChanges made while testing land in a draft, never live data. Any submit that writes something is confirmed with me first.
Confirm before submitEvery 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.
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.
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.
“If the person resigned, exited, retired or their contract ended, ask what to do with them: suspend, exit with a date, or do nothing.”
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.
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.
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.
“Adjust the spacing”: gaps measured at 16px, raised to 20px, re-measured. “Same options on Replace”: added.
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.
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.
| Opened | What shipped | Size | Files |
|---|---|---|---|
| 16 Oct | Remove and Replace ask what happens to someone leaving: suspend, exit with a date, or nothing | +339 / −88 | 11 |
| 16 Oct | Bulk invite review: issues shown inline in the table instead of stacked error cards | +748 / −1,146 | 17 |
| 15 Oct | Career paths: tidier draft banner, skeleton tracks for early drafts | +88 / −73 | 7 |
| 14 Oct | Profile: name field in Edit Profile | +47 / −12 | 7 |
| 14 Oct | Skills: new skill-level picker component | +560 / −152 | 22 |
| 14 Oct | Onboarding: Slack out of setup, profile-link hints and checks | +246 / −43 | 17 |
| 13 Oct | Onboarding: drop the top back button, lift the steps | +7 / −30 | 6 |
| 13 Oct | Onboarding: smooth, staggered fetching lines | +101 / −30 | 3 |
| 13 Oct | Onboarding: change skill levels on profile review | +195 / −19 | 9 |
| 13 Oct | Onboarding: “edit later” hint on profile review | +52 / −13 | 6 |
| 13 Oct | Onboarding: confirm team LinkedIn first, pace the profile reveal | +100 / −31 | 6 |
| 13 Oct | Onboarding: rotating fetch copy, slow-scan skip, centred steps | +256 / −115 | 10 |
| 13 Oct | Profile: aspiration history drawer and ladder position markers | +741 / −50 | 21 |
| 12 Oct | Onboarding: redesigned profile setup, review and loading steps | +1,186 / −296 | 36 |
| 9 Oct | Profile: readiness over time spans every level held | +86 / −60 | 10 |
| 9 Oct | Profile: readiness table fills its row, titles capitalised | +19 / −18 | 3 |
| 9 Oct | Profile: career tab with career path and readiness over time | +2,291 / −170 | 39 |
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.
| Step | Before | Now |
|---|---|---|
| Spec and redlines | Written for an engineer | Not needed: intent in chat, corrections on screen |
| Waiting for capacity | Queued behind feature work | Starts immediately |
| Building the screen | An engineer, from the spec | Claude, from design-system parts and the repo’s patterns |
| States and copy | Often missed, found in QA | Required by the rulebook, in two languages |
| Visual QA rounds | Fixes filed, then re-queued | Asked, changed and re-measured in minutes |
| Code quality | One engineer’s judgement | Same checks as any PR, plus human review |
| Engineer’s role | Author | Reviewer; owns architecture and backend contracts |
The biggest single saving is on polish. And every part added to the design system, like the new skill-level picker, already reused in four app files, makes the next screen cheaper.
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.
The one review comment that needed a code change was fixed and merged within the hour.
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.
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.
HandoffI designed, engineers built from my specs. Shipping code myself was the exception.
The merged PRs added 36 new component files and 8 new hooks, most of them from Claude-made PRs.
3 new parts
added to the shared design system, ready for every screen
4 app files
already use the new skill-level picker. That is the point of adding parts to the library, not to a page.
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.
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.
Feedback like “tabs are always visible” is a rule, so it’s applied to every state.
Ambiguous intent gets options and a recommendation, not a guess.
“Spacing looks uneven” is checked by measuring gaps in the browser.
Each commit stages only that feature’s files.
API contracts, data models and architecture. Backend gaps get raised, not worked around.
Sessions expire every couple of hours and screenshots can lag, so Claude reads the page text to confirm.
A misclick once created an empty draft, so submits are confirmed first and full submit runs become a QA step.
Every repeated correction becomes a rulebook line or a library component.
An engine that reads work from the tools a team already uses and turns it into a live report card, with next steps.