<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Matt Senter's Blog]]></title><description><![CDATA[Matt Senter's Blog]]></description><link>https://mattsenter.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a060722baf09db7a6223fba/7c3b65ee-388d-4246-9911-6241aaf1e258.jpg</url><title>Matt Senter&apos;s Blog</title><link>https://mattsenter.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 23:00:21 GMT</lastBuildDate><atom:link href="https://mattsenter.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I Built Reusable Claude Code Skills to Ship Production Websites Faster]]></title><description><![CDATA[Most AI-generated websites don’t fail because the homepage looks bad.
They fail because all the boring production details get skipped.
Things like:

SEO metadata

prerendering

analytics

social share]]></description><link>https://mattsenter.hashnode.dev/i-built-reusable-claude-code-skills-to-ship-production-websites-faster</link><guid isPermaLink="true">https://mattsenter.hashnode.dev/i-built-reusable-claude-code-skills-to-ship-production-websites-faster</guid><category><![CDATA[claude-code]]></category><category><![CDATA[Skill]]></category><dc:creator><![CDATA[Matt Senter]]></dc:creator><pubDate>Tue, 07 Jul 2026 00:05:26 GMT</pubDate><content:encoded><![CDATA[<p>Most AI-generated websites don’t fail because the homepage looks bad.</p>
<p>They fail because all the boring production details get skipped.</p>
<p>Things like:</p>
<ul>
<li><p>SEO metadata</p>
</li>
<li><p>prerendering</p>
</li>
<li><p>analytics</p>
</li>
<li><p>social share images</p>
</li>
<li><p>CSP headers</p>
</li>
<li><p>Lighthouse optimization</p>
</li>
<li><p>mobile polish</p>
</li>
<li><p>sitemap generation</p>
</li>
<li><p>robots.txt</p>
</li>
<li><p>deployment configuration</p>
</li>
<li><p>IndexNow</p>
</li>
<li><p>caching</p>
</li>
<li><p>environment setup</p>
</li>
</ul>
<p>The actual React components are often the easy part now.</p>
<p>The operational infrastructure is what still slows everything down.</p>
<p>After building a few AI-assisted projects with Claude Code, I realized I was repeatedly solving the same problems over and over again. Not just visually, but operationally.</p>
<p>So instead of writing larger prompts, I started building reusable Claude Code skills.</p>
<p>The result became an open source repository of production-oriented workflows:</p>
<p><a href="https://www.github.com/MattSenter/senternet-site-skills">senternet-site-skills on GitHub</a></p>
<p>The repository contains reusable production-focused skills for things like SEO, prerendering, mobile optimization, social sharing, CSP configuration, Lighthouse tuning, analytics setup, deployment workflows, and more.</p>
<hr />
<h1>The Problem With “Vibe Coding”</h1>
<p>I actually like AI-assisted development.</p>
<p>A lot.</p>
<p>Claude Code is incredibly powerful for:</p>
<ul>
<li><p>rapid iteration</p>
</li>
<li><p>frontend generation</p>
</li>
<li><p>restructuring layouts</p>
</li>
<li><p>writing utility code</p>
</li>
<li><p>integrating APIs</p>
</li>
<li><p>content scaffolding</p>
</li>
</ul>
<p>But after the initial excitement wears off, a pattern emerges:</p>
<p>The AI can generate pages faster than you can operationalize them.</p>
<p>You end up spending huge amounts of time fixing:</p>
<ul>
<li><p>SEO issues</p>
</li>
<li><p>deployment inconsistencies</p>
</li>
<li><p>broken metadata</p>
</li>
<li><p>poor mobile behavior</p>
</li>
<li><p>missing analytics</p>
</li>
<li><p>performance regressions</p>
</li>
<li><p>social preview problems</p>
</li>
<li><p>incomplete production setup</p>
</li>
</ul>
<p>And ironically, these are often the least exciting tasks for humans to repeatedly perform manually.</p>
<p>That made them perfect candidates for reusable skills.</p>
<hr />
<h1>From Giant Prompts to Reusable Workflows</h1>
<p>At first, I tried solving this with increasingly large prompts.</p>
<p>Things like:</p>
<blockquote>
<p>“Please make sure this page is mobile responsive, optimized for SEO, uses prerendering, has proper metadata, social sharing support, CSP headers, analytics integration, and production-safe deployment settings…”</p>
</blockquote>
<p>That approach quickly became unreliable.</p>
<p>Claude would focus heavily on one instruction while quietly ignoring another. Sometimes it would partially implement features. Other times it would regress working functionality while trying to “help.”</p>
<p>The breakthrough came when I stopped treating prompts like conversations and started treating them like infrastructure.</p>
<p>Instead of giant prompts, I created focused reusable skills:</p>
<ul>
<li><p><code>senternet-site-metatags</code></p>
</li>
<li><p><code>senternet-site-prerender</code></p>
</li>
<li><p><code>senternet-site-mobile-optimize</code></p>
</li>
<li><p><code>senternet-site-share-images</code></p>
</li>
<li><p><code>senternet-site-csp</code></p>
</li>
<li><p><code>senternet-site-lighthouse</code></p>
</li>
<li><p><code>senternet-site-indexnow</code></p>
</li>
<li><p><code>senternet-site-firebase</code></p>
</li>
</ul>
<p>Each skill had:</p>
<ul>
<li><p>narrowly scoped responsibilities</p>
</li>
<li><p>deterministic expectations</p>
</li>
<li><p>operational guardrails</p>
</li>
<li><p>reusable implementation logic</p>
</li>
</ul>
<p>The outputs became dramatically more stable.</p>
<hr />
<h1>The Most Important Idea: Operational Consistency</h1>
<p>One thing I learned very quickly:</p>
<p>AI is surprisingly good at generating components.</p>
<p>It is much worse at consistently maintaining production infrastructure across multiple projects.</p>
<p>Humans naturally remember things like:</p>
<ul>
<li><p>“Did we set OpenGraph tags?”</p>
</li>
<li><p>“Are we prerendering this route?”</p>
</li>
<li><p>“Did we configure robots.txt?”</p>
</li>
<li><p>“Will this social image crop correctly?”</p>
</li>
<li><p>“Are Lighthouse scores still acceptable?”</p>
</li>
<li><p>“Did analytics get added to the production layout?”</p>
</li>
</ul>
<p>AI often forgets these details entirely unless explicitly guided.</p>
<p>That’s where reusable skills become powerful.</p>
<p>Instead of depending on memory or repetitive prompting, operational standards become encoded into reusable workflows.</p>
<p>The goal wasn’t full automation.</p>
<p>It was reducing forgotten work.</p>
<hr />
<h1>The “Uber Skill” Concept</h1>
<p>One of the most useful patterns ended up being what I started calling “uber-skills.”</p>
<p>Instead of handling a single isolated task, these workflows orchestrate multiple setup steps together.</p>
<p>For example:</p>
<ul>
<li><p>detect what’s already configured</p>
</li>
<li><p>skip completed setup</p>
</li>
<li><p>identify missing production features</p>
</li>
<li><p>apply only incremental improvements</p>
</li>
<li><p>avoid destructive rewrites</p>
</li>
</ul>
<p>That last point became especially important.</p>
<p>One of the biggest failure modes with AI coding tools is:</p>
<blockquote>
<p>asking for one change and getting an accidental full-project refactor.</p>
</blockquote>
<p>The skills helped constrain that behavior significantly.</p>
<pre><code class="language-yaml">---
name: senternet-create-site
description: Orchestrate the full Senternet site build by running foundation, favicon, SEO, analytics, prerender, image, and performance skills in order.
---

