<?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: Shen Huang</title>
    <description>The latest articles on DEV Community by Shen Huang (@shenhuang).</description>
    <link>https://dev.to/shenhuang</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%2F936104%2F47f8fca8-4790-49fe-889b-9f4179202580.jpg</url>
      <title>DEV Community: Shen Huang</title>
      <link>https://dev.to/shenhuang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shenhuang"/>
    <language>en</language>
    <item>
      <title>I Fired My $2,000 Video Editor and Replaced Them With a URL Bar</title>
      <dc:creator>Shen Huang</dc:creator>
      <pubDate>Tue, 16 Jun 2026 03:28:28 +0000</pubDate>
      <link>https://dev.to/shenhuang/i-fired-my-2000-video-editor-and-replaced-them-with-a-url-bar-2jg1</link>
      <guid>https://dev.to/shenhuang/i-fired-my-2000-video-editor-and-replaced-them-with-a-url-bar-2jg1</guid>
      <description>&lt;p&gt;For about a year, my ad-creative process looked like this: brief a freelance editor, wait four days, get one video back, realize the hook was weak, ask for revisions, wait three more days, pay the invoice, run the ad, watch it flop. Repeat.&lt;/p&gt;

&lt;p&gt;Each "batch" of three videos cost me around &lt;strong&gt;$2,000&lt;/strong&gt; and a week of calendar time. As a solo DTC founder, that wasn't a creative pipeline. It was a tax on testing.&lt;/p&gt;

&lt;p&gt;Then I did the math on what I was actually buying, and it broke my brain a little.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was really paying for
&lt;/h2&gt;

&lt;p&gt;I wasn't paying $2,000 for &lt;em&gt;good ads&lt;/em&gt;. I was paying $2,000 for the &lt;strong&gt;right to find out&lt;/strong&gt; whether an ad was good — after the money was already spent on production &lt;em&gt;and&lt;/em&gt; on media.&lt;/p&gt;

&lt;p&gt;The expensive part of paid social isn't the ad spend. It's the &lt;strong&gt;learning&lt;/strong&gt;. Every variation you push live costs you impressions to discover it doesn't work. And before AI, every variation also cost you a shoot, an editor, and a few days.&lt;/p&gt;

&lt;p&gt;So I had two cost centers stacked on top of each other:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Production cost (the editor)&lt;/li&gt;
&lt;li&gt;Discovery cost (the ad budget burned learning what flops)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I couldn't kill the second one entirely — the platform always charges you to learn. But the first one? The first one turned out to be almost completely removable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The replacement: a URL bar
&lt;/h2&gt;

&lt;p&gt;Here's my process now. I paste a product URL into &lt;a href="https://heydreaming.com" rel="noopener noreferrer"&gt;an AI tool that scores the ad before you spend&lt;/a&gt;, and ~90 seconds later I have four ad-video variations, each graded on hook, retention, CTA, and brand-fit. I download the best one and run it.&lt;/p&gt;

&lt;p&gt;No brief. No four-day wait. No invoice. The "creative production" step — the thing that used to cost me $2,000 and a week — collapsed into the time it takes to make coffee.&lt;/p&gt;

&lt;p&gt;I'm not telling you AI editing is &lt;em&gt;better&lt;/em&gt; than a great human editor. A brilliant editor with a real creative vision still beats it on the high end. I'm telling you that for &lt;strong&gt;volume testing&lt;/strong&gt; — the unglamorous work of finding out which of ten angles even deserves budget — paying a human $2,000 per batch is like hiring a calligrapher to write your grocery list.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number that actually changed the business
&lt;/h2&gt;

&lt;p&gt;When I added it up, my creative-production cost dropped roughly &lt;strong&gt;95%&lt;/strong&gt;. But the number that mattered more was a different one: &lt;strong&gt;time to test.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before, I could test maybe one batch of three videos a week, bottlenecked by the editor's turnaround. Now I can generate and pre-screen a dozen variations in an afternoon. The throughput increase didn't make my ads prettier. It made me &lt;strong&gt;right faster&lt;/strong&gt; — because I was sampling more of the angle-space before committing budget.&lt;/p&gt;

&lt;p&gt;That's the real unlock of AI creative for a small advertiser. Not "cheaper pixels." More shots on goal, screened before they cost you anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest catch
&lt;/h2&gt;

&lt;p&gt;It's not free, and I'd be a hypocrite to pretend otherwise. The tools that gate ad &lt;strong&gt;video&lt;/strong&gt; behind their top tiers can run &lt;strong&gt;~$999/mo&lt;/strong&gt; (looking at you, the big static-image incumbent). That's just the old $2,000 problem wearing a SaaS hoodie.&lt;/p&gt;

&lt;p&gt;What changed my mind was finding the version priced like a tool instead of a hostage situation — &lt;a href="https://heydreaming.com/pricing" rel="noopener noreferrer"&gt;$29 a month instead of $999&lt;/a&gt;, with transparent per-video credits so I can see what a clip costs &lt;em&gt;before&lt;/em&gt; I generate it. At that price, the "should I even test this angle?" hesitation disappears, which is the entire point.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're a solo founder doing your own ads
&lt;/h2&gt;

