<?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: K.C. Sheffield</title>
    <description>The latest articles on DEV Community by K.C. Sheffield (@pantech-kc).</description>
    <link>https://dev.to/pantech-kc</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2000527%2F617c5d62-69c5-4e4a-b6ef-6f0e4b7d6f5e.png</url>
      <title>DEV Community: K.C. Sheffield</title>
      <link>https://dev.to/pantech-kc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pantech-kc"/>
    <language>en</language>
    <item>
      <title>Helping your SPA get found</title>
      <dc:creator>K.C. Sheffield</dc:creator>
      <pubDate>Tue, 10 Feb 2026 00:04:31 +0000</pubDate>
      <link>https://dev.to/pantech-kc/helping-your-spa-get-found-i59</link>
      <guid>https://dev.to/pantech-kc/helping-your-spa-get-found-i59</guid>
      <description>&lt;h1&gt;
  
  
  I Built Something I'm Proud Of. Nobody Could Find It.
&lt;/h1&gt;

&lt;p&gt;Building the product was the easy part.&lt;/p&gt;

&lt;p&gt;I spent months building a developer tool — a real product that solves a real problem. I shipped it. It works. I'm genuinely proud of it.&lt;/p&gt;

&lt;p&gt;Then I Googled my own site.&lt;/p&gt;

&lt;p&gt;The homepage showed up — barely. Every other page? Invisible. My docs page, my templates page, my pricing page — Google didn't know they existed. When I shared links on LinkedIn and Twitter, every page showed the same generic preview card. Slack, Discord — same story.&lt;/p&gt;

&lt;p&gt;We've all heard "build it and they will come." And even though you know in your head that's not how it works, some part of you still expects it. You build something great, you deploy it, and you wait for people to stumble across your genius. They don't.&lt;/p&gt;

&lt;p&gt;Getting eyeballs on your work is the hardest problem nobody warns you about. And for me, the root cause turned out to be embarrassingly simple.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Every SPA Developer Has
&lt;/h2&gt;

&lt;p&gt;If you built a single-page app — React, Vue, Svelte, whatever — you have this problem right now, whether you know it or not.&lt;/p&gt;

&lt;p&gt;Your app ships one &lt;code&gt;index.html&lt;/code&gt;. One &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;. One &lt;code&gt;&amp;lt;meta description&amp;gt;&lt;/code&gt;. Every route on your site — &lt;code&gt;/docs&lt;/code&gt;, &lt;code&gt;/pricing&lt;/code&gt;, &lt;code&gt;/about&lt;/code&gt;, all of them — serves the exact same metadata to search engines and social platforms.&lt;/p&gt;

&lt;p&gt;You have 10 pages. Google sees one. LinkedIn sees one. Twitter sees one. Slack sees one.&lt;/p&gt;

&lt;p&gt;And crawlers that don't run JavaScript? They see nothing. An empty div.&lt;/p&gt;

&lt;p&gt;I opened Google Search Console and saw 21 out of 25 page resources couldn't even load. Fonts from an external CDN that Google's crawler couldn't reach. My site was basically invisible to the systems that help people discover things.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built to Fix It
&lt;/h2&gt;

&lt;p&gt;I wrote a Cloudflare Worker that sits in front of your SPA like a reverse proxy. Your app doesn't change. Your hosting doesn't change. The worker just intercepts requests and fixes what search engines and social platforms see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Every page gets its own title, description, Open Graph tags, Twitter cards, and canonical URL. Share your &lt;code&gt;/pricing&lt;/code&gt; page on Slack and the preview actually says "Pricing" — not your homepage title.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When a search engine crawler or social preview bot visits (Googlebot, Bingbot, LinkedIn, Twitter, Slack, Discord, AI bots — 35+ covered), it gets fully rendered HTML with real content instead of a blank div.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Normal visitors get your SPA exactly as before. Zero changes to your app. Zero impact on performance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Doesn't require you to change frameworks&lt;/li&gt;
&lt;li&gt;Doesn't require SSR or a build plugin&lt;/li&gt;
&lt;li&gt;Doesn't touch your existing code&lt;/li&gt;
&lt;li&gt;Doesn't care where your app is hosted — Netlify, Vercel, Cloudflare Pages, S3, anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's one file. It deploys in minutes. And it works for any SPA on any hosting platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Get
&lt;/h2&gt;

&lt;p&gt;After setting this up on my own site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 out of 11 pages showing up in Google&lt;/li&gt;
&lt;li&gt;FAQ rich results detected from structured data&lt;/li&gt;
&lt;li&gt;Every page has its own social preview on LinkedIn, Twitter, Slack, and Discord&lt;/li&gt;
&lt;li&gt;External resource failures went from 21 out of 25 down to near-zero&lt;/li&gt;
&lt;li&gt;All pages submitted and crawling on Bing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing adds about 5ms of latency. For routes that don't need SEO (like your dashboard), the worker proxies straight through with zero overhead.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Can Set This Up With an AI Prompt
&lt;/h2&gt;

&lt;p&gt;I packaged the entire setup into a single AI prompt. You paste it into Claude Code, Cursor, Windsurf, or whatever AI editor you use. It asks you a few questions — your domain, your routes, what you want each page's title and description to be — and then it builds everything.&lt;/p&gt;

&lt;p&gt;The worker. The prerender script. The sitemap. The robots.txt. Structured data. Deployment. Search console submission steps. All of it.&lt;/p&gt;

&lt;p&gt;No need to understand HTMLRewriter or Playwright or JSON-LD. The prompt handles the technical side. You just answer questions about your app.&lt;/p&gt;

