💡 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-coreandpurchases-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 viaRevenueCatSubscriptionManager. - Architecture: Unidirectional MVI architecture, Koin 4.x for dependency injection, and Room Multiplatform for offline-first local progression.
🧗 Challenges we ran into
- 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.
- 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.
Log in or sign up for Devpost to join the conversation.