<?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: Cung Dinh Uy</title>
    <description>The latest articles on DEV Community by Cung Dinh Uy (@uypoko).</description>
    <link>https://dev.to/uypoko</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%2F1454715%2Fa3dae4cd-d88f-42a0-aee5-20f66c52451c.jpeg</url>
      <title>DEV Community: Cung Dinh Uy</title>
      <link>https://dev.to/uypoko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uypoko"/>
    <language>en</language>
    <item>
      <title>Sometimes a DESIGN.md Is Not Enough</title>
      <dc:creator>Cung Dinh Uy</dc:creator>
      <pubDate>Thu, 09 Jul 2026 05:24:42 +0000</pubDate>
      <link>https://dev.to/uypoko/sometimes-a-designmd-is-not-enough-48l2</link>
      <guid>https://dev.to/uypoko/sometimes-a-designmd-is-not-enough-48l2</guid>
      <description>&lt;p&gt;What DESIGN.md can't tell your coding agent - and how to extract it anyway.&lt;/p&gt;

&lt;p&gt;Every AI coding agent today can read a DESIGN.md. Colors, spacing tokens, typography scale, component variants - drop that file into a repo and Claude Code, Codex, Cursor, or Gemini CLI will follow it faithfully. It's become the standard way to hand a coding agent a design system and expect consistent output.&lt;/p&gt;

&lt;p&gt;But open the sites that actually make people stop scrolling, and the thing you notice first is never in that file.&lt;/p&gt;

&lt;p&gt;It's the way a hero canvas breathes when nothing is happening. The way a row of elements tilts toward your cursor before you've consciously registered it moved. The pacing of a scroll-triggered reveal - not just that it animates, but how it accelerates and settles. None of that lives in a token file. It lives in the running page, and it disappears the moment you only read the &lt;/p&gt;

&lt;p&gt;markup.&lt;/p&gt;

&lt;p&gt;That gap is what web-reverse-engineer is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The layer nobody's filling
&lt;/h2&gt;

&lt;p&gt;The current AI-coding stack has gotten good at two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DESIGN.md gives an agent static design direction - palette, type, layout rules.&lt;/li&gt;
&lt;li&gt;SKILL.md / Agent Skills give an agent a reusable workflow - a repeatable way of doing a task.&lt;/li&gt;
&lt;li&gt;Coding agents (Claude Code, Codex, Cursor, Gemini CLI) handle implementation once they have direction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's missing is the step before any of that: actually studying a reference site's runtime behavior - its motion, its interaction logic, its animation timing, and turning that observation into something an agent can build from. Screenshots don't capture motion. A design token file doesn't capture how an SVG eye rotates to track a cursor using real pointer math. That knowledge only exists while the page is running, and most workflows never bother to extract it before code gets written.&lt;/p&gt;

&lt;p&gt;web-reverse-engineer is a portable SKILL.md workflow that does exactly that: inspect a public reference, extract the design and motion principles behind it, and hand a coding agent enough structured observation to rebuild an original implementation - not a copy of what it saw.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not a website copier
&lt;/h2&gt;

&lt;p&gt;That distinction matters enough that it's the first rule of the project, not a footnote.&lt;/p&gt;

&lt;p&gt;The workflow never touches proprietary source code, minified bundles, shader strings, stylesheets, or media assets from the reference site. It doesn't reproduce exact layout or exact animation timing. What it does extract is the principle - the class of motion, the interaction pattern, the structural idea - and every line of code in the rebuild is written fresh, in a different brand, different palette, different copy, re-tuned animation velocity.&lt;/p&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Studies runtime behavior, not source code.&lt;/li&gt;
&lt;li&gt;Extracts design principles, not assets.&lt;/li&gt;
&lt;li&gt;Guides an original implementation, not a duplicate.&lt;/li&gt;
&lt;li&gt;Ships as a portable SKILL.md your agent can reuse on the next reference site, not a one-off script.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it looks like in practice
&lt;/h2&gt;

&lt;p&gt;Three small demos made this concrete:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/aldRNLRBN_g"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A reference-inspired dark, whole-page build where ambient canvas motion runs continuously in the background - the kind of animation you only notice because the page feels alive, not because anything is pointing at it.&lt;/li&gt;
&lt;li&gt;A light, section-specific rebuild centered on a single micro-interaction: an SVG eye that tracks the cursor, rotating and scaling based on real pointer coordinates. Getting that to feel natural meant working out the interaction math from scratch, not eyeballing a CSS transform.&lt;/li&gt;
&lt;li&gt;A light hero built around a Canvas 2D sine-wave animation - procedural motion that has to be derived, not lifted, because there's no source to copy from in the first place.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one started as observation - measuring the running page, writing down what it was actually doing - before a single line of the rebuild got written. Look first, build second.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part an agent still can't certify
&lt;/h2&gt;

&lt;p&gt;Here's the honest part: even with good extraction, there's a step no agent gets to skip past on its own.&lt;/p&gt;

&lt;p&gt;The bar for whether a rebuilt animation actually works is simple to state and hard to automate: if a normal person watching for three seconds doesn't notice the motion, the demo failed, regardless of whether the build compiled, lint passed, and the code looked right. "Build passing" and "demo passing" turned out to be two different claims, and only a human can actually confirm the second one. The workflow leans into that instead of pretending otherwise: it captures evidence - screenshots, frame sequences - precisely so a person can make that call, rather than letting an agent self-certify something it fundamentally can't perceive.&lt;/p&gt;

&lt;p&gt;That's a small detail, but it's the kind of thing that only shows up once you've actually tried to automate this instead of just writing a spec for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;web-reverse-engineer installs as a standard package and drops a portable SKILL.md into your project for your coding agent to use on the next site you want to learn from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;web-reverse-engineer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Live demos, the clean-room notes behind each one, and the skill itself are all in the repo, or see it running live.&lt;/p&gt;

&lt;p&gt;If you're already handing your coding agent a DESIGN.md, screenshots, Cursor rules, or a custom skill to carry design context, I'd genuinely like to know what that setup looks like for you. What's the layer you built to cover the gap DESIGN.md leaves open?&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo + skill: &lt;a href="https://github.com/uycung/web-reverse-engineer" rel="noopener noreferrer"&gt;https://github.com/uycung/web-reverse-engineer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live demos: &lt;a href="https://web-reverse-engineer.netlify.app/" rel="noopener noreferrer"&gt;https://web-reverse-engineer.netlify.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/web-reverse-engineer" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/web-reverse-engineer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