&lt;p&gt;Here's the mindset shift that saved me the most money: &lt;strong&gt;stop paying humans to produce tests, and start paying them to produce winners.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use AI for the wide, cheap, top-of-funnel exploration — generate ten angles, score them, kill the eight obvious losers before they touch your ad account. &lt;em&gt;Then&lt;/em&gt;, if you've got a proven winner worth polishing, that's when a great editor earns their $2,000.&lt;/p&gt;

&lt;p&gt;I fired my editor from the &lt;em&gt;testing&lt;/em&gt; job. I didn't fire them from the &lt;em&gt;craft&lt;/em&gt; job. The URL bar just turned out to be a much cheaper way to find out which ideas are worth the craft in the first place.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm building &lt;a href="https://heydreaming.com" rel="noopener noreferrer"&gt;HeyDreaming&lt;/a&gt; — an AI video-ad generator that scores every cut on hook, retention, CTA, and brand-fit before you spend — in public. If you've also tried to escape the $2K-per-batch creative trap, I'd love to hear what worked.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>startup</category>
      <category>ai</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>The Real Cost of AI Video Ads in 2026: I Broke Down Every Tool's Pricing (and the $999 Video Paywall Nobody Mentions)</title>
      <dc:creator>Shen Huang</dc:creator>
      <pubDate>Sun, 14 Jun 2026 07:20:46 +0000</pubDate>
      <link>https://dev.to/shenhuang/the-real-cost-of-ai-video-ads-in-2026-i-broke-down-every-tools-pricing-and-the-999-video-2bbk</link>
      <guid>https://dev.to/shenhuang/the-real-cost-of-ai-video-ads-in-2026-i-broke-down-every-tools-pricing-and-the-999-video-2bbk</guid>
      <description>&lt;p&gt;Every AI ad tool advertises a "free plan." Almost none of them give you &lt;em&gt;video&lt;/em&gt; on it. That gap — between the headline price and the price to do the thing you actually came for — is where small advertisers get surprised. So I sat down and worked out the &lt;strong&gt;real&lt;/strong&gt; cost of generating AI video ads across the main tools, including the fees that only show up once you click "upgrade."&lt;/p&gt;

&lt;p&gt;If you're a founder or small performance team deciding whether AI video ads are worth it before committing budget, this is the math you want first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TL;DR — The "free plan" on most AI ad tools excludes video. AdCreative's ad &lt;strong&gt;video&lt;/strong&gt; effectively lives on a &lt;strong&gt;~$999/mo&lt;/strong&gt; tier (as of mid-2026 — verify current pricing). Creatify, Arcads, HeyGen, and Runway meter video through credits that get expensive (and opaque) at volume. The cheapest &lt;em&gt;honest&lt;/em&gt; entry I found for scored ad video is &lt;strong&gt;$29/mo&lt;/strong&gt; — a two-figure entry instead of a four-figure one, which is the gap I built HeyDreaming into.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The trick: "free plan" ≠ "free video"
&lt;/h2&gt;

&lt;p&gt;Here's the pattern, and once you see it you can't unsee it. A tool offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;free plan&lt;/strong&gt; — usually images, templates, or a handful of watered-down credits.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;paid plan&lt;/strong&gt; where the &lt;em&gt;video&lt;/em&gt; generation actually lives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The marketing leads with "free." The product gates the expensive compute (video) behind a real subscription. That's not necessarily dishonest — video genuinely costs more to generate — but it means the "free AI video ad generator" you searched for often isn't free for &lt;em&gt;video&lt;/em&gt; at all.&lt;/p&gt;

&lt;p&gt;So the only number that matters is: &lt;strong&gt;what does it cost to generate an actual ad video?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The pricing breakdown
&lt;/h2&gt;

&lt;p&gt;Approximate public-plan pricing as of &lt;strong&gt;mid-2026&lt;/strong&gt; — every one of these has changed tiers before, so &lt;strong&gt;verify current pricing before you buy.&lt;/strong&gt; Where a vendor doesn't cleanly publish a "video" price, I've said so rather than invent one:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Entry price for &lt;strong&gt;video&lt;/strong&gt;
&lt;/th&gt;
&lt;th&gt;Pricing model&lt;/th&gt;
&lt;th&gt;Notable catch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HeyDreaming&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$29/mo&lt;/strong&gt; (Studio)&lt;/td&gt;
&lt;td&gt;Credit $-budget; Studio $29 / Agency $99&lt;/td&gt;
&lt;td&gt;Lowest published entry for scored ad video; credits are transparent ($0.02 each)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Creatify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$33/mo+ (annual) for video plans&lt;/td&gt;
&lt;td&gt;Credits/mo&lt;/td&gt;
&lt;td&gt;Credits burn faster than expected at volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$15/mo+ (Standard, credit-limited)&lt;/td&gt;
&lt;td&gt;Credits&lt;/td&gt;
&lt;td&gt;General creative tool, not an ad pipeline; credits run out fast on video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HeyGen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$29/mo+ (Creator)&lt;/td&gt;
&lt;td&gt;Credit/minute&lt;/td&gt;
&lt;td&gt;Avatar/translation focus; video minutes add up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Arcads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$110/mo+ (Starter)&lt;/td&gt;
&lt;td&gt;Per-seat / credits&lt;/td&gt;
&lt;td&gt;Built for actor-UGC volume; priced for it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AdCreative.ai&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$999/mo tier for ad &lt;strong&gt;video&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;td&gt;Strong on static images; ad &lt;strong&gt;video&lt;/strong&gt; is a top-tier feature&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;(Treat the competitor figures as ballpark — their pages bundle, gate by annual billing, and rename tiers constantly. The point is the &lt;em&gt;shape&lt;/em&gt;: a $15–110 credit-metered band for most, a four-figure outlier in AdCreative for video specifically.)&lt;/p&gt;

