Documentation

TetherShot · native macOS utility · MIT licensed

Overview

TetherShot is a native macOS app with an optional menu-bar controller. It captures pixel-perfect screenshots of an iPhone and saves them to a folder you choose (optionally copying each to your clipboard). It supports two capture paths:

TetherShot opens as a compact Mac app with an optional menu-bar control. Closing its window removes the Dock icon while capture, updates, and the global hotkey keep running in the background.

Requirements

Install

For a normal Mac install, use the verified Homebrew Cask or download the signed and notarized universal DMG. Developers can use npm for the CLI and source-built workflow.

via Homebrew — recommended
brew install --cask aopv/tap/tethershot
via DMG
open https://github.com/aopv/TetherShot/releases/latest
via npm
npm install -g tethershot   # links the CLI (and builds the app)
tethershot install         # ensure the app is in ~/Applications
tethershot                 # launch it

Note: npm 11+ blocks postinstall scripts by default, so if the app isn't built after npm install, the explicit tethershot install step always does it.

From source

git
git clone https://github.com/aopv/TetherShot.git
cd TetherShot
./build.sh             # compiles + packages TetherShot.app
open .build/TetherShot.app

First capture (USB)

  1. Connect your iPhone with a cable and tap Trust This Computer (unlock if prompted).
  2. Click the TetherShot icon in the menu bar.
  3. Your phone appears as 📸 <name> (USB) — click it. (Use Refresh Devices if it's not listed yet.)
  4. The first capture triggers a one-time Camera permission prompt — allow it. (The iPhone screen rides the camera privacy bucket; your Mac camera is never used.)
  5. The PNG lands in your folder (default ~/Pictures/TetherShot) and, if enabled, on your clipboard.

Wi-Fi capture

Wireless capture uses a root tunnel daemon (tunneld) that keeps a RemoteXPC tunnel alive so captures need no sudo. One-time setup:

one-time setup
# 1 · install pymobiledevice3 (the engine)
pip3 install -U pymobiledevice3

# 2 · install the tunnel service (asks for admin password once)
tethershot setup-wifi

# 3 · with the iPhone connected over USB once:
#     enable Developer Mode (Settings ▸ Privacy & Security)
pymobiledevice3 lockdown wifi-connections --state on

After that you can unplug. While the iPhone and Mac are on the same Wi-Fi, the menu shows it as (Wi-Fi) and captures are pixel-perfect — even when the phone is locked. The tunnel daemon is discovered automatically.

Why not AirPlay mirroring? On macOS Tahoe, a mirrored iPhone window blacks out whenever any screen-capture context is active, so TetherShot uses the developer-services path instead — it captures the device's own framebuffer regardless of transport.

CLI

tethershot
tethershot            # launch the app
tethershot install    # build & install to ~/Applications
tethershot update     # update to the latest published version
tethershot setup-wifi # install the Wi-Fi tunnel service
tethershot uninstall  # remove the app
tethershot version    # print the installed version

Options

All options live in the menu and persist across launches:

Updating

Use Check for Updates… in the menu, then Update & Relaunch. TetherShot downloads the signed and notarized universal DMG, verifies its GitHub SHA-256 digest and Developer ID signature, replaces the current installation in place, and relaunches. Node.js and Xcode are not required for normal updates. CLI users can still update the optional command separately:

terminal
tethershot update

Heads-up: the from-source build is ad-hoc signed, which isn't stable across rebuilds, so an update may re-trigger the one-time Camera permission prompt.

Troubleshooting

The iPhone isn't listed

Make sure it's unlocked and trusted, then hit Refresh Devices. Over USB it must appear as a screen source; a wireless-only connection surfaces as a camera, which TetherShot ignores by design.

“Capturing…” hangs or errors

Confirm the iPhone is unlocked. For Wi-Fi, ensure the tunneld service is running (tethershot setup-wifi installs it) and both devices share a network/subnet.

Camera permission blocked

Enable TetherShot under System Settings ▸ Privacy & Security ▸ Camera, then capture again.

Uninstall

terminal
tethershot uninstall                 # removes the app
npm uninstall -g tethershot         # removes the CLI
bash scripts/uninstall-tunneld.sh   # removes the Wi-Fi service

Questions or bugs? Open an issue on GitHub.