fdb 1.13.0 copy "fdb: ^1.13.0" to clipboard
fdb: ^1.13.0 copied to clipboard

Flutter Debug Bridge - CLI for AI agents to interact with running Flutter apps on device. Launch, reload, screenshot, inspect widget tree, filter logs.

1.13.0 #

Improvements #

  • fdb launch --timeout <seconds> sets how long launch waits for the app to start. The default is now 600 seconds (was 300), because first debug builds of large apps often take longer. fdb attach --timeout works the same way (default stays 300). Invalid values print ERROR: Invalid value for --timeout: <value>.
  • fdb launch and fdb attach clean up a dead previous session on their own. If the previous app is gone or its controller does not answer, they stop the leftover controller, flutter tool and log collector processes, remove the stale session files and print WARNING: Cleaned up a stale session .... You no longer need fdb kill or to delete .fdb/ first.
  • fdb describe marks disabled widgets: @N ElevatedButton(disabled) "Send" (JSON: enabled: false). Lines for enabled widgets are unchanged.
  • fdb describe refs are now stable IDs, modelled on agent-browser's element refs. @N names one widget instance: it keeps its ref across describes while it stays mounted (scrolling, rebuilds, state changes, a dialog on top), and refs are never reused while the app runs (hot restart starts again at @1). A widget that is removed or replaced gets a new ref, and its old one fails with ERROR: @N is stale: the widget was removed or rebuilt. Run fdb describe again. instead of reaching whatever widget now sits at that position. Describe lines stay in top-to-bottom order, so numbers are no longer 1..n. A list child that is not built yet keeps its ref when fdb scroll-to @N brings it into view; tapping it before that fails with ERROR: @N is not built on screen. .... The describe JSON lists refs of the previous describe that went stale in removedRefs.
  • fdb longpress, double-tap, scroll-to and input accept @N too (fdb input @3 "text"). A ref can't be combined with --key/--text/--type/coordinates.
  • New fdb tap @N --expect-text <text> and --expect-type <type>: fail without tapping if the widget behind the ref no longer shows that text or has that type (a "Follow" button that now reads "Unfollow"): ERROR: @4 is now TextButton "Delete", not "Save". Nothing was tapped. Run fdb describe again. --expect-text matches the widget's text or one of its ·-separated parts.
  • fdb tap @N appends the widget's text to the success line: TAPPED=ElevatedButton X=196.0 Y=410.0 TEXT="Save".
  • @N needs the updated fdb_helper. With an older one, commands with @N fail with ERROR: fdb_helper in the app is too old for @N refs. ... and tap nothing.
  • fdb describe warns on stderr when the running app's fdb_helper differs from the version the project resolves (.dart_tool/package_config.json): WARNING: The app runs fdb_helper X but the project resolves Y. Hot reload/restart does not reload it; stop and rebuild the app (fdb kill, then fdb launch). It also warns when the helper is older than the fdb CLI's major.minor: WARNING: fdb X with fdb_helper Y; update fdb_helper to ^X and rebuild. Stdout and exit codes are unchanged.
  • fdb doctor reports the same problems as a DOCTOR_CHECK=fdb_helper_version STATUS=warn RUNNING=... RESOLVED=... FDB=... HINT=... line after device. The line only appears when something is off, so a healthy run still prints 5 checks.
  • fdb launch and fdb attach store the project path in .fdb/project_path.txt. Older sessions fall back to the session directory's parent.
  • Needs the updated fdb_helper, which reports its version. Older helpers are flagged as "does not report its version (older than 1.13)".

