Keyframer Inspector

dev.keyframer由 keyframer.dev 發布v0.4.0更新於 Oct 30, 2026

Give your agent eyes for motion: record, slow down and test animations in mobile apps

發布方自己的服務:Keyframer

概覽

AI 產生的概覽

錄製、逐格回放並診斷執行中應用程式的 React Native Reanimated 動畫,向助理提供掉格、時間軸與修正迴圈。

可以做什麼
  • 檢視已連線的應用程式:狀態、已註冊情境、工作階段與共享值
  • 錄製工作階段、開始與停止錄製、執行已註冊情境、回放並比較兩次工作階段
  • 以時間軸讀取工作階段、跳到某個時刻、播放、擷取畫面與截圖、匯出 GIF 或 MP4
  • 在裝置上控制動畫時間:減速、暫停、逐格前進
  • 用 check 與 recheck 執行修正迴圈,並靜態檢查原始碼中的 worklet 與動態效果錯誤
  • 列出、開啟與儲存錄製,並讀取 Motion Vitals 的線上問題與版本比較
適用情境
適合除錯已接入 Keyframer SDK 的 React Native 應用程式中的卡頓、掉格或動畫異常,尤其是希望由助理量測、改程式碼並驗證修正的情況;也適合檢視 Motion Vitals 的線上動態效果問題。
執行需求
以本機 npm 套件透過 stdio 執行;應用程式需在開發環境接入 Keyframer inspector SDK 與 Babel 外掛,並連線到 macOS 上的 Keyframer Inspector 桌面應用程式。螢幕擷取與 MP4 匯出需要應用程式支援,MP4 另需 PATH 中有 ffmpeg。選用的 KEYFRAMER_VITALS_READ_KEY 用於啟用線上問題相關工具。
安裝前請注意
選用的 KEYFRAMER_VITALS_READ_KEY 是 Motion Vitals 的工作區讀取金鑰,應妥善保管。這些工具會驅動應用程式並改變其狀態:錄製、跳轉、播放、重播與時間控制都會改變畫面顯示,錄製檔會寫入專案的 .keyframer/recordings 資料夾。除非建立分享連結,資料保留在本機。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Keyframer Inspector,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Keyframer Inspector

A motion debugger for apps. Every animation, with the line of code that started it, what it cost, and why frames dropped, recorded on the device and scrubbed like a video. Tune a duration or a spring and write the numbers back to your source. Hand the recording to a coding agent over MCP, or gate pull requests on it in CI.

https://github.com/user-attachments/assets/81d909d3-64fb-431b-a06f-1d20da5d5952

This repository holds the SDKs that go into your app, for every platform, under MIT.

PlatformFolderInstall
React Native (Reanimated)react-native/npm i -D @keyframerdev/inspector
iOS (UIKit)ios/Swift Package Manager: https://github.com/keyframer-dev/inspector
Android (Views)android/debugImplementation("dev.keyframer:keyframer-inspector:<version>")
Flutterflutter/flutter pub add keyframer_inspector

The apps connect to Keyframer Inspector, the desktop app (below). React Native apps can also use the panel inside Expo's dev tools, no desktop app needed.

Quick start

React Native. Add the Babel plugin in development (before react-native-worklets/plugin), connect, then press shift+m in Metro and open @keyframerdev/inspector. The npm README has the details, bare React Native included, and react-native/example is an Expo app with it all set up.

js
// babel.config.js (Expo)plugins: process.env.NODE_ENV !== 'production' ? ['@keyframerdev/inspector/babel'] : []
ts
// your root layoutif (__DEV__) require('@keyframerdev/inspector/devtools').connectDevTools({ app: 'MyApp' })

iOS.

swift
import KeyframerInspector
#if DEBUGKeyframerInspector.start()                              // simulator: ws://127.0.0.1:8790KeyframerInspector.start(.init(host: "192.168.1.20"))   // a device: the Mac's LAN address#endif

Android.

kotlin
// Application.onCreate (debuggable builds only)Keyframer.start(this)ObjectAnimator.ofFloat(title, View.ALPHA, 0f, 1f).kfTrack("title").start()

Flutter.

dart
void main() => runApp(const KeyframerInspector(app: 'My app', appPackage: 'my_app', child: MyApp()));

Each folder's README covers the API, what is reported and how, and its tests.

The desktop app

