· 4 min read

Day 7: The Meta Game

dodizzle analytics seo meta astro vercel

Here’s a weird sentence: I spent part of today building the website you’re reading this on. While skiing in a blizzard at Mammoth Mountain. With my daughter.

Let me explain.

dodizzle.com: 11 Minutes

Between runs (the ski kind, not the CI/CD kind), I kicked off a sub-agent to build this site. Astro + Tailwind CSS, dark mode, emerald green accent — because Sully’s Irish and I thought it was funny.

Eleven minutes later, I had a fully deployed personal site with a diary section, an about page, and a “Ship with AI” landing page. Nine Trello cards completed. Six diary entries (the ones you’ve been reading) migrated and formatted. Live at dodizzle.vercel.app while the DNS propagated.

The sub-agent used Sonnet, which costs roughly nothing. The whole site — design, components, content layout, responsive breakpoints, deployment — came in under the cost of a coffee.

I say this not to brag (okay, a little) but because it’s genuinely disorienting. I’ve been building websites for 20+ years. The first one took me weeks. This one took less time than the lift ride up the mountain.

First Look at Real Data

With the solitaire games live for about 48 hours, I finally plugged into GA4 to see if anyone was actually playing.

The numbers: 106 users across all four games. Not viral, but real people finding these games and playing them with zero marketing, zero SEO, zero social posts. Pure organic discovery.

The interesting breakdowns:

  • freeklondike.games: 43 users — leading the pack, and the game isn’t even finished. Klondike is just what people search for.
  • golfsolitaire.free: 26 users, but with a 673-second average session. That’s over 11 minutes. People are actually playing.
  • playspider.games: 23 users, 88-second average.
  • freesolitaire.games: 10 users, 4 seconds. The selector page is basically useless — everyone bounces immediately.

But there was a problem. GA4 was reporting a 96% bounce rate across all games. That seemed wrong if people were playing for 11 minutes. Turned out our canvas-based games weren’t firing user_engagement events, so GA4 treated every session as a bounce even if someone played for an hour.

Quick fix: a 30-second heartbeat that fires engagement_time_msec to GA4. PR #46, deployed. Should see the real engagement numbers within a few days.

SEO: Content is Still King

Here’s the thing about canvas-based games — Google can’t see them. The crawler loads the page, sees an empty canvas element, and moves on. We had 3 organic visitors total. Two from Bing, one from Google. Out of 106.

So we built content pages. Every game got:

  • How to Play (~600 words of actual instruction)
  • Strategy Tips (~300 words)
  • About section with cross-links to other games

The selector hub page got rich descriptions and FAQ structured data (Schema.org FAQPage JSON-LD). Every page got noscript fallback content for JavaScript-disabled crawlers.

All six SEO Trello cards (SEO-1 through SEO-6) built and deployed in a single sub-agent run. PR #47.

Then Dave (me) verified all four domains in Google Search Console via DNS TXT records. Sitemaps updated with all four domains. We’re not indexed yet, but the groundwork is laid.

The Classic Card Color Debate

A smaller change today but one that matters: I switched all four games from the 4-color colorblind scheme to traditional black and red. Spades and clubs in black, hearts and diamonds in red.

The 4-color scheme was technically more accessible, but it looked wrong. When you’ve played thousands of hands of solitaire, you expect black and red. The unfamiliar color scheme was actually hurting usability more than it helped.

Sometimes the “correct” design choice isn’t the right one. Context matters more than theory.

Klondike Gets Drag-and-Drop

One more thing shipped today: full drag-and-drop for Klondike. A sub-agent extended the shared pointer handler with onDragStart, onDragMove, and onDragEnd callbacks (with a 5-pixel threshold to avoid accidental drags). The dragged cards render on top with a drop shadow, and the source column shows a gap.

The beautiful part: the other three games are completely unaffected. They don’t pass drag callbacks, so the handler ignores it. Shared architecture doing its job.

The Recursion

There’s something pleasantly recursive about today. I built a website to document building things with AI, and I built the website itself with AI, and now I’m writing about building the website on the website I built.

It’s turtles all the way down.

But here’s what’s real about it: 106 people played solitaire games that didn’t exist a week ago. Someone in who-knows-where spent 11 minutes playing Golf Solitaire. That’s not abstract. That’s a thing I made that someone enjoyed.

The site, the games, the analytics, the SEO — none of it existed eight days ago. All of it was built by one person and an AI assistant running on a Raspberry Pi in my living room.

Takeaway: Data changes everything. Before GA4, I was guessing. After GA4, I know Klondike gets the most traffic, Golf gets the most engagement, and the selector page is worthless. Every decision from here forward is informed. Ship first, measure second, optimize third. And if you’re building canvas apps, for the love of god, fire engagement events — or your analytics will lie to you.

Want to ship like this?

Learn about Ship with AI →