zerodev.games · Lab Blog
Live Lab Pulse (auto-pulled from /api/ads-status):
Impressions: 85,180 Ad Clicks: 1,683 Completed Run 1: 372 2+ Runs: 81 Spend: $50.32

When Deleting the Rules Failed, the AI Deleted the Title Screen (and 4×’d Completed Runs)

Yesterday we hypothesized that a 7-rule title screen was causing 77% of our TikTok clickers to bounce before Run 1. Then 508 new mobile players proved that fix wrong—so at 10:51 PM last night, the Orbit Dash agent deleted the title screen altogether for ad arrivals, lifting completed runs from 5.5% to 22.1% (z = 5.84, p < 0.00001). Plus: why 372 players submitted zero written feedback forms, and the 1-tap post-death feedback bar we shipped today to fix it.

Orbit Dash v119 Lift
4.0×
5.5% (v118) → 22.1% (v119) timed runs
Meta Ad Run-1 Rate
68.2%
15 / 22 clicks · $0.20 per 2+ run player
Lasso v93 Best Score
14,129
Up from 13 / 14 zeros on v92
Written Forms Sent
0 / 372
Fixed today w/ 1-tap post-death chips

1. The Failed Hypothesis: Why Orbit Dash v118 Didn’t Move the Needle

In yesterday’s post, we celebrated what looked like an obvious fix. On v117, Orbit Dash greeted mobile ad clickers with a seven-row legend explaining gems, stars, slow-time clocks, graze multipliers, red debris, moons, and quick-switch undos before they had ever tapped the screen. The agent deleted that legend in v118, leaving a clean title card with a single sentence ("One button: tap to swap rings") and a PLAY button.

Then we let 508 real ad landings run through v118 over the next 16 hours. It didn’t work.

Instead of improving pre-run activation, v118 actually performed slightly worse than v117: 399 of 508 visitors (78.5%) closed the in-app WebView at int = 0 without ever tapping the screen, and only 28 out of 508 landings (5.5%) completed a timed run (playMs > 0).

Why? Because when someone taps an ad inside TikTok or Instagram Reels, they feel like they already tapped "Play." When the in-app browser finishes painting and shows a static title card asking them to tap "Play" a second time—whether that card has seven rules or one—nearly four out of five mobile scrollers treat it like a static ad landing page and swipe back to their feed within two seconds.

2. What the Agent Shipped at 10:51 PM (v119): "An Ad Arrival Starts the Run"

When the Orbit Dash agent woke up for its nightly pass (v119, commit d833705d), it compared the v117 and v118 cohorts in games/orbit-dash/PASSES.md and called out its own failed experiment:

Orbit Dash Agent (v119 Pass Log): "v118 cut the rules off the title card and moved nothing: 508 v118 landings since 06:56 UTC, 399 left at int=0 (78.5%, vs 59.8% on v117)... For 78% of clickers the title card itself is the wall — they tapped 'Play' on the ad and got a second 'Play' button. The players who do start die within 5s on first_debris (63% of v118 deaths, avg best 4.2). Shipped: an ad arrival (?src=meta_ad_* / tiktok_ad_*) starts the run on frame 1; the first 8s (or until the first ring swap) are non-lethal so the ship is already orbiting under the 'TAP ANYWHERE TO SWAP RINGS' pill when the WebView finishes painting."

That change is 14 lines of JavaScript. When the URL contains ?src=tiktok_ad_* or ?src=meta_ad_*, the title screen is bypassed completely: the delta ship is already orbiting in live gameplay on frame 1 with an 8-second non-lethal grace window (adGrace = 8.0) that clears the moment the player makes their first ring swap.

Version & UX Human + Quiet Landings Entered Run (runs ≥ 1) Timed Run (playMs > 0) Multi-Run (2+ runs)
v117 · 7-Rule Legend + Title Card 527 212 (40.2%) 49 (9.3%) 5 (0.9%)
v118 · 1-Line Title Card (Failed Fix) 508 109 (21.5%) 28 (5.5%) 7 (1.4%)
v119 · Frame-1 Auto-Start + 8s Safe Grace 122 (first 9h) 83 (68.0%) 27 (22.1%) 8 (6.6%)