Fixes #

  • Fixed fdb input --text/--key/--type on a widget that is not a text field (e.g. a standalone label Text) typing into the first field under the screen-level GestureDetector around it, which could be a different field. The text input is now resolved from the matched widget (itself, below it, or a custom editor above it); a field's own label or hint still resolves to that field. Otherwise the command fails, and a match holding several fields fails with the count. Needs the updated fdb_helper.
  • fdb no longer writes to ~/.pub-cache/bin. fdb 1.12.0 repointed its launchers there at the running SDK's snapshot whenever dart on PATH differed from the SDK that activated fdb, so switching between two SDKs (e.g. an FVM-pinned project and a global dart) rewrote them on every switch and the Can't load Kernel binary line kept coming back. fdb now only reads the fdb launcher and, on a mismatch, prints one line after the kernel error: WARNING: fdb was activated with Dart X but 'dart' on PATH is Y; ... Fix: run 'dart pub global activate fdb' with the Dart you use. The command then runs normally. FDB_NO_BINSTUB_REPAIR no longer does anything.
  • Fixed fdb tap, longpress and double-tap by --key/--text/--type reporting success on a disabled widget, for example a send button that the app enables only after fdb input updates its state. The tap did nothing. fdb now never dispatches a selector tap to a disabled widget: it retries until the app enables it, up to --timeout, then exits 1 with ERROR: <Type> is disabled. Disabled means a Material/Cupertino button without onPressed, a Switch/Checkbox/Slider without onChanged, a ListTile or text field with enabled: false, or a custom button whose own GestureDetector/InkWell has no callbacks. When fdb can't tell, the widget counts as enabled. Needs the updated fdb_helper.
  • Fixed fdb tap @N tapping the wrong widget or a point outside the screen. It used to describe the screen again and tap entry N's stored coordinates, with no check that the widget there was the one the agent saw or that it was on screen. After a scroll-to the refs had shifted and the tap hit a different button; an entry on an off-screen PageView page was "tapped" at X=-553. Now the ref names the widget itself (see stable refs above) and tap @N taps it through the same checks as --key/--text: a covered, scrolled-out or off-screen widget fails with exit 1 and nothing is tapped, and a disabled one waits up to --timeout like a selector tap. Needs the updated fdb_helper.
  • fdb launch, attach, logs and the app-died log tail no longer fail with a FileSystemException when logs.txt contains invalid UTF-8. Malformed bytes are replaced with U+FFFD. fdb logs --follow also decodes new output as UTF-8 instead of Latin-1.
  • fdb syslog no longer dies with FormatException: Invalid UTF-8 byte when device logs contain bytes that aren't valid UTF-8 (seen with raw 0xFF in Android logcat). Output from adb logcat, log and idevicesyslog, and from flutter run, flutter devices, crash-report, mem native and attach's VM service discovery, is now decoded as UTF-8 with malformed bytes replaced by U+FFFD.
  • The log collector no longer outlives fdb kill. It used to stay running after the app's VM service went away (for example after a relaunch) with its PID file already deleted, so nothing could find it. It now exits when the connection closes, only removes its PID file while that file still names it, and the controller stops it on shutdown.

1.12.0 #

Improvements #

  • fdb input works with any text input, not just TextField/EditableText. From the focused element (or the --text/--key/--type/--index match) fdb_helper checks the element, then its descendants (EditableText first, then any State implementing TextInputClient), then its ancestors. This covers flutter_quill (QuillEditor/QuillRawEditorState) and custom TextInputClient/DeltaTextInputClient editors. Text is applied through the client (updateEditingValue or updateEditingValueWithDeltas), so the widget's controller and listeners run; no keyboard needed. Content is replaced; rich-text editors keep their trailing document newline.
  • New fdb input --action <name> sends an IME action via TextInputClient.performAction, after the text or on its own (fdb input "QA test" --action send, fdb input --action done). Prints IME_ACTION=<action> TARGET=<widgetType>. The widget decides what the action does: EditableText calls onSubmitted/onEditingComplete; flutter_quill calls QuillEditorConfig.onPerformAction if the app set it. Older fdb_helper versions report that the action was not performed.
  • fdb input errors now name the widget and the reason, e.g. ElevatedButton is not a text input: no EditableText and no State implementing TextInputClient was found on it, below it, or above it.
  • fdb describe lists non-EditableText text inputs as interactive entries: @N QuillRawEditor(editable) "current text" (JSON: editable: true, inputClient: <StateType>).