&lt;p&gt;The honest read: AdCreative's image product is mature and worth it for image-first teams — but if &lt;strong&gt;video&lt;/strong&gt; is your goal, the entry cost is steep. The credit-metered tools (Creatify, Runway, HeyGen, Arcads) are reasonable to start but get expensive once you're generating real volume, and the credit math is often opaque until you're inside.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why credit pricing trips people up
&lt;/h2&gt;

&lt;p&gt;The Reddit threads AI loves to cite about these tools are full of one complaint: &lt;strong&gt;"the credits run out way faster than I expected."&lt;/strong&gt; That's not always the tool being greedy — it's that "1 credit = ?" is rarely clear until you've spent them.&lt;/p&gt;

&lt;p&gt;This is exactly why I made HeyDreaming's credits a &lt;strong&gt;transparent dollar-budget&lt;/strong&gt; instead of magic points. Credits map to a real cost at &lt;strong&gt;$0.02 each&lt;/strong&gt;, and a video's cost is computed from resolution × duration — so a short 720p clip is ~20 credits and a long 1080p clip is more, and the Generate form shows the estimate &lt;em&gt;before&lt;/em&gt; you hit go. The tiers translate to honest video budgets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Studio&lt;/td&gt;
&lt;td&gt;$29/mo&lt;/td&gt;
&lt;td&gt;750 credits ≈ a real testing budget for a small store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agency&lt;/td&gt;
&lt;td&gt;$99/mo&lt;/td&gt;
&lt;td&gt;2,750 credits ≈ multi-client / high-volume&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The point isn't just that $29 beats $999 on a spec sheet. It's that the credits are priced like a tool, not a hostage situation — you can see the per-video cost &lt;em&gt;before&lt;/em&gt; you click generate, instead of watching a magic-points balance evaporate.&lt;/p&gt;




&lt;h2&gt;
  
  
  The actual cost comparison that matters: AI vs the old way
&lt;/h2&gt;

&lt;p&gt;Step back from SaaS pricing for a second. The real comparison for a small advertiser isn't "tool A vs tool B" — it's "any AI tool vs how I made ad video before":&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Traditional ad video&lt;/th&gt;
&lt;th&gt;AI video ad tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Per-video cost&lt;/td&gt;
&lt;td&gt;$500–2,000+ (shoot / UGC creator / editor / agency)&lt;/td&gt;
&lt;td&gt;Cents to a few dollars of credits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time&lt;/td&gt;
&lt;td&gt;Days to weeks&lt;/td&gt;
&lt;td&gt;~90 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variations&lt;/td&gt;
&lt;td&gt;1–3 (what you paid for)&lt;/td&gt;
&lt;td&gt;4+ per run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revisions&lt;/td&gt;
&lt;td&gt;More money&lt;/td&gt;
&lt;td&gt;Regenerate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even the $999/mo tools are dramatically cheaper than a production pipeline if you're making more than a handful of videos a month. The AI-vs-AI pricing fight is real, but don't lose the bigger picture: &lt;strong&gt;all of these beat paying $2K for three clips you haven't tested.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  So what should you actually pay?
&lt;/h2&gt;

&lt;p&gt;A simple decision rule based on your stage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Just validating that AI video ads work for your product?&lt;/strong&gt; Start on the &lt;strong&gt;lowest credit-metered entry&lt;/strong&gt; you can — you want to spend tens of dollars, not a four-figure subscription, to find out. HeyDreaming's $29 Studio is built for exactly this test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Running consistent paid social for one store?&lt;/strong&gt; A &lt;strong&gt;~$29/mo&lt;/strong&gt; tier covers real testing volume without a four-figure commitment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image-first funnel with deep ad-platform integrations and budget?&lt;/strong&gt; AdCreative's higher tiers may be worth it &lt;em&gt;for the integrations&lt;/em&gt;, not the video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need actor-UGC at scale?&lt;/strong&gt; Budget for Arcads/Creatify credits and price it against your output volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agency / multi-client?&lt;/strong&gt; Compare per-seat and credit ceilings carefully — this is where "cheap" plans get expensive fast.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The honest caveat about my own pricing
&lt;/h2&gt;

