Three modes, one app.
pick up wherever you areImport & analyze
Load heap-snapshot dumps or Perfetto .pftrace captures from disk. No running app, no device attached.
- Class histograms, retaining paths
- Compare any two dumps
- Trends across a soak test
Attach & go live
Point at the ws:// URI flutter run prints. Offline analysis keeps working — connecting only adds capability.
- Live heap capture + Force GC
- Live Performance & Stability tabs
- Honest "not detected" when unsupported
Below the Dart heap
Capture native-heap allocations from a device via adb + heapprofd + Perfetto, then work with it entirely on desktop.
- Per-module still-live analysis
- Checkpoint compare/diff
- Native symbolization
Offline · no connection needed
Dump-first. Everything works without a running app.
Drop in a .dartheap snapshot or a Perfetto .pftrace capture and the full memory-analysis workflow is available immediately — the same analysis the DevTools companion offers, built for keeping many captures side by side across a long soak test.
Every imported dump in one place — file or capture, size, class count, retained bytes. Pick up exactly where you left off.
Per-class instance counts and shallow bytes for a single dump, sortable and searchable, tagged by dominant root kind.
Grouped by dominant root kind, with the full gc-root → field → … → object hop list on drill-down.
Pick two dumps and rank per-class growth by instances and bytes — the same diff the DevTools companion does, on desktop.
Plot one class's instance or byte count across every dump in the workspace — the tool for a class that never returns to baseline.
Connected · optional
Attach to a running app. More appears — nothing switches off.
Point Radar Desktop at the ws:// URI flutter run prints and it attaches to that app's Dart VM Service. Offline analysis keeps working exactly as before; connecting only adds capability.
Capture a snapshot straight from the attached app into the workspace — identical downstream analysis to an imported dump. Force GC first.
Traces (count, avg, p95/p99, total, rate) and frame/jank timing — the same tables the DevTools companion and on-device inspector show.
Uncaught errors with repeat counts, and main-thread stalls correlated to the trace that blocked the isolate.
Honest when it can't see something.
Live Performance and Stability need the target app to embed the Radar runtime. Attach to a plain Flutter app instead, and those tabs report a clear "not detected" state — never a fabricated reading.
Android native profiling
The memory below the Dart heap.
Capture native-heap allocations from a device via adb + heapprofd + Perfetto, then work with the trace entirely on desktop — per-module still-live analysis, checkpoint compare/diff, and an FFI-allocations lane for blocks tied to a real Dart file:line.
- Ranked by module — app, plugin, engine, GPU driver
- Checkpoint compare: added / grew / shrank / gone
- FFI-allocations lane, grouped by Dart call site, once a log is imported
- Native symbolization via build-id-matched
.sofiles - Guided on-device capture over
adb(profile/release builds)
Get it running
One Flutter app, no separate install.
Radar Desktop lives in this repo as a Flutter desktop app, built on the shared radar_workbench analysis engine and the radar_ui design system — the same two foundations behind the DevTools companion.
flutter run -d macos
flutter build macos
An app, not a pub.dev package.
Radar Desktop ships as a Flutter desktop app (publish_to: none), not a dependency you add to a project. Android profiling and native symbolization shell out to a few external tools; each is auto-detected, and without one, the feature it powers reports a clear "not available" state instead of guessing.