Fixes #

  • Can't load Kernel binary: Invalid kernel binary format version when fdb was activated with a different Dart SDK than the dart on PATH (e.g. FVM). fdb now repoints its fdb and fdb-controller launchers in ~/.pub-cache/bin to the snapshot for the running SDK once and prints a WARNING:. Set FDB_NO_BINSTUB_REPAIR=1 to disable; fdb then prints the manual fix.
  • fdb describe and fdb screenshot warn on stderr when the app isn't in the foreground (WARNING: App is not in the foreground (lifecycle=paused). ..., or the inactive variant). Stdout and exit codes are unchanged. When iOS has suspended the backgrounded app and its VM service stops answering, describe now reports that instead of the misleading "fdb_helper not detected". Needs the updated fdb_helper (new ext.fdb.lifecycle extension, lifecycleState in describe JSON).
  • Fixed fdb tap --key on a custom button (a widget that builds its own GestureDetector, not a Material/Cupertino button) tapping the centre of an outer GestureDetector, such as a screen-level keyboard dismisser. It now taps the keyed widget and reports its type.
  • Fixed fdb input --key on a field scrolled out of view reporting INPUT=Column (or Semantics, Listener) and typing into the first field of that container. It now reports and types into the matched field. fdb tap on a partly visible widget taps the visible part; on a widget scrolled fully out of view it fails with an error asking to fdb scroll-to it first.
  • Fixed fdb tap, longpress, double-tap and swipe by --key/--text/--type tapping roughly the screen centre when the matched widget was covered (a dialog, bottom sheet, opaque overlay, or IgnorePointer/AbsorbPointer/Offstage). They used to fall back to a large hittable ancestor such as the Overlay, Scaffold or a screen-level GestureDetector. They now tap only a point inside the matched widget that reaches it (for a Text inside a button, the button), and otherwise keep retrying until --timeout (a dialog that is still closing), then exit 1 without tapping: ERROR: ElevatedButton is not hittable: it is covered by ModalBarrier at 200.0,410.0. Dismiss what covers it or use --index/another selector. Needs the updated fdb_helper.

1.11.2 #

