OSS TanbouSign in with GitHub

separate Presenter, Ui, and Screen on a Compose foundation for Kotlin application state and navigation

About these scores

OSS scale score is an unbounded metric that log-compresses and weights Stars, Watchers, Forks, and Contributors. Discovery score is the current OSS scale score minus the score at discovery. Update pace is commits in the last 30 days, growth momentum is the OSS scale score difference within the recent observation window, and OSS health is a 0–100 rating based on available recency, Community Health, and release data.

Stars
1,857
Primary language
Kotlin
License
Apache-2.0
Repository last updated
Oct 5, 2026
On this page

Overview

Circuit is a Compose-driven application framework for Kotlin and Android. Screens are keyed by Screen objects, while Presenter and Ui communicate through state and events in a unidirectional data flow.

Features and best fit

Based on official documentation; not hands-on tested · Content checked:

Key features

Connect Presenter and Ui only through state and events

Presenter and Ui do not directly reference one another. They communicate through CircuitUiState and events while presenters can use Compose runtime APIs to produce state.

Sources: [2]

Provide shared configuration, content, navigation, and retained state

Circuit.Builder configures factories and shared behavior, while CircuitCompositionLocals and CircuitContent run screens. Navigation, backstack, testing, retained state, and serialization are available as granular artifacts.

Sources: [3]

Best fit

Fits Compose-first applications that want one architecture for screens and state

Android and Kotlin applications can standardize screen boundaries, presenter logic, navigation, and state handling around the same Screen/Presenter/Ui conventions.

Sources: [3][2]

Before adoption

Check the Kotlin, Compose, and AGP toolchain required by 0.39.0

Circuit 0.39.0 updates to Kotlin 2.4.20, Compose Multiplatform 1.12.0, AndroidX Compose 1.12.1, and AGP 9.4.0, so existing build tooling should be checked before adoption.

Sources: [4]

Official sources

  1. [1]slackhq/circuit — GitHub repository(2026-10-06)
  2. [2]Circuit 0.39.0 — Overview(2026-10-06)
  3. [3]Circuit 0.39.0 — Setup(2026-10-06)
  4. [4]Circuit 0.39.0 release(2026-10-06)
  5. [5]Circuit Apache-2.0 license(2026-10-06)
Supplemental curator note

Circuit uses Compose runtime concepts in presenters as well as UI. Decide how much existing dependency injection, navigation, and state management should move into Circuit, then evaluate it screen by screen.

Try it in 3 steps

  1. 1

    Add Circuit Foundation 0.39.0

    Add the foundation artifact that bundles the core Presenter, Ui, Screen, and navigation APIs.

    implementation("com.slack.circuit:circuit-foundation:0.39.0")
  2. 2

    Register Ui and Presenter factories

    Follow the setup guide and register factories that know how to handle the target Screen.

    val circuit = Circuit.Builder() .addUiFactory(AddFavoritesUiFactory()) .addPresenterFactory(AddFavoritesPresenterFactory()) .build()
  3. 3

    Run the Screen from the Compose hierarchy

    Provide the Circuit configuration and confirm the matching Presenter and Ui are connected for the Screen.

    CircuitCompositionLocals(circuit) { CircuitContent(AddFavoritesScreen()) }
Check the official README

Growth

Growth trends · Last 30 days

1,857 Stars

Trend data is still being collected.

Development activity

Last 90 days · weekly

Commits (last 30 days)
40
Open PRs
7

Development activity is still being collected.

Built with

Categories and tags

GitHub data

GitHub dataView detailed GitHub data

GitHub Topics

  • architecture
  • compose
  • kotlin
  • android
  • mvi
  • udf
Stars
1,857
Forks
122
Watchers
20
Open issues
5
Contributors
46
Owner type
Organization
Primary language
Kotlin
License
Apache-2.0
Repository last updated
Oct 5, 2026
Write a related article

Share a guide or use case for this OSS in Markdown. Articles are published after administrator approval.

Report incorrect information

Tell us if any listing information is incorrect or outdated.

After reading this page, do you know what to do next?