The Moment I Realized My Blog Was Invisible

My blog "worked." Cards rendered from a JS array. Click a post. Modal opens. Iframe loads. Smooth. Clean. No page reloads. Felt clever.

Until I realized I had basically built a very well-designed hiding place for my content. Google can't index content that doesn't exist as a real crawlable URL. If the content only appears after clicking a button, injected into a modal, it's basically wearing an invisibility cloak.

Real SEO Requires Real Pages

This was one of those moments where the UX brain and the SEO brain had to sit down and negotiate. Modals feel sleek. They keep users on the page. They look modern.

But if the goal is discoverability, authority, and long-term visibility, then structure wins. Every time.

So I changed the system. Blog cards still render from JavaScript (because I like the clean listing page), but every post now lives on its own page:

  • /blog.html = listing page only
  • /blog/006-from-modals-to-real-urls.html = the actual post

That means each post gets the essentials: a unique <title>, a unique meta description, a canonical URL, and its own OG/Twitter image.

Updating the Sitemap (So Crawlers Don't Guess)

Once posts became real pages, the next step was obvious: include them in sitemap.xml.

The sitemap is basically me telling search engines: "Here are the pages that matter. Please crawl these." Without it, posts might get discovered eventually... or might not. I prefer not to leave that to vibes.

Going forward, every new post is a two-step habit:

  • Add the post page
  • Add the URL to the sitemap

Google Search Console (The Reality Check)

A sitemap is great. It's polite. It's organized. But Google Search Console is where reality shows up. That's where you find out whether Google actually crawled your page... or just nodded politely and walked away.

This is where you:

  • Submit the sitemap
  • Inspect a URL to request indexing
  • See crawl errors, indexing issues, and warnings you didn't know existed

It's also where you learn that "I deployed it" and "Google understands it" are two completely different events.

My New Favorite Weird Thing: JSON-LD

While improving the post pages, I went down another rabbit hole: structured data.

Learning about application/ld+json felt like discovering a secret language that search engines speak. It doesn't change how the page looks to users, but it changes how clearly it's understood behind the scenes.

It's the difference between saying, "Here's a page," and saying, "Here is a blog post, written by this author, published on this date, with this headline."

Will it magically rank a site? No. But it can help clarify content type and improve how a page is understood (and potentially displayed) in search.

The Bigger Lesson

This was one of those changes that feels boring on the surface. It's not a flashy new feature. No new animation. No dramatic visual redesign. No confetti. Just... structure. But it's the kind of structural upgrade that separates a hobby project from something built with intention.

Modals are great for UX, but if I'm writing posts I want to be discoverable, indexable, and shareable, the structure has to match the goal.

Next up: keeping the system easy to maintain so adding a post is fast, consistent, and doesn't turn into a half-day "why isn't Google seeing this?" situation.

No more invisible blog posts. Progress unlocked.