Sky Critter is now on Android

Sky Critter started on iPhone. As of this morning it's on Android too, live on Google Play.

Android was always the plan. The blocker was more mundane than technical: I needed a real Android phone to test on, and I didn't want to buy one in Europe. So the port waited until I was back in the United States and could pick up an affordable used phone as a test device. Users had been asking, and I also wanted to know whether my way of working could handle a second platform.

Ziggy the raccoon handling a clear 75-degree afternoon in Santa Barbara, on Android, in my hand.
Ziggy the raccoon handling a clear 75-degree afternoon in Santa Barbara, on Android, in my hand.

It's the same app on both platforms: a pixel critter lives in your sky and reacts to the real weather outside your window. Soggy in rain, giddy in snow, sun-baked in heatwaves, scared of thunder, and a werewolf on real full moons. Underneath the cuteness is a genuine forecast: hourly temperatures, wind, humidity, pressure, sunrise and sunset, moon phases, and a yesterday-versus-today comparison. The whole critter roster made the trip, too. Tabby ships free; the rest of the crew (the cats, the dogs, the raccoons, one extremely calm capybara) are one-time cosmetic purchases, and weather features are never paywalled on either platform. You can meet everyone in the critter gallery.

How a one-person studio ships a second platform

The Android app isn't a rewrite, and it isn't Flutter or React Native. It's the same Swift codebase as the iPhone app, running on Android via Skip, an open-source toolchain that compiles Swift natively for Android and maps SwiftUI to Jetpack Compose. The app's brain — the weather logic, the 18-state critter mood engine, the bilingual voice lines, every pixel sprite — lives in one shared Swift package that both platforms consume, with a single test suite that runs on macOS, Linux, and Android to prove the two apps behave identically.

I didn't guess that this would work. The port started as a one-week feasibility spike with explicit go/no-go criteria. The spike found exactly one hard problem: high-frequency ambient animation (the twinkling stars, the drifting rain and snow) was about 30x too slow through the cross-platform bridge. So that one layer is hand-written Kotlin/Compose on Android, driving the same art. The sky renderer and the billing layer are per-platform by design; everything else is shared. The weather data comes from Apple's WeatherKit on both platforms, so the Android app reads the same forecast as the iPhone app, with a small cloud service handling the authentication Android can't do natively.

All in, the port took about ten weeks of part-time work, July to October, and I'm not maintaining two codebases at the end of it.

The text that made it worth it

I made a friend in Barcelona who has an Android phone, and it's been a real bummer that she hasn't been able to enjoy anything I've been building. This morning, after the release went live, I sent her the link. She sent back "you're the boss" with the little flex-arm emoji.

That's the thing, really. Regardless of what platform my friends are on, they can now enjoy what I've built.

Sky Critter runs on Android 10 and newer, and on iPhone with iOS 17 and newer. Get it on Google Play, on the App Store, or poke the sky first at skycritter.app.