Stuck at Home LLC logo
← All posts
5 min read

Hauling Android Up to the iOS Waterline, Four Apps Deep

luckycoinandroidnumbergenluckyfind
Projects
7
Commits
163
Lines
+69k / −13k
Files
591
Claude time
40h
79h of work
Tokens
22.7M

Claude time is wall-clock at the keyboard; the hours of work below it is total model effort, which runs higher when several Claude windows work in parallel.

Commits by day

MTWTFSS

Where the work went

  • Lucky RNG35%
  • LuckyCoin29%
  • LuckyFind24%
  • PoultryPal13%

If there's a single sentence for the week, it's this: most of our apps already look good on iOS, and this week was about making the other platforms stop being the embarrassing cousin. Android got the bulk of the attention — LuckyCoin, LuckyFind, the Random number generator, and PoultryPal all moved closer to their iOS twins — with a web companion and a multi-platform monetization experiment riding along.

LuckyCoin on Android grows up

This was the heavy lift. LuckyCoin-Android took an iOS feature-parity port and a hard slimming pass in the same stretch, and the net result is an app that's both more capable and smaller.

The slimming is the satisfying part. We pulled the AI coin-grading stack — it was disabled anyway — along with its dependencies, which alone cut about 15 MB. An unused 2 MB drawable went too, and we removed AdMob and banner ads entirely. For an app that had been accumulating weight for years, dropping dead code and a whole ad SDK is the kind of cleanup that makes the download lighter and the codebase honest. We even fixed marketing copy that overclaimed country coverage and listed an AI grading feature that wasn't actually there.

On the parity side, the app now does the things iOS users already expect: a historical melt-value curve ported straight from the iOS chart, collection value shown per row (and coin rows that show market value rather than face value), completion rings on category and subcategory rows, a quick-resume link back to your last-opened subcategory, and friend collections rendered as image grids instead of plain lists. The tabs got renamed to match iOS — Summary became Stats, Friends became Social — with all nine locales realigned to follow. Friend requests now remember they were sent and show a "Pending" chip, and subscription management surfaces where you'd look for it.

There were also several audit passes before the release build: caching coalesced, fan-out throttled, force-unwraps removed, a clutch of P0 bugs and lint errors fixed, sign-out hygiene tightened. We shipped it as versionName 2.0 — with the caveat that full iOS parity is officially deferred until coin grading lands, so we're not pretending it's all the way there. We also dropped a CLAUDE.md project guide so future sessions start with context instead of archaeology.

One number generator, every platform at once

The Random number generator family moved on three fronts simultaneously, which makes it the week's busiest little app by commit count.

On Apple platforms (NumberGen), the interesting work is a monetization A/B test: a Remote Config control versus a Remove-Ads paywall variant, set up as mutually-exclusive variants so we're not stacking monetization on top of monetization. We disabled interstitials and shipped the banner only, then moved the surviving interstitial to fire on app resume rather than every 25 generations, and wired up paywall funnel analytics (logging dismissals on close and "No thanks"). The paywall itself got reworded to "Remove all ads — for good" across all 32 locales, and along the way we fixed 202 translation errors — the kind of number that tells you the localization had quietly drifted. tvOS got a real pass too: a redesigned main UI, controls kept inside the title-safe area where TVs won't crop them, and a Tip Developer option that's the only monetization path on TV. watchOS got its range stepper hardened against invalid ranges, visionOS finally shows the app logo on its welcome screen, and fastlane now authenticates with an App Store Connect API key instead of a password and 2FA dance.

RandomAndroid spent the week catching up to all of that: a home-screen widget to match iOS, the Remove-Ads paywall and billing, the same Remote Config A/B variant, thousands-separator number formatting, a full-width adaptive banner instead of a fixed 320x50 box, and a welcome screen redesigned to mirror iOS down to the gradient colors pulled from exact iOS system values. It also got a toolchain bump to current — Kotlin 2.4, Gradle 8.14.3, Billing 9.0.0, target SDK 36 — and two production crashes in the parameters sheet fixed.

The third front is the web. RandomNum's site was redesigned to match the iOS app, given proper App Store and Google Play badges (with a corrected Play package id), a privacy policy, an OG/Twitter share image built from the app icon, and — the part that matters for reach — 33 localized pages with hreflang tags for multilingual SEO. So the same app now presents a consistent face on iOS, Android, and the open web, in a lot of languages.

LuckyFind's Android release run

LuckyFind's Android build got a single dense day of release prep that reads like a checklist someone actually finished. The dependency stack jumped forward hard — Kotlin to 2.4, AGP to 8.9.1, maps-compose from 2.11 all the way to 8.3.0, compile/target SDK to 36 — which dragged in the usual migration work: deprecated MarkerState replaced, lint errors from the newer AGP cleaned up, dark-mode maps and themed find markers.

Parity with iOS covered the details that matter to someone logging finds in the field: UTM coordinate display with a Settings toggle, depth units stored in the user's chosen unit without silent conversion, persisted typed categories, and photos saved to the gallery. On the account side, guests can now back up by linking an email and password, an anonymous account is pre-created on launch so "Get Started" is instant, and a returning-user sign-in that used to strand people on onboarding now actually lets them in. There's a security cluster too — fixed account deletion, hidden Remote Config key, stripped PII from logs — plus a debug-only demo-data injector and the removal of the advertising-ID permission for a clean Play declaration.

PoultryPal, briefly

PoultryPal got a smaller but pointed Android pass: the paywall rebuilt to match iOS (hero, benefits, ratings, comparison, FAQ, and the free trial surfaced on the CTA), the Flock Detail stats tab brought to parity with a chart and Top Layers, sample data made to match iOS exactly, R8 minification enabled, release signing wired up, and Play Store listing assets added. It's the same story as everything else this week, just on a shorter timeline.


Four apps, one direction. The iOS versions have been the reference build for a while; this week was mostly the unglamorous work of making Android — and in RandomNum's case, the web — read from the same page, while quietly shedding the dead weight a few of these apps had been carrying for years.