# Tapir documentation > Tapir snapshots the Semantics tree of a running Flutter app and drives it by stable refs, from the CLI or an AI agent. ## Getting Started - [Getting Started](https://anilcancakir.com/tapir/docs/v0.0/getting-started/index.md): Everything you need to add tapir to your project, capture your first snapshot, and drive real user gestures from an AI agent or CLI session. - [Installation](https://anilcancakir.com/tapir/docs/v0.0/getting-started/installation.md): Add tapir to a Flutter app, wire TapirPlugin.install() behind a !kReleaseMode guard, and optionally register the MCP server for your AI client. - [Quickstart](https://anilcancakir.com/tapir/docs/v0.0/getting-started/quickstart.md): A three-step walkthrough from zero to driving the bundled example/ Flutter app with a snapshot, a tap and a screenshot through the tapir CLI. - [Driving real apps: gotchas for agents](https://anilcancakir.com/tapir/docs/v0.0/getting-started/driving-real-apps-gotchas.md): The recurring traps of a long real-app E2E session, each with the workaround tapir has built in. ## Commands - [Commands](https://anilcancakir.com/tapir/docs/v0.0/commands/index.md): Every tapir command, grouped by intent, with its boot mode and the VM Service extension behind it. - [tapir:install](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-install.md): One-shot bootstrap that patches a Flutter app's lib/main.dart for tapir and registers the plugin with dowel. - [tapir:run](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-run.md): Run several tapir verbs against the running app in one call. - [tapir:doctor](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-doctor.md): Verify the tapir runtime and the consumer-side wiring health in a single pure-CLI pass. - [tapir:snap](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-snap.md): Capture the Semantics tree of the running Flutter app as YAML, tagging every interactive node with a [ref=eN] token. - [tapir:find](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-find.md): Mint a re-resolvable q handle backed by one or more predicates (text, semanticsLabel, key). - [tapir:observe](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-observe.md): Return a structured candidate list of every interactive widget on screen. - [tapir:tap](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-tap.md): Synthesise a tap at the widget identified by a snapshot ref token. - [tapir:fill](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-fill.md): Focus, clear, type, and settle a text field in a single call. - [tapir:screenshot](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-screenshot.md): Capture a screenshot of the running Flutter app to a file. - [tapir:reset_overlays](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-reset-overlays.md): Return the app to a known clean screen by dismissing every modal, pressing Escape, and tapping a Cancel/Dismiss affordance as a fallback. - [tapir:perf_begin](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-perf-begin.md): Open a performance measurement session around an interaction you are about to drive. - [tapir:perf_end](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-perf-end.md): Close the measurement session opened by tapir:perf_begin and read a bounded report of frames, blocks, counters and insights. - [tapir:perf_run](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-perf-run.md): Run a perf scenario several times from a clean start and write one run file per scenario. - [tapir:perf_trace](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-perf-trace.md): Write the last closed perf session as a Chrome Trace JSON file and print only its path. - [tapir:perf_insight](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-perf-insight.md): Drill into one insight of the report tapir:perf_end last produced: its title, a summary in prose, the raw rows behind it, the estimated savings and the next… - [tapir:perf_compare](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-perf-compare.md): Judge one tapir:perf_run file against another: a verdict per metric and one overall, on counts per painted frame first and timing-mode milliseconds second. - [tapir:perf_campaign](https://anilcancakir.com/tapir/docs/v0.0/commands/tapir-perf-campaign.md): Run every scenario of a perf campaign on one platform, each from a cold start of the app, and summarise which passed. ## MCP - [Tapir MCP Overview](https://anilcancakir.com/tapir/docs/v0.0/mcp/overview.md): Tapir adds its MCP tools to the MCP server hosted by dowel, so an AI client sees one catalogue of dowel and tapir tools. - [Tapir MCP Setup](https://anilcancakir.com/tapir/docs/v0.0/mcp/setup.md): Setting up the tapir MCP tools means writing the .mcp.json entry of the dowel MCP server and registering TapirDowelProvider. - [Tapir MCP Tool Reference](https://anilcancakir.com/tapir/docs/v0.0/mcp/tool-reference.md): The input schema, return shape and an example payload for every tapir_* MCP tool that TapirDowelProvider contributes. ## Plugins - [Authoring a snapshot enricher](https://anilcancakir.com/tapir/docs/v0.0/plugins/enricher-authoring.md): TapirSnapshotEnricher is the extension point that lets a package or a host app append custom YAML lines under each ref of a tapir:snap output. - [Magic integration](https://anilcancakir.com/tapir/docs/v0.0/plugins/magic-integration.md): MagicTapirIntegration is the glue layer that registers Magic-aware snapshot enrichers with tapir. - [Wind integration](https://anilcancakir.com/tapir/docs/v0.0/plugins/wind-integration.md): Tapir reads the state of wind_kit widgets through a neutral diagnostics bridge, so a host only calls Wind.installDebugResolver(). ## Reference - [Actionability gate](https://anilcancakir.com/tapir/docs/v0.0/reference/actionability-gate.md): The actionability gate is the precondition check tapir runs before it dispatches a pointer or key event at a widget. - [Frame production](https://anilcancakir.com/tapir/docs/v0.0/reference/frame-production.md): Every tapir read and action depends on the app producing frames, and this page covers when that stops, what tapir does about it, and the fallback. - [Interactions and the perf trace](https://anilcancakir.com/tapir/docs/v0.0/reference/perf-trace.md): Inside a perf session every gesture tapir dispatches opens an interaction, and ext.tapir.perf_trace exports them with the session's frames as Chrome Trace… - [The semantics hold](https://anilcancakir.com/tapir/docs/v0.0/reference/semantics-hold.md): ext.tapir.semantics_hold releases tapir's semantics handle for one timed window, so tapir:perf_run --semantics-pass can measure the app without the semantics… ## Optional - [Tapir](https://anilcancakir.com/tapir): the package landing page - [Full documentation](https://anilcancakir.com/tapir/docs/v0.0/llms-full.txt): every page in one file