← All work

Runara · Senior Product Designer · Workflow · Design systems · AI tooling

High time you changed your design workflow.

The workflow I was trained in was built for handoff. The one I run now has no handoff in it. It came together at Runara, where I own the design system and the tooling around it: the system lives in a repo, Claude Code can read and write the Figma file, and a review agent lets engineers and other designers contribute without waiting on me. This is how I got here, what the machine gets wrong, and where I still make every call myself.

Role
Senior product designer at Runara. Owner of the design system and the tooling around it
When
The old workflow from 2019. The new one at Runara since early 2026, still changing
Stack
Figma and its MCP server, Claude Code, DTCG tokens, Style Dictionary, GitHub Actions
Outcome
A design system anyone on the team can change, reviewed by an agent, merged within the rules I wrote
Two rows. The draft loop: Figma to Claude Code over MCP, then my interview of the draft, then code pushed back to canvas. The contribution pipeline: a pull request, automated checks, a review agent, and three lanes: merge, flag back to the author, or escalate to me.
(01)   Then

The first team I joined ran the workflow the industry had settled on a decade earlier. I did every step of it.

It went like this. Research in a deck. Wireframes in Sketch. A symbol library that one person maintained and everyone detached from. A clickable prototype in InVision for the stakeholder review, which was a meeting, which was where the design actually got decided. Then the part that took the most time and produced the least value: handoff. I exported to Zeplin, wrote redlines for the things Zeplin missed, sat in a "walkthrough" with engineering, and answered Slack questions about spacing for the next two weeks.

Then the build shipped, and it did not match. Not because anyone was careless. Because the design lived in one place, the code lived in another, and the only bridge between them was me, explaining. Design QA was a spreadsheet of screenshots with red circles. The design system was a Sketch library plus a Confluence page, and the contribution model was "ask Nandha." I was the bottleneck by design, and I was proud of it, because being the bottleneck felt like being the standard.

I want to be fair to that workflow. It was rigorous. It taught me to think in components, to specify states, to write a redline that an engineer could not misread. Most of what I know about UI I learned by having to explain it to someone who was going to build it without me in the room. But the whole shape of it was organised around a single assumption: the designer produces a picture, and someone else turns the picture into the product.

(02)   What changed

The picture stopped being the source of truth. That broke the workflow more than any tool did.

Two things happened close together. Figma shipped an MCP server, which means an AI agent can read a frame as structure rather than as a screenshot: the layer hierarchy, the variables behind every colour and spacing value, and the Code Connect map that says which production component a Figma component corresponds to.1 And Claude Code became something a designer could actually sit in front of all day. Give it a frame link, and it writes against your real components and tokens instead of approximating from pixels. Ask it to push what it built back, and it lands in Figma as editable layers.2

Figma's own 2026 report puts a number on what that did to the job: designers participating in development nearly doubled in a year, from 21 to 41 percent.3 I am one of them. But the interesting change is not that I write code now. It is that the artefact I hand over is no longer a picture. It is a working screen, built from the system, that engineering reviews as a pull request rather than reconstructs from a spec.

Once that was true, handoff stopped being a phase. And once handoff stopped being a phase, everything I had built my process around, the redlines, the walkthroughs, the QA spreadsheet, became overhead with nothing to attach to.

The workflow I inherited
  1. Research synthesis in a deck
  2. Wireframes, then hi-fi in Sketch
  3. Detach from the library when it gets in the way
  4. InVision prototype for the stakeholder meeting
  5. Export to Zeplin, add redlines for the gaps
  6. Handoff walkthrough with engineering
  7. Two weeks of spacing questions in Slack
  8. Design QA against the build, screenshots with red circles
  9. Design system updated later, by me, if I remember
How I work at Runara
  1. Standards first: tokens, principles, and component rules in the repo
  2. Research synthesis, still a document, now also read by the agent
  3. Draft the screen with Claude Code against the system, from a Figma frame or from a brief
  4. Interview the draft. Reject most of it. Iterate in the same session
  5. Push the result back to Figma as editable layers for the team to see
  6. Open a pull request. Engineering reviews working UI, not a spec
  7. Any teammate opens their own PR against the design system
  8. Checks run, the review agent reads the diff, and it merges, flags, or escalates
  9. System stays current because contributing is cheaper than working around it
(03)   How I work now