&lt;p&gt;I'm not claiming HeyDreaming is the cheapest for every workload forever — at very high volume, any per-credit model (mine included) adds up, and a flat enterprise plan elsewhere could win. What I &lt;em&gt;will&lt;/em&gt; defend is the &lt;strong&gt;entry&lt;/strong&gt;: there's no reason a founder should pay $999/mo to find out if AI video ads convert for their store. A $29 entry with transparent per-video pricing is the fair version of this category, and that's the version I built.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skip the four-figure tier
&lt;/h2&gt;

&lt;p&gt;Before you put a card into a $999/mo plan, run your own best-selling product through the lowest-entry option you can find and look at the scored output. You'll learn whether AI video works for &lt;em&gt;your&lt;/em&gt; product for tens of dollars, not thousands — and that answer is worth more than any pricing table, including this one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get scored ad video from $29/mo → &lt;a href="https://heydreaming.com" rel="noopener noreferrer"&gt;heydreaming.com&lt;/a&gt;&lt;/strong&gt; · paste a product URL, get four scored variations, no $999 paywall.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>marketing</category>
      <category>saas</category>
      <category>startup</category>
    </item>
    <item>
      <title>How I Indexed 2,000 Claude Code Skills (And What the Install Data Says About AI Coding in 2026)</title>
      <dc:creator>Shen Huang</dc:creator>
      <pubDate>Sun, 24 May 2026 04:57:53 +0000</pubDate>
      <link>https://dev.to/shenhuang/how-i-indexed-2000-claude-code-skills-and-what-the-install-data-says-about-ai-coding-in-2026-3k80</link>
      <guid>https://dev.to/shenhuang/how-i-indexed-2000-claude-code-skills-and-what-the-install-data-says-about-ai-coding-in-2026-3k80</guid>
      <description>&lt;h2&gt;
  
  
  The problem: 2,000 skills, no map
&lt;/h2&gt;

&lt;p&gt;Claude Code skills exploded across 2025 and into 2026. The official registry at &lt;a href="https://skills.sh" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt; and the parallel ecosystem on GitHub now expose well over 2,000 public skills — covering everything from &lt;code&gt;frontend-design&lt;/code&gt; patterns to &lt;code&gt;azure-deploy&lt;/code&gt; to &lt;code&gt;nano-banana-pro&lt;/code&gt; image generation. The format won. Every serious AI coding agent — Claude Code, Cursor, OpenSeek, Codex — now ships some flavor of "loadable context package".&lt;/p&gt;

&lt;p&gt;But there is no ranked, install-weighted, searchable index. The registry lists skills alphabetically, paginates them across dozens of pages, and doesn't surface install volume in a way you can sort. You discover a useful skill one of three ways: someone tweets it, you scroll forever, or you already know the author/repo combo. None of those scale past a few hundred skills.&lt;/p&gt;

&lt;p&gt;So I built one. &lt;a href="https://orangebot.ai/skills" rel="noopener noreferrer"&gt;orangebot.ai/skills&lt;/a&gt; is a ranked, filterable index of 1,998 public Claude Code skills sorted by weekly install volume, tagged by domain, with individual detail pages for the top 50 highest-installed entries. It is the page I wanted six months ago and didn't have.&lt;/p&gt;

&lt;p&gt;This post is the build log. Three parts: the stack (boring on purpose), the SEO crisis I walked into and the fix that shipped today, and what the install data actually says about where AI coding tools are headed in 2026.&lt;/p&gt;

&lt;p&gt;Source registry: &lt;a href="https://skills.sh" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt;. The catalog: &lt;a href="https://orangebot.ai/skills" rel="noopener noreferrer"&gt;orangebot.ai/skills&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack (zero infrastructure surprises)
&lt;/h2&gt;

&lt;p&gt;I picked the most boring stack I could justify, on purpose. The catalog is not where I want to spend operational attention — the data pipeline and the SEO are.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16 App Router&lt;/strong&gt;. Server Components by default so Google sees real HTML, not a JS shell. Routing is filesystem-based, the metadata API is built in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase App Hosting&lt;/strong&gt;. &lt;code&gt;git push&lt;/code&gt; deploys. No manual ops, no Docker, no Kubernetes. Free tier so far.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cron on a Linux box at home&lt;/strong&gt;. A Python scraper runs daily on &lt;code&gt;lich-ubuntu&lt;/code&gt;, normalizes install counts and author attribution, and writes a single ~2.5MB &lt;code&gt;skills_index.json&lt;/code&gt; to the repo's &lt;code&gt;public/data/&lt;/code&gt; directory. When the file changes, the next deploy picks it up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No database at request time&lt;/strong&gt;. The Next.js page reads the JSON at revalidate time (every 6 hours). Firebase serves the rendered HTML. No Postgres, no Redis, no Firestore call on the hot path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the whole architecture. One JSON file, one Next.js page, one daily cron. The catalog routes in the repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/app/skills/page.js              # SSR catalog (server component)
src/app/skills/SkillsClient.js      # interactive island (search/filter/sort)
src/app/skills/[category]/page.js   # domain filter pages
src/app/s/[id]/page.js              # individual skill detail page (top 50)
public/data/skills_index.json       # 1,998 entries, ~2.5MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Honest disclosure on the data freshness: &lt;code&gt;skills_index.json&lt;/code&gt; is regenerated weekly-ish during active development as I iterate on the parser. The production cron — separate Python service on &lt;code&gt;lich-ubuntu&lt;/code&gt; — is what stabilizes it to daily; that part is still rolling out. So treat the snapshot as recent, not "fresh this morning".&lt;/p&gt;

