The Movie Game brand banner — left side shows the wordmark 'THE MOVIE GAME' next to a film-clapper icon with the tagline 'CONNECT THE FILMS. CRACK THE LINK.' Right side shows the puzzle premise: 'Guess the movie that connects two films through a shared actor. 30 seconds to get it. 30 days to master it. Forever to fall down the rabbit hole.' Below sits a three-card row labeled MOVIE A ↔ LINK MOVIE (tap to reveal, shown as a glowing question-mark card) ↔ MOVIE B.
Case Study · The Movie Game · May 2026

A road-trip game. A year on the shelf. A week to ship a re-launch.

In April 2025, Josh threw together a daily film-link puzzle so we could play it on a road trip. People kept playing — small but real traction. In May 2026, we picked it back up with two new partners: Hyperagent as the design and strategy room, and Replit as the build environment. One week of work shipped sixteen things — including a complete gameplay logic reboot, a Movie Identity Card system, a watchlist feature born inside a badge concept, daily auto-posting infrastructure, a full GA4 + GTM analytics layer, a press page, and this case study.

Husband-and-wife team One-week sprint 16 shipped surfaces Hyperagent + Replit v1 → v2 Postgres backbone Live at themoviega.me
Where this started

A road-trip game that kept getting played.

The Movie Game started in the front seat of a car. Emily had carried the mechanic in her head for years — every movie has actors, every actor has been in many movies, so any two movies can be connected by a third. Six Degrees of Kevin Bacon, daily. Ahead of a long drive in April 2025, Josh used Replit to throw together a working prototype we could play on the road. It was a weekend build — deployed to a domain, shared with a small group of friends, functional enough to actually play.

And then we kept playing it. Friends kept playing it. A small, organic following formed around it. The prototype worked — it had real, if quiet, traction. We always meant to come back. Life got in the way for about ten months.

In May 2026 we picked it back up — this time with a clearer division of labor. Hyperagent re-imagined what Replit had built: the GTM thinking, the redesigns, the identity system we'd never gotten around to. Replit then built everything — the new logic, every redesigned surface, the integrations, the deploy. The prototype gave us the mechanic; the sprint gave us the product.

💭
Gut feel · constraints · taste
Us · Josh + Emily
🪄
Ideas · designs · functionality
Hyperagent
Build · fine-tune · test · ship
Replit

We brought the gut-feel direction. We knew how the game should be played. We said yes or no to feature ideas. We asked for changes based on the feel of the game and how — and when — to scratch a movie itch. Hyperagent turned those instincts into strategy docs, mockups, copy, and specs. Replit took the resulting plans and built them — including a complete reboot of the link/clue selection logic that we worked out together inside the Replit environment. Most days we ran ideas through Hyperagent in the morning and watched Replit ship them by afternoon.

One week. Sixteen things shipped or specced. That's the headline. The rest of this doc is what we made, why, and which AI did which part.

The prototype

Enjoyably playable. A few rough edges.

The starting product was simple and worked: a daily film puzzle where you guess the movie that shares a cast member with two clue films. Four rounds, three hint reveals across them, a share string at the end. After solving, you saw a stripped-down post-game screen with the answer and a link to the movie's full page (which itself was a quiet rabbit hole of Wikipedia-grounded trivia, soundtrack, cast, awards, where-to-watch — all already shipped). Tap "Play Again" and you dropped into Practice mode with the full puzzle archive — no 24-hour cooldown.

What was missing was everything around it. No identity system. No badges, no streak visualization beyond a number. No watchlist. The Statistics modal was a basic Wordle-clone screen. The post-game share moment wasn't optimized for virality. The "How to Play" was a wall of text. There was no analytics — we couldn't actually tell what players were doing. And there was no GTM plan beyond "tell some friends." We had a mostly great mechanic and a working game; we did not have a product designed to grow.

The mechanic problem · why puzzles felt harder than they should

The original game pulled the connecting actor from anywhere in the link movie's full cast list — no weighting, no filtering. That sounds reasonable until you see it in practice: the algorithm might land on the eighth-billed actor in a mid-sized ensemble, someone who also happened to appear in a clue film with a small cast and a limited release. The connection was real. It was just one that almost nobody would recognize, on either side. Players couldn't get the "I knew that one" moment because the actor wasn't famous enough to recall, and couldn't get the "now I know" moment either, because the movies themselves weren't memorable enough to care about. The puzzle was technically solvable but emotionally unsatisfying — and that's the one thing a daily puzzle can't afford to be.

The build week

Sixteen things, one week.

A clean division of labor emerged on day one and held all week: Hyperagent generated ideas, designs, and functional specs; Replit handled building, fine-tuning, testing, and deployment; we steered with gut-feel direction. Most surfaces below were drafted in Hyperagent in the morning and shipped through Replit by the same evening. A few of them — most notably the link/clue logic reboot — were Replit-led from the start, with Hyperagent feeding diagnostic ideas rather than designs.

Each card below names the work, the shipping status, and which AI did which half.

01 · Free GTM playbook · strategy first Live

The first deliverable was a complete free go-to-market plan, written before any redesign work. The playbook ranked surfaces by ROI, established a four-week sequencing model, and called out the strategic positioning — most daily games punish enthusiasm with a 24-hour timeout; The Movie Game rewards it with unlimited Practice mode after the daily, plus a rich movie-page rabbit hole instead of a results screen. That single observation reframed every later pitch in the document.

