
Shared declarative UI and app scaffolding enabling common business logic, target-specific implementation folders, native entry-point integration and straightforward build/run workflows.
Bring Ctrl+Z to your app state.
ControlZ TimeTravel is a developer tool that records the history of your application state and lets you travel back and forth in time, jump to any saved state, and even inject new states from JSON.
Perfect for debugging, reproducing bugs, and exploring how your app behaves in different scenarios.
Navigate freely through your application's state history — step backward, forward, or jump to any moment in time.
https://github.com/user-attachments/assets/9c845ebb-2239-421e-b1b8-711a279702c7
Load and inject a custom state from JSON to instantly reproduce edge cases and complex scenarios.
https://github.com/user-attachments/assets/f5a21733-7f91-49e2-84e2-a55dac51cfcd
TimeTravelPanelDrawer(enabled = true) {
//Your app content
}In your ViewModel (or any presentation layer), register your StateFlow in TimeTravelRegistry.
TimeTravelRegistry.register(
scope = viewModelScope,
stateFlow = state,
enabled = true, // usually BuildConfig.DEBUG
onChanged = { travelState ->
updateState { travelState }
}
)Add the dependency to your build.gradle:
dependencies {
implementation("io.github.doseeare.controlz:timetravel:0.1.0")
}Bring Ctrl+Z to your app state.
ControlZ TimeTravel is a developer tool that records the history of your application state and lets you travel back and forth in time, jump to any saved state, and even inject new states from JSON.
Perfect for debugging, reproducing bugs, and exploring how your app behaves in different scenarios.
Navigate freely through your application's state history — step backward, forward, or jump to any moment in time.
https://github.com/user-attachments/assets/9c845ebb-2239-421e-b1b8-711a279702c7
Load and inject a custom state from JSON to instantly reproduce edge cases and complex scenarios.
https://github.com/user-attachments/assets/f5a21733-7f91-49e2-84e2-a55dac51cfcd
TimeTravelPanelDrawer(enabled = true) {
//Your app content
}In your ViewModel (or any presentation layer), register your StateFlow in TimeTravelRegistry.
TimeTravelRegistry.register(
scope = viewModelScope,
stateFlow = state,
enabled = true, // usually BuildConfig.DEBUG
onChanged = { travelState ->
updateState { travelState }
}
)Add the dependency to your build.gradle:
dependencies {
implementation("io.github.doseeare.controlz:timetravel:0.1.0")
}