Before you dive in, it may be helpful to get familiar with the companion document Architecture: Feature Screen, which explains how the individual classes fit together. With that context in mind, this guide walks you through creating a new feature screen in the project. You can choose one of two paths:

  1. Using file templates — the recommended, fastest way
  2. Manual setup — when you need full control or when templates aren't available

Option 1: Using File Templates (recommended)

  1. Ensure the UI Feature template is installed
  2. Right-click the destination package → New → UI Feature
  3. Enter the feature name (e.g., Profile, Settings)
  4. Review generated files and fix missing imports
  5. Done 🎉—your feature is wired into the app

Option 2: Manual Setup

  1. Create *UiEvent
sealed interface ProfileUiEvent : UiEvent
  1. Create *UiState
@Immutable
data class ProfileUiState(
    override val eventSink: (ProfileUiEvent) -> Unit,
) : UiState<ProfileUiEvent>
  1. Create *ViewModel
@Inject
class ProfileViewModel : BaselineViewModel<ProfileUiEvent, ProfileUiState>() {

    @Composable
    override fun state() = ProfileUiState { /* handle events */ }
}
  1. Create *Screen
@Composable
fun ProfileScreen(onLogoutClicked: () -> Unit) { /* UI */ }