<?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: Yun Xiao</title>
    <description>The latest articles on DEV Community by Yun Xiao (@xsh).</description>
    <link>https://dev.to/xsh</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%2F2187053%2F90d6f0e7-6bc8-4dc2-bb4a-2c657569a82f.png</url>
      <title>DEV Community: Yun Xiao</title>
      <link>https://dev.to/xsh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xsh"/>
    <language>en</language>
    <item>
      <title>What 117 UI skills actually change: notes from 1,770 generated pages</title>
      <dc:creator>Yun Xiao</dc:creator>
      <pubDate>Wed, 11 Nov 2026 23:38:59 +0000</pubDate>
      <link>https://dev.to/xsh/what-117-ui-skills-actually-change-notes-from-1770-generated-pages-3acc</link>
      <guid>https://dev.to/xsh/what-117-ui-skills-actually-change-notes-from-1770-generated-pages-3acc</guid>
      <description>&lt;p&gt;Agent skills (a &lt;code&gt;SKILL.md&lt;/code&gt; file your coding agent reads before it works) have become the default way to give Claude Code, Cursor or Codex a sense of taste. There are now hundreds of front-end "design" skills, and most of them describe themselves the same way: distinctive, intentional, not generic.&lt;/p&gt;

&lt;p&gt;I wanted to know what they actually do, so I built &lt;a href="https://skillarena.dev/?ref=devto" rel="noopener noreferrer"&gt;SkillArena&lt;/a&gt; and ran a controlled comparison.&lt;/p&gt;

&lt;h3&gt;
  
  
  The setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5 fixed briefs&lt;/strong&gt;, sent word for word: a SaaS landing page, an analytics dashboard, a mobile app screen, a sign-up form, and SkillArena's own home page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One model&lt;/strong&gt; (Claude Opus 5.5) at default settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;117 skills from 25 authors&lt;/strong&gt;, plus a control row with no skill. Each row puts one skill's &lt;code&gt;SKILL.md&lt;/code&gt; (and any reference files it points to) into the same short system prompt. Nothing else changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 runs&lt;/strong&gt; for every skill × brief, all published. That's 1,770 pages, every one screenshotted and openable in a sandbox.&lt;/li&gt;
&lt;li&gt;Each skill is pinned to a git commit, so the results match a specific version you can install.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no score and no leaderboard. I don't trust any automated design score enough to publish one. What I can do is count things.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Skills change the look far more than the words
&lt;/h3&gt;

&lt;p&gt;The landing page brief describes a shared calendar for small teams whose selling point is that it "automatically finds a time when everyone is free." It doesn't suggest a headline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;317 of the 354 landing pages open with "Stop asking…"&lt;/strong&gt;: "Stop asking 'when works for everyone?'", "Stop asking 'when are you free?'", and so on. The no-skill control did it in all 3 runs. So did 94 of the 117 skills, including a skill written specifically to improve UX copy.&lt;/p&gt;

&lt;p&gt;Only two skills avoided it in every run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Elaya's landing-page-design&lt;/strong&gt;: "Find a time everyone is free without the reply all thread."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Addy Osmani's SEO skill&lt;/strong&gt;: "The shared calendar that finds a time everyone is free." All three runs put the product's actual keyword in the H1, which is exactly what an SEO skill should do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v0vkbs1szspvx1y7lks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v0vkbs1szspvx1y7lks.png" alt="SaaS landing page brief: no skill vs Addy Osmani's SEO skill" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pages themselves look very different from each other, with different layouts, type and colour. But underneath, the model mostly says the same thing. If you want different copy, a visual design skill probably won't give it to you. A skill that changes what the model is trying to achieve (rank for a keyword, follow a copy framework) might.&lt;/p&gt;

&lt;p&gt;The home page brief shows the same pattern. &lt;strong&gt;205 of 354 pages used the exact headline "Same brief. Different skill."&lt;/strong&gt;, and only 15 skills never did. Brutalist went with "ONE BRIEF. EVERY SKILL. NO GUESSING."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. "Does a skill make the model write more?" depends on the brief
&lt;/h3&gt;

&lt;p&gt;I expected skills to make pages bigger across the board: more instructions, more effort, more output. That's true for some briefs and false for others.&lt;/p&gt;