Keyframer Inspector for macOS (Apple silicon and Intel) is where every SDK connects. Download it from Releases. It is free, signed and notarized, and keeps itself up to date.

  • Every platform, one place. iOS, Android, Flutter and React Native apps connect to it on ws://<your Mac>:8790: simulators and emulators on their own, devices on the same network with the address the status bar shows. Several apps at once, with a switcher.

  • The panel. Record, then drag to scrub: the app follows, back to the screen it was on. Tracks show every animation as segments you can click to tune (duration, delay, spring) live, then apply the numbers to your source. Problems come ranked by the frames they cost, each with where it is, what was running and the fix. Compare two sessions, before and after a change. Open any step in Cursor, VS Code, Zed or Xcode.

  • An MCP server for coding agents. Built in, one switch in Settings, and nothing else to install. Claude Code, Codex, Cursor, VS Code, Windsurf, Zed and Claude Desktop can record your app, run its scenarios, read the trace and the problems, and take screenshots. With check and recheck an agent runs the fix loop: measure, change the code, measure again, until the problems are gone and the motion still works. Settings shows the setup for each client; for Claude Code:

    sh
    claude mcp add --transport http keyframer-inspector http://127.0.0.1:8789/mcp
  • A recordings library. Recordings (.kfrec.json) from the panel, from testers' devices or from share links land in one folder. Double-click one to open it; share links open in the app.

  • In the menu bar. Closing the window keeps the relay running. The menu shows the connected apps and the MCP server, with switches for the server and for launching at login.

  • Updates on its own. It checks after launch and every six hours, downloads in the background and installs when you restart or quit. Every update is signed, and the app installs nothing else.

  • Local. Recordings, the relay and the MCP server stay on your Mac. Nothing leaves it unless you make a share link.

Protocol

Every SDK speaks one wire protocol, protocol/inspector.ts: hello, the signals an app exposes, animation events with their call sites, frames, screens, recordings, and what an editor sends back (record, scrub, overrides, scenarios). A new platform needs only to speak it.

Issues and contributions

Issues for any platform, the desktop app and the npm package go here. This repository is published from Keyframer's own; pull requests are welcome, and land here once merged there.

License

MIT for everything in this repository (LICENSE). The desktop app is free and closed source. In the npm package, what runs in your app is MIT (its source is react-native/), and the tools (the CLI, the MCP server and the panel) are under the Functional Source License; see its LICENSE.md.

來源:README.md,提交 90fd922

工具

22

inspector_status

Which app is connected through Metro, the scenarios it registered, the recorded sessions, the shared values (useSharedValue) it has rendered, the worklet mistakes in its code that crash it (with the fix), and what animates now as the app counts it: animated styles and shared values mounted on the screen, what each value drives (fan-out), animation starts per frame by call site, rows that remount, and the cost per list cell.

無需輸入參數。

record

Record the app for a while: every shared value (also ones that mount mid-recording), both threads' frame rates and long frames, animations with call sites and stacks, React commits with why components rendered, JS tasks (handlers, effects, timers) and UI-thread worklet time. A person interacts with the app meanwhile (or pass replay: true). Returns the problems found, ranked, each with where it is written and how to fix it. It blocks for durationMs: when you drive the app yourself with another tool (Argent, agent-device, a Maestro flow), use start_recording and stop_recording instead. Prefer run_scenario when the app registered one for the interaction: it is reproducible, so a fix can be checked with compare.

輸入參數replaysignalsdurationMs

start_recording