&lt;p&gt;The decision I keep being asked about is "why not a database". Two reasons. First, the catalog is read-mostly and changes once a day — that is the canonical shape of a static JSON file, not a row store. Second, every database I'd add is a thing that can break at 2am while I'm asleep. A JSON file in &lt;code&gt;public/&lt;/code&gt; cannot break. It can be wrong, but it cannot be down.&lt;/p&gt;

&lt;p&gt;The pillar guide that links into the catalog lives at &lt;a href="https://orangebot.ai/blog/claude-code-skills-guide" rel="noopener noreferrer"&gt;orangebot.ai/blog/claude-code-skills-guide&lt;/a&gt;. It's the long-form companion — what skills are, how to install them, when to pick a skill vs an MCP server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SEO crisis I didn't see coming
&lt;/h2&gt;

&lt;p&gt;Six months after the catalog went live, I finally opened Google Search Console. The numbers were ugly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;21 of 186 known URLs indexed. 11.3%.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;151 URLs sitting in "Discovered – currently not indexed". &lt;code&gt;last_crawled&lt;/code&gt; timestamps were the 1969-12-31 Unix epoch — Google had registered the URLs from my sitemap and then never bothered to fetch them.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;/skills&lt;/code&gt; page alone was getting &lt;strong&gt;5,651 impressions per week&lt;/strong&gt; but a &lt;strong&gt;0.12% CTR&lt;/strong&gt;. People were seeing the page in search results, then bouncing past it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the failure mode for a content site. I had built the catalog, written the pillar guide, submitted the sitemap, and Google's verdict was a polite "no thanks". The 5,651 impressions were good news in disguise — the demand was real; the page just couldn't convert it because the SERP snippet was the generic brand tagline (no &lt;code&gt;generateMetadata&lt;/code&gt;) and the rendered HTML was an empty client shell.&lt;/p&gt;

&lt;p&gt;I spent a day diagnosing it instead of pushing more content. Three root causes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root cause 1 — the catalog page was a client component.&lt;/strong&gt; The top of &lt;code&gt;src/app/skills/page.js&lt;/code&gt; had &lt;code&gt;'use client'&lt;/code&gt;. The server-rendered HTML was an empty &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;. Googlebot does run JS, eventually, but it queues JS-heavy pages on a much slower second pass, and for low-authority sites it often skips the second pass entirely. So Google saw a blank page, picked up the brand-tagline title from the root layout, and ranked accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root cause 2 — sitemap pollution.&lt;/strong&gt; Next.js App Router auto-generates routes from &lt;code&gt;metadata&lt;/code&gt; files like &lt;code&gt;opengraph-image.js&lt;/code&gt;, &lt;code&gt;twitter-image.js&lt;/code&gt;, &lt;code&gt;icon.js&lt;/code&gt;. My &lt;code&gt;next-sitemap.config.js&lt;/code&gt; was pulling all of them into &lt;code&gt;sitemap.xml&lt;/code&gt;, plus eight stale scaffold routes I never finished (&lt;code&gt;/cjobs&lt;/code&gt;, &lt;code&gt;/mnews&lt;/code&gt;, &lt;code&gt;/jobmatch&lt;/code&gt;, &lt;code&gt;/jobs&lt;/code&gt;, &lt;code&gt;/datajobs&lt;/code&gt;, &lt;code&gt;/photographer&lt;/code&gt;, &lt;code&gt;/prop&lt;/code&gt;, &lt;code&gt;/startups&lt;/code&gt;). Google saw 173 sitemap entries, found ~18 weren't HTML and another 8 returned thin/empty pages, and started treating the whole sitemap as low-trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root cause 3 — the homepage didn't link to /skills, /tools, or /digest in visible HTML.&lt;/strong&gt; The nav was inside a &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element that collapsed by default. Googlebot reads &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; content fine, but the absence of a prominent above-the-fold internal link to /skills meant the catalog was getting near-zero internal PageRank from the homepage.&lt;/p&gt;

&lt;p&gt;Three causes, four commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: 4 commits, ~180 file-changes (shipped 2026-05-23)
&lt;/h2&gt;