I spend the first week of any project writing the rules the machine has to design inside.

The mistake I made in the first month was prompting the way people prompt image generators: describe the screen, admire the output, describe it again. It produced plausible UI that belonged to no product. What fixed it was doing the design-system work first and treating it as the prompt.

Concretely, the repo now holds four things before any screen exists. The tokens, in the W3C Design Tokens format, built out to CSS, Swift, and Kotlin by Style Dictionary, so there is one file that says what "muted text" means everywhere.4 A CLAUDE.md that reads like a design principles page, not a style guide: what the product is for, who it is for, what we never do, which component to reach for in which situation. Skills for each component family, so "add a filter bar" pulls in the rules for density, empty states, and keyboard behaviour without me restating them. And Code Connect mappings, so when Claude Code reads a Figma frame it sees "this is our Button, primary, medium" rather than a rectangle with a fill.

Then the loop. I give Claude Code a frame link or a paragraph of intent. It drafts. I do not accept the draft. I interview it.

Question 01
What is the one thing on this screen?
If the draft cannot answer in a sentence, the hierarchy is wrong. AI drafts tend toward evenness: every element the same weight, because the average interface is even.
Question 02
What happens when it is empty, loading, wrong, or too long?
The first draft is always the happy path. I ask for the four other states before I look at the visual again.
Question 03
Which token did you use, and why that one?
A draft that invents a hex value or a spacing number has left the system. The answer has to be a token name and a reason.
Question 04
Would the person in the research recognise this?
The agent has read the synthesis doc. I make it point to the line in it that justifies the layout. If it cannot, the layout is a guess dressed as a decision.

Iteration is the same session. "Collapse the secondary actions into an overflow, the primary is competing with three things." "The loading state is a spinner, use the skeleton pattern from the list component." "That is the wrong elevation for a sheet on mobile." Each of those is a sentence, and each one lands in working code in under a minute, which is the part that changed the pace of my work more than anything. A round of critique that used to cost an afternoon of moving rectangles now costs the time it takes to say what is wrong.

When it holds up, I push it back to Figma. Not because Figma is the source of truth anymore, but because it is where the rest of the team looks, and a working screen they can annotate beats a link to a branch.

(04)   Where the AI design fails

It designs the average product. My job is to know what makes ours not average.

I keep a running list of the ways drafts go wrong, because the pattern is stable enough to design around. These are the ones that show up every week.

The draft
Flat hierarchy. Title, metadata, and primary action all set at the same visual weight, because that is what most dashboards look like.
What I change
Name the one thing, demote everything else. This is a taste call the agent will not make unless CLAUDE.md tells it what the product is for.
The draft
Token drift. A "close enough" grey typed in as a hex value, or a 14px gap where the scale has 12 and 16.
What I change
Reject on sight, and this is now a CI check rather than a thing I catch by eye. Every value has to resolve to a token.
The draft
Fluent, generic copy. "Manage your settings." "Get started." Reads fine, says nothing, and never uses the words the users used in research.
What I change
I write the copy. The agent gets a glossary of user language from the synthesis doc, and the rule that it never coins a noun we did not hear.
The draft
Pattern borrowing. A confirmation modal where the product's own pattern is an inline undo. Correct in general, wrong for us.
What I change
Add the pattern to the skill so it never happens twice. Every correction I make more than once becomes a rule the agent reads next time.

That last row is the whole method. The agent is not getting smarter between sessions. The repo is. Every rejected draft either teaches me something about the product or teaches the system something about the product, and I try to make sure it is the second one as often as possible.

(05)   The contribution pipeline

The design system is only alive if people other than me can change it. So I stopped being the gate.

Here is the problem every design system owner knows. Contribution is welcome in principle and gated in practice, and the gate is one person's calendar. Zeroheight's 2026 survey found most teams say they encourage open contribution while more than two in five admit to gatekeeping it.5 I was both of those teams. Engineers would need a token or a variant, find me busy, and ship a local override. Six months later the system described a product that no longer existed.

What I built at Runara is a pipeline where the review is done by an agent that has read the same principles I would apply, and I only see the changes that need a human.

