💡 Inspiration

Casual sorting and "jam" puzzles are incredibly satisfying, but the market is flooded with clones that suffer from intrusive 30-second video ads, arbitrary fail timers, and artificial paywalls.

We asked ourselves: What if every satisfying puzzle move directly contributed to rebuilding a ruined historical metropolis into an awe-inspiring solarpunk city? And what if monetization was built ethically — offering genuine value through an Architect Pro Pass subscription without ever breaking the core puzzle flow? That vision created City Builder: Sort & Build.


🏙️ What it does

  • Tactile Sort & Jam Mechanics: Manage 5 to 7 limited workbench slots. Match 3 identical architectural components (terracotta bricks, seasoned timber, brass bolts) to assemble orders before your queue jams.
  • Rewarding City Restoration: 6 distinct districts to rebuild across 100 hand-crafted levels, from historic municipal clock towers to futuristic hydroponic markets.
  • Fair & Offline-First: 100% playable offline with zero internet required. Every level is mathematically beatable through logic alone.
  • Architect Pro Pass: A premium subscription tier providing unlimited energy, ad-free play, and monthly booster drops.

🛠️ How we built it & RevenueCat Integration

City Builder is engineered with a cutting-edge cross-platform stack:

  • Shared Engine & UI: Kotlin Multiplatform (KMP 2.4) and Compose Multiplatform (CMP 1.12) delivering native 60 FPS performance on both Android and iOS from a single shared codebase.
  • Monetization & In-App Purchases: Powered by the official RevenueCat Purchases KMP SDK (purchases-kmp-core and purchases-kmp-ui).
  • RevenueCatUI Paywall: We implemented native Paywall() composables seamlessly within our Compose Multiplatform screens. Offerings, active subscriptions, customer entitlements (citybuilder_sort_and_build_pro), and transaction restores are managed in pure shared code via RevenueCatSubscriptionManager.
  • Architecture: Unidirectional MVI architecture, Koin 4.x for dependency injection, and Room Multiplatform for offline-first local progression.

🧗 Challenges we ran into

  1. Cross-Platform Purchase State: Coordinating StoreKit 2 on iOS and Google Play Billing on Android across shared Compose screens. The RevenueCat KMP SDK provided a unified reactive flow that drastically reduced platform-specific boilerplate.
  2. Deterministic Puzzle Rules vs. Rendering: Ensuring 100 levels remained mathematically fair and deterministic while keeping animations smooth and tactile. We separated game logic into pure shared Kotlin (:core:gamekit) independent of the presentation layer.

🏆 Accomplishments that we're proud of

  • Shipping a polished, 100-level casual puzzle game natively on both Android and iOS with 100% automated Maestro UI testing.
  • Effortlessly managing subscription lifecycle, receipt validation, and native paywall presentation with RevenueCat.
  • Creating a calming, non-violent, ASMR-inspired architectural aesthetic with zero intrusive advertising during puzzle gameplay.

📚 What we learned

Working with the RevenueCat KMP SDK demonstrated how fast indie developers can deploy production-grade subscription infrastructure without maintaining complex backend billing servers or wrestling with individual store receipt verification pipelines.


🚀 What's next for City Builder

  • New thematic restoration districts: Floating Sky Harbor and Sunken Aqueduct.
  • Community blueprint design challenges and seasonal passes via RevenueCat customer segmentation.

Built With

  • android
  • compose-multiplatform
  • in-app-purchases
  • ios
  • koin
  • kotlin-multiplatform
  • revenuecat
  • revenuecat-purchases
  • subscriptions
Share this project:

Updates

Submission history