&lt;p&gt;Here are the average output tokens per page, no skill vs the median skill:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Brief&lt;/th&gt;
&lt;th&gt;No skill&lt;/th&gt;
&lt;th&gt;Median skill&lt;/th&gt;
&lt;th&gt;Skills that wrote more&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mobile app screen&lt;/td&gt;
&lt;td&gt;5.8k&lt;/td&gt;
&lt;td&gt;11.7k (2.0×)&lt;/td&gt;
&lt;td&gt;114 of 117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sign-up form&lt;/td&gt;
&lt;td&gt;8.3k&lt;/td&gt;
&lt;td&gt;13.6k (1.6×)&lt;/td&gt;
&lt;td&gt;115 of 117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS landing page&lt;/td&gt;
&lt;td&gt;13.8k&lt;/td&gt;
&lt;td&gt;15.9k (1.15×)&lt;/td&gt;
&lt;td&gt;93 of 117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SkillArena home page&lt;/td&gt;
&lt;td&gt;14.0k&lt;/td&gt;
&lt;td&gt;16.4k (1.17×)&lt;/td&gt;
&lt;td&gt;82 of 117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics dashboard&lt;/td&gt;
&lt;td&gt;20.9k&lt;/td&gt;
&lt;td&gt;18.0k (0.86×)&lt;/td&gt;
&lt;td&gt;35 of 117&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feb9ken7nhzwymidvkctw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feb9ken7nhzwymidvkctw.png" alt="Mobile app screen brief across several skills" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On small, open-ended briefs (a phone screen, a form), the model on its own does the minimum, and almost any skill pushes it to build more. On the dashboard, the model already writes a lot on its own, and most skills (82 of 117) make it write &lt;em&gt;less&lt;/em&gt;: tighter layouts, fewer charts, less filler.&lt;/p&gt;

&lt;p&gt;Across all five briefs, &lt;strong&gt;21 of 117 skills averaged fewer output tokens than no skill at all&lt;/strong&gt;. The smallest was Subtractive Design (5.4k per page), which is at least honest about its name. The largest was Emil Kowalski's Prototype skill at 36.2k, nearly 3× the control. On the mobile brief alone it was over 7×.&lt;/p&gt;

&lt;p&gt;None of this says which pages are better. A bigger page isn't a better page. But size is a practical signal: it tells you how much a skill changes the cost and latency of every generation, and it tells you the skill is doing &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Usually consistent, occasionally wild
&lt;/h3&gt;

&lt;p&gt;With three runs per cell, you can see how stable a skill is. For output size, most are fairly stable: in about 9 of 10 skill × brief cells, the largest run was less than 1.5× the smallest.&lt;/p&gt;

&lt;p&gt;The exceptions are big. The Soft skill on the home page brief produced 17k, 23k and 44k tokens across three runs. The screenshots look like three different skills. If you had judged that skill from the 17k run alone, you'd have the wrong idea about it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqyytyeuj64nu1cgmn883.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqyytyeuj64nu1cgmn883.png" alt="Soft skill vs no skill on the SkillArena home page brief, run 1 of 3" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Run 1 of 3 above. &lt;a href="https://skillarena.dev/skill/taste-soft/?ref=devto" rel="noopener noreferrer"&gt;All three runs side by side&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's why SkillArena shows all three runs side by side instead of a best pick. Cherry-picking is the default in skill READMEs and on social media, and it's easy to do by accident.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'd take from this
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Look before you install.&lt;/strong&gt; Two skills with near-identical descriptions can produce very different pages, and a skill described as "distinctive" can produce something close to the default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on your kind of page.&lt;/strong&gt; A skill that transforms a form or a phone screen may barely touch a dashboard, and the reverse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't expect a design skill to fix copy.&lt;/strong&gt; If the words matter, use a skill (or a prompt) that changes what the page is trying to say.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look at more than one run.&lt;/strong&gt; Most skills are consistent, but the ones that aren't can fool you with a single screenshot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Caveats
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skills are always fully loaded.&lt;/strong&gt; In real Claude Code, the agent sees a skill's description first and decides whether to load it. Here, every skill is always fully loaded. That isolates what the instructions do, not how often they'd be used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One model.&lt;/strong&gt; Other models will likely behave differently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-file HTML.&lt;/strong&gt; All five briefs ask for self-contained HTML pages, which suits some skills better than others. Skills written for a specific stack, like Vue or a component library, are at a disadvantage, and their pages say so.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token counts aren't quality.&lt;/strong&gt; They're just the most objective thing I can count.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is public:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The site: &lt;a href="https://skillarena.dev/?ref=devto" rel="noopener noreferrer"&gt;skillarena.dev&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Every run, token count and list-price cost: &lt;a href="https://skillarena.dev/results.json" rel="noopener noreferrer"&gt;&lt;code&gt;/results.json&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The code (MIT): &lt;a href="https://github.com/xyunsh/skillarena" rel="noopener noreferrer"&gt;github.com/xyunsh/skillarena&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain a skill and something about how it's described or installed is wrong, or you'd like yours added, open an issue and I'll fix it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>webdev</category>
      <category>design</category>
    </item>
  </channel>
</rss>
