Skip to content

Releases: LiuTianjie/StupidMirror

StupidMirror v0.7.1

Choose a tag to compare

@LiuTianjie LiuTianjie released this 27 Oct 03:10
  • 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

Choose a tag to compare

@LiuTianjie LiuTianjie released this 26 Oct 18:15
  • Watch and operate the phone from Claude Code. The new open_viewer tool
    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 a stupidmirror-viewer entry (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_devices and list_apps in Claude Code, which
    rejected their results because the device or app list was returned as a
    bare array. Structured results now wrap the list as devices or apps;
    the text result is unchanged.
  • Tell Claude Code to call show_screen before reading the screen. It starts
    background capture without opening a Mac window, so observe_screen has a
    frame. Screen errors now name show_screen alongside start_mirror, and the
    tool's description no longer reads as Codex-only.
  • observe_screen right after show_screen waits 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

Choose a tag to compare

@LiuTianjie LiuTianjie released this 26 Oct 15:44
  • Add one-click Connect Claude Code in Settings → MCP Automation,
    beside Codex. It registers the user-scope stupidmirror MCP 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 older stupidmirror HTTP 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

Choose a tag to compare

@LiuTianjie LiuTianjie released this 26 Oct 11:42
  • 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 through set_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

Choose a tag to compare

@LiuTianjie LiuTianjie released this 23 Oct 03:42

0.5.1

  • Recordings run to the moment stop_recording is 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_app reports a missing file or the wrong package type for the device as invalid_argument instead of control_failed.

See 0.5.0 for iOS Simulator and Android emulator support, the app-management and recording MCP tools.

StupidMirror v0.5.0

Choose a tag to compare

@LiuTianjie LiuTianjie released this 22 Oct 18:11
  • 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_app and
      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,
      except open_url on an iPhone.
    • start_recording / stop_recording save the live mirror as an H.264
      .mp4 in ~/Movies/StupidMirror, up to 10 minutes.
  • list_devices and the other device results include transport
    (usb, wireless or simulator).
  • 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

Choose a tag to compare

@LiuTianjie LiuTianjie released this 22 Oct 12:18
  • 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

Choose a tag to compare

@LiuTianjie LiuTianjie released this 22 Oct 10:41
  • 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/touch route 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

Choose a tag to compare

@LiuTianjie LiuTianjie released this 21 Oct 15:50
  • 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 the smtunnel control 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

Choose a tag to compare

@LiuTianjie LiuTianjie released this 21 Oct 10:48
  • 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 old CMIOGraph,
    replaces the AVCaptureSession, and resolves the newly published
    AVCaptureDevice instance even when its uniqueID is unchanged.
  • Observe AVCaptureSession.runtimeErrorNotification and add a USB first-frame
    watchdog so a wedged capture graph automatically tears down and recovers.
  • Avoid starting one-shot USB ThumbnailCapture sessions while device control,
    an smtunnel sidecar, iPhone setup, or the --mcp-background daemon is
    active, preventing iOSScreenCaptureAssistant idle 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.