It also established the anti-strategy: what we deliberately weren't doing. No founder TikTok. No public X-as-yourself. No paid social. No app store. No leaderboards. Saying no turned out to be half the value of the document — every later piece of work landed inside those constraints without re-litigating them.

Hyperagent Generated the playbook end-to-end from research on Framed, CineNerdle, Cinematrix, and the 2022-2026 Wordle-clone press wave. Wrote the four-week sequencing model and the anti-strategy section. Ten priority subreddits, ten journalist drafts, ten newsletter drafts, eight podcast pitches.
Replit n/a
02 · Link / clue logic reboot · Replit-led Live

Maybe the most significant under-the-hood change of the week. The original puzzle generator picked the link movie's actors at random from the full credited cast. The result: clue movies that were technically connected but often felt like a stretch — a 1996 single-scene appearance linking a 2024 lead role, or two unrelated supporting parts. Players solved it eventually but the "ahhh" of recognition was muted.

We rebuilt the actor-selection logic inside Replit to optimize for billing position, filmography depth, and cross-movie recurrence — picking the actors from the link movie whose presence in the clue movies is most likely to feel obvious in hindsight. The result: puzzles where the link, once you see it, is almost embarrassingly clear. Average solve rate climbed; hint rate dropped; the share-string distribution shifted toward earlier-round wins.

Hyperagent n/a
Replit Led the implementation end-to-end. Diagnosed the random cast-selection problem, rewrote the algorithm to weight by billing position, penalize one-scene appearances, and reward recurring collaborators. Iterated through eight rounds of comparative test runs against the live puzzle archive. Verified on the last 30 puzzles that the new logic consistently produces the "feel obvious in hindsight" solve. Schema-safe migration of the puzzle generation pipeline.
03 · Play screen v4 · the auto-reveal model Live

The play screen was rebuilt around a clearer game model. Three fixed hint slots — Hint N reveals automatically at the end of round N, no exceptions. The corner badge on each filled slot tells the story of that round: 💡 if the player took the hint, 🎞️ gold if they guessed wrong. Wrong guesses get their own row below the indicators, struck through, only appearing when made.

The hint counter button now uses instead of 💡 — keeping 💡 reserved for the corner-badge meaning ("I took the hint this round"). The whole surface becomes self-narrating: one glance tells you what round you're in, what you know, what you've tried, and how many reveals are still coming.

Play screen · Round 1 of 4 · Ghostbusters ↔ Burn After Reading
The Movie Game play screen v4. Header reads 'Today · Puzzle #5 · Round 1 of 4'. Title 'Find the Link Movie' with the subtitle 'Guess the movie that connects these two films through their actors.' Two movie posters — Ghostbusters (1984) on the left and Burn After Reading (2008) on the right — flank a center 'Link Movie · solve it' card with a blue '?' tile. Below: hint indicators reading 'HINTS · revealed after each round · 0 of 3 shown' with three empty slots labeled Hint 1 (Actor · Ghostbusters), Hint 2 (Actor · Burn After Reading), and Hint 3 (Year). At the bottom, a guess input field 'Type your movie guess…', a primary 'Guess' button, a '? Hint 3' button, and a 'GIVE UP · SHOW THE ANSWER' link.
Three fixed hint slots · Hint N reveals at the end of round N · 💡 corner badge = took the hint · 🎞️ gold = guessed wrong
Hyperagent Iterated through four versions of the model. Generated five comparative variants (round 1 returning, round 1 first-time, round 2, round 3 spotlight, round 4 with wrongs) so the new model could be evaluated across the whole game arc. Designed the corner-badge vocabulary and the vs 💡 separation that finally made the surface unambiguous.
Replit Built the live play screen, the slot auto-reveal animation, the wrong-guess row, and the hint-counter button. Wired hint_reveal, guess_attempt, and game_completion events via the GA4 layer with attempt-number + correct-boolean per submission.
04 · Post-game screen redesign · the biggest growth lever Live

The post-game moment is where players decide whether to share, whether to come back, and whether to tell anyone. The original was functional but under-loved. We rebuilt it as the central social surface of the entire game — share string anchored at the top, brand-blue accent, prominent share affordances by platform, streak ribbon, and a clear path into the rabbit-hole movie page.

Five executions of the concept were generated side-by-side so we could decide by comparison rather than abstraction. The chosen execution made the share-string the hero, with secondary surfaces (badges earned, watchlist quick-add, replay CTA) tucked below the fold.

Post-game · share moment — chosen execution · live screenshot
The Movie Game post-game share screen for Real Genius (1985), showing the solved Link Movie poster, connected actors William Atherton and Robert Prescott, the share-string preview, share buttons for X / Bluesky / Reddit / Letterboxd / Copy, the next-puzzle countdown, Practice mode CTA, and a Deep Dive · Real Genius callout with video clips and watch providers.
Hyperagent Re-imagined the post-game screen Replit had originally built. Generated five comparative variants of Concept 01, accented in red or green depending on loss. Specified the share-string anchor pattern, the secondary-surfaces hierarchy, and the per-platform share copy.
Replit Built the original post-game screen in the prototype, then rebuilt it to Hyperagent's redesign. Wired the share targets (native share / clipboard / platform-specific) and instrumented the GA4 events (post_game_modal_open, share with platform parameter) so every iteration is measurable.
05 · Share-string vocabulary · the streak of lightning Live

