Alex JauchConsulting Group
All posts

My Epic Battle with SEO: 106 Commits, One Year, and I'm Still Losing

A cautionary tale about what happens when a solo founder and an AI decide to “just handle SEO real quick.”


I launched Fictivize -- a platform for serialized fiction -- in late 2025. I had a beautiful serverless architecture, a single-table DynamoDB design I was unreasonably proud of, and exactly zero organic search traffic. One year and 106 SEO-related commits later, I have a beautiful serverless architecture, a single-table DynamoDB design I am still unreasonably proud of, and approximately zero organic search traffic.

This is the story of my year-long bar fight with Google, told through my git history, my bruises, and the slowly dawning realization that SEO is not, in fact, something you can “just add” to a codebase like a feature flag.

I should mention that I’m building this entire platform with Claude Code as my development partner. It’s just me and an AI. No team, no co-founder, no SEO consultant. Just a guy and a large language model who are both very confident and frequently wrong. I’ve built dozens of SaaS products over the years, but I’ve never done any B2C work and I’ve never had to worry about SEO before. Depending on who’s blog you read, SEO is dead, but I’m too deep into this war to quit now.

Act I: Blissful Ignorance (October 2025 -- January 2026)

For the first three months after launch, I did not think about SEO at all. I was building features. Users would find me… somehow. Through vibes, probably. Or maybe sheer force of will. I was focused on what technical people like me love: infrastructure, data models, and deployment pipelines.

My first SEO-adjacent commit was blocking crawlers on the staging environment, which technically counts as SEO in the same way that locking your front door counts as interior design. I didn’t want Google indexing my test data. A reasonable precaution, and also the last reasonable thing I did for months.

Act II: The Metadata Marathon (January -- February 2026)

I shared a page link on social media and noticed the preview displayed approximately nothing useful. No title. No description. No image. Just the quiet dignity of a blank white card.

What followed was a two-week sprint that I now think of as “The Tagging.” Claude Code and I cranked out Open Graph tags for stories. Open Graph tags for episodes. Then I realized the OG tags weren’t actually being rendered because the metadata function wasn’t wired up. Fix that. Then og:image for blog posts. Then I realized the author meta tag on every story said “Fictivize” instead of the actual author’s name. Fix that too.

I added an About Us page specifically because I read that Google cares about “E-E-A-T” (Experience, Expertise, Authoritativeness, and Trustworthiness), a concept that sounds like it was named by a committee hosted by Gloria, the woman in charge of picking the two letter abbreviations for the states. Then I expanded the sitemap. Then the sitemap broke because Amplify’s SSR didn’t like the static generation approach. So I converted it to a route handler. Then the route handler returned stale data because of build cache. So I forced dynamic generation. Then I limited it to 10 stories with 10 episodes each because nobody needs 400 URLs in a sitemap when you have 12 readers and most of them are your mom.

The sitemap alone accounts for 30 commits. Thirty. I have rebuilt the sitemap more times than some companies have rebuilt their entire product.

Act III: The Soft 404 Chronicles (April -- May 2026)

In April, Google Search Console started reporting something called “soft 404s.” For the uninitiated, a soft 404 is when your server says “200 OK, here’s a perfectly valid page!” and Google looks at that page and says “This is nothing. This is a void. I’m marking it as a 404 anyway because I have opinions.”

My episode pages were rendering just fine in a browser, but Google’s crawler was seeing a loading spinner and a prayer, because the content was being fetched client-side. Turns out, when Google says “we render JavaScript,” what they actually mean is “we render JavaScript when we feel like it, which is never for your site specifically.”

I added server-side rendering. I added proper 404 responses for episodes that don’t exist. I added canonical tags to blog pages and discovered I had duplicate H1 tags, which is apparently the SEO equivalent of wearing two hats at the same time.

Around this time I also added tags to my blog posts, because my blog posts had no tags and Google reportedly likes tags, or doesn’t care about tags, depending on which SEO blog you read and what phase the moon is in. Google’s official policy on this is “don’t ask, don’t tell.”

Act IV: The Sitemap Saga, Part II: This Time It’s Personal (July 2026)

July was the month the sitemap fought back.

It started with 504 timeouts. The sitemap route was querying DynamoDB on every request, and under any real crawl load it buckled like a folding chair at a wrestling match. So I added a 30-minute cache. Then I moved the entire sitemap generation to a background Lambda that runs on a daily schedule, pre-building the XML and storing it for fast retrieval.

Then the E2E tests broke. Then I fixed them. Then they broke differently. Then I made them tolerant of cached sitemap divergence. Then I skipped them for local runs. Then I realized the sitemap was referencing deleted stories because I’d hardcoded some “featured episodes” in the test cases that no longer existed. Then I moved sitemap regeneration into the deploy script. Then the test cleanup ran after regeneration instead of before, so the sitemap included test data.

