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
## 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)
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
⌘⇧7from anywhere - 🗂️ Custom folder + optional per-device subfolders
- ⬆️ In-app self-update via npm
- 🔒 Local-first — no accounts, no telemetry, no servers
## Try it
- 🌐 Site: https://tethershot.apoorvdarshan.com
- 💻 Code (MIT): https://github.com/apoorvdarshan/TetherShot
- 📦 npm: https://www.npmjs.com/package/tethershot
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)