DEV Community

Apoorv Darshan
Apoorv Darshan

Posted on

TetherShot: Screenshot your iPhone from the Mac menu bar (USB or Wi-Fi)

macOS still has no clean, one-click way to screenshot your iPhone from your Mac. You end up in the QuickTime → record → pause → screenshot dance. So I
built the tool I wanted: TetherShot — a tiny menu-bar app that grabs a pixel-perfect iPhone screenshot and
drops it into a folder and your clipboard.

It's native Swift, MIT-licensed, and installs with one npm command.

  npm install -g tethershot
  tethershot install
Enter fullscreen mode Exit fullscreen mode

## Two ways to capture
### USB — the AVFoundation trick
When you plug in a trusted iPhone, macOS can expose its screen as an AVCaptureDevice of media type .muxed — the same source QuickTime and OBS use.
You just have to opt in first by flipping a CoreMediaIO flag:

  // without this, the iPhone's screen device never shows up
  var addr = CMIOObjectPropertyAddress(
      mSelector: CMIOObjectPropertySelector(kCMIOHardwarePropertyAllowScreenCaptureDevices),
      mScope: CMIOObjectPropertyScope(kCMIOObjectPropertyScopeGlobal),
      mElement: CMIOObjectPropertyElement(kCMIOObjectPropertyElementMain))
  var allow: UInt32 = 1
  CMIOObjectSetPropertyData(CMIOObjectID(kCMIOObjectSystemObject), &addr, 0, nil,
                            UInt32(MemoryLayout<UInt32>.size), &allow)
Enter fullscreen mode Exit fullscreen mode

Then it's a one-shot AVCaptureSession → grab the first CMSampleBuffer → PNG. Full resolution, instant, zero setup.

### Wi-Fi — the part that fought back
My first idea was: AirPlay-mirror the phone to the Mac, then screenshot that window with ScreenCaptureKit. It doesn't work on macOS Tahoe — the
mirrored window blacks out the instant any capture context is active.

So Wi-Fi capture instead rides Apple's developer-services path via pymobiledevice3 over a RemoteXPC
tunnel. A small root tunneld LaunchDaemon keeps the tunnel alive so captures need no sudo, and you get the device's real framebuffer —
pixel-perfect, even when the phone is locked. It costs a one-time USB pairing + Developer Mode, then it's fully cable-free.

## Distributing a native app via npm
TetherShot is a Swift .app, but it ships on npm. The postinstall builds it from source — and because it's compiled locally, the bundle never gets
a com.apple.quarantine attribute, so it runs with no Gatekeeper warning and no notarization. The tradeoff: you need the Xcode Command Line Tools.

## The rest of it

  • 📋 Each capture is copied to the clipboard
  • ⌨️ Global hotkey ⌘⇧7 from anywhere
  • 🗂️ Custom folder + optional per-device subfolders
  • ⬆️ In-app self-update via npm
  • 🔒 Local-first — no accounts, no telemetry, no servers

## Try it

Built and tested on macOS 26 (Tahoe) + iOS 26. I'd love feedback — especially on wireless reliability and the security model. What would make this a daily
driver for you?

Top comments (0)