Kotlin 2.0 — 2.3 · Android + iOS

Catch runaway recompositions
before they ship

Budget-based recomposition monitoring for Jetpack Compose. A Screen at 3/s. An Animation at 120/s. Zero config. Debug builds only.

build.gradle.kts
plugins {
    id("io.github.aldefy.rebound") version "0.2.1"
}
Maven Central License v0.2.1

See it in action

Five-tab IDE cockpit

Live monitoring, hot spots, timeline heatmap, stability analysis, and session history — all inside Android Studio.

Monitor

Live recomposition tree with per-node detail panel showing rate, budget, skip%, and peak values. Sparkline chart visualizes trends over time. Color-coded violation indicators and a real-time event log keep you informed as you interact with the app.

Rebound Monitor tab

Your Compose app recomposes 18x/sec
and you don't know it

Without per-composable budgets, you can't tell healthy animation-driven recomposition from pathological state thrashing. Here's what Rebound found in a real production app:

Composable Rate Budget Skip% Status
ShimmerBox 18/s 5/s 0% OVER
MenuItem 13/s 30/s 0% NEAR
DestinationItem 9/s 5/s 0% OVER
TravelGuideCard 8/s 5/s 0% OVER
AppScaffold 2/s 3/s 68% OK

Three layers of defense

Rebound instruments at compile time, monitors at runtime, and reports in your IDE. All automatic.

Compiler Plugin

Instruments every @Composable at the IR level. Infers budget class from call-site heuristics. Zero annotation required. Debug builds only.

Budget Engine

Six budget classes: Screen (3/s), Container (10/s), Interactive (30/s), List Item (60/s), Animated (120/s), Leaf (5/s). Dynamic scaling during scroll, animation, and input.

IDE Cockpit

Five-tab Android Studio tool window: live monitor with sparklines, hot spot ranking, timeline heatmap, parameter stability matrix, and session history with VCS correlation.

Install the IDE plugin → · JetBrains Marketplace listing planned

Every composable gets a budget

Flat thresholds are wrong for most of your composables. Rebound assigns budgets by role.

3/s
Screen
Full pages
10/s
Container
Row, Column, Box
30/s
Interactive
Buttons, fields
60/s
List Item
LazyColumn items
120/s
Animated
animate* APIs
5/s
Leaf
Text, Icon, Image

Android and iOS

Full KMP support. The compiler plugin instruments all targets. Transport adapts per platform.

📱

Android

ADB socket forward
Device + Emulator

🖥

iOS Simulator

Direct TCP on :18462
Zero setup

📡

iOS Device

WebSocket relay
Bonjour auto-discovery

JVM / Desktop

In-memory metrics
Transport planned

Get started in 60 seconds

1

Apply the Gradle plugin

plugins {
    id("io.github.aldefy.rebound") version "0.2.1"
}
2

Run your debug build

Rebound instruments every @Composable automatically. No annotations needed.

3

See violations

$ ./rebound-cli.sh summary
{"composables":[
  {"name":"ShimmerBox","rate":18,"budget":5,"class":"LEAF","over":true},
  {"name":"MenuItem","rate":13,"budget":30,"class":"INTERACTIVE","over":false}
],"violations":4,"total":127}

iOS Physical Device?

Build and start the relay on your Mac. The device discovers it via Bonjour automatically.

./tools/build-relay.sh && ./tools/rebound-relay

Try it on a real app

The sample/ module in this repo is a quick-start Compose app with Rebound pre-configured. For a more interesting stress test, try StickerExplode — a particle-effect demo with heavy animation that exercises every budget class.