Maybe the single highest-leverage design decision of the week. The share string had to look unmistakable in a feed, encode a complete game state in a glance, and trigger the same I-have-to-try-this reflex Wordle's green-yellow grid does. Five rounds of iteration to land on the right emoji vocabulary: for solving it, 💡 for a hint taken, 🎞️ for a wrong guess, 🎭 for a bust.

Hyperagent first proposed 💨 for the bust (smoke, fire-going-out streak metaphor). Josh wasn't sold, so Hyperagent floated a few alternatives — and 🎭 landed instantly: theater masks, cinematic specificity. It became both the bust signal and the framing for a card design ("the drama got you").

The share string · two states
The Movie Game 🎬 #312 Top Gun ↔ Mean Girls 🎞️ 💡 ✨ 🔥×14 themoviega.me
A clean solve

The clue titles are the hook. A non-player sees "Top Gun ↔ Mean Girls" in their feed and thinks how are those connected? That's the game explained in one line.

The emoji row is the story. Wrong guess, took the hint, solved in round 3. Anyone can read it.

The share string · bust state
The Movie Game 🎬 #312 Top Gun ↔ Mean Girls 🎞️ 💡 🎞️ 🎭 🔥×14 → 0 themoviega.me
A bust · theater masks

The theater masks finish the row. Cinematic, thematically right, narratively kind. "The drama got you" reads better than "you lost."

The streak break is symbol + number. No English, copy-pastes clean across every platform.

🎬
Clapperboard — brand mark, only in the title line
🎞️
Film frames — a wrong guess that round
💡
Lightbulb — used the round to take a hint
Sparkle — solved it
🎭
Theater masks — ran out of rounds. The drama got you.
🔥
Fire — streak count, shown as 🔥×N
Hyperagent Ideated the emoji vocabulary from scratch. Generated four iterations of the share-string format. Designed the layout, the line lengths, the visual rhythm. Wrote the legend that lives in How to Play.
Replit Shipped the share-string generation logic — guess history → emoji sequence → clipboard. Wired the Satori PNG renderer so shares can also export as images when needed. Logs every share event with platform + result via the GA4 layer.
06 · Statistics screen · the live surface Live

The shipped Statistics screen — a single full-page surface stitching together every signal the player generates. Current streak crowned at the top, the canonical three-tile ledger below it (Played · Win Rate · Avg Rounds), the result distribution showing where wins land round-by-round, the live solver style with its contextual one-liner, the badge tray with the running unlock count, and a primary CTA to share the Movie Identity Card.

Everything on this surface derives from the player's own play history — no leaderboards, no comparisons, no social pressure. A simple toggle pairs the richer surface with a canonical numbers-only view, so the screen meets the player where they are.

Statistics screen · live on mobile · the Style Forming early-game view
The Movie Game Statistics screen on mobile. Header reads 'STATISTICS' with the post-share platform tray (X · Bluesky · Reddit · Letterboxd · Copy) above it. A featured tile shows '🔥 3 · CURRENT STREAK · Best: 3 · Started May 12, 2026'. Three summary tiles below read '6 PLAYED · 67% WIN RATE · 3.0 AVG ROUNDS'. A 'RESULT DISTRIBUTION' panel charts five bars labeled with the share-string emoji vocabulary (✨ wins on round 1, 🎞️✨ on round 2, 🎞️🎞️✨ on round 3, 🎞️🎞️🎞️✨ on round 4, and 🎭 busts). A SOLVER STYLE card reads 'Style Forming · Play a few more puzzles. We're watching.' A BADGES row shows '1 of 20' unlocked with the First Try seal earned. A primary blue 'Share your Movie Identity Card' button anchors the bottom, with a CLOSE link below it.
Streak · Played · Win Rate · Avg Rounds · Result Distribution · Solver Style · Badges · Identity Card share
Hyperagent Designed every pixel of the Statistics screen — the visual hierarchy that puts streak at the crown, the three-tile ledger underneath, the result-distribution chart that re-uses the share-string vocabulary instead of inventing new symbols, the SOLVER STYLE card with its contextual copy, the badge tray with the "N of 20" running counter, and the share-Identity-Card CTA as the screen's primary action. Specified spacing, typography, color, the empty/early-game treatment ("Style Forming"), and the toggle pairing with the canonical numbers-only view.
Replit Built the surface against a fully client-resident data model. The complete play history lives in a Zustand store persisted to the browser's localStorage — every streak count, every win-by-round bucket, every badge predicate, and every solver-style cascade is computed in the browser from the player's own device. No server round-trip, no account required, no analytics aggregate masquerading as personal stats. The screen renders synchronously from local state, which is why the streak crown lands the moment the modal opens.
07 · Badges & solver styles · from Wordle-clone to identity moment Live

Twenty badges across six groups and an eight-style solver classifier — a full identity layer threaded through the Statistics screen (§06) and anchoring the Movie Identity Card system (§08). Badges reward streaks, solving prowess, volume, content mastery, discovery, and watchlist behavior. Solver styles read the player's running play pattern and assign a single label that updates as the pattern evolves.

