How we use Kotlin
Every new Android screen we write uses Jetpack Compose, with state flowing through coroutines and Flow rather than callbacks. Data lives in Room, so planners and games keep working on a train with no signal, and background jobs such as reminders run through WorkManager so they survive restarts and battery optimisation.
When one product ships as more than one app, as our DayPlanner and Day Planner Pro do, the shared rules sit in plain Kotlin modules. Each edition then adds only its own screens and features, and a fix made once reaches both apps in the same release.
What we build with it
- Native Android apps with Jetpack Compose interfaces
- Offline-first data layers with local databases and sync
- Reminders, notifications and scheduled background work
- Shared business logic for several editions of one app
Toolkit
- Jetpack Compose
- Coroutines and Flow
- Room
- WorkManager
- Hilt
- Kotlin Multiplatform
How we keep Kotlin code healthy
- ktlint and detekt run on every pull request
- Unit tests with JUnit, flows tested with Turbine
- Compose UI tests for the main user journeys
- Code split into modules by feature, not by layer
Questions about Kotlin
Do you write new Android code in Kotlin or Java?
New code is written in Kotlin. Existing Java stays where it works, and we move it to Kotlin file by file when a feature around it changes.
Can Kotlin code be shared with an iOS app?
Yes, through Kotlin Multiplatform. We share data and domain logic, while each platform keeps its own native interface.