Capturing an iPhone screenshot should be a one-click part of a Mac workflow. I wanted the full-resolution PNG to land in a folder and on the clipboard without opening QuickTime, starting a recording session, or moving files by hand.
So I built TetherShot, a native, open-source macOS menu-bar app that captures an attached iPhone over USB or Wi-Fi.
What it does
- Captures a trusted iPhone at full resolution over USB
- Supports cable-free capture over the local Wi-Fi network
- Saves PNG files to a folder you choose
- Copies every capture to the clipboard by default
- Can organize screenshots into per-device folders
- Provides a global Command + Shift + 7 shortcut
- Runs as a background menu-bar app with no Dock icon
- Uses no accounts, analytics, servers, or cross-device uploads
USB capture with native macOS frameworks
When an iPhone is connected and trusted, macOS exposes its screen as an AVCaptureDevice with the .muxed media type. TetherShot enables the CoreMediaIO screen-capture device, finds the connected iPhone, captures a single frame through AVFoundation, and writes it as a PNG.
The first capture triggers macOS's Camera permission prompt because the iPhone screen arrives through the AVFoundation privacy category. TetherShot does not access the Mac's camera.
Wi-Fi capture
Wireless capture uses pymobiledevice3 and Apple's developer-services tunnel. A small tunneld LaunchDaemon keeps the RemoteXPC tunnel available, and TetherShot asks the device for its own framebuffer over the local network.
This requires one-time setup:
pip3 install -U pymobiledevice3
tethershot setup-wifi
Connect the iPhone by USB once, enable Developer Mode and Wi-Fi reachability, then unplug it. When the Mac and iPhone are on the same network, the device appears in TetherShot as Wi-Fi.
Install from npm
TetherShot requires macOS 14 or newer, Node.js 18+, and the Xcode Command Line Tools.
npm install -g tethershot
tethershot install
tethershot
The npm package builds the native Swift app locally and installs it into ~/Applications. You can also build directly from source:
git clone https://github.com/apoorvdarshan/TetherShot.git
cd TetherShot
./build.sh
open TetherShot.app
A small native architecture
The app is written in Swift and SwiftUI. Its capture implementations sit behind a shared CaptureBackend protocol:
-
USBCapturehandles CoreMediaIO and AVFoundation -
WirelessCapturecommunicates withtunneldandpymobiledevice3 -
AppModelmanages connected devices, folders, preferences, and status -
MenuContentandTetherShotAppprovide the SwiftUIMenuBarExtrainterface
The same flow handles output folders, timestamped filenames, clipboard copying, and per-device organization regardless of transport.
Local-first by design
Screenshots can contain private conversations, unreleased interfaces, authentication codes, and personal photos. TetherShot therefore has no account system, analytics, cloud backend, or tracking. Captures remain on the Mac and are only written to the selected folder and clipboard.
TetherShot is MIT licensed. Contributions and feedback are welcome.
Top comments (0)