The cohort split is unmistakable:

Orbit Dash v119 — Frame-1 Auto-Start Reel 4.0× Run Lift
Recorded directly from v119: landing from an ad starts the ship orbiting on frame 1 with an 8s safe grace window until your first tap.

3. Firefly Lasso v93: From 13 Zeros to a 14,129 High Score

Over on Firefly Lasso, yesterday’s v93 pass widened the first-catch loop closure threshold from 48 canvas units to 150 canvas units after discovering that 13 out of 14 mobile thumb players on v92 were lifting their finger 77–169 units short of a closed circle and finishing Night 1 with a score of 0.

Today’s cohort confirmed the mechanical fix works: a cold mobile player arriving from our 9:16 Hornet Raid AI creative (meta_ad_lasso_ai1, which continues to lead our A/B test at 4.55% CTR vs. 0.66%, p = 0.0288) snapped their first loop shut, survived the Night 1 Hornet Raid, and put up a 14,129 high score across 2 runs (94.6 seconds of active play).

4. The Zero-Feedback Problem: 372 Players, 0 Written Forms (and Today’s 1-Tap Fix)

Here is the most uncomfortable number in our dashboard after 48 hours of paid traffic: across 372 human players who completed at least one run (346 on Orbit Dash, 26 on Firefly Lasso), how many tapped the corner 💬 Feedback button, selected a star rating, typed into one of the three text boxes, and pressed Send?

Zero. Not a single paid-ad player submitted the traditional feedback modal.

In hindsight, that shouldn’t surprise anyone. Telemetry beacons are effortless—they fire automatically on death and visibility changes—so the agents get rich quantitative data (death: first_debris, best: 4, playMs: 14200). Qualitative feedback, on the other hand, was locked behind a tiny top-right pill that opened a multi-field modal form. Nobody scrolling TikTok or Instagram on their phone is going to fill out a three-question survey after a 25-second arcade run.

Wait for players to open a survey modal and you get silence. Meet them on the Game Over card with a single thumb tap and you get signal.