In two days in late July, I made 12 commits related to the sitemap. Twelve. In two days. I was not building a sitemap; I was in a relationship with it, and it was toxic. I’m not going to tell you if this is in addition to the 30 from the previous act (spoiler: it is).

Act V: The Great Episode Purge (August -- September 2026)

By August, I had learned something that I probably should have figured out much earlier: indexing every episode page on a fiction platform is a terrible idea.

I had hundreds of episode pages. Most of them had zero search traffic. Google was spending its crawl budget visiting pages that nobody had ever searched for and nobody ever would, while my actually-important story landing pages sat in the queue behind “Episode 7 of a story with three readers.”

So I noindexed all episode pages. This felt like admitting defeat, except it worked. I consolidated episode content as previews on the story detail pages, added hidden navigation links so crawlers could still discover the episode structure, changed the JSON-LD from Article to Book (because a serialized story is more book than article, a distinction that matters to Google and literally no human being), and added FAQ sections to story pages because Google likes FAQ schema and will give you rich results for it, which is the SEO equivalent of a participation trophy.

I also replaced relative dates like “2 days ago” with absolute dates, because Google was apparently indexing the text “published 2 days ago” and then getting confused three months later when the page still said “2 days ago.”

Act VI: Fighting Ourselves (October 2026)

My most recent commits tell the saddest story of all: I’ve been sabotaging myself.

I ran a formal SEO audit in September -- well, Claude Code ran it -- and it gave me an A in Technical SEO (thank you, I worked very hard) and a C in Content Strategy (I know, I know). The core problem? I have 38 blog posts about AI and software engineering on a fiction platform. I have been busy “building in public” like a good open source veteran, but that is not a good thing for SEO. Google looks at fictivize.com and has no idea if it’s a tech blog or a fiction site, which is fair because sometimes I don’t know either.

I also discovered that my story URLs look like /stories/ba44620e-71fc-4ae6-8652-1ddfd9256af0, which provides exactly as much keyword signal to Google as reading a phone number aloud provides to a dog. This is the single most impactful thing I could fix, and I haven’t fixed it yet because it requires a backend data model change and I’m scared of my own migration scripts.

And then -- the indignity of indignities -- I found out Google was indexing my favicon. As a page. My 32x32 pixel icon was showing up in search results. I fixed it, but the emotional damage was done. I’m not admitting defeat, just taking a tactical withdrawal.

What I Should Have Done Differently

Looking back through 106 commits and a year of work, the lessons are painfully clear:

I should have thought about URLs on day one. Slug-based URLs are not a nice-to-have. They’re foundational. Retrofitting them after you’ve been indexed with UUIDs means writing redirect logic, updating every internal link, and praying that Google follows 301s promptly (spoiler: it does not).

I should have server-side rendered from the start. I spent months fixing soft 404s that only existed because I was client-side rendering content and expecting Google to wait for my API calls like a patient friend. Google is not your patient friend. Google has places to be, apparently.

I should have picked a content strategy before writing 38 off-topic blog posts. A fiction platform should probably write about fiction. I know this now. I knew this then. I wrote about AI anyway because it was more interesting to write about, which is not a valid SEO strategy.

I should have treated the sitemap as infrastructure, not an afterthought. I rebuilt it six times. Each time, I was surprised it needed to be rebuilt. I should not have been surprised.

Where We Are Now

Honestly? I’m not there yet. My technical SEO is genuinely strong -- metadata on every page, structured data that would make schema.org weep with joy, proper canonicals, breadcrumbs, environment-aware robots.txt, and a sitemap that finally works (knock on every available wooden surface).

But my content strategy is a C. My URLs are still UUIDs. I’m still showing up in Google results less than my personal web site which I built in a weekend.

I’ve learned that SEO is not a feature you ship. It’s a philosophy you adopt from day one, or a philosophy you spend 106 commits slowly, painfully reverse-engineering into a codebase that was never designed for it. I chose the second option, and I have the git history to prove it.

One more thing I’ve learned: Claude Code is an extraordinary development partner for cranking out metadata, structured data, and sitemap fixes at 2 AM. But it’s not going to tap you on the shoulder and say “hey, maybe we should think about URL slugs before we launch.” AI is great at solving the problem you put in front of it. It’s less great at telling you which problems to solve first. That part is still on you.

If you’re building a content platform and reading this, please, for the love of everything crawlable: pick good URLs, server-render your pages, and decide what your site is about before you write 38 blog posts about something else.

I’ll get there eventually. Probably around commit 200.


Alex Jauch is the founder of Fictivize, a serialized fiction platform that Google is still trying to figure out. You can find it at fictivize.com, assuming Google has gotten around to indexing it this week.