๐งต The tech stack behind Caresse โ and why we made these calls
Frontend: Kotlin Multiplatform + Compose Multiplatform, shared UI across iOS/Android.
Kotlin was hard to love at first โ the module/folder hierarchy fights you early on. But once it clicks, KMP is a banger on almost every level: the IDE, the language itself, and the ability to drop down to native when you actually need to.We went full Compose Multiplatform for the UI... except one screen: the audio player.
Native audio APIs on iOS/Android are just too different (and too finicky) to abstract cleanly, so that one component is native on each platform. Everything else โ one codebase.Backend: .NET 10, hosted on Azure Container Apps.
Why .NET over Java or Go? Best perf/productivity tradeoff out there right now. C# is more expressive than Go, and the ecosystem is lighter than Java's (minimal APIs, EF Core, native DI = way less boilerplate). vs Go specifically: we keep strong typing and better abstractions as the codebase grows, without giving up performance โ .NET 10 is now neck and neck with Go in benchmarks.Why Azure specifically: it's the only cloud that gives you a free Postgres DB with basically no limits to get started. For a bootstrapped build, that's a big deal โ real Postgres, zero cost, day one.
Dev setup: Rider on Apple Silicon. Excellent tooling, natively optimized for ARM, no Rosetta tax.
TL;DR: shared UI via KMP + Compose (native only where it truly matters), a .NET 10 backend that punches above its weight, and Azure Container Apps + free Postgres to keep costs at zero while we validate.
Building in public โ questions/roasts welcome ๐

Replies