Every badge predicate and every style cascade is computed in the browser from the same Zustand store the game uses, so the player's identity surfaces the moment they earn it — no server round-trip, no waiting.

The full badge catalog · 20 badges, six groups
A · Streak Milestones
🔥
First Week
Hit a 7-day daily streak.
🔥
Month Master
30-day daily streak.
🔥
Centurion
100-day daily streak.
🔥
Calendar Cinephile
365-day daily streak — a full year.
B · Solving Prowess
First Try
Solved on round 1, no hints.
Pattern Reader
Ten Hole-in-Ones — round 1 wins, no hints.
🎞️
Down to the Wire
Won on round 4 with at least one wrong guess.
💡
Pure Solver
Seven consecutive daily wins with zero hints.
C · Volume
🎬
Matinee Regular
25 daily puzzles completed.
🎬
Casual Critic
50 daily puzzles. You've earned an opinion.
🎬
Frequent Filmgoer
100 daily puzzles. A genuine habit.
🎬
Annual Subscriber
365 daily puzzles. A year of mornings.
D · Content Mastery
🕰️
Time Traveler
Solved daily puzzles spanning 6 different decades.
🧭
Genre Wanderer
Solved daily puzzles across 8 different genres.
🎭
Six Degrees
Solved 6 daily puzzles featuring the same actor.
🌍
Polyglot
Solved daily puzzles from 4 different production countries.
E · Discovery & Special
🎭
Phoenix
Rebuilt a 7-day streak after a bust.
Practice Devotee
100 practice mode plays.
🔭
Scout
Discovered 100 unique movies across your puzzles.
F · Watchlist
📌
Watchlist Builder
Saved 10 movies to your Watchlist.
20 badges total · single source of truth lives in client/src/lib/badges.ts
Solver styles · cascade classifier, first match wins
Style Forming
Fewer than 7 plays. We're still watching.
The Cinephile
≤2.2 avg rounds, <10% hint rate, ≥85% win rate.
Speed Demon
≤2.0 avg rounds, ≥75% win rate.
Hint-Wary
Hint rate under 15%.
Comeback Kid
Over 30% of wins land on round 4.
Bookworm
≥40% hint rate, ≥85% win rate.
The Gambler
>30% round-1 wins and >20% bust rate.
Methodical
Steady, deliberate, almost always solves.
Hyperagent Wrote the first version of the badges (twelve in initial spec, twenty in final) across the six groups — streak milestones, solving prowess, volume, content mastery, discovery, and watchlist. Identified the eight solver styles and their cascade thresholds. Specified the Plaque card preview that surfaces both systems on the Identity Card.
Replit Built the badge predicates and the solver-style cascade as a single source of truth in client/src/lib/badges.ts. Predicates fire client-side from the persisted Zustand store the game already uses, so unlocks land instantly without a server round-trip.
08 · Movie Identity Card · The Plaque Live

Five identity-card concepts were generated side-by-side: The Plaque, The Folio, The Cover, The Poster, The Plate. Each carried a different metaphor for who the player is as a film-watcher. After comparison, The Plaque won — inset corner brackets, logo in a framed block, polished-metal gradient — partly because it felt earned (the plaque metaphor) rather than self-selected (the cover metaphor).

The card surfaces solver style, badge seals earned, streak signature, total puzzles, and a personal title. It's designed to be screenshotted and shared — a posting artifact, not just a profile.

The Plaque · the chosen identity card
The Movie Game Identity Card — The Plaque. Dark navy card with inset blue corner brackets. Centered logo block reads 'THE MOVIE GAME' in a framed clapperboard mark. Below it: 'IN RECOGNITION OF · A Hint-Wary Solver · an ongoing study in one acts'. A featured row reads '🔥 1 · DAYS · 28% WINS · 2.5 AVG'. A serif italic blurb reads 'Three hundred sixty-six puzzles played. One hundred consecutive at peak. Drawn to family — 50% of solves. The pattern in the playlist.' A row of badge seals at the bottom shows a pin, three clapperboards, and a +5 chip. Footer reads 'themoviega.me · puzzle 0 6'.
Hyperagent Designed five comparative card concepts with full visual treatments. Specified the seal placement, the streak signature aesthetic, the title taxonomy. Refined The Plaque's proportions after the initial layout overlapped the footer.
Replit Built The Plaque via the same Satori + @resvg/resvg-wasm pipeline already producing share images. Zustand store derives solverStyle on render (no persisted field, per spec). Schema rides on the v2 Postgres backbone — no localStorage edge cases to handle for the identity-card data.
09 · Watchlist page · born inside a badge Live

This one wasn't on the original list. While working through the Identity system, we noticed that the "Watchlist Builder" badge implied a watchlist feature that didn't actually exist yet. The badge needed somewhere for the user to build. So we designed and shipped the Watchlist as its own surface — a video-rental-wall of posters the player has marked from past puzzles, opening into the rabbit-hole movie pages already shipped.

The Watchlist Builder badge progress strip lives just above the wall (Scout earned at 5 films · Watchlist Builder unlocks at 25), tying the page back to the identity system. Tapping any poster also surfaces a small new section on the detail page: "Why this is on your watchlist — Connected Whiplash and Mean Girls via Greta Lee in Puzzle #287 · added two days ago." The watchlist becomes a memory of the player's journey, not just an inventory.

