DEV Community

Apoorv Darshan
Apoorv Darshan

Posted on

I Built TetherShot to Capture iPhone Screenshots from the macOS Menu Bar

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

A small native architecture

The app is written in Swift and SwiftUI. Its capture implementations sit behind a shared CaptureBackend protocol:

  • USBCapture handles CoreMediaIO and AVFoundation
  • WirelessCapture communicates with tunneld and pymobiledevice3
  • AppModel manages connected devices, folders, preferences, and status
  • MenuContent and TetherShotApp provide the SwiftUI MenuBarExtra interface

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)