<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Eun Ji Jung — Thoughts</title>
    <link>https://eunji.design/thoughts</link>
    <description>Writing about what I’m learning as I incorporate AI deeply into my design workflow: building design systems that agents can actually use, writing Claude Skills to automate how I work, and figuring out what it means to be a designer in 2026.</description>
    <language>en</language>
    <managingEditor>Eun Ji Jung</managingEditor>
    <lastBuildDate>Wed, 12 Aug 2026 12:00:00 GMT</lastBuildDate>
    <atom:link href="https://eunji.design/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Ask what you can give</title>
      <link>https://eunji.design/thoughts/fashion-nova-hq</link>
      <guid isPermaLink="true">https://eunji.design/thoughts/fashion-nova-hq</guid>
      <pubDate>Wed, 12 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Eun Ji Jung</dc:creator>
      <description>Six people over four hours at the Fashion Nova office. The normal move afterwards is six emails that say the same thing with the names swapped. I built the office instead: an isometric floor you walk around, leaving a note with each person who interviewed me.</description>
      <category>Canvas</category>
      <category>Interaction Design</category>
      <category>Claude</category>
      <category>Side Project</category>
      <content:encoded><![CDATA[<div><div><p>Thoughts</p><div><span>Aug 2026 · 1 min read</span><div><span>Canvas</span><span>Interaction Design</span><span>Claude</span><span>Side Project</span></div></div><p>Claude Opus 5 helped me build this and write this up.</p><div><p>I was listening to<!-- --><a href="https://www.youtube.com/watch?v=mdV8APhz2j4" target="_blank" rel="noopener noreferrer">the Dive Club podcast</a><!-- -->with Flora Guo as a guest. There were a lot of memorable moments, but the one that really stuck was her idea that designers should treat the internet the way a good host treats a room. Ask what you can give rather than what you can get: notes, artifacts, events you put on. She makes things for her friends as gifts. That sat with me for a few weeks without anywhere to go.</p><p>Then I spent a Monday at the Fashion Nova office in Beverly Hills. A design workshop, lunch, then four back-to-back conversations. Six people over four hours. I could have sent the recruiter one email with six individual thank-you notes in it. I thought of Flora instead and wanted to make this a gift too. The day was memorable and I wanted to give that back as something memorable.</p><p>I built out a game, a representation of the office with the different hubs and the cross functions that I got to meet, interact and learn from during my interview process. It&#x27;s an isometric floor you walk around in the browser. The recruiter meets you at the entrance, welcomes you in and tells you how to move, and then you walk the building and leave a note with each of the six people who interviewed me, each of them standing about where I met them. A table by the door keeps every note you&#x27;ve handed over so you can read them again.</p></div><figure><div><iframe src="https://fashion-nova-hq.vercel.app/" title="Fashion Nova HQ, an isometric office you can walk around" loading="lazy" allowFullScreen=""></iframe></div><figcaption><a href="https://fashion-nova-hq.vercel.app/" target="_blank" rel="noopener noreferrer">Open in a new tab</a><span>Click into the office first, then arrow keys or WASD to walk and space to talk. On a phone, open it in a tab for the touch controls and the full-height view.</span></figcaption></figure><div><p>I designed it, and my new best friend Claude built it, haha.</p></div><div><p>Resources</p><p><a href="https://fashion-nova-hq.vercel.app" target="_blank" rel="noopener noreferrer">fashion-nova-hq.vercel.app</a><!-- -->— walk around the office. Arrow keys or WASD, space to talk, T to change the palette.</p></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>figma-comments-mcp: an MCP server so Claude can read your comments</title>
      <link>https://eunji.design/thoughts/figma-comments-mcp</link>
      <guid isPermaLink="true">https://eunji.design/thoughts/figma-comments-mcp</guid>
      <pubDate>Sat, 08 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Eun Ji Jung</dc:creator>
      <description>Every round of design feedback went through me as a copy-paste layer between Figma and Claude. I built an MCP server that reads comment threads and Dev Mode annotations directly, scoped to the frame you link, and never writes back.</description>
      <category>MCP</category>
      <category>AI Workflow</category>
      <category>Claude</category>
      <category>Open Source</category>
      <content:encoded><![CDATA[<div><div><p>Thoughts</p><div><span>Aug 2026 · 4 min read</span><div><span>MCP</span><span>AI Workflow</span><span>Claude</span><span>Open Source</span></div></div><p>Claude Opus 5 helped me build this and write this up.</p><div><p>Every round of design feedback went through me as a copy-paste layer. Open Figma, read the comment thread, retype it into Claude in my own words, wait for the change, go check it against the original comment. For a file with a dozen open threads, that&#x27;s a dozen trips back and forth before any of it reaches the agent.</p><p>The comments already exist, in full, in Figma. There was no reason Claude couldn&#x27;t read them itself. So I built<!-- --><a href="https://github.com/ejun-9/figma-comments-mcp" target="_blank" rel="noopener noreferrer">figma-comments-mcp</a>, an MCP server that hands Claude a frame link and gets back the actual feedback pinned to it.</p></div><div><h2>Two tools, both read-only</h2><p><code>list_figma_comments</code> reads the comment threads and Dev Mode annotations on a file, or on one frame within it. Each one resolves to the layer it&#x27;s pinned to, so a comment reaches Claude as<!-- --><em>&quot;on 01 · Results — default&quot;</em> instead of a bare node id:</p><pre>rNK3UkoeLnbBHHYQiv9MW8 · frame 132:5 &quot;01 · Results — default&quot; · 1 thread · 1 annotation 1873426532 · Eun Ji Jung · 2026-08-05 19:22 on 132:5 &quot;01 · Results — default&quot; FRAME have hover states annotation on 132:258 &quot;Overview&quot; FRAME allow for collapsing panels</pre><p><code>get_figma_comment_image</code> renders the layer a comment is pinned to, for when the feedback is spatial (&quot;too much space here&quot;) or pinned to a pasted screenshot named something useless like <code>image 21</code>.</p><p>Neither tool writes anything back. It reads Figma; it never edits a design or posts a reply.</p></div><div><h2>Why there&#x27;s no reply tool</h2><p>An earlier version had a <code>reply_to_figma_comment</code> tool. I pulled it. A reply in a comment thread is a statement to a collaborator, not a status update, and I didn&#x27;t want an agent posting into that conversation on my behalf, worded however it decided to word it. Reading feedback and acting on it is one thing. Speaking to the people who left it is mine to do.</p></div><div><h2>A frame link isn&#x27;t a file link</h2><p>I share a link to one frame and expect comments on that frame, not the fifty other threads scattered across the rest of the file. Any Figma URL copied with a frame selected carries a <code>node-id</code>, and the tool scopes to it, descendants included, everything outside excluded, and it always reports how many threads it left out. Before this distinction existed, a frame link and a file link looked identical and every call just returned the whole file.</p><p>Annotations get the same care for a different reason. Dev Mode annotations are a separate Figma feature, invisible to the comments API, and easy to leave behind without noticing. A frame holding one comment and one annotation used to report &quot;1 thread,&quot; which looked complete and wasn&#x27;t. Both counts are on the headline now.</p></div><div><h2>Try it</h2><p>Clone the repo, <code>npm install</code>, <code>npm run build</code>, then point Claude Code or Claude Desktop at<!-- --><code>dist/index.js</code> with a Figma personal access token scoped to read-only file content and comments. Full setup steps, the token scopes, and a troubleshooting table are in the repo README.</p><p>Once it&#x27;s wired in, paste a frame link and ask Claude to read the comments and apply them, or ask what&#x27;s still open across the whole file. No more retyping.</p></div><div><p>Resources</p><p><a href="https://github.com/ejun-9/figma-comments-mcp" target="_blank" rel="noopener noreferrer">github.com/ejun-9/figma-comments-mcp</a><!-- -->— the server, setup instructions, and troubleshooting.</p></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>ds-specs: a Claude Skill for LLM-first design systems, with two-way Figma sync</title>
      <link>https://eunji.design/thoughts/ds-specs</link>
      <guid isPermaLink="true">https://eunji.design/thoughts/ds-specs</guid>
      <pubDate>Sat, 08 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Eun Ji Jung</dc:creator>
      <description>The design system fix I wrote about last time lived inside one project. I rebuilt it as ds-specs, an installable Claude Skill with a two-way Figma bridge and five enforcement gates, and put it on GitHub for other designers to use.</description>
      <category>Design Systems</category>
      <category>AI Workflow</category>
      <category>Claude</category>
      <category>Open Source</category>
      <content:encoded><![CDATA[<div><div><p>Thoughts</p><div><span>Aug 2026 · 5 min read</span><div><span>Design Systems</span><span>AI Workflow</span><span>Claude</span><span>Open Source</span></div></div><p>Claude Opus 5 helped me build this and write this up.</p><div><p>Some time ago I wrote about<!-- --><a href="https://eunji.design/thoughts/design-system-for-agents">fixing a design system so Claude could actually follow it</a>. That fix lived inside one project, a<!-- --><code>/DSYS</code> folder in Lune&#x27;s repo, built by hand for that codebase&#x27;s stack and that codebase&#x27;s tokens. It worked there. It also meant that the next time I wanted the same fix on a different project, I&#x27;d be rebuilding it from scratch.</p><p>So I rebuilt it once more, on purpose this time, as something reusable: a Claude Skill called<!-- --><a href="https://github.com/ejun-9/ds-specs" target="_blank" rel="noopener noreferrer">ds-specs</a>. It&#x27;s on GitHub now, free to install, for any designer or team running into the same drift problem.</p></div><div><h2>What a skill gets you that a folder doesn&#x27;t</h2><p>The Lune version was specific to one project&#x27;s conventions. Turning it into a skill meant it had to work on a codebase it had never seen: detect whether the project uses Tailwind or plain CSS, scale the spec tree to how big the project actually is, and refuse to invent specs for components that don&#x27;t exist yet. A small accurate spec beats a comprehensive stale one.</p><p>It also meant going further than the original fix did. Three things<!-- --><code>ds-specs</code> adds on top of what I described last time:</p></div><div><h2>Three tiers, three layers of indirection</h2><p>Every spec references only the tier above it, so a component spec can never point straight at a raw hex value:</p><pre>specs/ ├── foundations/ color, typography, spacing, radius, elevation, motion… ├── tokens/ the master variable map ├── atoms/ ─┐ ├── molecules/ ├─ components, 8-section template each ├── organisms/ ─┘ └── patterns/ layout and composition rules</pre><p>And every token itself passes through three layers before it reaches a component, so nothing in the UI touches the upstream library directly:</p><pre>--ds-text: #292A2E; /* upstream library */ --color-text: var(--ds-text, #292A2E); /* your alias */ color: var(--color-text); /* components — alias only */</pre></div><div><h2>Five gates instead of one</h2><p>The Lune pre-commit hook was a single checkpoint. <code>ds-specs</code><!-- -->runs the same idea at five points, from session start through deploy, and draws a hard line on what&#x27;s allowed to self-heal. Local autofix can rewrite an exact hex match with a human reading the diff. CI and deploy only block, they never rewrite. A near miss like<!-- --><code>#1868DA</code> against a <code>#1868DB</code> token is either a typo or a deliberate one-off, and no script can tell which, so it gets flagged at higher severity and left for a person to decide.</p><p>On an existing codebase with hundreds of pre-existing violations, the gates start from a recorded baseline and only fail when the count goes up. Hard-failing against 400 existing violations just gets the gate deleted by Thursday.</p></div><div><h2>A two-way bridge to Figma</h2><p>The part I was most unsure I could get right. Figma variables carry a<!-- --><code>codeSyntax</code> field. Set it to the matching CSS custom property and the Figma variable and the code token become one record seen from two sides, so syncing is exact instead of fuzzy name matching between &quot;Text/Primary&quot; and<!-- --><code>--color-text</code>.</p><p>Neither side is treated as canonical. When you ask it to reconcile, it produces a six-category diff and stops. A mismatch is ambiguous. Only a person knows whether the designer moved the value or the developer did.</p></div><div><h2>Try it</h2><p>It installs two ways. On claude.ai, download the <code>.skill</code> file from the latest release and upload it under Settings → Capabilities → Skills. In Claude Code or Cowork, clone the repo and copy the skill folder into<!-- --><code>~/.claude/skills/</code>. Full steps, including how to verify it installed correctly, are in the repo README.</p><p>Once it&#x27;s in, you don&#x27;t need to invoke it by name every time. Say &quot;tokenize this&quot; or &quot;my prototype is drifting&quot; and it builds the spec tree. Say &quot;push my specs to Figma&quot; and it hands off to Figma&#x27;s own library-generation skill. Say &quot;does Figma match my code&quot; and it reconciles without changing anything.</p></div><div><p>Resources</p><p><a href="https://github.com/ejun-9/ds-specs" target="_blank" rel="noopener noreferrer">github.com/ejun-9/ds-specs</a><!-- -->— the skill, install instructions, and the packaged<!-- --><code>.skill</code> file for claude.ai.</p><p><a href="https://hvpandya.com/llm-design-systems" target="_blank" rel="noopener noreferrer">Expose your design system to LLMs</a><!-- -->by Hardik Pandya. The article the whole approach is built on.</p></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>I went looking for a Figma replacement.</title>
      <link>https://eunji.design/thoughts/figma-replacement-search</link>
      <guid isPermaLink="true">https://eunji.design/thoughts/figma-replacement-search</guid>
      <pubDate>Sun, 02 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Eun Ji Jung</dc:creator>
      <description>I spent a year obsessively testing every AI prototyping tool that came out, looking for something to replace Figma. Twelve tools survived. None of them replaced it. What I built instead was a stack, and one small tool of my own.</description>
      <category>AI Workflow</category>
      <category>Prototyping</category>
      <category>Figma</category>
      <content:encoded><![CDATA[<div><div><p>Thoughts</p><div><span>Aug 2026 · 7 min read</span><div><span>AI Workflow</span><span>Prototyping</span><span>Figma</span><span>Claude</span></div></div><p>Claude Sonnet 5 helped me write this.</p><div><p>We are moving into an age where using AI is just expected in a design workflow. Not optional, not a nice-to-have on a resume. Expected. That expectation is what put me into a phase of obsessively testing every AI tool that came out, and it left me with two feelings at once that I don&#x27;t think get said out loud enough.</p><p>There was excitement. Genuine excitement, about how much new technology was suddenly out there and how early I got to touch it. And there was a slight fear, too, that if I didn&#x27;t learn the new tool fast enough, I would fall behind. Both were real. Neither one cancels the other out.</p><p>But the testing wasn&#x27;t random. I was looking for something specific: an AI-native replacement for Figma.</p></div><div><h2>The search</h2><p>Figma is the tool I use the most. It is where I have lived for years. So the question I kept bringing to every new launch was not &quot;is this a fun tool,&quot; it was &quot;could this be the place I live instead.&quot;</p><p>Most of what I tried didn&#x27;t survive an evening. I am not going to name those. They weren&#x27;t great, and the interesting thing about them isn&#x27;t which ones they were. It&#x27;s how fast the filter worked. A tool either showed me something real in the first hour or it didn&#x27;t, and if it didn&#x27;t, I didn&#x27;t go back.</p><p>Twelve did survive. I loved all twelve, for different reasons, not the same reason repeated twelve times. That matters, because it means there was no winner. Nothing on the list replaced Figma. What I ended up with instead was a stack.</p></div><div><h2>The one with the best shot let me down the most</h2><p>Figma Make is the one I was rooting for hardest, and its updates were the ones I kept hoping would land. Every other tool on my list started from zero. Stitch, Claude Design, all of them. They don&#x27;t know my components, my variables, my files. When they fail to respect a design system, that&#x27;s expected. They never had one to begin with.</p><p>Figma Make already had it. Same file. Same libraries. Same components I&#x27;d built over years. It had the one advantage nothing else on my list could claim, and it&#x27;s still the one that disappointed me most.</p><p>It isn&#x27;t just a feeling, either.<!-- --><a href="https://forum.figma.com/ask-the-community-7/figma-make-export-design-doesn-t-export-the-library-components-49985" target="_blank" rel="noopener noreferrer">Figma&#x27;s own community forum</a><!-- -->confirms the exact failure I kept hitting: components from design system libraries don&#x27;t reliably export from Figma Make. They can paste back in as plain Figma elements instead of the real thing. The tool with the best possible starting position still couldn&#x27;t carry my system through cleanly. For their own product to be that disappointment was sad to say the least.</p></div><div><h2>What earned a place, and why</h2><p>Cursor stuck because of two things together: point-and-click editing, and a noticeably better Figma integration than anything else I tried. It did a better job than the others at translating a vibe-coded prototype back into Figma.</p><p>That detail matters more than it looks like at first. I went looking for something to replace Figma. The tool that earned a permanent slot did so by being best at going back to it. Figma never stopped being the destination. It&#x27;s still the system of record: the place work has to land, get reviewed, get handed off, and live.</p><p>So the honest version of my search isn&#x27;t &quot;nothing was good enough to replace Figma.&quot; It&#x27;s that I built a stack that orbits the thing I was trying to leave. The tools that survived are the ones that talk to Figma well, not the ones that could stand in for it.</p><p>Claude Code desktop does the opposite direction well: Figma into code. With the capture link, my designs get translated exactly. It gives me point-and-click modification, multiple terminals, file management in a side panel, and context that actually persists. It&#x27;s the center of the stack now.</p><p>Two different directions, both from tools I kept: my prototype becoming a design file, and my design file becoming a working prototype. I want to keep those separate in my head, because it&#x27;s easy to blur them into one vague &quot;Figma integration,&quot; and they&#x27;re not the same job.</p></div><div><h2>The tool built for exactly what I wanted</h2><p>Paper (paper.design) is the one that made me feel like I wasn&#x27;t crazy for looking. Its canvas is real HTML and CSS, not a proprietary format, and it&#x27;s built MCP-native from the ground up: an agent can read the canvas and write directly to it, not just generate something new. Some reviewers frame it outright as a Figma challenger.</p><p>It&#x27;s also still in open alpha. Figma is still where the industry actually is. Even<!-- --><a href="https://www.bykatharina.com/blog/paper-design-vs-figma-two-different-bets-on-the-future-of-design" target="_blank" rel="noopener noreferrer">Paper&#x27;s own comparisons</a><!-- -->concede it: Figma is more mature, has the ecosystem, and is still the default for most teams.</p><p>What I keep coming back to is the parallel. Paper rebuilt the canvas from scratch so an agent could act on it directly. I did something smaller with the same instinct. Neither of us thought the answer was a chat window. We both thought the answer was making the surface itself something an agent could touch.</p></div><div><h2>The one I kept, then killed, then understood why</h2><p>Conductor solved a real problem for me. I was living in the terminal, running Claude Code, and at some point I had what felt like a million terminal windows open. Conductor organized that.</p><p>Two things ended it. The model access I had through my subscription only covered Sonnet 4.6 for free. Every Opus tier I could pick was the paid, outside-subscription version, and Opus was the one I actually wanted for harder reasoning.</p><p>The second reason is the one I actually think matters more. I was living in the terminal because I assumed the desktop app had worse capabilities. It doesn&#x27;t. It does the same thing, but with a UI: I can see everything, make point-and-click modifications, and switch between projects from a side nav.</p><p>Once I saw that, Conductor&#x27;s whole reason for existing evaporated. It wasn&#x27;t a bad tool. It solved a problem I had manufactured for myself by believing something that wasn&#x27;t true. Claude Code desktop didn&#x27;t beat Conductor. It made the problem Conductor was solving disappear.</p></div><div><h2>The pattern I didn&#x27;t notice until I looked back</h2><p>Point-and-click kept coming up. Cursor, for the editing. Claude Code desktop, for the modification and a side nav where I can see everything. Figma, the one tool that was never displaced, is a canvas before it&#x27;s anything else.</p><p>Every tool that survived lets me point at the thing instead of describing it. I&#x27;m a designer. Direct manipulation is the way I actually think, and I&#x27;d been selecting for it the whole time without naming it.</p><p>The Claude Code move is the cleanest proof of this, because it isolates the variable. Same product, same model, same capabilities. It does the same thing. The only thing that changed was the interface. And that one change was enough to end an entire tool I&#x27;d built into my workflow. The tool didn&#x27;t get better. The interface did.</p></div><div><h2>What none of the twelve have</h2><p>This is where the search actually failed, and it wasn&#x27;t about features.</p><p>None of the twelve are multiplayer. There&#x27;s no one else in the file with me, no comment thread, and no history to point to when someone asks why a button ended up the way it did. Every one of them was built for one person and a text box.</p><div><div><table><thead><tr><th>Tool</th><th>Point at it</th><th>Round-trips to Figma</th><th>Own the code</th><th>Backend / deploy</th><th>Version history</th><th>Multiplayer</th></tr></thead><tbody><tr><td>Stitch</td><td>●</td><td>●</td><td>◐</td><td>○</td><td>○</td><td>○</td></tr><tr><td>Paper</td><td>●</td><td>○</td><td>●</td><td>○</td><td>○</td><td>○</td></tr><tr><td>Claude Design</td><td>●</td><td>○</td><td>●</td><td>◐</td><td>○</td><td>○</td></tr><tr><td>Figma Make</td><td>●</td><td>◐</td><td>◐</td><td>◐</td><td>◐</td><td>○</td></tr><tr><td>V0</td><td>◐</td><td>○</td><td>●</td><td>●</td><td>●</td><td>○</td></tr><tr><td>Lovable</td><td>●</td><td>○</td><td>●</td><td>●</td><td>●</td><td>○</td></tr><tr><td>Bubble.io</td><td>●</td><td>○</td><td>○</td><td>●</td><td>◐</td><td>○</td></tr><tr><td>FlutterFlow</td><td>●</td><td>○</td><td>●</td><td>●</td><td>◐</td><td>○</td></tr><tr><td>Cursor</td><td>●</td><td>●</td><td>●</td><td>◐</td><td>●</td><td>○</td></tr><tr><td>Claude Code</td><td>●</td><td>●</td><td>●</td><td>◐</td><td>●</td><td>○</td></tr><tr><td>Antigravity</td><td>◐</td><td>○</td><td>●</td><td>◐</td><td>●</td><td>○</td></tr><tr><td>Conductor</td><td>◐</td><td>○</td><td>●</td><td>◐</td><td>●</td><td>○</td></tr></tbody></table></div><p>● yes ◐ partial ○ no</p><p>Twelve tools, six capabilities. The last column is empty top to bottom.</p></div><p>Design doesn&#x27;t work that way. It runs on review and disagreement, and on a trail you can walk back months later when nobody remembers the original reasoning.</p><p>Figma seems to know this is the gap. At<!-- --><a href="https://www.figma.com/blog/config-2026-recap/" target="_blank" rel="noopener noreferrer">Config 2026</a><!-- -->they announced that agent chats are now visible to the whole team by default, so you can see what directions a teammate is exploring and build on it. That&#x27;s real progress toward collaboration. What Figma hasn&#x27;t announced is the history and traceability piece: a record of <em>why</em> a decision was made, not just that the AI made one. I think that&#x27;s what has to come next, not something already shipped.</p><p>Nobody on my list has built that piece yet. Not the twelve tools, not Paper, and not Figma.</p></div><div><h2>What I am doing for now</h2><p>So I built it myself. A small MCP server that reads comments left directly on a Figma file and hands them to Claude, which makes the modifications the comment is asking for.</p><p>The workflow is exactly the ordinary thing designers already do all day: leave a comment on a file. Except now the comment is also the prompt. The most mundane gesture in design review became the instruction channel for an agent.</p><p>That&#x27;s the actual ending to a year of testing everything. I went looking for a replacement. I didn&#x27;t find one. What I found instead is that the last piece (the one that would have made this all feel finished) wasn&#x27;t for sale anywhere I looked. So I built it, small and specific, for exactly my own workflow.</p><p>I made the tool work for me.</p></div><div><p>Sources</p><p><a href="https://forum.figma.com/ask-the-community-7/figma-make-export-design-doesn-t-export-the-library-components-49985" target="_blank" rel="noopener noreferrer">Figma Make export design doesn&#x27;t export the library components</a><!-- -->— Figma Community Forum.</p><p><a href="https://www.bykatharina.com/blog/paper-design-vs-figma-two-different-bets-on-the-future-of-design" target="_blank" rel="noopener noreferrer">Paper Design vs Figma: Two Different Bets on the Future of Design</a><!-- -->— Katharina Pilz.</p><p><a href="https://www.figma.com/blog/config-2026-recap/" target="_blank" rel="noopener noreferrer">Config 2026: New Materials, New Tools and a More Expressive Canvas</a><!-- -->— Figma Blog.</p></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>My trial and error making a design system legible for agents</title>
      <link>https://eunji.design/thoughts/design-system-for-agents</link>
      <guid isPermaLink="true">https://eunji.design/thoughts/design-system-for-agents</guid>
      <pubDate>Tue, 09 Jun 2026 12:00:00 GMT</pubDate>
      <dc:creator>Eun Ji Jung</dc:creator>
      <description>Vibe coding changed how teams build. The design system is the only thing keeping the product from looking like five different apps, but agents need it in a completely different format than the one I built it in.</description>
      <category>Design Systems</category>
      <category>AI Workflow</category>
      <category>Claude</category>
      <content:encoded><![CDATA[<div><div><p>Thoughts</p><div><span>Jun 2026 · 6 min read</span><div><span>Design Systems</span><span>AI Workflow</span><span>Claude</span></div></div><p>Claude Sonnet 5 helped me write this!!</p><div><p>Vibe coding changed how teams build. Designers, PMs, and engineers describe what they want in plain language and get working UI back. That speed comes with a cost. When everyone is building, the design system is the only thing keeping the product from looking like five different apps.</p><p>I use Claude Code and Cursor daily. I pushed my team to do the same.</p></div><div><h2>The first thing I tried: pointing Claude at Figma</h2><p>As soon as the Claude Code and Figma MCP integration shipped (and even before, with a custom MCP built by the designer community), I was providing the agent with a Figma DSYS file and prompting it to reference it when building prototypes.</p><p>It worked, mostly. But every task started with the agent pulling the entire Figma file, reading through it, and then proceeding. That overhead added up. Token costs climbed. Sessions got slower. For a small correction like fixing one color, it felt absurd to burn that much context just to confirm one rule. I ended up going from free, to pro, and ultimately to max. (I need something in between pro and max, but what can I do.)</p></div><div><h2>When errors crept in: re-prompting</h2><p>On top of the token cost, something else kept going wrong.</p><p>I noticed our green slate color showing up on an alert message. Green slate was designated for AI-generated responses only. I had been clear about this. So I went back in and corrected it. Next session, same mistake. I corrected it again. Same mistake again.</p><p>I explained the rule in the prompt. I added more context. The agent got it right for that session, then forgot it in the next one.</p><p>This is not a prompting problem. Every new session starts with zero memory of previous decisions. The agent doesn&#x27;t know it used green slate incorrectly last week. It doesn&#x27;t know which colors belong where. It makes reasonable guesses, and 200 reasonable guesses across a session don&#x27;t add up to a consistent system.</p></div><div><h2>What actually explained the problem</h2><p>Hardik Pandya&#x27;s article<!-- --><a href="https://hvpandya.com/llm-design-systems" target="_blank" rel="noopener noreferrer">Expose your design system to LLMs</a><!-- -->named what was happening. Agents fabricate values, drift within sessions, and lose all context between sessions. The problem wasn&#x27;t my prompts or my Figma file. It was that my design system existed in a format optimized for humans, not for agents. Agents need structured, local, readable files they can check at the start of every session without burning through your context window.</p><p>That reframe changed how I approached the fix.</p></div><div><h2>What I built</h2><p>I tested this properly on<!-- --><a href="https://eunji.design" target="_blank" rel="noopener noreferrer">Lune</a>, a wedding planning app I co-founded. I was the only designer on it, which made it the right place to try: a technical co-founder building alongside me, a real design system, and no tolerance for a prototype that looks like it was built by three different people.</p><p>The design system now lives in a <code>/DSYS</code> folder at the project root:</p><pre>DSYS/ DESIGN-SYSTEM.md ← master reference, always read first tokens.md ← flat token quick-reference foundations/ ← color, typography, spacing, motion components/ ← one .md per component patterns/ ← layout and interaction rules</pre><p>Every design value in the codebase has a named token. Nothing is hard-coded. In Lune, tokens map directly to Tailwind utility classes, so the lookup is fast:</p><pre>ivory → bg-ivory / text-ivory (#faf6f0) gold → text-gold / bg-gold (#b8944e) espresso → text-espresso / bg-espresso (#1e1510)</pre><p><code>DSYS/tokens.md</code><!-- -->is a flat file with every token, its hex value, and its utility class in one place. When the agent needs to know what color primary text is, it reads one file and gets one authoritative answer. Not a Figma panel. Not a Storybook story. A plain markdown file.</p><p>Each component gets its own spec file in<!-- --><code>DSYS/components/</code>. Every spec follows the same eight-section format: metadata, overview, anatomy, props, variants, states, usage rules, and code examples. The anatomy section uses ASCII diagrams to show hierarchy and nesting without requiring the agent to parse actual code. The usage rules section lists what not to do. That part matters as much as the positive examples, because it trains the agent away from the most common mistakes before they happen.</p><p>Then there is<!-- --><code>CLAUDE.md</code>, the file Claude Code reads at the start of every session. It sets the rules once:</p><ul><li>Read <code>DSYS/DESIGN-SYSTEM.md</code> and the relevant component spec before any UI work</li><li>Run the design audit script before every commit</li><li>When building a new component, also create <code>DSYS/components/&lt;name&gt;.md</code></li><li>When modifying a component, update the spec and sync Figma</li></ul><p>The agent doesn&#x27;t need to be reminded of these rules in every prompt. They are part of the project.</p><p>The last piece is the commit gate.<!-- --><code>scripts/design-audit.js</code><!-- -->scans every<!-- --><code>.tsx</code>,<!-- --><code>.ts</code>, and<!-- --><code>.css</code><!-- -->file for hardcoded values that should be tokens. If it finds a raw hex color or a pixel value that belongs to the token system, it flags the file, the line number, and the correct class to use instead. The audit runs automatically on every<!-- --><code>git commit</code><!-- -->via a pre-commit hook. The commit is blocked until the audit passes. When a collaborator clones the repo and runs<!-- --><code>npm install</code>, the hook installs automatically. No manual setup, no way to skip it by accident.</p><p>Figma still has a role, but a different one. The MD files are the implementation contract: what shipped and what the audit enforces. Figma is the exploration layer, where new screens get designed and stakeholders review. When a component gets a new state or variant, the rule is to update both in the same pass. Claude is instructed to remind you to do this at the end of every component change.</p></div><div><h2>What changed</h2><p>Green slate now has a rule written in a file: use only for AI-generated response containers. The agent reads the file. The audit catches violations. It doesn&#x27;t rely on my memory or my prompts.</p><p>A contributor with no design background can now build a new screen in Lune. They get code a designer would recognize, not because they studied the design system, but because the system was structured to be readable by the tool doing the work.</p><p>The bigger shift is that consistency is no longer something I enforce through reviews or repeated prompts. It&#x27;s something the system enforces. That&#x27;s what a design system is supposed to do. It just took me a while to realize agents need it in a completely different format than the one I built it in.</p></div><div><p>Resources</p><p><a href="https://hvpandya.com/llm-design-systems" target="_blank" rel="noopener noreferrer">Expose your design system to LLMs</a><!-- -->by Hardik Pandya. The article that reframed how I thought about this problem.</p></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>A running reading list</title>
      <link>https://eunji.design/thoughts/reading-list</link>
      <guid isPermaLink="true">https://eunji.design/thoughts/reading-list</guid>
      <pubDate>Tue, 09 Jun 2026 12:00:00 GMT</pubDate>
      <dc:creator>Eun Ji Jung</dc:creator>
      <description>A living repository of articles, tools, repos, podcasts, and people who have shaped how I think about AI and design. Grouped by topic and updated as I find things worth keeping.</description>
      <category>Resources</category>
      <content:encoded><![CDATA[<div><div><p>Resources</p><p>A living repository of articles, tools, repos, podcasts, and people who have shaped how I think about AI and design. Updated as I find things worth keeping.</p><div><span>Jun 2026</span><span></span><span>Living doc</span></div><div><p>Design Systems</p><div><div><a href="https://hvpandya.com/llm-design-systems" target="_blank" rel="noopener noreferrer"><div><div><h3>Expose your design system to LLMs</h3></div><div><span>hvpandya.com</span><span>Hardik Pandya</span></div><p>How to make a design system machine-readable: structured specs, token layers, and audit scripts so AI agents stop hallucinating styles across sessions. The article that reframed how I thought about this problem.</p></div></a></div></div></div><div><p>Claude Skills</p><div><div><a href="https://www.aihero.dev/my-grill-me-skill-has-gone-viral" target="_blank" rel="noopener noreferrer"><div><div><h3>My &quot;Grill Me&quot; Skill went viral</h3></div><div><span>aihero.dev</span><span>Matt Pocock</span></div><p>Introduces a Claude skill that uses structured, relentless questioning to stress-test any plan or idea. A good example of how a well-scoped slash command can become a thinking tool, not just an automation.</p></div></a></div><div><a href="https://github.com/julianoczkowski/designer-skills" target="_blank" rel="noopener noreferrer"><div><div><h3>designer-skills</h3></div><div><span>github.com</span><span>Julian Oczkowski</span></div><p>A GitHub repo of AI agent skills for designers to use with Claude Code and Cursor. Encodes structured design processes across eight aesthetic philosophies, with full workflows from brief through implementation and review.</p></div></a></div></div></div><div><p>Workflow + Process</p><div><div><a href="https://uxplanet.org/a-b-testing-with-claude-code-3a1e56df6684" target="_blank" rel="noopener noreferrer"><div><div><h3>A/B Testing with Claude Code</h3></div><div><span>uxplanet.org</span><span>UX Planet</span></div><p>A practical walkthrough of using Claude Code to run A/B design tests. It covers how to set up variants, prompt the agent to evaluate them, and use that loop to make faster design decisions.</p></div></a></div><div><a href="https://yummy-design-sprint.notion.site/32762791470980f79c59f4580d377f3f?v=32762791470980f495ac000c95dece67" target="_blank" rel="noopener noreferrer"><div><div><h3>Yummy Design Sprint</h3></div><div><span>notion.site</span><span>Notion</span></div><p>A public Notion workspace documenting a design sprint process. Useful as a reference for how to structure sprint phases, share artifacts, and document decisions alongside an AI-assisted workflow.</p></div></a></div></div></div><div><p>Podcasts</p><div><div><a href="https://www.youtube.com/watch?v=mdV8APhz2j4" target="_blank" rel="noopener noreferrer"><div><div><h3>How to accelerate your design career with AI</h3></div><div><span>youtube.com</span><span>Flora Guo — Dive Club</span></div><p>Flora Guo, founding design engineer at Paradigm and formerly at Vercel, on what it actually takes to design AI-first products. The part that stuck with me: treating AI as a learning tool rather than a task executor, and how she rebuilt her workflow around Claude Code over a year.</p></div></a></div><div><a href="https://www.youtube.com/watch?v=tivaWTTVRhY" target="_blank" rel="noopener noreferrer"><div><div><h3>Why AI is going vertical (again)</h3></div><div><span>youtube.com</span><span>Dianne Penn — Lenny’s Podcast</span></div><p>Anthropic’s first technical PM on the eval-driven loop that replaced the PRD, and how Claude Code, MCP, and Skills got incubated. A useful look at how product decisions get made when the underlying model keeps moving.</p></div></a></div></div></div><div><p>People I Follow</p><div><div><a href="https://www.instagram.com/meshtimes" target="_blank" rel="noopener noreferrer"><div><div><h3>Marisa — @meshtimes</h3></div><div><span>instagram.com</span><span>Creative technologist, NYC</span></div><p>Designs and sometimes codes — cyberdecks, custom keyboards, circuit boards, creative coding experiments. I follow her for the builder mindset more than any single project: she just makes the thing, and it’s genuinely fun to watch. Also on YouTube and TikTok.</p></div></a></div></div></div></div></div>]]></content:encoded>
    </item>
  </channel>
</rss>
