Repository navigation
Releases: LiuTianjie/StupidMirror
Releases · LiuTianjie/StupidMirror
Release list
StupidMirror v0.7.1
- Keep the dashboard and MCP responsive while devices stream. Stream
previews were drawn through Core Image on the main thread, waiting on the
GPU every time a thumbnail redrew, and the tools that answer the Codex
panel and the Claude Code viewer queued behind them. Previews are now
rendered to bitmaps in the display's color space off the main thread. - Build the live USB thumbnail from the frame buffer in the background
instead of encoding and decoding a full-size PNG on the main thread. - Stop redrawing the menu bar item on every app state change.
- In the Claude desktop app, Claude now opens the live phone viewer in the
Browser pane by default when it starts working with a device, as Codex
shows its panel, instead of waiting to be asked. In the terminal it offers
the link instead. If the desktop app refuses the Browser tools, Claude
shows the link once and carries on.
StupidMirror v0.7.0
- Watch and operate the phone from Claude Code. The new
open_viewertool
starts capture and returns a link to a live viewer page on this Mac. In the
Claude desktop app's Code tab, Claude opens it in the Browser pane itself,
adding astupidmirror-viewerentry (origin only) to the project's
.claude/launch.json; elsewhere it shows the link. The page reuses
the Codex panel: live local WebRTC video with a PNG fallback, device
picker, refresh and manual control. Annotation is hidden there because no
chat receives it. - The viewer link carries a single-use ticket that expires after 10 minutes,
in the URL fragment so it is never sent in a request or Referer. The page
trades it for a tab session that can call only the four panel tools; the
MCP bearer token never reaches the page. Host and Origin are checked, and
rotating the token or stopping the server ends every open viewer. - Fix
list_devices,refresh_devicesandlist_appsin Claude Code, which
rejected their results because the device or app list was returned as a
bare array. Structured results now wrap the list asdevicesorapps;
the text result is unchanged. - Tell Claude Code to call
show_screenbefore reading the screen. It starts
background capture without opening a Mac window, soobserve_screenhas a
frame. Screen errors now nameshow_screenalongsidestart_mirror, and the
tool's description no longer reads as Codex-only. observe_screenright aftershow_screenwaits up to a few seconds for the
first frame instead of failing while capture starts.- Fast OCR no longer garbles Chinese. Apple Vision's fast mode reads Latin
scripts only, so a request that includes Chinese or another script is read
in accurate mode. - Keep the installed Claude Code plugin current: connecting again updates
Claude Code's cached copy, and after an app update StupidMirror refreshes
the plugin by itself when it was already installed.
StupidMirror v0.6.1
- Add one-click Connect Claude Code in Settings → MCP Automation,
beside Codex. It registers the user-scopestupidmirrorMCP server and
installs a StupidMirror plugin with setup and device-use skills written for
Claude Code; parts already in place are skipped. It works in the terminal
and in the Claude desktop app's Code tab. - The Claude Code MCP entry runs the app's signed helper over stdio, so no
token is written to Claude Code's configuration and port or token changes
need no reconnection. An olderstupidmirrorHTTP entry for this app's
endpoint is replaced; an unrelated entry with that name is kept. - The plugin is read in place from the installed app, so app updates refresh
it. Clicking again after moving the app points Claude Code at the new copy. - Redesign the AI client setup as side-by-side Codex and Claude Code cards,
each with its status, one install action and a starter prompt to copy.
StupidMirror v0.6.0
- Prefer system HID touch on supported iOS 27+ iPhones over USB or Wi-Fi and
on compatible iOS Simulators. Presses, movement and releases are sent as
they happen, with held long presses and native screen-edge gestures. An
HID badge identifies the active live-touch connection. - Forward native Mac trackpad scroll, magnification and rotation when the
device's gesture service is available, including mouse-wheel and momentum
events. Default touchscreen mode uses a held left mouse button for long
press; right click is no longer mapped to a separate long-press action. - Keep WDA compatibility when HID cannot connect, and prepare WDA on demand
for text, buttons, app and accessibility actions. Programmatic pinch and
rotate calls with an explicit center still use WDA to preserve that center.
A gesture interrupted after input starts is never replayed on a fallback. - Share touch ownership and ordered delivery across the native mirror, MCP
coordinate actions and Codex preview. Reduce extra waits before automation
gestures and simulator input, and release contacts on cancellation,
connection loss or display changes. - Use the signed WDA/XCTest runner's H.264 / SRT video stream for both USB
and wireless iPhones, decoded with VideoToolbox. Video does not require
Camera permission and does not acquire the phone's audio output.
Setup change: USB video now also requires the runner; complete
Set Up This iPhone, or run Prepare Again once over USB to update an
existing runner. - Bound capture, encoding, transmission and decoding buffers to limit memory
growth and accumulated video delay. Recover from a new keyframe after an
overloaded or interrupted stream instead of replaying a growing backlog.
Improve tunnel startup and reconnect handling during USB re-enumeration. - Keep iPhone audio on the phone by default. Play Device Audio on Mac
opens a separate USB audio input, requiring Camera and Microphone
permission; switching back releases that input. Wireless audio stays on
the phone. Known limitation: changing USB audio playback can
re-enumerate the phone's USB network interface and briefly interrupt
mirroring while the tunnel reconnects; this switch is not seamless. - Add iPhone Duo simulator posture controls for Closed, Partially Open and
Open. Change the actual hinge, select the active inner or outer display,
and keep capture, orientation and touch coordinates aligned with the
confirmed simulator state. Expose posture throughset_device_posture
and device status results. - Show device bezels and a folding 3D Duo model in both the native mirror and
Codex panel, using resources from the selected local Xcode installation
when available. Follow hinge changes without replacing the preview view. - Refine the device panel and mirror windows: compact status and posture
controls, native menus, minimization and reopening, transparent device
outlines, and resizing that preserves the device proportions and the
user's chosen size through rotation. Discovery refreshes retain menu and
keyboard state. - Disable device input on static or stopped dashboard previews and while a
simulator posture is changing; resume input on the live display with its
current geometry. - Codex plugin: send live pointer input and supported browser wheel input
over the local WebRTC data channel into the shared touch backend. Cancel
input on disconnect, stale geometry or congestion, and keep frame delivery
bounded. Browser events lack some native macOS phase and acceleration
information, so wheel behavior can differ from the native mirror. - Refresh the setup guides and publish the complete changelog history on the
website from this file as the shared source.
Full release history: https://stupidmirror.itool.tech/changelog/
StupidMirror v0.5.1
0.5.1
- Recordings run to the moment
stop_recordingis called. When the screen stayed still at the end (an Android device only sends frames when its screen changes), the last frame was not held, so browsers and other players ended the video early. install_appreports a missing file or the wrong package type for the device asinvalid_argumentinstead ofcontrol_failed.
See 0.5.0 for iOS Simulator and Android emulator support, the app-management and recording MCP tools.
StupidMirror v0.5.0
- iOS Simulators: a booted simulator now appears as a device. StupidMirror
builds its screen agent for the simulator once (no signing, Xcode
required), mirrors it at up to 60 fps and controls it like an iPhone. All
of the simulator agent's ports listen on this Mac only. - Android emulators are recognised, listed under their AVD name and marked
Simulator instead of USB. - Simulators and emulators count toward the simultaneous device limit like
real devices. They are not mirrored automatically, so a simulator running
your own UI tests is left alone until you open it. - New MCP tools for agents:
list_apps,install_app(.app / .ipa / .apk),uninstall_appand
open_url(web links and app deep links) on iPhones, iOS Simulators and
Android. They use the platform's own tools and need no control session,
exceptopen_urlon an iPhone.start_recording/stop_recordingsave the live mirror as an H.264
.mp4in~/Movies/StupidMirror, up to 10 minutes.
list_devicesand the other device results includetransport
(usb,wirelessorsimulator).- Fix control reconnecting by itself a few seconds after an agent called
disconnect_control. - Fix the iPhone screen agent spinning on its Wi-Fi video connection: it
read control messages into a buffer smaller than SRT accepts, so it
busy-looped and never received key-frame requests, which slowed recovery
from lost video packets. Run Prepare Again in iPhone Setup once over
USB to install the fixed agent.
StupidMirror v0.4.1
- New app icon, and a matching template icon in the menu bar that follows
light and dark menu bars. - The device status lines read "镜像 进行中" / "控制 已就绪" (Mirror Live /
Control Ready) instead of repeating the noun. - Redesigned website with new screenshots of the 0.4 interface.
StupidMirror v0.4.0
- Redesign every window: the dashboard, device panel, settings, MCP, iPhone
setup, activation, diagnostics and the mirror window share one neutral
system of panels, wells, pill buttons and state marks, with colour kept for
state (live, working, failed, control). The dashboard's top strip replaces
the toolbar, and the selected device shows its mirror and control state as
two status lines above the screen. - Support light and dark appearance. The app follows the system by default;
Settings → Interface and the menu bar can pin Light or Dark. Every text
colour is tested for 4.5:1 contrast on every surface in both. - iPhone control: add a
/stupidmirror/touchroute to the bundled
WebDriverAgent that synthesizes taps, double taps, long presses, swipes and
drags directly through the test daemon, skipping WebDriverAgent's
per-call foreground-app lookup and coordinate resolution. Runners prepared
by an earlier version keep working through the stock endpoints; run
Prepare Again in iPhone Setup once over USB to install the route. - A quick flick now keeps its real start point, direction and speed instead of
always becoming the same full-screen page swipe. - The mouse wheel scrolls the phone (each notch was previously below the
minimum distance and dropped), and nearby notches are sent as one scroll. - Trackpad scrolls are sent once when the fingers lift; macOS momentum is no
longer replayed as a second, late scroll. - Rapid taps are all delivered in order instead of replacing each other while
the phone is busy, and scrolls queued behind a slow gesture add up instead
of keeping only the last chunk. - Swipes and drags that run past the edge of the picture are pinned to the
screen edge instead of being discarded. - After release, a tap ripple or the gesture's trail fades out on the mirror,
so a gesture is acknowledged before the phone answers. - Diagnostics shows each device's median and slowest gesture round-trip time
over the last 20 gestures. - Codex plugin: an annotation send waits up to ten minutes for a busy Codex to
accept it instead of the SDK's one-minute default, and an unbound widget
conversation explains how to reopen the panel.
StupidMirror v0.3.9
- Fix USB iPhone control dropping about 15 seconds after the mirror window is
closed, and when a mirror is opened while control is already running.
Starting or idling USB screen capture switches the iPhone between USB
Configuration 7 and 6, which re-enumerates it and resets every usbmuxd
connection, including thesmtunnelcontrol tunnel. While control is
wanted for a cabled iPhone, StupidMirror now keeps its screen-capture
stream running in the background (with audio returned to the phone
speaker), so opening or closing the mirror never changes the USB
configuration. The stream is released when control stops. - Wait for the held USB capture stream to deliver its first frame before
opening the USB control tunnel, so the tunnel is built after the
Configuration 7 switch instead of being torn down by it. - Gallery thumbnails and AI screen observations use frames from the held
stream instead of falling back to a WebDriverAgent screenshot.
StupidMirror v0.3.8
- Fix USB iPhone mirroring freezing or dropping after brief USB re-enumerations
or Configuration 6/7 switches (CMIOGraphStart for setRunning (err=-67520)).
Stopping or retargeting a USB session now tears down the oldCMIOGraph,
replaces theAVCaptureSession, and resolves the newly published
AVCaptureDeviceinstance even when itsuniqueIDis unchanged. - Observe
AVCaptureSession.runtimeErrorNotificationand add a USB first-frame
watchdog so a wedged capture graph automatically tears down and recovers. - Avoid starting one-shot USB
ThumbnailCapturesessions while device control,
ansmtunnelsidecar, iPhone setup, or the--mcp-backgrounddaemon is
active, preventingiOSScreenCaptureAssistantidle timers from resetting the
USB bus and dropping active tunnels. - Retry iOS control tunnel startup across transient USB re-enumeration windows
and automatically resume desired control sessions when a device reconnects.