&lt;p&gt;Four commits today, between 11:15 and 18:59 PDT: &lt;code&gt;e9b4ba0&lt;/code&gt; (SSR-ify /skills /tools /news, clean sitemap, add hub nav), &lt;code&gt;d09e0e4&lt;/code&gt; (CTR titles, EEAT author page, 5 tools SSR, news sitemap), &lt;code&gt;4442629&lt;/code&gt; (P1+P2 push — 5 more tools SSR, deep compare pages, blog framework + 8 posts), &lt;code&gt;505ec1d&lt;/code&gt; (P3 push — 23 tools SSR, 50 skill detail pages, hub depth, OG image, newsletter). Cumulative session touched ~180 file-changes across the four commits per the P3 commit message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit 1 — convert &lt;code&gt;/skills&lt;/code&gt; and the other hub routes from client components to a server-shell + client-island pattern.&lt;/strong&gt; This is the generally useful pattern I'd recommend to anyone running into the same problem. The shape is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/app/skills/page.js  — Server Component (NO 'use client')&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SkillsClient&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./SkillsClient&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;revalidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;21600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 6 hours&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2,000+ Best Claude Code Skills (2026): Top Skills by Installs &amp;amp; Stars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A working library of Claude Code skills from across GitHub...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;alternates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canonical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/skills&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SkillsPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;skills_index.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allSkills&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;topSkills&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;allSkills&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;installs&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;installs&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;itemListJsonLd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://schema.org&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ItemList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;numberOfItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;topSkills&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;itemListElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;topSkills&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ListItem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;
        &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemListJsonLd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;details&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Text view · &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;allSkills&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; skills&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Claude Code Skills Index&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ol&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;topSkills&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skillId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;repository&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;by @&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; — &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;weeklyInstalls&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; installs/wk
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ol&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;details&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SkillsClient&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The trick: the server emits the real top-60 list inside a &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; block (collapsed for users, fully readable for crawlers) plus a JSON-LD &lt;code&gt;ItemList&lt;/code&gt; schema, and only then mounts the interactive &lt;code&gt;&amp;lt;SkillsClient /&amp;gt;&lt;/code&gt;. Google indexes the static list. Users get the interactive shell. Both reads are served from the same render.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit 2 — clean the sitemap.&lt;/strong&gt; Excluded &lt;code&gt;/*/opengraph-image&lt;/code&gt;, &lt;code&gt;/*/twitter-image&lt;/code&gt;, &lt;code&gt;/*/icon&lt;/code&gt;, &lt;code&gt;/feed.xml&lt;/code&gt;, &lt;code&gt;/feed.json&lt;/code&gt;, &lt;code&gt;/feed/*&lt;/code&gt;, &lt;code&gt;/api/*&lt;/code&gt;, and the eight stale scaffold routes from &lt;code&gt;next-sitemap.config.js&lt;/code&gt;. Sitemap went 173 → 154 (cleanup), then later commits added &lt;code&gt;/blog/*&lt;/code&gt; posts and 50 &lt;code&gt;/s/[id]&lt;/code&gt; detail pages, bringing it to &lt;strong&gt;219 URLs today&lt;/strong&gt;. All current entries return HTML with &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;meta description&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit 3 — visible homepage nav.&lt;/strong&gt; Added a &lt;code&gt;&amp;lt;nav aria-label="Site sections"&amp;gt;&lt;/code&gt; block at the top of the homepage with plain anchor tags to &lt;code&gt;/skills&lt;/code&gt;, &lt;code&gt;/tools&lt;/code&gt;, &lt;code&gt;/digest&lt;/code&gt;, &lt;code&gt;/news&lt;/code&gt;, &lt;code&gt;/blog&lt;/code&gt;, &lt;code&gt;/sources&lt;/code&gt;, &lt;code&gt;/topics&lt;/code&gt;, &lt;code&gt;/year/2026&lt;/code&gt;, &lt;code&gt;/compare&lt;/code&gt;. No &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;, no JS, no collapse. Boring. Crawlable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit 4 — depth on /tools, /blog, /s/[id], OG images, newsletter.&lt;/strong&gt; SSR'd 33 of 36 tool pages (each with HowTo / FAQPage / SoftwareApplication / BreadcrumbList JSON-LD), shipped 13 blog posts as the editorial layer, built 50 individual &lt;code&gt;/s/[id]&lt;/code&gt; skill detail pages, added a dynamic &lt;code&gt;next/og&lt;/code&gt; card per blog post, and embedded Substack signup on every post page.&lt;/p&gt;

&lt;p&gt;Expected D7 trajectory (forecast, not measured — post deploys today): indexed URLs &lt;strong&gt;30-40&lt;/strong&gt; by 2026-05-30, &lt;strong&gt;60-80&lt;/strong&gt; by 2026-06-06. The new &lt;code&gt;/skills&lt;/code&gt; title — "2,000+ Best Claude Code Skills (2026): Top Skills by Installs &amp;amp; Stars" — replaces the generic brand tagline that was driving the 0.12% CTR. I'll update this post with measured GSC numbers once the D7 pull lands.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the install data says about AI coding in 2026
&lt;/h2&gt;

&lt;p&gt;The catalog gives a daily-updated view into which skills people actually install. Here is the top 10 by weekly installs, pulled directly from &lt;code&gt;skills_index.json&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Author&lt;/th&gt;
&lt;th&gt;Installs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;find-skills&lt;/td&gt;
&lt;td&gt;vercel-labs/skills&lt;/td&gt;
&lt;td&gt;753,732&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;vercel-react-best-practices&lt;/td&gt;
&lt;td&gt;vercel-labs/agent-skills&lt;/td&gt;
&lt;td&gt;256,738&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;frontend-design&lt;/td&gt;
&lt;td&gt;anthropics/skills&lt;/td&gt;
&lt;td&gt;212,072&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;web-design-guidelines&lt;/td&gt;
&lt;td&gt;vercel-labs/agent-skills&lt;/td&gt;
&lt;td&gt;206,584&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;remotion-best-practices&lt;/td&gt;
&lt;td&gt;remotion-dev/skills&lt;/td&gt;
&lt;td&gt;182,063&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;azure-ai&lt;/td&gt;
&lt;td&gt;microsoft/github-copilot-for-azure&lt;/td&gt;
&lt;td&gt;146,196&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;azure-deploy&lt;/td&gt;
&lt;td&gt;microsoft/github-copilot-for-azure&lt;/td&gt;
&lt;td&gt;145,787&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;azure-storage&lt;/td&gt;
&lt;td&gt;microsoft/github-copilot-for-azure&lt;/td&gt;
&lt;td&gt;145,752&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;azure-cost-optimization&lt;/td&gt;
&lt;td&gt;microsoft/github-copilot-for-azure&lt;/td&gt;
&lt;td&gt;145,752&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;azure-diagnostics&lt;/td&gt;
&lt;td&gt;microsoft/github-copilot-for-azure&lt;/td&gt;
&lt;td&gt;145,697&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four things jump out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;find-skills&lt;/code&gt; is #1 with 753K weekly installs.&lt;/strong&gt; A meta-skill — a skill whose only job is to discover other skills — outranks every domain-specific skill in the index by roughly 3x. The discovery layer is the actual moat. That's the thesis behind this entire catalog. The #1 skill is published by &lt;code&gt;vercel-labs/skills&lt;/code&gt;, not Anthropic, which is itself a tell about who is racing to own the discovery primitive. Detail page: &lt;a href="https://orangebot.ai/s/find-skills" rel="noopener noreferrer"&gt;orangebot.ai/s/find-skills&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft owns the platform-skill volume.&lt;/strong&gt; The &lt;code&gt;microsoft/github-copilot-for-azure&lt;/code&gt; family ships 22 skills totaling &lt;strong&gt;2.86M installs&lt;/strong&gt; — the largest publisher in the index by total installs. The next-largest publisher is the parallel &lt;code&gt;microsoft/azure-skills&lt;/code&gt; family at 2.29M across more skills. Combined: ~5.15M installs, all curated, all opinionated, all shipped as part of GitHub Copilot for Azure's default surface. If you're a cloud provider in 2026 and you don't have a curated skill family, you are losing this distribution channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vercel is quietly the #2 publisher by reach.&lt;/strong&gt; &lt;code&gt;vercel-labs/skills&lt;/code&gt; (the &lt;code&gt;find-skills&lt;/code&gt; repo) plus &lt;code&gt;vercel-labs/agent-skills&lt;/code&gt; total 1.42M installs across very few skills — meaning per-skill leverage is higher than Microsoft's. Vercel is shipping skills that get installed almost universally rather than the broad-Azure-surface bet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inferen-sh and the open-source long tail are real.&lt;/strong&gt; &lt;code&gt;inferen-sh/skills&lt;/code&gt; totals 1.94M installs across 79 skills, mostly multimodal (image/video gen, OCR, Qwen). Six months ago "coding skills" meant test runners and migration helpers. Today image/video generation skills are colonizing the surface — because the same developer building a Next.js app is also generating OG images, hero shots, and product demos. The agent is the unified tool.&lt;/p&gt;

&lt;p&gt;Top publishers by total installs in the current index:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Publisher&lt;/th&gt;
&lt;th&gt;Skills&lt;/th&gt;
&lt;th&gt;Total Installs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;microsoft/github-copilot-for-azure&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;2,858,606&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;microsoft/azure-skills&lt;/td&gt;
&lt;td&gt;(multiple)&lt;/td&gt;
&lt;td&gt;2,291,209&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;inferen-sh/skills&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;1,941,845&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;github/awesome-copilot&lt;/td&gt;
&lt;td&gt;209&lt;/td&gt;
&lt;td&gt;1,598,674&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;coreyhaines31/marketingskills&lt;/td&gt;
&lt;td&gt;(multiple)&lt;/td&gt;
&lt;td&gt;873,458&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;anthropics/skills&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;757,840&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;vercel-labs/skills&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;753,732&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;supercent-io/skills-template&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;745,913&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total index: 1,998 skills, 401 unique publishers, ~19.2M cumulative weekly installs. Top 8 publishers hold roughly 60% of total volume — the power law is sharper than I expected, but the long tail of ~390 smaller publishers still matters.&lt;/p&gt;

&lt;p&gt;The thesis I'd commit to: by Q4 2026 the meaningful divide will be &lt;strong&gt;"agents that ship and run skills" (Claude Code, Cursor, OpenSeek) vs "agents that just call LLMs" (everyone else)&lt;/strong&gt;. Skills become the unit of teaching an agent your stack. If your agent can't load a community skill in one command, it's a closed garden, and closed gardens lose to ecosystems.&lt;/p&gt;

&lt;p&gt;A note on install-count interpretability: the numbers above include CI installs, scripted bulk installs, and probably some bot traffic. Treat them as a relative-popularity proxy, not a clean user count. The signal is noisy at the absolute level but the relative ranking holds up across multiple pulls.&lt;/p&gt;

&lt;p&gt;For reference, the actual install command shape from &lt;code&gt;skills_index.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install find-skills (the #1 skill, by Vercel Labs)&lt;/span&gt;
npx skills add https://github.com/vercel-labs/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; find-skills

&lt;span class="c"&gt;# Install frontend-design (by Anthropic)&lt;/span&gt;
npx skills add https://github.com/anthropics/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; frontend-design

&lt;span class="c"&gt;# Install azure-deploy (Microsoft)&lt;/span&gt;
npx skills add https://github.com/microsoft/github-copilot-for-azure &lt;span class="nt"&gt;--skill&lt;/span&gt; azure-deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command. No package.json, no virtualenv, no Docker. That low-friction install path is what makes install counts a usable popularity signal in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The 50 highest-installed skills now have individual SEO pages at &lt;code&gt;/s/[id]&lt;/code&gt; — searchable on Google for the skill ID directly, with &lt;code&gt;SoftwareApplication&lt;/code&gt; + &lt;code&gt;BreadcrumbList&lt;/code&gt; structured data and inline install instructions. That doubles the catalog's surface area for long-tail queries like "claude code find-skills install" or "azure-deploy skill setup".&lt;/p&gt;

&lt;p&gt;The daily digest email is up next — a curated 5-skill brief delivered each morning, weighted toward newly-published skills with unusually high first-week install velocity. The signal I'm hunting: which skills are about to break out before they hit the top 50.&lt;/p&gt;

&lt;p&gt;Open invitation: if you publish a Claude Code skill — public Git repo with a valid &lt;code&gt;SKILL.md&lt;/code&gt;, listed on skills.sh or installable via &lt;code&gt;npx skills add&lt;/code&gt; — the next scrape will pick it up. No submission form, no review queue, no gatekeeping. If your skill is good, the install counts will surface it on their own; if it isn't, no one will install it and that's also fine.&lt;/p&gt;

&lt;p&gt;The live catalog is at &lt;a href="https://orangebot.ai/skills" rel="noopener noreferrer"&gt;orangebot.ai/skills&lt;/a&gt;. The long-form pillar — what skills are, how they compare to MCP servers, how to write one — is at &lt;a href="https://orangebot.ai/blog/claude-code-skills-guide" rel="noopener noreferrer"&gt;orangebot.ai/blog/claude-code-skills-guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Go publish a skill. I'll see it on the next scrape.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>I got tired of all the desktop agent tools being macOS only, so I built one for Linux.</title>
      <dc:creator>Shen Huang</dc:creator>
      <pubDate>Sun, 01 Feb 2026 06:26:59 +0000</pubDate>
      <link>https://dev.to/shenhuang/i-got-tired-of-all-the-desktop-agent-tools-being-macos-only-so-i-built-one-for-linux-4mh5</link>
      <guid>https://dev.to/shenhuang/i-got-tired-of-all-the-desktop-agent-tools-being-macos-only-so-i-built-one-for-linux-4mh5</guid>
      <description>&lt;p&gt;Like many of you, I’ve been messing around with OpenClaw  (formerly clawdbot) and the whole "vibe coding" concept. It's cool, but finding a decent tool that actually drives the UI on Linux was a pain. Everything seems to be Mac-first right now. &lt;/p&gt;

&lt;p&gt;Since I do all my local inference on Linux, I built a dedicated tool for it.&lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;Peepbo&lt;/strong&gt; : &lt;a href="https://github.com/LichAmnesia/peepbo" rel="noopener noreferrer"&gt;https://github.com/LichAmnesia/peepbo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, it's a lightweight Node/TS wrapper that connects your local VLM (LLaVA, Qwen-VL, etc) to your desktop Linux environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vision:&lt;/strong&gt; Wraps &lt;code&gt;scrot&lt;/code&gt;, &lt;code&gt;gnome-screenshot&lt;/code&gt;, or &lt;code&gt;gdbus&lt;/code&gt; so the model can see the screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control:&lt;/strong&gt; Uses &lt;code&gt;xdotool&lt;/code&gt; to handle mouse/keyboard inputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wayland:&lt;/strong&gt; Yes, it works on GNOME Wayland, but you'll need to run in unsafe mode (details in the readme).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's open source. Give it a shot if you're trying to build agents on Linux and let me know if it breaks anything.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>linux</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