A pull request against the design system repo From anyone on the team. Tokens, a component variant, a doc page, a Code Connect mapping. Often opened by Claude Code from a one-line request in an engineer's terminal.
Deterministic checks Token JSON validates against the DTCG schema. Style Dictionary builds all platforms. Contrast holds AA on every theme pair. Visual snapshots diff.
The review agent Claude Code, run by a GitHub Action on every PR, with the design principles, the component skills, and the change log as context. It reads the diff, not the screenshots.6
The verdict One of three lanes, written as a PR review with a reason for every line it objects to. Never a bare approve or reject.
Lane 1 · Merge Additive and inside the rules. A new semantic alias of an existing primitive. A doc fix. A variant that reuses existing tokens and adds every state. The agent approves, CI merges, the variables sync back to Figma.
Lane 2 · Flag Something is wrong and the fix is knowable. The agent requests changes, cites the principle or the token that was broken, names the owner of the affected component, and posts the same note to them in Slack.
Lane 3 · Escalate A new pattern, a primitive change, anything that touches more than one component family, or anything the agent is not confident about. It writes a summary and assigns the PR to me.

The line between the lanes is the design decision here, and I drew it conservatively. The merge lane is narrow on purpose: additive, token-resolved, every state present, no primitive touched, all checks green. Everything else goes to a person. The point was never to remove judgment from the system. It was to stop spending my judgment on the changes that did not need it.

This is what a flag looks like when it lands. It is the part of the pipeline I rewrote most, because a review that says "wrong" without a reason teaches nothing and gets ignored.

runara-review bot requested changes
design-system · PR #212 · "Soften muted text for the reports table" · assigned to the author, cc component owner for Table

Blocking. This changes the primitive color.gray.500 from #6B6F76 to #8A8E95. That primitive is aliased by color.text.muted, which is used by 14 components, not only the reports table. On surface.card the new value measures 3.6:1, below the AA threshold of 4.5:1 for body copy set in the accessibility rule (CLAUDE.md, "Never ship text below AA on any theme pair").

What I think you wanted. The table's secondary column reads too heavy against the row striping. That is a component-level problem, not a palette-level one.

Suggested fix. Leave the primitive alone. Add a semantic alias table.cell.secondary pointing at color.gray.500, and change the Table component to use the existing type.body.sm scale for that column. That reads lighter without changing contrast anywhere else. If you make that change, this PR qualifies for the merge lane.

Reasons cited: accessibility rule, primitive-change rule, token-scope rule. Escalated to a human: no. Author notified in Slack.

Two rules make this work, and neither is about the model. First, the agent has to say what it thinks the author was trying to do. A review that only says no gets worked around. A review that says "here is the version of this that would merge" gets acted on, usually within the hour. Second, it has to name a person. A flag that goes to a channel is nobody's. A flag that goes to the author with the component owner copied gets resolved.

(06)   What I'm keeping

The tools took the handoff away. They did not take the judgment. If anything they made it the whole job.

The standards are the design work now. A week spent on tokens, principles, and component rules used to feel like overhead before the "real" design. It is the opposite. It is the only week where what I decide gets multiplied by every draft and every PR that follows.

The interview is the craft. Ten years ago the skill was producing the screen. Now the screen is cheap, and the skill is knowing, in one look, why this one is wrong for these users. That is the same taste I was building with redlines. It just has somewhere to go faster.

The gate moved, it did not disappear. The merge lane is small and I intend to keep it small. Every time the agent approves something I would not have, the lane gets narrower, and the rule that would have caught it goes in the repo. That is the part of this workflow I expect to still be doing in a year.

What still worries me. A system that is easy to contribute to can drift by accretion, one reasonable alias at a time. I read the merged-lane log every Friday. I am not sure yet that is enough.

References

  1. Figma, Figma MCP server: tools and prompts. The design-context, variable-definition, and Code Connect map tools an agent reads a frame through.
  2. Figma, How designers can use Claude Code, and From Claude Code to Figma, February 2026, on pushing built UI back to the canvas as editable layers.
  3. Figma, 2026 AI Report. Designers participating in development rose from 21% to 41% year over year.
  4. W3C Design Tokens Community Group, Design Tokens Format Module, first stable release October 2025, and Style Dictionary for the platform builds.
  5. zeroheight, Design Systems Report 2026. Token adoption at 84% of teams; most teams encourage contribution while more than two in five gatekeep it.
  6. Anthropic, Claude Code GitHub Actions. Automated review on pull request events, with CLAUDE.md and repository skills as the review criteria.