<?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: arialus</title>
    <description>The latest articles on DEV Community by arialus (@arialus).</description>
    <link>https://dev.to/arialus</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%2F4138630%2F3b3d0b49-c61a-453b-b997-951385a17e7c.png</url>
      <title>DEV Community: arialus</title>
      <link>https://dev.to/arialus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arialus"/>
    <language>en</language>
    <item>
      <title>Stop installing giant icon packages — write SVGs as source with a CLI + MCP</title>
      <dc:creator>arialus</dc:creator>
      <pubDate>Wed, 23 Sep 2026 04:42:04 +0000</pubDate>
      <link>https://dev.to/arialus/stop-installing-giant-icon-packages-write-svgs-as-source-with-a-cli-mcp-290c</link>
      <guid>https://dev.to/arialus/stop-installing-giant-icon-packages-write-svgs-as-source-with-a-cli-mcp-290c</guid>
      <description>&lt;h2&gt;
  
  
  The pain nobody admits in the PR
&lt;/h2&gt;

&lt;p&gt;You need a house icon, an arrow, a settings gear, and the GitHub logo.&lt;/p&gt;

&lt;p&gt;So you install Lucide. Then someone on the team already used Tabler. The marketing site copied Heroicons. Brand marks came from a random SVG dump. Six months later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;node_modules&lt;/code&gt; carries thousands of icons you never render&lt;/li&gt;
&lt;li&gt;imports disagree on naming (&lt;code&gt;House&lt;/code&gt; vs &lt;code&gt;IconHome&lt;/code&gt; vs &lt;code&gt;home&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;agents invent Lucide paths that don’t exist&lt;/li&gt;
&lt;li&gt;design asks for “the same icon but from that other set”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lucide, Tabler, Heroicons, Feather, Remix  theyre excellent &lt;strong&gt;art&lt;/strong&gt;. Theyre a weak &lt;strong&gt;delivery model&lt;/strong&gt; when your app only needs twelve icons from four families.&lt;/p&gt;

&lt;p&gt;I wanted something closer to a package manager: search a huge catalog, pull only what I need, commit the SVG as source, and let Cursor / Claude use the same engine without hallucinating.&lt;/p&gt;

&lt;p&gt;That’s &lt;strong&gt;Aria Icons&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Aria Icons actually is
&lt;/h2&gt;

&lt;p&gt;Not another Lucide clone. Peers worth comparing: &lt;strong&gt;Iconify&lt;/strong&gt; (catalog) and &lt;strong&gt;better-icons&lt;/strong&gt;. Aria’s bet is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Browser&lt;/strong&gt; over ~340k SVGs  Lucide, Tabler, Heroicons, Feather, Remix, brands via theSVG, Iconify-backed collections, and more
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt; (&lt;code&gt;npx aria-icons&lt;/code&gt;) that searches a hosted API and &lt;strong&gt;writes icons into your repo as source&lt;/strong&gt; — no fat icon dependency
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; for Cursor / Claude — local stdio or remote HTTP — so agents search and fetch the same catalog
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Site: &lt;a href="https://icons.leularia.com" rel="noopener noreferrer"&gt;https://icons.leularia.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Repo: &lt;a href="https://github.com/LeulAria/Aria-Icons" rel="noopener noreferrer"&gt;https://github.com/LeulAria/Aria-Icons&lt;/a&gt; (MIT)&lt;br&gt;&lt;br&gt;
npm: &lt;code&gt;aria-icons&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Quickstart (concrete, copy-paste)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; aria-icons@latest setup
&lt;span class="c"&gt;# or: bunx aria-icons@latest setup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Search the catalog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aria-icons search house
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Print one icon (SVG or framework-oriented output depending on flags/docs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aria-icons get lucide:house
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add icons &lt;strong&gt;as files in the project&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aria-icons add lucide:house tabler:arrow-up thesvg:github
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ids look like &lt;code&gt;collection:name&lt;/code&gt; — e.g. &lt;code&gt;lucide:house&lt;/code&gt;, &lt;code&gt;tabler:arrow-up&lt;/code&gt;, &lt;code&gt;thesvg:github&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When you’re already in mixed-library hell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aria-icons doctor
npx aria-icons suggest src/
npx aria-icons migrate &lt;span class="nt"&gt;--to&lt;/span&gt; lucide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI stays tiny on purpose. It talks to the Aria Icons API and only downloads the icons you request. Your lockfile doesn’t inherit 340k SVGs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give agents a real catalog (MCP)
&lt;/h2&gt;

&lt;p&gt;Coding agents are great at wiring components and terrible at remembering every icon name across every set. Aria Icons MCP exposes search/fetch over the same index the CLI uses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remote HTTP&lt;/strong&gt; (hosted with the site):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aria-icons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://icons.leularia.com/api/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Local stdio&lt;/strong&gt; (what &lt;code&gt;aria-icons setup&lt;/code&gt; configures for Cursor / Claude / VS Code-style clients):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aria-icons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aria-icons"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typical loop that works well in practice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask the agent to search for an icon via MCP
&lt;/li&gt;
&lt;li&gt;Review the pick in the browser if you care about aesthetics
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;aria-icons add …&lt;/code&gt; so the SVG lands in source control&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agents get truth; humans keep commit hygiene.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this differs from Lucide / Iconify / “just copy SVG”
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;th&gt;Weakness&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single set package (Lucide, etc.)&lt;/td&gt;
&lt;td&gt;Cohesive style, great DX for one family&lt;/td&gt;
&lt;td&gt;Fat install; multi-set reality breaks the model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Iconify&lt;/td&gt;
&lt;td&gt;Huge catalog, flexible&lt;/td&gt;
&lt;td&gt;You still need a workflow for “icons as source in &lt;em&gt;this&lt;/em&gt; repo” + agent tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual SVG paste&lt;/td&gt;
&lt;td&gt;Zero dependency&lt;/td&gt;
&lt;td&gt;Drift, duplicates, no search, agents invent junk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aria Icons&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Catalog + write-as-source CLI + MCP&lt;/td&gt;
&lt;td&gt;You’re choosing a workflow, not a single aesthetic brand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Positioning in one line: &lt;strong&gt;icon package manager + agent surface&lt;/strong&gt;, not an art set competing with Lucide’s drawings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture sketch (why the CLI isn’t a megapackage)
&lt;/h2&gt;

&lt;p&gt;The interesting part is the shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fat index on the server&lt;/strong&gt; — search metadata for ~340k icons (vendored sets, Iconify collections, brand logos)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thin client&lt;/strong&gt; — npm package &lt;code&gt;aria-icons&lt;/code&gt; is a CLI + MCP entrypoint, not the database
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write path&lt;/strong&gt; — &lt;code&gt;add&lt;/code&gt; materializes only chosen icons into your tree
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit path&lt;/strong&gt; — &lt;code&gt;doctor&lt;/code&gt; / &lt;code&gt;suggest&lt;/code&gt; / &lt;code&gt;migrate&lt;/code&gt; for teams that already mixed libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Public REST used by the CLI (tiny payloads): search, icon by id, batch, collections, similar, equivalent/cross-set mapping. MCP rides the same catalog.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI doesn’t download an icon universe
&lt;/li&gt;
&lt;li&gt;design-system PRs review actual SVG files
&lt;/li&gt;
&lt;li&gt;agents and humans share one source of truth&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A realistic workflow for a design system
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://icons.leularia.com" rel="noopener noreferrer"&gt;icons.leularia.com&lt;/a&gt; and search visually when taste matters
&lt;/li&gt;
&lt;li&gt;Standardize on ids (&lt;code&gt;lucide:…&lt;/code&gt; etc.) in tickets
&lt;/li&gt;
&lt;li&gt;Engineers run &lt;code&gt;aria-icons add&lt;/code&gt; (or let MCP propose, then add)
&lt;/li&gt;
&lt;li&gt;Occasionally run &lt;code&gt;doctor&lt;/code&gt; on &lt;code&gt;src/&lt;/code&gt; before a release
&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;migrate --to &amp;lt;set&amp;gt;&lt;/code&gt; when consolidating&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You’re not forbidden from using Lucide React components forever — you’re free to &lt;strong&gt;stop pretending one package covers every brand mark and every one-off&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;License: &lt;strong&gt;MIT&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Contribute new sets via the in-app &lt;code&gt;/contribute&lt;/code&gt; flow (and PRs)
&lt;/li&gt;
&lt;li&gt;Brand logos refresh from theSVG; Iconify sets can be fetched/indexed into the catalog&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you maintain icon metadata, tags, and aliases — those PRs matter as much as new drawings. Search quality is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I’m looking for feedback on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CLI UX: is &lt;code&gt;migrate&lt;/code&gt; / &lt;code&gt;doctor&lt;/code&gt; / &lt;code&gt;suggest&lt;/code&gt; the right surface, or too much?
&lt;/li&gt;
&lt;li&gt;MCP tools: what should agents get next (similar icons, framework wrappers, Figma-ish naming)?
&lt;/li&gt;
&lt;li&gt;Messaging: does package manager for icons” land, or do people still hear another icon set”?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it, then decide
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; aria-icons@latest setup
npx aria-icons search house
npx aria-icons add lucide:house
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://icons.leularia.com" rel="noopener noreferrer"&gt;https://icons.leularia.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/LeulAria/Aria-Icons" rel="noopener noreferrer"&gt;https://github.com/LeulAria/Aria-Icons&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the workflow sticks after you try it, starring the repo helps other developers discover it. If it doesn’t, tell me why in the comments — that feedback is more useful than a polite star.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