Fixes #

  • Fixed flutter build apk --profile (and flutter run --profile) failing for Android apps that depend on fdb_helper with Unresolved reference 'FdbHelperNativeTapImpl'. Profile builds now compile the real native tap implementation, so fdb attach, tap, input, and describe work against Android profile builds (#163).

1.11.1 #

Fixes #

  • Fixed several core/commands verbs (crash-report, mem, mem native, screenshot, tap) and the controller's VmServiceCommand runner returning a delegated Future without await inside a try block, which let exceptions from the delegate escape the surrounding error handling instead of being translated into a sealed error result (or ControllerResponse.appDied for the controller runner).

1.11.0 #

Improvements #

  • fdb_helper now exports FdbServiceExtensionsMixin, allowing fdb's VM service extensions to compose with other custom Flutter bindings such as DevicePreviewBindingMixin. Existing FdbBinding.ensureInitialized() usage remains supported.

1.10.1 #

Fixes #

  • Windows: fdb no longer crashes on which (Windows has no which binary) — tool lookup now dispatches to where on Windows. Affects mem, doctor, syslog, crash-report, and attach's VM URI auto-discovery.
  • Windows: fdb launch and fdb attach no longer crash immediately — they no longer try to watch SIGTERM, which Dart cannot watch on Windows.
  • Windows: PID-liveness checks (previously kill -0) now use tasklist on Windows. Fixes fdb launch falsely reporting the app died seconds after starting, and fdb kill silently reporting success without actually killing the process.

1.10.0 #

New commands #

  • fdb swipe-path --points "x1,y1;x2,y2;..." dispatches an arbitrary multi-point path as a single continuous pointer stroke, for drawing canvases, signature pads, and handwriting/gesture recognizers that swipe's straight-line model can't express.

Improvements #

  • fdb swipe and fdb swipe-path now accept --precision to control the max pixel gap between synthesized move events (default 8.0, matching prior swipe behavior).

1.9.0 #

New commands #

  • fdb attach now auto-discovers the VM service URI from device logs on Android and iOS — no --debug-url needed. Android uses adb logcat; iOS Simulator uses xcrun simctl log; physical iOS uses idevicesyslog archive lookback. Falls back to mDNS when discovery returns null.
  • Adding fdb_helper to the app enables the [FDB_VM_URI] log marker, which fdb prefers over Flutter's own output for more reliable auto-discovery.

Improvements #

  • fdb skill now prints a compact core (~60 lines) instead of the full 800-line reference. Full docs are split into 6 topic sub-documents loaded on demand: fdb skill launch, fdb skill interact, fdb skill data, fdb skill diagnostics, fdb skill memory, fdb skill simulator. Each sub-doc includes a best-practices section.

Fixes #

  • Smoke tests replaced timing-based sleeps with deterministic app-state checks to fix intermittent failures on Android.

1.8.0 #

New commands #

  • fdb attach attaches fdb to an already-running debug/profile Flutter app, including apps started from Xcode or Android Studio. It supports --app-id for disambiguation and --debug-url for iOS/macOS/manual discovery fallbacks.
  • fdb heap dump --output captures DevTools-loadable heap snapshots.
  • fdb mem native runs platform-native memory tools for Android, iOS simulator, and macOS.

Improvements #

  • fdb longpress --at now uses native long-press injection on supported platforms.
  • The fdb skill and README now include a memory leak investigation workflow.

Fixes #

  • fdb launch --flavor now resolves flavor-specific Android application ids and iOS/macOS bundle ids for .fdb/app_id.txt.

1.7.3 #

Fixes #

  • fdb launch --dart-define and --dart-define-from-file now preserve comma-containing values instead of splitting them during passthrough to flutter run (contributed by Rustam Gilyaev)
  • fdb screenshot on macOS now uses the app PID from controller-backed launches, so screenshots work reliably after launch

1.7.2 #

Improvements #

  • fdb skill now tells users to add stable widget keys for better discoverability and more reliable describe, tap, input, and scroll-to automation

Fixes #

  • Added smoke coverage for the fdb describe regression where visible TextField content must appear in VISIBLE TEXT

1.7.1 #

Fixes #

  • fdb devices now honors project-local FVM Flutter SDKs instead of requiring a global flutter on PATH

1.7.0 #

New commands #

  • fdb launch -i / fdb launch --interactive — starts an interactive REPL after launch for reload, restart, describe, tap, logs, and kill workflows without leaving the shell (contributed by Brett Sutton)

Improvements #

  • fdb launch now starts a long-lived local controller process that owns the flutter run --machine session. Follow-up commands talk to the controller over a local socket instead of independently reconnecting to the VM service on every invocation. (contributed by Brett Sutton)
  • fdb grant-permission now accepts --device to pass a specific simulator UDID to xcrun simctl privacy, enabling pre-grant before the app is launched
  • fdb describe now includes visible TextField values in VISIBLE TEXT

Fixes #

  • fdb launch run twice in the same project no longer orphans the previous controller process
  • Ctrl-C during fdb launch now terminates the controller instead of leaving it detached
  • fdb kill always cleans up session files even when some processes fail to stop
  • Walk-up session resolution now correctly detects a live session when only controller.pid is alive
  • fdb input "" (clear a text field) no longer fails through the controller transport
  • Physical iOS no longer falsely reports APP_DIED when the controller is unavailable — device-side PIDs cannot be checked from the host

1.6.4 #

Fixes #

  • fdb_helper profile builds now compile the real native tap implementation again on iOS and macOS, so internal/dev distributions (Firebase App Distribution, TestFlight internal) remain profilable by fdb native-tap. Only release builds compile the safe stub. Android profile already kept the real implementation via Flutter's matchingFallbacks (debug → release).

1.6.3 #

Fixes #

  • fdb_helper release builds now compile a safe stub instead of the private-API native tap implementation, so iOS App Store binaries no longer ship the private UIKit/IOHID symbols. Debug builds keep the real implementation. Android release builds compile a stub variant via Gradle source sets and no longer depend on the debug-only Flutter embedding artifact. (Profile build behavior was incorrect in this release; see 1.6.4.)

1.6.2 #

Fixes #

  • fdb swipe now dispatches finer-grained synthetic pointer moves, so swiping a PageView whose pages contain scale-capable gesture handlers moves pages reliably instead of losing Flutter's gesture arena to the child scale recognizer.

1.6.1 #

Fixes #

  • fdb tap --text now resolves to the enclosing interactive widget instead of the matched Text leaf — agents that branched on TAPPED=<type> no longer get Text for buttons whose label they tapped (closes #119)
  • fdb tap --key no longer reports IgnorePointer for buttons wrapped in route-level IgnorePointer(ignoring: false) transitions; pass-through wrappers are now skipped during the ancestor walk (closes #118)

Improvements #

  • The closed-list of interactive widgets recognised by fdb tap and fdb describe now covers the full Cupertino family (CupertinoButton, CupertinoSwitch, CupertinoTextField, CupertinoSlider, CupertinoListTile, CupertinoExpansionTile, etc.) plus Material widgets that were previously missing (Chip family, MenuItemButton, SubmenuButton, SegmentedButton, ListTile, ExpansionTile, Tab, BackButton, CloseButton, RangeSlider, InkResponse, NavigationBar, BottomNavigationBar, NavigationRail, NavigationDestination, DropdownMenu, ToggleButtons)

1.6.0 #

New commands #

  • fdb simulator — full simulator control palette: appearance (light/dark), status bar overrides, location spoofing, push notification delivery, text size, and arbitrary defaults write key-value adjustments
  • fdb grant-permission — grant, revoke, or reset runtime permissions on Android and iOS without leaving the fdb workflow

Fixes #

  • fdb launch now correctly resolves the iOS/macOS bundle ID when Info.plist uses the $(PRODUCT_BUNDLE_IDENTIFIER) variable reference — previously fell through to the Android Gradle extractor and wrote the wrong bundle ID to .fdb/app_id.txt
  • fdb describe now surfaces buttons inside ListTile as separate interactive elements instead of merging them into the tile's tap target

1.5.1 #

Fixes #

  • fdb describe no longer leaks elements from underlying navigator routes — when navigating to a child screen, the handler previously walked route subtrees kept alive by the Navigator stack; the fix tracks the active ModalRoute boundary and prunes any subtree where isCurrent is false

1.5.0 #

New commands #

  • fdb gc — force a full garbage collection across all isolates; prints heap before/after delta

Improvements #

  • fdb launch now surfaces structured LAUNCH_ERROR=<CATEGORY> tokens when flutter process exits before the VM service appears, with LAUNCH_ERROR_CAUSE and HINT for known failure patterns (iOS bundle ID, code signing, Android ADB install, SDK toolchain, build errors)
  • skills/using-fdb/SKILL.md is now a lean install-once shim; fdb skill reads the full reference from the bundled lib/skill/SKILL.md

Fixes #

  • fdb tap on a widget that disappears during or after the tap now returns graceful success instead of an error

1.4.0 #

New commands #

  • fdb crash-report — fetches OS-level crash and OOM records from the system log (Android logcat, iOS Console, macOS unified log), filtered to the running app
  • fdb ext list — enumerates all registered VM service extensions across isolates
  • fdb ext call <method> — invokes any VM service extension and prints the JSON result
  • fdb mem — shows heap totals (usage, external, capacity) per isolate with human-readable formatting
  • fdb mem --json — same as above in machine-readable JSON
  • fdb mem profile — captures an allocation profile snapshot to a file
  • fdb mem diff — diffs two allocation profile snapshots and reports allocation changes

Improvements #

  • fdb launch smoke readiness detection now uses fdb wait instead of a manual poll loop, making it more reliable and readable

Fixes #

  • fdb describe now surfaces all GestureDetector and InkWell widgets at any nesting depth inside Stack/Positioned; previously the walk stopped at the first interactive ancestor, silently dropping inner buttons
  • iOS simulator smoke tests stabilised

1.3.0 #

New commands #

  • fdb syslog — streams native system logs (iOS Console / Android logcat) for the running app
  • fdb native-tap --at x,y — taps native OS UI (permission dialogs, system sheets) by injecting events at the OS level, bypassing Flutter entirely (adb shell input tap on Android, IndigoHID on iOS simulator)
  • fdb tap --at x,y — taps by absolute coordinates via in-process native injection through fdb_helper, reaching platform views overlaid on the Flutter surface (WebView, UIAlertController, AlertDialog) without requiring OS-level access

Improvements #

  • fdb describe now surfaces off-screen children of GridView and ListView that were previously hidden
  • App death is now detected and surfaces an APP_DIED error immediately instead of hanging
  • .fdb/ state directory is now auto-located by walking up the directory tree, so fdb commands work from any subdirectory of the project
  • fdb status returns RUNNING=true when a launch was interrupted but the app is still alive via VM URI fallback
  • fdb.app_pid is now stored separately from fdb.pid for accurate app liveness detection

Fixes #

  • Session directory walk-up no longer escapes to a parent .fdb/ that has no vm_uri.txt when the local PID is stale
  • fdb status VM URI fallback works correctly when launch is interrupted

1.2.1 #

Fixes #

  • fdb logs now keeps recent VM-service log lines readable through unexpected app crashes by running the log collector as a real entrypoint with serialized flushes

1.2.0 #

New commands #

  • fdb doctor - pre-flight health checks for the app process, VM service, fdb_helper, platform tools, and stored device state
  • fdb double-tap - double-tap widgets by selector or absolute coordinates
  • fdb scroll-to - scroll until a target widget becomes visible, including lazy lists
  • fdb wait - wait for widget and route presence or absence without shell polling loops

Improvements #

  • fdb tap and fdb longpress now support absolute coordinate targeting via --at x,y
  • Reload and restart completion now use VM lifecycle events for more reliable detection, including macOS reload handling
  • Test automation gained a stricter verify pipeline plus more robust deep-link and double-tap smoke coverage

Fixes #

  • Android test app now registers the fdbtest:// URL scheme so deep-link smoke tests exercise the real Android flow

1.1.7 #

New #

  • fdb screenshot now supports all platforms: macOS (screencapture), Linux X11 (xdotool+import), physical iOS / Windows / Linux Wayland (via fdb_helper VM extension), and web (Chrome DevTools Protocol)
  • fdb_helper: new ext.fdb.screenshot VM extension — renders the Flutter surface to PNG and returns base64; used as fallback on platforms with no native capture CLI
  • Screenshots are automatically downscaled so the longest side fits within 1200px (preserving aspect ratio), using the pure-Dart image package; pass --full to get native resolution

Fixes #

  • Screenshot: fdb launch now writes .fdb/platform.txt so screenshot dispatches to the correct backend without probing live tools at capture time
  • Screenshot: Android and iOS simulator now targeted by explicit device ID (no more booted heuristic that breaks with multiple simulators)
  • devices.dart: safe cast for emulator field (as bool? ?? false) to avoid crash on unexpected flutter devices output
  • extractDevicesJson deduplicated into process_utils.dart (was copied in both launch.dart and devices.dart)
  • Fix CI release: fdb_helper/CHANGELOG.md missing 1.1.6 entry caused GitHub release to not be created despite pub.dev publish succeeding

1.1.6 #

Fixes #

  • SKILL.md state files section corrected: paths are <project>/.fdb/ (not /tmp/) since 1.1.0
  • SKILL.md screenshot default path corrected to <project>/.fdb/screenshot.png
  • doc/README.agents.md screenshot default path corrected to <project>/.fdb/screenshot.png

Improvements #

  • README: updated Flutter MCP server description to accurately reflect its current capabilities (runtime introspection, not just static analysis)
  • README: comparison table "Device interaction" row now enumerates fdb's full interactive command set and correctly characterises the MCP server as read-only
  • README: fdb describe command annotated with (requires fdb_helper) in the commands table

1.1.5 #

Fixes #

  • Fix CI publish: fdb 1.1.4 was published but fdb_helper was not due to missing CHANGELOG entry

1.1.4 #

Improvements #

  • Renamed skill from interacting-with-flutter-apps to using-fdb for better discoverability on skills.sh

1.1.3 #

Improvements #

  • fdb_helper is now published to pub.dev — add it as fdb_helper: ^1.1.3 instead of a git path reference

1.1.2 #

New commands #

  • fdb shared-prefs get|get-all|set|remove|clear — read/write/clear SharedPreferences from the CLI via a VM service extension in fdb_helper

Fixes #

  • fdb deeplink now uses the session device ID to detect platform instead of probing all connected devices — fixes misrouting to Android when both Android and iOS are connected but the session is on iOS

Improvements #

  • Smoke test extended with test:clean and test:shared-prefs tasks covering all sub-commands

1.1.1 #

Improvements #

  • fdb_helper install instructions now reference pub.dev (fdb_helper: ^X.Y.Z) instead of a git path reference
  • Releasing skill updated to track all 9 version-bearing files

1.1.0 #

Fixes #

  • Fix developer.log() output not appearing in fdb logs — flutter run never forwards developer.log() to stdout; a background log collector now subscribes to the VM service Logging stream and appends events directly to the log file

Improvements #

  • Session state moved from /tmp/fdb_*.txt to <project>/.fdb/ — multiple projects can run simultaneously without interfering with each other
  • .fdb/ is automatically added to the project's .gitignore on first launch
  • FVM support: launch auto-detects .fvm/flutter_sdk/bin/flutter; override with --flutter-sdk <path>
  • --project flag on launch is now optional — defaults to CWD (agents running from the project directory need not pass it)
  • Log collector self-cleans on SIGTERM, SIGINT, and when flutter run exits

1.0.1 #

Fixes #

  • Fix dartdoc angle bracket warnings in describe.dart and vm_service.dart
  • Fix deeplink smoke test — register fdbtest:// URL scheme in test app Info.plist
  • Fix back smoke test — restart app to reset UI state before navigation test

Improvements #

  • Add example/example.md for pub.dev Example tab
  • Replace mermaid code block with pre-rendered SVG diagram (renders on pub.dev)
  • Add dart pub global activate fdb install option to README
  • Add release skill and CI publish workflow

1.0.0 #

New commands #

  • fdb back — navigate back via Navigator.maybePop(), handles dialogs and root detection
  • fdb longpress — long-press widgets, reuses tap infrastructure with configurable duration
  • fdb swipe — swipe gestures for PageView/Dismissible with widget targeting and smart defaults
  • fdb describe — compact screen snapshot with interactive element refs (@1, @2...) for agent navigation
  • fdb devices — list connected devices
  • fdb deeplink — open deep link URLs on device
  • fdb skill — print SKILL.md for AI agent consumption

Describe command #

  • Shows only hittable, topmost-layer widgets (filters obscured/background route elements)
  • Gesture info on GestureDetector/InkWell: (tap), (tap,horizontalDrag), (tap,longPress)
  • Extracts text from all children, tooltips, and icon semantic labels
  • Filters framework widgets and Unicode PUA icon codepoints
  • Ref-based tapping: fdb tap @3 taps the 3rd interactive element from last describe
  • Shows deepest route name and Scaffold title

Fixes #

  • Error propagation: specific error messages instead of "Server error"
  • --text tap: walks to hittable ancestor when Text widget itself isn't in hit-test path
  • --index ordering: user widgets before framework widgets (Overlay, IndexedStack, _Theater)
  • --key tap: ancestor walk for KeyMatcher/TypeMatcher, not just TextMatcher
  • --help / -h: prints to stdout with exit 0, no "ERROR:" prefix
  • Swipe velocity: process-relative Stopwatch timestamps for VelocityTracker fling detection
  • Screenshot: defaults to 1x logical resolution (~180KB vs ~1MB), --full for native
  • Screenshot: supports --output=path equals syntax, fixes Android shell escaping
  • Skill command: resolves SKILL.md via package URI for global installs

0.1.0 #

  • Initial release
  • CLI commands: launch, status, reload, restart, kill, logs, tree, screenshot, select, selected, tap, input, scroll
  • fdb_helper package for Flutter app integration
21
likes
160
points
512
downloads

Documentation

API reference

Publisher

verified publisherappflate.io

Weekly Downloads

Flutter Debug Bridge - CLI for AI agents to interact with running Flutter apps on device. Launch, reload, screenshot, inspect widget tree, filter logs.

Repository (GitHub)
View/report issues

License

MIT (license)

Dependencies

args, image, vm_service

More

Packages that depend on fdb