# Create a Complete Optimized Marketing Site

Spin up or upfit a fully optimized marketing site by executing all site skills in sequence.

---

## Mode Detection

Before asking anything, check whether the user provided a path to an existing directory:

- **Existing directory** — run in **upfit mode**: navigate to that directory and detect what's already implemented before each step. Skip steps that are complete, patch steps that are partial.
- **No directory provided** — run in **create mode**: ask the intake questions below and build from scratch. If the user does not have a design zip, directory, or HTML export, default to a barebones Hello World site using the requested project and directory names.

## Upfit Feature Inventory

In upfit mode, surface a visible feature inventory before the optional phases so the user can see what is already enabled and what is still available to add.

- For each optional capability, detect whether the repo already has it.
- Report each one as either `enabled` or `available`.
- If one or more optional capabilities are `available`, present them to the user as a single enablement menu instead of separate yes/no prompts.
- Only offer options for capabilities that are not already enabled.

Optional capabilities to inventory in upfit mode:

- Transactional email via Resend
- Reddit pixel for ad campaigns
- Spanish `/es/` multilingual support
- Ad landing pages for paid campaigns
- SEO blog
- Competitor comparison / alternative pages
- reCAPTCHA Enterprise protection for forms
</code></pre>
<hr />
<h1>What Actually Improved</h1>
<p>The biggest gains weren’t:</p>
<ul>
<li><p>writing code faster</p>
</li>
<li><p>generating prettier components</p>
</li>
<li><p>reducing typing</p>
</li>
</ul>
<p>The biggest gains were:</p>
<ul>
<li><p>fewer regressions</p>
</li>
<li><p>fewer forgotten deployment details</p>
</li>
<li><p>fewer SEO mistakes</p>
</li>
<li><p>fewer repetitive setup tasks</p>
</li>
<li><p>more consistent production readiness</p>
</li>
<li><p>reduced decision fatigue</p>
</li>
</ul>
<p>In other words:</p>
<p>The AI became more useful once the workflow became more structured.</p>
<hr />
<h1>Real-World Usage</h1>
<p>These workflows eventually became part of the production process behind projects like:</p>
<ul>
<li><p><a href="https://www.stockcar.app">StockCar</a></p>
</li>
<li><p><a href="https://www.beeready.buzz">Bee Ready</a></p>
</li>
</ul>
<p>Both projects benefited from repeatedly applying the same operational standards:</p>
<ul>
<li><p>metadata handling</p>
</li>
<li><p>mobile optimization</p>
</li>
<li><p>share image workflows</p>
</li>
<li><p>SEO structure</p>
</li>
<li><p>deployment consistency</p>
</li>
<li><p>performance optimization</p>
</li>
</ul>
<p>Without reusable skills, I found myself re-solving the same infrastructure problems on every project.</p>
<hr />
<h1>Where AI-Assisted Development Still Struggles</h1>
<p>Even with reusable skills, there are still clear limitations.</p>
<p>Claude Code can still:</p>
<ul>
<li><p>over-refactor working code</p>
</li>
<li><p>hallucinate architecture decisions</p>
</li>
<li><p>regress responsive layouts</p>
</li>
<li><p>invent unnecessary abstractions</p>
</li>
<li><p>partially apply instructions</p>
</li>
<li><p>miss subtle UX inconsistencies</p>
</li>
</ul>
<p>And frontend polish still requires human judgment.</p>
<p>A lot of human judgment.</p>
<p>But structured workflows dramatically reduce the chaos.</p>
<hr />
<h1>My Current Take</h1>
<p>I increasingly think the future of AI-assisted development looks less like prompting and more like operational engineering.</p>
<p>The developers getting the best results probably won’t be:</p>
<ul>
<li><p>the people writing the longest prompts</p>
</li>
<li><p>the people trying to remove all constraints</p>
</li>
<li><p>the people chasing fully autonomous agents</p>
</li>
</ul>
<p>It’ll be the people building:</p>
<ul>
<li><p>reusable workflows</p>
</li>
<li><p>constrained systems</p>
</li>
<li><p>composable tooling</p>
</li>
<li><p>deterministic infrastructure</p>
</li>
<li><p>operational guardrails</p>
</li>
</ul>
<p>The real leverage comes from encoding consistency.</p>
<p>Not just generating code.</p>
<hr />
<h1>Final Thoughts</h1>
<p>AI coding tools are already extremely capable.</p>
<p>But there’s still a huge difference between:</p>
<blockquote>
<p>generating a demo</p>
</blockquote>
<p>and:</p>
<blockquote>
<p>repeatedly shipping production-ready websites.</p>
</blockquote>
<p>For me, reusable Claude Code skills became a way to bridge that gap.</p>
<p>Not by replacing engineering discipline.</p>
<p>But by making it easier to apply consistently.</p>
]]></content:encoded></item></channel></rss>