Open-source KMP client toolkit
frnk
A modular Kotlin Multiplatform toolkit for indie and small-team mobile apps.
Headless Compose UI, pluggable Supabase + Firebase backends, MVI presentation, SQLDelight persistence, and RevenueCat monetization — wired together via Koin so day-to-day work stays on features, not plumbing.
Why frnk
frnk gives indie / small-team apps a fast-compiling foundation with a clean architecture, aggressive modularization, and a standardized MVI presentation layer — so the day-to-day work stays on features and business logic.
What it ships
-
MVI presentation engine
MviContract, MviViewModel<S, A, E>, and ObserveAsEvents ship in shared-ui-atoms. New screens subclass MviViewModel and stay consistent across the toolkit.
-
Headless Compose UI
Built on compose-unstyled so consuming apps bring their own design system instead of fighting opinionated defaults.
-
Pluggable backends
Supabase and Firebase implementations sit behind capability interfaces. Pick one at runtime via BackendChoice without touching feature code.
-
Strict api / impl modules
*-api modules expose only interfaces and DTOs; *-impl modules carry the concrete bindings — wired via Koin and swappable per project.
-
One-shot Koin bootstrap
frnkModules(BackendChoice) and initializeFrnk() set up DI in one call so host apps stand up the toolkit in their Application class.
-
SQLDelight persistence
Multiplatform driver factory and Multiplatform Settings key/value store. The toolkit owns the driver; your host app owns the schema.
-
RevenueCat monetization
Entitlement and feature-gate interfaces with a RevenueCat implementation behind them — paywall logic stays out of feature modules.
-
Fast CI + pre-commit ktlint
A single CI job runs compileAndroidMain and testDebugUnitTest; ktlint formatting is enforced via an auto-installed git pre-commit hook.
Built with
- Kotlin
- Compose Multiplatform
- Coroutines
- MVI
- Koin
- Nav3
- SQLDelight
- Supabase
- Firebase
- RevenueCat
- Unstyled Compose
Project status
Early / pre-1.0. APIs may shift between minor versions — pre-1.0 policy is that 0.x.0 may break API while 0.x.y stays additive and fix-only.
View CHANGELOG on GitHub