&lt;p&gt;**Here is the ai prompt &lt;a href="https://gist.github.com/Fruitloop24/f663a9c80a291035b42d3d2554ce36f7" rel="noopener noreferrer"&gt;https://gist.github.com/Fruitloop24/f663a9c80a291035b42d3d2554ce36f7&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I'm Sharing This
&lt;/h2&gt;

&lt;p&gt;Because I know there are other devs who built something good and can't figure out why nobody's finding it. The SEO problem with SPAs isn't obvious until you check — and by then you've already lost months of potential traffic.&lt;/p&gt;

&lt;p&gt;If you built a single-page app, go check Google Search Console right now. See how many of your pages are actually indexed. See what your social previews look like. You might be surprised.&lt;/p&gt;

&lt;p&gt;Then fix it. It takes minutes, not days.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>ai</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I Added Auth and SaaS Billing to an App in 4 Minutes Using Claude Code — Here's How</title>
      <dc:creator>K.C. Sheffield</dc:creator>
      <pubDate>Sun, 08 Feb 2026 00:32:18 +0000</pubDate>
      <link>https://dev.to/pantech-kc/i-added-auth-and-saas-billing-to-an-app-in-4-minutes-using-claude-code-heres-how-438a</link>
      <guid>https://dev.to/pantech-kc/i-added-auth-and-saas-billing-to-an-app-in-4-minutes-using-claude-code-heres-how-438a</guid>
      <description>&lt;p&gt;Every side project hits the same wall — auth, billing, usage tracking. The stuff that isn't your actual product but eats weeks of your life.&lt;/p&gt;

&lt;p&gt;So I built an API that handles all of it. One publishable key. $19/month flat. No platform fees on your revenue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SDK
&lt;/h2&gt;

&lt;p&gt;Published on npm. Safe for frontend. Four calls and you're done.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @dream-api/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;DreamAPI&lt;/span&gt; &lt;span class="p"&gt;}&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;@dream-api/sdk&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;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DreamAPI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;publishableKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pk_live_xxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;      &lt;span class="c1"&gt;// Tiers you set in the dashboard&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;track&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;        &lt;span class="c1"&gt;// Enforced limits and gating&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;billing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;// Stripe checkout — your account, your money&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSignUpUrl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;// Hosted auth — no password logic needed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's your whole frontend integration. No backend routes. No webhook handlers. No Stripe SDK wrangling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Stripe account (Dream API uses &lt;a href="https://stripe.com/connect" rel="noopener noreferrer"&gt;Stripe Connect&lt;/a&gt; so payments go directly to you)&lt;/li&gt;
&lt;li&gt;A free &lt;a href="https://dream.panacea-tech.net" rel="noopener noreferrer"&gt;Dream API account&lt;/a&gt; to get your publishable key&lt;/li&gt;
&lt;li&gt;That's it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 4 Minute Demo
&lt;/h2&gt;

&lt;p&gt;Here's the real workflow. I open a terminal, fire up Claude Code, and four minutes later I have a working SaaS with real Stripe billing, tier management, and user auth. Not a mockup. Real test keys processing real transactions.&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Handles
&lt;/h2&gt;

&lt;p&gt;Dream API covers the three things that kill side project momentum:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auth&lt;/strong&gt; — hosted sign-up and login through &lt;a href="https://clerk.com" rel="noopener noreferrer"&gt;Clerk&lt;/a&gt;. No password logic, no session management, no OAuth wiring. One call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Billing&lt;/strong&gt; — Stripe Connect subscriptions, one-time payments, and store checkout. You configure your tiers and pricing in the &lt;a href="https://dream.panacea-tech.net" rel="noopener noreferrer"&gt;Dream API dashboard&lt;/a&gt; and the SDK handles the rest. Your Stripe account, your revenue, zero platform fees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage tracking&lt;/strong&gt; — set limits per tier, track consumption in real time, and gate features automatically when users hit their cap. Real-time changes from the dashboard reflect instantly.&lt;/p&gt;

&lt;p&gt;It works for SaaS, stores, and membership sites. I'm currently running four separate sites off the same API with full tenant isolation — different users, different billing, completely separate, one publishable key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;I built this for devs who use AI coding tools in the terminal — &lt;a href="https://docs.anthropic.com/en/docs/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, Gemini CLI, Cursor, Aider. If you're building with AI and you need the money part handled, this is it.&lt;/p&gt;

&lt;p&gt;You configure your tiers and products in the dashboard. The SDK does the rest on the frontend. Your users sign up, pick a plan, and start paying you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Templates
&lt;/h2&gt;

&lt;p&gt;Don't want to start from scratch? Six free starter templates ready to go:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React and Next.js SaaS templates&lt;/li&gt;
&lt;li&gt;React and Next.js store templates&lt;/li&gt;
&lt;li&gt;React and Next.js membership templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one comes pre-wired with the SDK, auth flows, billing pages, and a user dashboard. Clone it, plug in your key, and customize with Claude Code or whatever you build with.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://dream.panacea-tech.net/templates" rel="noopener noreferrer"&gt;template docs&lt;/a&gt; to see them in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  See It In Action
&lt;/h2&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://dream.panacea-tech.net" rel="noopener noreferrer"&gt;dream.panacea-tech.net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://dream.panacea-tech.net/docs" rel="noopener noreferrer"&gt;dream.panacea-tech.net/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@dream-api/sdk" rel="noopener noreferrer"&gt;@dream-api/sdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;14-day free trial, no credit card required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to answer any questions. Roast it, break it, tell me what's missing — I want the honest feedback.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>api</category>
    </item>
  </channel>
</rss>
