- Organize into modules: `domain` (entities, use cases, repository interfaces), `data` (implementations), `presentation` (UI/API).
- Domain module has no Android, Spring, or framework dependencies — pure Kotlin only.
- Use Kotlin `interface` for ports in the domain layer — implement adapters with Spring beans or Ktor plugins in the infrastructure layer.
- Use Kotlin interfaces for repository ports. Implement with Room (Android) or Spring Data (backend).
- Use cases are single-responsibility classes with `operator fun invoke()` for clean call syntax.
- Use sealed classes for domain results: `sealed class Result<T> { data class Success, data class Error }`.
- Use Hilt or Koin for dependency injection to wire layers together.