The problem
The worst bugs don't crash on commit. They accumulate.
A controller that's never disposed. A frame that quietly blows the 16ms budget. An error swallowed three layers down. None of them break the build — they erode the app over a long session until a user feels it, and the trace points at nothing.
DevTools can find all of it, if you know to go looking. Flutter Radar watches continuously and brings what it finds to the surface — on the device, as you build.
Three pillars, one toolkit.
drop in once — get all threeCatch leaks twice
A static lint stops leak-prone code before it ships; a runtime detector finds what slips through by inspecting the live heap.
- Per-class growth, retaining paths
- 7 lint rules with auto-fixes
- Heap snapshot & diff
Find the slow path
Timed traces, frame/jank timing, rebuild counts, and startup — surfaced as a dense, sortable analytics table.
- Traces: p50/p95/p99, total, rate
- Duplicate / hot-call detection
- Frames, rebuilds, startup
See it before users do
Uncaught errors and main-thread stalls, captured with repeat counts and stacks — the freezes a crash report never names.
- Uncaught errors + repeat counts
- Stack traces on drill-down
- Main-thread stall watchdog
How it works
One init call. No base classes.
Add it
Two dev-dependencies and one FlutterRadar.init(). Nothing to extend, no mixins on your types.
Run it
Use the app in debug or profile. Radar watches the heap, the frames, the traces, and the error zone continuously.
Read the signal
The badge shows worst severity across all three. Tap for the inspector, or open the DevTools companion to go deep.
Beyond the app
One suite, now with a desktop home.
Radar Desktop is a standalone macOS-first analyzer for everything the suite captures — heap dumps, Perfetto traces, and a live VM-Service connection — plus an Android native-profiling workflow for the memory that lives below the Dart heap.
- Offline: import & analyze, no running app required
- Connected: live Performance + Stability over
ws:// - Android native: heapprofd capture, checkpoint diff, symbolization
Safe by construction
Radar never throws into your app and never measurably slows it. It runs only in debug and profile, and is fully tree-shaken out of release builds — there is nothing of it left to ship.
Install
Three edits, all three pillars.
Memory, Performance, and Stability all come from one project. Add the deps, enable the lint plugin, call init.
dev_dependencies:
radarscope: ^0.1.0
custom_lint: ^0.6.0
analyzer:
plugins:
- custom_lint
FlutterRadar.init(overlay: true);
runApp(const MyApp());