<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dejan Veljanoski</title>
    <description>The latest articles on DEV Community by Dejan Veljanoski (@dejan_veljanoski).</description>
    <link>https://dev.to/dejan_veljanoski</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4055075%2Fdd5a3fc5-aaa1-42b7-8bf0-e775b3318d6c.png</url>
      <title>DEV Community: Dejan Veljanoski</title>
      <link>https://dev.to/dejan_veljanoski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dejan_veljanoski"/>
    <language>en</language>
    <item>
      <title>Your AI coding tools are ignoring your design system. Here's how I fixed it.</title>
      <dc:creator>Dejan Veljanoski</dc:creator>
      <pubDate>Thu, 30 Jul 2026 12:43:22 +0000</pubDate>
      <link>https://dev.to/dejan_veljanoski/your-ai-coding-tools-are-ignoring-your-design-system-heres-how-i-fixed-it-161j</link>
      <guid>https://dev.to/dejan_veljanoski/your-ai-coding-tools-are-ignoring-your-design-system-heres-how-i-fixed-it-161j</guid>
      <description>&lt;p&gt;Every screen Claude or Cursor generated for me looked almost right.&lt;/p&gt;

&lt;p&gt;Slightly different button radius. A shade off on the primary color. Spacing that was close to my scale but not on it. Each screen fine in isolation — put five of them together and the app looked like it was built by five different freelancers who'd never met.&lt;/p&gt;

&lt;p&gt;I started calling it UI drift, and once you see it, you can't unsee it in every AI-built product on the internet.&lt;/p&gt;

&lt;p&gt;Why drift happens&lt;/p&gt;

&lt;p&gt;It's not the model's fault. It's a context problem:&lt;/p&gt;

&lt;p&gt;Your design system isn't in the prompt. The AI defaults to its training-data average: generic Tailwind, purple gradients, shadcn-out-of-the-box. That's why so many vibe-coded apps look identical.&lt;br&gt;
When it is in the prompt, it's stale. You pasted your tokens into a rules file three weeks ago, then changed the design. Now the AI is confidently generating against a snapshot that no longer exists.&lt;br&gt;
When it's fresh, it's too big. Dumping an entire design system into context on every prompt burns tokens, slows everything down, and buries the signal — models follow a focused 2KB rules file far better than a 200KB JSON dump.&lt;/p&gt;

&lt;p&gt;So you get to pick: generic output, outdated output, or expensive output.&lt;/p&gt;

&lt;p&gt;I wanted a fourth option.&lt;/p&gt;

&lt;p&gt;What I built&lt;/p&gt;

&lt;p&gt;GliaKit is a Next.js SaaS boilerplate with a design system your AI tools actually follow. The core idea is a single source of truth with three synced views:&lt;/p&gt;

&lt;p&gt;A Figma library — tokens, components, and screens (this part is free on Figma Community)&lt;br&gt;
Cursor rules + Claude rules files — generated from the library, so they always describe the current system, not a memory of it&lt;br&gt;
The Next.js codebase — components that map 1:1 to the Figma components, so what the AI generates already exists in code&lt;/p&gt;

&lt;p&gt;When the design changes, the rules files change with it. Your AI stops hallucinating a design system and starts referencing yours.&lt;/p&gt;

&lt;p&gt;The token-efficiency part&lt;/p&gt;

&lt;p&gt;This was the constraint that shaped everything: the rules files are deliberately minimal. Instead of feeding the model every property of every component, they encode just the decisions — the token scale, the component names, the composition rules. Less context re-ingested per prompt means cheaper generations, faster responses, and (counterintuitively) more consistent output, because the model isn't drowning in irrelevant detail.&lt;/p&gt;

&lt;p&gt;If you use Figma MCP, the same logic applies: the file is structured so MCP pulls compact, relevant context instead of the whole document.&lt;/p&gt;

&lt;p&gt;What "day one" actually looks like&lt;br&gt;
Duplicate the free Figma kit, restyle the tokens to your brand&lt;br&gt;
Grab the boilerplate, run the sync so the rules files reflect your tokens&lt;br&gt;
Prompt Cursor or Claude: "build the billing settings page"&lt;br&gt;
Get a screen that uses your components, your spacing, your colors — on the first try&lt;/p&gt;

&lt;p&gt;No "make the buttons match the other buttons" follow-up prompts. That prompt is where indie builders' evenings go to die.&lt;/p&gt;

&lt;p&gt;Honest scope&lt;br&gt;
The Figma UI kit is free — take it, use it, no strings.&lt;br&gt;
The boilerplate (Next.js code + synced rules files) is paid. It's the part that took months and it's how I keep building this.&lt;br&gt;
It won't make AI output pixel-perfect 100% of the time. It makes the failure mode "small fix" instead of "different app."&lt;br&gt;
Try it / tear it apart&lt;/p&gt;

&lt;p&gt;The free kit is on &lt;a href="https://www.figma.com/community/file/1662380003116366149/gliakit-saas-ui-kit-design-system-figma-code" rel="noopener noreferrer"&gt;Figma Community&lt;/a&gt;, and everything else is at &lt;a href="https://dev.tourl"&gt;https://www.gliakit.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm genuinely curious how others are handling drift — hand-maintained rules files? MCP? Just accepting the chaos? Tell me in the comments, especially if you think there's a better approach than syncing. I'd rather find out here than after v2.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>ai</category>
      <category>webdev</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