Start recording the app and return at once, so you can drive it with another tool between this call and stop_recording: taps, swipes and flows from a simulator agent (Argent, agent-device, Maestro) or anything else. Records what record does (every shared value, both threads' frame rates and long frames, animations with call sites, React commits, JS tasks, UI-thread worklet time). One recording at a time; it stops by itself after 5 minutes. Use record instead for a fixed stretch while a person uses the app, and run_scenario when the app registered the interaction.

輸入參數signals

stop_recording

Stop the recording start_recording began and report the problems found, ranked, each with where it is written and how to fix it: the same report as record. The session is kept for get_trace, compare, save_recording and export_recording. Says so when the recording stopped early: the app disconnected or restarted, or the cap was reached.

無需輸入參數。

run_scenario

Run one of the app's registered scenarios (registerScenario: a reproducible interaction, like opening a sheet or scrolling a feed) while recording, and report the problems. Run it before and after a change, then compare the two sessions to check the fix.

輸入參數name必填settleMs

compare

Compare two recorded sessions (ids from record / stop_recording / run_scenario, default the last two): frame rates, frames lost, longest frames, rendering, JS task and worklet time, and which problems were fixed, remain or are new.

輸入參數afterbefore

get_trace

A session as a timeline: frame drops, JS tasks with where they are written, UI worklets over 2 ms a frame, React commits with the components that rendered and why, animations with symbolicated stacks, logs.

輸入參數toMsfromMssessionlibraryFrames

scrub

Set every recorded shared value to its value at a moment of the last recording, so the app shows that frame.

輸入參數atMs必填

play

Play the last recording back into the app in real time, from a moment (default the start).

輸入參數fromMs

capture_frame

A screenshot of the app. With atMs, first shows that moment of the last recording. Needs an app that can capture its screen (inspector_status says how to set it up).

輸入參數atMswidth

export_recording

Render the last recording to a GIF or MP4 file, frame by frame from the app (needs captureScreen). MP4 needs ffmpeg on the PATH; GIF does not.

輸入參數fpspathtoMswidthformat必填fromMstouches

list_recordings

The recordings in this project's library (.keyframer/recordings), newest first: ones made on a device, saved in the panel or with save_recording, and the ones kept automatically when a recording stops (the panel's, record's, stop_recording's and run_scenario's; marked automatic, only the newest are kept), with the titles they were renamed to.

無需輸入參數。

open_recording

Open a recording file (.kfrec.json) made on a device (Motion Scan record button) or saved from the panel. It becomes the recording every other tool reads; returns its report. A recording from a build without Metro (an internal preview build) has raw stacks: pass that build's source map to map them to source lines.

輸入參數path必填sourceMap

save_recording

Keep the last recording for good in the library, as a .kfrec.json file the dev tools panel can open. record, stop_recording and run_scenario keep each recording automatically (only the newest automatic ones stay): saving one of those keeps that copy instead of writing a second one.

輸入參數path

get_screenshot

A screenshot the recording took on the device (recordings made on the device carry a few): the one shown at atMs.

輸入參數atMs必填

replay

Run the app's registered replay (registerReplay): re-mount the screen, re-run its entrance.

無需輸入參數。

set_time

Slow down, pause or step the app's animations on the device, to watch a fast animation or a glitch frame by frame (capture_frame shows the screen). scale: 1 is normal speed, 0.5 half, 0.25 a quarter, 0.1 a tenth, 0 paused. step, with scale 0: advance that many frames at the display's refresh rate, then hold again. Returns the speed the app says it runs at now; every panel shows the same. Recordings made while slowed carry time markers and their durations are stretched by 1 / scale: set scale 1 again before measuring. Needs an app that lists the time capability (inspector_status says).

輸入參數stepscale必填

check

Start a fix loop: measure the app and keep the result as the baseline recheck compares with. Scenarios (default all the app registered) run the median of several runs after a warm-up, each from a clean start (the app's reload). Or a recording: a .kfrec.json file (with sourceMap for a preview build), or "current" for the last recording; each of its problems is then verified by a scenario that reproduces it, by playing the recording back (UI-thread, rendering and layout problems only), or marked Not verifiable. Returns the problems ranked, each with a short ref (P1…), where it is, evidence, the fix, how it will be verified, and the motion that must keep working. With field (a Motion Vitals problem id from field_problems, like SHOP-12), it also says whether that call site dropped frames here: reproduced or not reproduced. Takes minutes on a big app.

輸入參數runsfieldreloadwarmupsettleMsrecordingscenariossourceMapscenarioStub

recheck

Measure what check measured again, the same way, and compare with check's baseline. Returns Fixed (gone, and its animations still start and its values still move), Still there, New, Removed (gone because its animation or value stopped: not a fix), Not verifiable, the numbers before and after, and done: true or false with the reason. Call it after a change has reloaded in the app (Fast Refresh, hot reload or a rebuild).

無需輸入參數。

field_problems

The top field problems of a Motion Vitals project (slow frames from production, keyframer.dev/app/vitals), most frames lost first, in the dashboard's words: where each is (call site and screen), how many frames it drops while it runs against its screen's baseline, the devices and OS where it is worst, the causes of its slow frames, its status (New, Came back, Worse, Ongoing, Resolving, Fixed, Ignored), the check command and the dashboard's agent prompt. Then check with field: "<id>" measures it here. Needs KEYFRAMER_VITALS_READ_KEY: a workspace read key (kfw_) or a kf_ API key.

輸入參數oslimitstatusproject必填version

field_compare

Compare two versions of a Motion Vitals project, the way its Versions page does: hitch time, slow and frozen frames, janky sessions, and every problem call site as Worse, Came back, New, Still there, Better, Fixed or Ignored, with its drop rate in each version. Default: the latest version against the one before it with enough sessions. After a fix ships, it says whether the field problem is Fixed. Needs KEYFRAMER_VITALS_READ_KEY.

輸入參數tofromproject必填

lint_project

Read the project's source for the mistakes the inspector's Babel plugin finds while Metro builds it, without running the app (keyframer-inspect lint): worklet crashes (a worklet using a value declared after it, or calling a JS function on the UI thread; severity crash, always listed) and motion mistakes that do not crash (a descending interpolate range, scheduleOnRN on every frame, a spring config without mass, a shared value read while rendering, deprecated APIs…; severity error, warning or info). Over the project root this server was started with, or files and folders inside it; node_modules, build output and native folders are skipped. Returns each finding as file:line, severity, rule, message and its fix, most severe first. No app needs to be connected. React Native (Reanimated, worklets, Gesture Handler) only.

輸入參數limitpathsseverity

版本歷史

2
  1. v0.4.0最新Oct 23, 2026
  2. v0.3.0Oct 21, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Keyframer 整合