One Game, Two Platforms
The game went public in the browser to reach testers without an install. That raised questions about version numbers, analytics without cookies, a promo video rendered frame by frame – and a lesson about where browsers keep your save.

Getting testers to install an unreleased Android app is hard. Sending a link is easy. So Ski Resort Empire got a public browser version on its own subdomain, built from exactly the same code as the app.
What is different on the web
The web version has no Play Store and, at the time, no ads. Purchases show a note that packs are available in the Android app, and rewarded videos used a simple placeholder. Everything else is identical: same regions, same saves, same balancing.
Analytics was the tricky part. I wanted to see how web players progress, but without cookies or third-party scripts for people who did not agree. The solution: the Firebase analytics script is only downloaded after the player opts in. Before that, there is no Google script on the page at all. If the player later opts out, collection is disabled and the analytics cookies are deleted.
One version number
With two builds, version numbers start to drift. Now there is exactly one source: the version field in package.json. The web build shows it in the settings, analytics reports it, and the Android build derives both its human-readable version name and its numeric version code from it (major × 10000 + minor × 100 + patch). Releasing means bumping one number.
A promo video, frame by frame
For a short promo clip I wanted perfectly smooth footage of the game: a fresh resort that grows, lifts that run, money that rises. Screen recording a phone gives stutters and notifications. Instead, a script runs the browser version in an automated browser with a prepared save, controls the game clock, and takes one screenshot per frame. Thirty screenshots make one second of video, and ffmpeg assembles them into an MP4.
Because the clock is controlled, every frame is perfect and the video is reproducible. When a business icon changed later, the video could simply be rendered again. The same technique later produced versions with German, Italian and English captions.
Where did my save go?
A few days later I lost a week of progress in the browser. The cause is worth knowing for anyone making web games: browsers store localStorage per origin, which means per combination of protocol, domain and port. cpu82.com/test/ski-react, skiresort.cpu82.com and an itch.io page are three different origins with three separate saves. Opening the game under another address does not move your save; it starts a fresh one.
Nothing was deleted; I had simply played on a different origin. But it showed that a browser save is fragile: clearing site data, a different browser, or a new phone loses it. That was one of the main reasons for adding cloud saves a week later.
A number format players can read
From the same week: idle games quickly reach numbers that standard names cannot express. After thousand, million, billion and trillion come quadrillion and quintillion, abbreviated Qa and Qi, which nobody can tell apart. The game now switches to letters after T: aa, ab, ac … zz, the convention many idle games use. A setting offers two alternatives: scientific notation (1.03e15) and the classic short names. Each option shows a sample number, so the choice is obvious without knowing the terms.