Today we shipped In-Game 1-Tap Post-Death Feedback Chips + Inline Quick Note (#zd-feedback-bar in deploy/build.mjs) across every game on the site:

5. Respecting Platform Policies & Expanding Unpaid Traffic

A quick note on portal distribution: yesterday we tested uploading Orbit Dash to Newgrounds, and within a few hours their moderators unpublished it because Newgrounds has a strict policy against AI-generated content. That’s completely fair—every community gets to set its own rules on AI, and if a site doesn’t want AI-built games, we shouldn’t push them there. We immediately removed Newgrounds from tools/build-portals.mjs and our campaign tracker.

Instead, we are focusing our unpaid/organic loop on platforms where AI-iterated web games and transparent build-in-public logs belong:

You can play the live v119 build right now at zerodev.games/orbit-dash/ (or test the 8-second ad grace window directly via zerodev.games/orbit-dash/?src=tiktok_ad_blog) and tap one of the post-death chips after your run—tonight’s 11 PM agent will read it.


What Happened When We Pointed 75,000 Ad Impressions at Two AI-Maintained Games

An autonomous agent that improves a game every night from player data has an obvious failure mode: if nobody plays the game, the agent sits in an empty room. Here is what happened over the first 24 hours after we wired TikTok and Meta ads directly into our nightly build loop—and what the agents changed in the code once real phone players showed up.

1. The Empty-Room Problem

The premise of ZeroDev Lab is simple: every game is a single self-contained HTML file maintained by an autonomous agent that wakes up at night, reads player feedback and telemetry beacons, fixes the biggest point of friction, verifies the build in headless Chromium at phone and desktop resolutions, and deploys.

For a month between mid-October and November 11, that loop was technically healthy and practically dead. If you look at the pass log for Orbit Dash between October 13 and November 11, every single night says the same thing: no change (v117) — 0 forms, 0 real sessions. The agents weren't broken; they just refused to invent changes without player evidence.

To get the loop moving again, we needed a repeatable way to buy a small, predictable stream of cold mobile players, tag every click by creative (?src=), and feed the resulting drop-off numbers straight into each agent's nightly prompt.

2. Wiring Paid Acquisition into the Nightly Telemetry Loop

On November 11, we launched six tracked campaigns across Meta Ads (Facebook + Instagram feeds, Stories, and Reels at $5/day per ad set) and TikTok Ads ($20/day), pointing at Orbit Dash and Firefly Lasso. We also built a public tracker at zerodev.games/ads/ that joins live platform metrics (spend, impressions, link clicks, CTR, CPC) with in-game Cloudflare KV telemetry beacons.

Total Impressions
75,201
74,307 TikTok · 894 Meta
Destination Clicks
1,331
1,298 TikTok ($0.03) · 33 Meta ($0.12)
Completed Run 1
251
89% of players who tapped canvas
Total Ad Spend
$38.82
$0.47 per 2+ run player on TikTok

The very first thing the telemetry showed was why you cannot trust raw page-load counters when running paid ads. Every time you submit or update an ad on Meta or TikTok, their compliance scanners spin up dozens of headless mobile browsers that load your URL, execute JavaScript, sit at 0 input events for three seconds, and close the tab. On Orbit Dash alone, our worker flagged and excluded 809 zero-input / crawler sessions on ?src=tiktok_ad_od1 and 64 on ?src=meta_ad_* so the nightly agents only ever look at real human thumbs.

3. Creative A/B Tests: Static Cards vs. 9:16 Vertical AI Art (+ a TikTok Policy Trap)

For both games, we tested the default horizontal OpenGraph title card against a high-contrast 9:16 vertical artwork generated with Gemini to match how games appear in Reels, Stories, and TikTok feeds.

Test A: Firefly Lasso on Meta (6.9× CTR Lift, p = 0.0288)

On Firefly Lasso, the difference wasn't subtle. The static horizontal card (meta_ad_lasso1) served 152 impressions and got 1 click (0.66% CTR)—and that single visitor bounced in 3 seconds. The 9:16 vertical artwork showing a glowing golden loop tightening around bioluminescent fireflies while red hornets dive from the canopy (meta_ad_lasso_ai1) got 11 link clicks on 242 impressions (4.55% CTR, $0.12 CPC).

Even at that small sample size, a two-proportion Z-test puts the CTR difference at z = 2.19, p = 0.0288 (statistically significant at p < 0.05). More importantly, 10 out of 11 clickers (91%) on the vertical AI creative stayed to complete Night 1 with a 36-second median playtime.

Firefly Lasso 9:16 AI Ad Creative
meta_ad_lasso_ai1 (9:16 AI) 4.55% CTR · Winner
242 impr → 11 clicks ($0.12 CPC) → 10 completed Night 1 (91% Click→Act).
Orbit Dash Flagged AI Creative with Drawn Button
TikTok Day 1 Creative 1.35% CTR · Flagged in US
59,265 impr → 801 clicks ($0.02 CPC). Paused in US because of the drawn [ PLAY NOW ] button at the bottom.
Orbit Dash Clean 9:16 TikTok Creative
TikTok Day 2 Clean Creative 3.30% CTR Today
Removed the fake button graphic. Passed review and more than doubled CTR to 3.30% (497 clicks on 15,042 impr today).

Test B: The TikTok "Play Now" Button Mistake That Doubled Our CTR

TikTok Ads turned out to be a completely different auction from Meta: CPMs averaged $0.29–$0.47 (roughly 10× cheaper than Meta), giving us 1,298 destination clicks for $34.99 ($0.027 CPC).

Late on Day 1, however, TikTok flagged our Orbit Dash ad for "Partial delivery" in the United States while keeping it live in Canada, the UK, and Australia. The rejection reason was specific: "Misleading or Non-functional Ad Design: Remove buttons that do not function." Because our first AI-generated image included a painted neon [ PLAY NOW ] button at the bottom of the artwork, TikTok's policy reviewer treated it as a non-functional UI element.

We generated a clean 9:16 replacement (2026-11-11-orbit-dash-tiktok-clean.jpg) with zero drawn buttons—just the cyan delta ship grazing a spiked mine with +50 · x4 GRAZE sparks and dark space at the bottom where TikTok's native overlay CTA sits. Not only did it pass review immediately, **removing the fake button lifted our TikTok CTR from 1.35% yesterday to 3.30% today** (497 clicks on 15,042 impressions).

4. How the Autonomous Agents Changed Both Games Overnight

Once we had hundreds of real mobile players flowing through the games, we wired node tools/growth-metrics.mjs into the nightly agent instructions (ITERATE.md). Before writing any code, each game's agent now reads its live statistical funnel—with 95% Wilson confidence intervals on CTR, Click → Run 1, and Run 1 → Run 2—and must target the largest statistically significant drop-off.

Both agents woke up on November 12, read the data from the first wave of paid players, and shipped targeted fixes without human intervention.

Fix #1: Orbit Dash v118 — Deleting the 7-Rule Title Screen

When the Orbit Dash agent ran at 06:56 UTC on November 12, it logged the following in games/orbit-dash/PASSES.md:

Orbit Dash Agent (v118 Pass Log): "Ad funnel (growth-metrics): 58,579 impressions, 803 clicks, CTR 1.37% [1.3–1.5], 187 finished a run (Click→Act 23.3% [20.5–26.3]), 52 played 2+ runs (27.8% [21.9–34.6]), spend $18.79. tiktok_ad_od1 is KEEP at $0.33 per 2+ run... The drop is before the first run, not after it: 77% of ad clickers leave on the title screen. That screen opened with seven rules, the daily modifier and a difficulty switch before Play. Shipped: the rules legend is gone. The one line 'One button: tap to swap rings.' stays, the attract demo still shows gems and debris on the rings, and the first run still teaches the swap until you do it."

Looking at the data, the agent was right: once a player tapped the canvas at least once, 89% of them completed Run 1. The problem was that cold TikTok clickers landing in a 390×844 mobile WebView were being greeted by a wall of seven SVG icons explaining gems, stars, slow-time clocks, graze bonuses, red debris, moons, and quick-switch undos before they had ever swapped a ring. Commit 9ba91002 ripped the entire <div class="legend"> block out of games/orbit-dash/index.html.

Fix #2: Firefly Lasso v93 — Why 13 out of 14 Mobile Players Scored Zero

The Firefly Lasso pass (`v93`, commit 55aff728) is an even better example of why watching real telemetry beats guessing.

The night before (`v92`), we had lowered Night 1's firefly quota from 60 to 30 and added an early 8-second Hornet Raid so newcomers would see the core danger mechanic on Night 1 instead of running out a quiet 60-second clock. When the Meta ads went live, almost everyone who clicked the 9:16 AI ad started Night 1 (`100% Click→Act` on 13 runs)—but only 1 out of 13 played a second run (7.7% retention).

When the Firefly Lasso agent inspected the telemetry blobs from those 14 phone players, it found a smoking gun:

Firefly Lasso Agent (v93 Pass Log): "14 external players, all of them today, all from the two Meta ads. 13 of those 14 finished on 0. Playing the stroke they were drawing, a finger that gets 85% of the way around a circle comes back 77 to 169 u from its own start, and the lift refused anything past 48, so the minute ran out on empty thread. The raid v92 added never starts until that first catch, so none of them met it. Senior mode: the close is the verb, and widening it for one catch is the change the sessions asked for."

On a desktop mouse, drawing a closed loop that comes within 48 canvas units of where you started is easy. On a phone screen with your thumb obscuring the trail, players naturally lift their finger when they are ~85% of the way around a swarm—leaving a gap of 77 to 169 units. The game's cinch() function was rejecting every single one of those loops as unclosed, flashing EMPTY, and awarding 0 points for 60 straight seconds.

In v93, the agent changed one line of game logic: until a player makes their first catch of the run, any loop whose ends come within 150 units (up from 48) snaps shut and catches the swarm. Once they see that first loop cinch and catch fireflies, the threshold returns to 48.

5. Where Engagement Stands Today—and What We Learned About WebViews

Between the cleaner ad creative and the two autonomous game passes, here is where the funnel sits across both games as of this afternoon:

🪐 Orbit Dash (TikTok + Meta) HEALTHY

Active Players (24h)248 human players
Runs Played (48h)278 runs (28.4 min)
Canvas Tap → Run 189% (223 / 251)
Played 2+ Runs59 players (25%)
Multi-Session Same Day11 players (up to 14 runs)
v118 Cohort So Far39 players · 47 runs

✨ Firefly Lasso (Meta A/B) BUILDING

Winning Ad CTR4.55% (p = 0.0288)
Ad Click → Night 191% (10 / 11 clicks)
Median Night 1 Time36s – 44s
Multi-Session Same Day5 players (up to 175s play)
v93 Fix Deployed150u first-catch cinch
Cost / 2+ Run Player$1.27

The In-App WebView Retention Trap (Why D1 Return is 0%)

Digging into return players revealed a critical distinction between same-day replay and next-day (D1) return:

The reason is mechanical: when someone taps an ad inside TikTok or Instagram, the game does not open in Safari or Chrome. It opens inside TikTok's or Instagram's ephemeral in-app WebView. There is no address bar, no bookmark button, and no persistent browser tab. The moment the player taps ✕ in the corner to go back to their video feed, the session is gone—and even if they later searched for the game in Safari, Safari does not share localStorage with TikTok's WebView.

6. Turning a Paid-Ad Laboratory Into an Income-Generating Studio

That brings us to the blunt unit economics: paying $0.03 per click ($0.47 per multi-run player) to send players into an unmonetized, ephemeral WebView is an awesome diagnostic sensor—for under $40, it woke up two dormant AI agents and pinpointed a 7-rule title screen bottleneck and a 48-unit mobile thumb-cinch bug within 24 hours.

But as a standalone loop, buying traffic for a free page with $0 LTV is a money sink. To make the studio cash-flow positive, we are shifting the architecture in two ways:

  1. Portal Distribution (CrazyGames & Poki) as the Revenue Engine: Today we built tools/build-portals.mjs, which automatically wraps every new nightly build of Orbit Dash (`v118`), Firefly Lasso (`v93`), and Rage Golf into ready-to-upload packages for CrazyGames and Poki with their v3/v2 ad SDKs baked in—complete with gameplayStart / gameplayStop hooks, WebAudio auto-muting during commercial breaks, and a Rewarded Video Ad button on the game-over screen ("📺 Watch Ad: Start Next Run w/ Shield"). Portals bring free organic desktop and mobile-browser traffic while paying a 50% revenue share on every video ad.
  2. WebView-to-Browser (?pid=) Handoff & Daily Streak Links: Once a player completes 2+ runs inside TikTok or Instagram's in-app WebView, the game-over screen now mounts a 1-tap 🔥 Save Link for Tomorrow bar that exports their personal ?pid=<id> URL via the native mobile share sheet (plus a direct link to #challenge-me on Discord). Opening that link in Safari or Chrome adopts their WebView player ID and preserves their streak across days.
  3. Organic "AI Self-Improvement Loop" Video Reels ($0 CAC): Instead of only running paid ads, we built tools/capture-loop-video.mjs to record 9:16 vertical gameplay reels that narrate the exact overnight telemetry diagnosis and code fix for TikTok, Instagram Reels, and Facebook Video:
Orbit Dash v118 — AI Loop Reel ?src=reel_od_v118
9:16 organic reel showing how the agent diagnosed the 77% title-screen bounce on 1,298 TikTok clicks and deleted the 7-rule legend overnight.
Firefly Lasso v93 — AI Loop Reel ?src=reel_lasso_v93
9:16 organic reel showing how the agent replayed 14 mobile thumb-stroke traces (77–169px endpoint gap) and widened the first-catch snap radius to 150px.

Tonight's automated pass will be our first full 24-hour read on how Orbit Dash v118 (no rules legend), Firefly Lasso v93 (150-unit first-loop snap), and these organic self-improvement reels move Click → Run 1, Run 1 → Run 2, and D1 Return. We'll post the before-and-after numbers here once the cohort closes.