Watchlist · the video-rental wall
The Shawshank Redemption (1994) poster
Fight Club (1999) poster
Love Actually (2003) poster
Bridesmaids (2011) poster
Shaun of the Dead (2004) poster
Mystery Science Theater 3000: The Movie (1996) poster
Kill Bill: Vol. 1 (2003) poster
The Matrix (1999) poster
🎟️
14 · 25 to unlock Watchlist Builder
Hyperagent Designed the entire feature from the badge inwards — the wall layout, the "why this is on your watchlist" detail block, the badge progress strip, the empty state, the source taxonomy (clue_poster · answer_poster · watchlist_detail · rabbit_hole · watchlist · unknown).
Replit Built the watchlist routes (/watchlist and /watchlist/:id), the Zustand slice for watchlist state, and the GA4 events (watchlist_add, watchlist_remove, watchlist_view, watchlist_detail_view) with source attribution so we can see which surfaces drive adds.
10 · How to Play modal · polished, not patched Live
Thumbnail of the How to Play modal Tap to expand
The full How to Play modal — three-panel walkthrough covering the cast-link mechanic with a worked example (Top Gun: Maverick ↔ Paul), the four-round structure with the 🎞️/💡/✨/🎭 share-string legend, the rabbit-hole curated love letter that opens after solving, and the four daily-puzzle systems (Practice Mode, Your Rabbit Hole, Badges to Earn, Your Movie Identity). Bottom CTA reads 'Got it — Play today's puzzle'.

The old How to Play was a wall of text. The new one is a three-panel walkthrough: what you're solving (the cast-link mechanic with a worked example), how the rounds work (auto-revealing hints, the corner badge vocabulary, wrong-guess rows), and what happens when you finish (rabbit-hole movie page, Practice mode, sharing). Skip-ahead from the first panel for returning players.

Critically, the share-string legend (🎞️ · 💡 · · 🎭) lives inside the modal as a small inline section — players who encounter a share string in the wild can decode it without needing to play first.

Hyperagent Designed all three panels and the skip-ahead pattern. Wrote the worked example (Whiplash ↔ Miles Teller ↔ Top Gun: Maverick). Specified the share-string legend inline. Decided the skip-ahead's default position based on the "First time?" banner from the redesigned play screen.
Replit Built the modal, wired the skip-ahead state, fixed the focus-trap edge case on mobile. Instrumented dwell-time on each panel via a small custom event (not yet in the public GA4 reference but coming in v2 of the analytics doc).
11 · Settings page · everything in one place Live
Thumbnail of the Settings page Tap to expand
The full Settings page on mobile, organized into five sections: GAMEPLAY (Hard mode, Spoiler-safe share), SHARING (Default share target with Ask / X / Bluesky / Letterboxd / Reddit / Copy chips), ACCESSIBILITY (Reduce motion, High-contrast palette), DATA (Export progress with a Download button, Import progress with an Upload button, Install The Movie Game, Daily reminder with a 09:30 AM time picker, Auto-snooze, and a red Reset progress button), and ABOUT (the daily-puzzle tagline and a Send Feedback link in the footer). Footer reads 'V2 · BUILT ON REPLIT'.

