Fake Whiteout Survival
The 'snowfield butcher shop' minigame that exists only in Whiteout Survival's misleading ads — actually built: hunt cattle, sell meat, hire automation, then survive a 30-wave zombie tower-defense finale.
The seven dimensions
memoryTechnical Depth 7/10
Solid Babylon.js performance work driven by measurement, not templates: the BackStack module draws 200 stacked meat slabs on the player's back via one thin-instance mesh with a hand-written Float32Array matrix buffer (zero-allocation hot path), while tree-field.ts documents reverting thin instances back to InstancedMesh because per-tree frustum culling won. Zombie pool built lazily, static meshes frozen, Draco 24→11 MB self-hosted. No LOD, no spatial partitioning — collisions are brute-force O(n·m).
stadia_controllerGame Design 7/10
A complete loop with a real mid-game pivot: economy phase → automation phase (dog / hunter / cashier) → 30-wave tower-defense endgame with bosses every 3 waves and a pure-slow tower. Git history shows genuine design iteration — house-HP was cut for a more readable breach mechanic (10 zombies inside = loss). Weak spots: the upgrade tree has exactly one entry, no mid-run save, and the run is short.
securityBackend & Security 6/10
Above-average defenses: parameterized SQL, IP-based D1 rate limits (4–8 s per action), profanity filtering, wave clamped to 30 with 'claimed clear below wave 30 recorded as not cleared', ADMIN_KEY in Pages Secrets. Then the hole: the frontend hardcodes debug password '19840501' and its comment admits it equals the admin key — anyone reading the bundle can wipe the board and open the cheat panel. Rate limiter has a SELECT-then-UPSERT race; the rate table is never cleaned.
codeCode Quality 6.5/10
Strict TS with zero any in the whole codebase, vue-tsc forced before build, parameters centralized in a 349-line commented config.ts. The counterweight: game.ts is 3,837 lines — one createGame() closure containing nearly all logic, with the 'stand-in-zone payment' block copy-pasted six times and the attack block twice.
experimentTesting 1.5/10
Zero automated tests, no test dependencies, no CI. The only gate is type-checking inside the build — though DEVLOG records a real 'typecheck before every build' discipline.
verifiedCompleteness 8/10
Near-full spec for a hobby game: live with global leaderboard, nested-reply message board, 7-day online chart, server-wide stats, 11 achievements (with a commit that verified all are triggerable), 5-track synthesized BGM, four docs (README / BACKEND / DEVLOG pitfall collection / README_AI), and graceful degradation everywhere — model-load fallbacks, offline localStorage mode, fire-and-forget community calls.
emoji_objectsOriginality 4.5/10
The premise is knowingly derivative — recreating a game that only exists in scam ads — and that meta joke is genuinely clever. Mechanically, though, it is an assembly of two very mature genres (arcade idle + TD); the breach rule, slow-tower and social layer are its own, but no new mechanic is invented.
trending_upHighlights
- BackStack thin-instance stack — 200 visual layers at zero FPS cost, with smooth growth animation and per-step sway (
back-stack.ts) - Documented negative knowledge — DEVLOG lists five failed fixes for iOS double-tap zoom before the working one, plus thin-instance-on-merged-mesh and TDZ pitfalls (
DEVLOG.md) - Textbook quota-incident response — reduce, slim, then a reversible
_routes.jsoncircuit breaker, all documented in commit messages - Zero-external-dependency resilience — self-hosted Draco, synthesized music, automatic localStorage fallback: fully playable offline
- Server-side plausibility validation — wave clamped to 30 and false clears demoted, stricter than most small games' accept-everything (
run.ts:14-24)
trending_downWeaknesses
- Admin key effectively leaked — frontend hardcodes
'19840501'with a comment admitting it equals the backend ADMIN_KEY (game-view.vue:270) - 3,837-line god function with six copy-pasted payment blocks and duplicated attack logic (
game.ts) - Zero tests, zero CI — not even the rate limiter or leaderboard clamps have unit tests
- Rate limiter race (non-atomic SELECT-then-UPSERT) and a
ratetable that is never cleaned (_lib.ts:46-62) - Leaderboard still scriptable — no client proof; one fake max-score entry per IP every 4 seconds
Incident report: the kill-switch day
2026-07-13: real traffic pushed the account's shared Cloudflare Functions free quota (100k/day) to the brink — old background tabs were still running a retired 60-second heartbeat poll that could not be remotely stopped.
Same-day, three moves: (1) 09:05 switch presence to check-in-once; (2) 14:17 slim the landing calls from 5 requests to 2; (3) 15:42 emergency stop — a _routes.json that routes /api/* to static, sacrificing community features while the game stays playable on localStorage. The commit message includes the rollback procedure.
Next morning, quota reset confirmed, the kill-switch was removed. A reversible circuit breaker with a documented timeline — operational maturity well beyond a month-old hobby project (even if the naive heartbeat was a self-planted landmine).
smart_toyAI-assisted development
Public and extreme: all 96 commits carry Claude Opus 4.8 co-authorship (92 tagged '1M context'); the author's brand is literally 'Book AI'; README_AI describes itself as written by the AI after reading the codebase. The cadence is the human-directs-AI loop at full speed — 63 commits in one day, including a 12-commit battle with iOS double-tap zoom where a human verified on-device while the AI iterated.
summarizeFacts
| Stack | Vue 3 · TypeScript · Babylon.js 9 · Tailwind 4 · Vite 6 · CF Pages Functions · D1 |
|---|---|
| Genre | Arcade idle × tower defense |
| Period | 2026-06-18 → 2026-07-14 |
| Active dev days | 4 days |
| Commits | 96 |
| Lines of code | ~7,000 |
| Author | craig7351 (Book AI) |
Verdict
The strongest 'ops story' in the series: measured rendering trade-offs, documented pitfalls, and a real quota-incident handled like a professional. The debt is the same as its siblings — a god file, zero tests — plus one self-inflicted key leak in the frontend bundle.