Settings used to be a single Reset Progress button buried in a modal. Rebuilt as a dedicated screen organized into five sections: Gameplay (Hard Mode, Spoiler-Safe Share), Sharing (Default share target — Ask / X / Bluesky / Letterboxd / Reddit / Copy), Accessibility (Reduce Motion, High-Contrast Palette), Data (Export and Import progress as a JSON file, Install The Movie Game, Daily Reminder with a time picker, Auto-snooze when today's puzzle is already played, and the Reset Progress button), and About (tagline, dedication, Send Feedback link). Each setting carries a one-line description; defaults are sensible; the screen respects the player who just wants to play and the player who wants to tune.

The push-notification reminder system was wired up alongside Settings — a daily nudge at the player's chosen local time, fully opt-in, no email collection, runs on web-push with VAPID keys. Export/Import gives players insurance against device wipes without any account requirement.

Hyperagent Designed the Settings layout, the per-setting copy, the import/export flow, and the reminder-time picker. Wrote the iOS "Add to Home Screen" instructions for the push-notification path that doesn't work in iOS Safari.
Replit Built the Settings screen with shadcn/ui primitives. Wired the reminder system via web-push + node-cron timezone-aware scheduling. Instrumented every setting toggle (setting_changed) so we can see which knobs players actually touch.
12 · SEO-friendly puzzle archive · schema-first Live

Every past puzzle now has its own discoverable URL with proper JSON-LD VideoGame + Movie structured data. Clue movies and link movies are marked up; cast members are linked; release years and titles are crawlable. Search engines can index the entire puzzle history, and individual puzzle URLs are shareable as deep links.

Also added an archive index page (/archive) with a list view and a calendar view. Past puzzles are playable via Practice mode directly from the archive — no 24-hour wait, just tap and play.

Puzzle Archive · /puzzles · spoiler toggle, replay any past day
The Movie Game Puzzle Archive page. Header reads 'Puzzle Archive' with the subtitle 'Every past puzzle of The Movie Game. 4 puzzles and counting — replay any past day, or read the full breakdown of any answer.' A control bar shows '4 of 4 shown' on the left and a 'No spoilers · Hide answers' toggle on the right. Three puzzle cards are displayed side-by-side: Puzzle #4 (May 13, 2026) with answer 'What About Bob? (1991)' and clues D2: The Mighty Ducks (1994) + Polar (2019); Puzzle #3 (May 12, 2026) with answer 'Top Gun: Maverick (2022)' and clues Mean Girls (2024) + Eyes Wide Shut (1999); Puzzle #2 (May 11, 2026) with answer 'Meet the Robinsons (2007)' and clues Charlie and the Chocolate Factory (2005) + Stuart Little 2 (2002). Each card has a primary blue 'Play Puzzle #N' button at the bottom.
Crawlable per-puzzle URLs · spoiler-safe by default · one tap to replay any past day in Practice mode
Hyperagent Specified the JSON-LD schema, the URL structure (/puzzle/[number] and /archive), the metadata strategy (per-puzzle OG image generated via Satori with the answer hidden), and the calendar view layout. Wrote the index-page copy.
Replit Built the archive routes with proper SSR for crawlability. Generated per-puzzle OG images. Wired the structured data emission. Confirmed Lighthouse SEO score is a clean 100 on a sample of 12 puzzles. Instrumented archive_open and replay_open via GA4.
13 · Press page · a hosted press kit Live

A dedicated press page at /press — origin story, pre-approved quotes, brand assets (logos in 80/160/240px, screenshot library, OG images), the strategic positioning (the rabbit-hole win, Practice mode, schema-safe migration), and a contact email. Built so a journalist can fact-check, quote, and run a story without needing to email first.

Includes a checklist for ourselves of what an inbound journalist might ask, with pre-written answers. The page itself is now the asset linked from every cold pitch in the outreach playbook.

Press kit · themoviega.me/press Visit the hosted press page
Hyperagent Designed the press page layout, wrote every quote, set the brand-asset gallery, drafted the strategic-positioning prose, and supplied the "pre-approved quotes" section so journalists can lift verbatim with attribution. Designed the "poster not available" fallback for any titles without a TMDB poster.
Replit Hosts the page at themoviega.me/press. Wired the brand-asset downloads. Routes added without disturbing the puzzle archive or the watchlist routes. Image optimization pipeline applied to every press-page asset.
14 · GA4 + GTM analytics · nine event categories Live

We went from no instrumentation to a full nine-category GA4 layer in one sprint. Container GTM-WZRC3KHR, property G-V7HQGBVLMV. Categories: Lifecycle & navigation · Game lifecycle · Post-game surfaces · Sharing · Watchlist · Settings & data · Reminders · Install / PWA · Badges. All snake_case, no PII (guess strings never sent, no emails, no tokens). All pushed to window.dataLayer from client/src/lib/analytics.ts.

Every event is documented with when-it-fires, params, and gotchas — including dedupe rules, cardinality warnings, and the difference between our custom page_view (carries surface) and GA4's auto page_view. Looker Studio dashboard plan included: engagement overview, game funnel, difficulty insights, watchlist behavior, sharing, install/PWA funnel, reminders, settings, retention.

GA4 instrumentation · 9 categories · ~28 events
A
Lifecycle & navigation
app_open · page_view
B
Game lifecycle
game_start · guess · hint · completion · give_up
C
Post-game surfaces
modal_open · rabbit_hole · replay · archive
D
Sharing
share · platform · result
E
Watchlist
add · remove · view · detail_view
F
Settings & data
settings_open · setting_changed · export · import · reset
G
Reminders
subscribe · result · unsubscribe · time_changed
H
Install / PWA
nudge · prompt_result · ios_steps · app_installed
I
Badges
badge_unlocked
Container GTM-WZRC3KHR · Property G-V7HQGBVLMV · no PII · all snake_case
Hyperagent Wrote the entire GA4 event reference doc — 9 categories, ~28 events with full param shapes, the dedupe model for once-per-session events, the cardinality gotchas, the Looker Studio dashboard plan, the calculated fields (Win Rate, Share Rate, Install Conversion, Net Watchlist Adds), and the recommended custom dimensions / metrics for GA4 Admin registration.
Replit Wired every event into client/src/lib/analytics.ts and connected to the dataLayer. Configured the GTM container, registered the custom dimensions in GA4 Admin, verified events in DebugView. Built the Looker Studio data source connection. Module-scoped guards in place for app_open and rabbit_hole_open to prevent React StrictMode double-fires.
15 · Daily social auto-posting · Bluesky + Tumblr live, X queued Live · Bluesky + Tumblr · X queued

The site now auto-posts a daily message to Bluesky and Tumblr at 8:00 AM ET — different content variant per day-of-week (clue-forward Mon/Thu, challenge framing Tue/Fri, yesterday's chain Wed, solver stats Sat, trivia teaser Sun) so the feed reads human, not bot. The Wed-reveal variant is the only one that ever spoils — all others stay spoiler-safe so the post itself is a hook.

X is queued but skipped for now. X's new pay-per-action API pricing makes write actions expensive at our scale, and the manual copy-paste-via-Josh's-phone approach is fine for now. We'll revisit once volume justifies the cost.

Daily auto-post · Tuesday variant · 8:00 AM ET
Bluesky🎬 Puzzle #312 is live. Can you find the actor who connects: Top Gun ↔ Mean Girls 3 minutes. No signup. Free. themoviega.me
Tumblr🎬 Puzzle #312 is live. Can you find the actor who connects: Top Gun ↔ Mean Girls 3 minutes. No signup. Free. themoviega.me #film #cinema #moviegame #dailypuzzle #wordle #framed #filmblr #cinephile
Hyperagent Designed the five content variants and the day-of-week rotation. Wrote the post templates with the dynamic data hooks (puzzle.number, puzzle.clue_a, puzzle.clue_b, yesterday's solver aggregates). Specified the spoiler-safety rules (only Wed reveals). Drafted the Tumblr tag set for algorithm pickup.
Replit Built the post-generator service, integrated @atproto/api for Bluesky and tumblr.js for Tumblr NPF. Scheduled via node-cron with timezone-aware 7 AM ET trigger (8 AM ET adjustable). Failover logic in place: if either platform 4xx's, the other still posts. Logs every send to a daily audit table. X integration is built but feature-flagged off.
16 · Outreach playbook v2 · copy-paste drafts Live

After the original GTM playbook landed, we needed it operationalized. v2 of the outreach playbook is a sequence of copy-paste-ready drafts: specific Reddit posts per subreddit (tier-1 permissive, tier-2 organic-only, tier-3 topical hooks); personalized journalist emails for ten priority contacts (Bergeson, Edwards, Webster, Kottke, Cheng, Broderick, Hickey, Polygon Discoveries, Letterboxd editorial, Griffin Newman); ten newsletters; eight podcasts; five founder cross-promo emails; an eight-item aggregator submission checklist.

Plus the updated Letterboxd playbook for 2026 — reflecting that the Letterboxd API is no longer granting write access for our category of project, so the strategy is manual brand-account + lists + the Journal editorial pitch + critic DMs. Three moves, all founder-driven.

Hyperagent Wrote every draft. Researched the Letterboxd API restrictions. Personalized each journalist email with their specific prior coverage (Framed launch piece, Cinematrix beat, CineNerdle coverage, etc.). Drafted the founder cross-promo template and the five named-contact personalizations.
Replit Hosts the playbook page. The auto-posting infrastructure (§15) is the operational arm of the Reddit / Bluesky / Tumblr strategy in the playbook — what the playbook recommends, Replit ships.
Under the hood

The stack doing the work.

For anyone evaluating Hyperagent + Replit as a build partnership for their own product: this is what's actually running in production at themoviega.me. The whole stack is JavaScript, hosted end-to-end on Replit, deployed via Replit autoscale.

FEFrontend

  • React 18 + TypeScript, built and dev-served by Vite 5
  • Wouter for client-side routing
  • Zustand for global game / replay state
  • TanStack Query v5 for server-derived data
  • react-hook-form + Zod via @hookform/resolvers
  • Tailwind CSS 3 + shadcn/ui (Radix primitives)
  • Framer Motion for animation
  • canvas-confetti for win celebrations
  • Embla Carousel, Recharts for stats, react-youtube for clip embeds
  • lucide-react + react-icons for iconography
  • Web fonts: Fraunces, IBM Plex Serif, JetBrains Mono (self-hosted via @fontsource)

BEBackend

  • Node.js 20 + Express 4, written in TypeScript
  • Run with tsx in dev / esbuild-bundled in prod
  • Drizzle ORM + drizzle-zod against PostgreSQL 16 (Neon serverless driver)
  • node-cron for the timezone-aware 7 AM ET social poster
  • web-push for push notification reminders (VAPID)
  • Passport (local strategy) + express-session
  • connect-pg-simple / memorystore for session backing
  • ws for websocket needs

AIAI & content services

  • OpenAI SDK for trivia / content generation
  • LangSmith for tracing
  • TMDB API for movie data, cast, posters
  • Satori + @resvg/resvg-wasm for generating share images
  • Hand-edited Wikipedia-grounding pipeline for trivia (no slop)

SPSocial posting

  • @atproto/api (Bluesky)
  • tumblr.js v5 (Tumblr NPF)
  • X integration built but feature-flagged off (cost-vs-value pending)

OPSTooling, infra & dev environment

  • TypeScript 5.6, strict mode
  • PostCSS + Autoprefixer, tailwindcss-animate, @tailwindcss/typography
  • drizzle-kit for schema management
  • Hosted on Replit (Nix stable-24_05, modules: nodejs-20, python-3.11, postgresql-16)
  • Deploys to Replit autoscale behind port 80
  • Replit Vite plugins: cartographer, runtime-error-modal, shadcn-theme-json

SHShared

  • shared/schema.ts — single source of truth for DB tables, Zod insert schemas, and TS types consumed by both server and client
Why this stack works for a two-person team

Every choice in the table above prioritizes one of three things: (1) fast iteration with AI assistance — TypeScript-everywhere means Hyperagent's specs and Replit's generated code stay typed-consistent end-to-end; (2) low-ops production — Replit autoscale + Neon serverless mean no infra babysitting; (3) the v1 → v2 storage shift — Drizzle + the shared schema.ts file replaced v1's cached-only client storage as the structural backbone that enabled the SEO archive, analytics, watchlist persistence, and the auto-posting cron.

By the numbers

What this all added up to.

1
Week of work
16
Shipped surfaces
2
People · husband + wife
2
AI build partners
9
GA4 event categories
~28
Distinct GA4 events wired
20
Badges specced
8
Solver styles
5
Auto-post variants
10
Journalist drafts
10
Newsletter drafts
9
Subreddit drafts
2
Social platforms automated
$225.57
Hyperagent token cost
$281.46
Replit token cost
$0
Paid acquisition spent
Reflections · The streak of lightning

One week. One thing led to the next.

Asked at the start of the week, "what's the most important thing we'll ship?" — we'd have answered wrong. The work didn't unfold by priority; it unfolded by conversation. Each piece suggested the next. Here's the sequence of lightning strikes, in order.

1 · The GTM playbook came first, and that mattered.

We almost started with design. We're glad we didn't. Writing the free GTM playbook first forced us to articulate who we are before redesigning a single screen. The rabbit-hole win and Practice mode emerged as the strategic moat — and once those were named, every later design decision had something to optimize toward.

2 · The link/clue logic reboot was the Replit-led moment.

Most of the sprint ran Hyperagent-first, Replit-second. This was the inversion. The diagnostic — "the connections feel like a stretch" — went straight into the Replit conversation, and Replit drove eight rounds of heuristic tuning. The result: puzzles where the link, once you see it, is almost embarrassingly clear. Hardest work to evaluate in a screenshot. You feel it when you play.

3 · The share-string vocabulary, and the theater masks.

Hyperagent proposed the emoji vocabulary — solved, 💡 hint, 🎞️ wrong guess — and first floated 💨 for the bust state. Josh wasn't sold, so Hyperagent floated alternatives. 🎭 landed instantly: theater masks, cinematic specificity, and a card framing too ("the drama got you"). A perfect example of the partnership: AI generates the systematic options, the human picks the right metaphor.

4 · Then the post-game redesigns cascaded.

Once the share-string was right, the post-game screen had to be rebuilt around it. Five comparative concepts; the chosen one made the share-string the hero. Secondary surfaces (badges earned, watchlist quick-add) followed naturally. The post-game's structure then suggested the Stats screen should mirror it — same hierarchy, different content.

5 · Stats opened into the identity system.

The Stats redesign needed more than tiles. Hyperagent proposed badges; the badges suggested solver styles; both needed somewhere to live. That place became The Plaque — chosen from five card concepts because the "earned, not self-selected" metaphor felt right. We didn't set out to build an identity system. We set out to fix a Stats modal. The identity system fell out of the work.

6 · The Watchlist Builder badge birthed an entire feature.

The one we love telling. Hyperagent generated a Watchlist Builder badge in the identity spec. We looked at it and went, "wait — there's no watchlist yet." The badge implied a feature that didn't exist. So we built it. The Watchlist page is now one of the most-loved surfaces — a video-rental wall of films marked from past puzzles, opening into the rabbit-hole movie pages we already had. The badge designed the feature.

7 · How to Play + Settings were the polish that made it feel real.

By mid-week we had a redesigned game, an identity system, and a watchlist — but the surfaces around them felt loose. How to Play was a wall of text; Settings was a single Reset button buried in a modal. Cleaning both up in parallel was the moment the work stopped being a collection of pieces and started feeling like a coherent product. Putting the share-string legend inside How to Play was the small detail with outsized effect.

8 · The play screen reboot took four passes.

The single hardest piece of design to land. The auto-reveal hint model — Hint N reveals after round N, badges show what the player did that round — sounds simple. Four iterations and seven corrections later, the breakthrough was the corner-badge separation: 💡 means "I took the hint this round," so the hint counter button couldn't share the symbol — it became . Suddenly the surface stopped fighting itself.

9 · The social + outreach plan was the closer.

By Friday we had a beautiful product with no way for anyone to find it. The outreach playbook v2 and the daily auto-posting infrastructure shipped together. Hyperagent wrote thirty-plus draft emails and the five auto-post variants; Replit wired Bluesky and Tumblr APIs to a cron. The product can now market itself daily, without us, while we focus on the next phase.

What got left out of Phase 1, on purpose

The discipline of refusing to build certain things mattered as much as the design of what got built. Every "not now" is a Phase 2 unlock — the system grows by addition, not re-architecture.

Saying no is half the strategy. — The anti-strategy section of the GTM playbook

What we'd tell another two-person team thinking about this workflow

  1. Division of labor matters more than the tools. Hyperagent for ideation / design / strategy. Replit for build / fine-tune / ship. Us for taste and gut-feel. Put any one in the wrong seat and the week becomes ten weeks.
  2. Strategy before design before code. The GTM playbook on day one made every later decision faster. Design before code is obvious; strategy before design is not.
  3. Iterate on copy as carefully as on layout. Five rounds of share-string iteration mattered more than fifty rounds of post-game pixel-pushing would have. The copy is the share-string; the share-string is the growth loop.
  4. Let small details suggest big features. A badge in a spec opened a whole watchlist surface. Don't dismiss the implications of small additions.
  5. Don't skip the analytics. Without GA4 wired up, none of the above is learnable. We almost made this Phase 2. We're glad we didn't.
  6. The AI is generative; the gut is editorial. Theater masks beat smoke. The Plaque beat the Cover. The gut-feel layer isn't optional.
The one-liner

One week of two humans and two AIs shipped what would have taken a product team a full quarter or more. Idea → concept → production is faster and more accessible than ever — to anyone with the imagination and the token budget to run it.