Capture here. Let your agents use it there.
dotshot sends screenshots and screen recordings from your Mac straight to the machine where your coding agent is working, over SSH, and copies the remote path to your clipboard. Paste that path into Claude Code, Codex, or any terminal agent.
⌃⌥⌘S → drag over the problem → named, delivered, path copied → paste into your agent
There's no save dialog, no file naming, no upload, and no hunting for the file on the other machine. There's also no account, cloud inbox, receiving service, telemetry, or API key.
Download for macOS · Watch the 80-second intro · Walkthrough · Install guide · SSH setup · Troubleshooting
If you code across a laptop, a desktop, a GPU box, a build machine, or a NAS, your screenshot usually lands on the wrong computer. dotshot turns what you see into a path the agent can open right away:
Fix the overflow in /Users/dev/inbound/network-settings-proxy-host-20260916-101400.png
Files travel over the SSH or Tailscale connection you already have. On the destination, dotshot needs nothing but a folder the SSH account can write to.
- Region screenshots with offline, on-device OCR naming (
payment-form-test-failed-20260916-101300.png) - Recordings of a full display or a selected area, with send, trim, or resize afterward
- Several destinations, including a Mac or Linux machine reachable by
user@host, a Tailscale name, or an~/.ssh/configalias - Global shortcuts:
⌃⌥⌘Sfor a screenshot,⌃⌥⌘Vfor a recording - Drag and drop: drop any file on the camera nub, then onto a destination tile
- Automation URLs for Shortcuts, Raycast, BetterTouchTool, and scripts
- Guided setup that tests each destination, diagnoses SSH problems, and walks you through a first capture
- Stays out of the way: a 42 px camera nub in the corner of the screen you choose, excluded from your own screenshots
Requirements: macOS 14 Sonoma or newer (Apple silicon or Intel), plus a Mac or Linux destination you can SSH into with a key.
brew install --cask mejohnc-ft/tap/dotshotOr download it yourself:
- Download
dotshot-<version>.dmgfrom the latest release. - Open the DMG and drag dotshot to Applications.
- Open dotshot. Setup starts automatically.
Releases are signed with a Developer ID and notarized by Apple, so dotshot opens like any other downloaded app. To build from source instead, see Build from source.
Setup walks through each step and can be reopened any time from the gear on the expanded pill.
- Allow Screen Recording when macOS asks, then relaunch dotshot if prompted.
- Make sure SSH works from this Mac to the destination without a password:
If that fails, setup can copy the key authorization command for you. The SSH setup guide covers Remote Login, keys, and Tailscale.
ssh -o BatchMode=yes you@destination true && echo ready
- Add a destination with a short name (
work), an SSH address (you@mac-studio.local), and a folder (~/inbound). Press Test. dotshot checks the host, the key, and the folder separately, creates the folder, and saves its absolute path. - Take a first capture with
⌃⌥⌘S. Wait for the Sent notification, then paste the path into your agent.
![]() |
![]() |
![]() |
| Permission | SSH access | First capture |
Every screen, in order, is in the walkthrough.
| Action | How |
|---|---|
| Screenshot to the current destination | ⌃⌥⌘S, or hover the nub and click Shot |
| Recording | ⌃⌥⌘V, or Vid, then pick a display or Selected Portion. Stop with ⌘⌃Esc. |
| Switch destination | Click the destination name on the expanded pill |
| Send an existing file | Drag it onto the nub, then onto a destination tile |
| Reopen setup | Gear on the expanded pill, or open dotshot://settings |
After a successful transfer, the clipboard holds the absolute remote path. If
the transfer fails, dotshot keeps the file, copies its local path, and logs the
error to ~/Shots/.dotshot.log.
| URL | Effect |
|---|---|
dotshot://image |
Screenshot to the current destination |
dotshot://image?dest=work |
Screenshot to work |
dotshot://video?dest=work |
Recording picker |
dotshot://video?dest=work&screen=2 |
Record display 2 |
dotshot://video?dest=work&screen=region |
Record a selected area |
dotshot://settings |
Open destination settings |
dotshot://setup?step=appearance |
Open setup at a step (welcome, permissions, connect, destinations, test, login, appearance, done) |
open 'dotshot://image?dest=work'Links that start a recording ask for confirmation first, because any app or web page can open a link. Tick Always allow links to start recordings in that dialog if you trigger recordings from your own automation. A link naming a destination that doesn't exist is reported and captures nothing.
| What | Where |
|---|---|
| Local copies of captures | ~/Shots |
| Delivery log | ~/Shots/.dotshot.log |
| Destinations | ~/Library/Application Support/dotshot/destinations.tsv |
| Preferences | defaults read com.mejohnc.dotshot |
destinations.tsv holds one tab-separated row per destination (name, SSH host
or alias, remote folder). You can edit it by hand. See
config/destinations.example.tsv.
- Machines: DGX Spark · ROCm · Remote Macs and macOS VMs
- Agents: Claude Code · Codex · Pi
- Let your agent set it up: docs/AGENTS.md. The
dotshot-setupskill configures and checks destinations from the command line, anddotshot-inboxhelps agents on each machine find and read what you sent.
The script inside the app also works from Terminal:
DS=/Applications/dotshot.app/Contents/Resources/dotshot-capture.sh
"$DS" add spark spark '~/inbound' && "$DS" check spark # validate, create a private folder, save the absolute path
"$DS" send spark ./notes.txt # deliver a file; the remote path is on your clipboardOther tools solve part of this, and one of them may suit you better:
- clipbridge lets you press Ctrl+V for a clipboard image inside Claude Code or Codex on Linux hosts.
- clipssh, clipport, and claude-screenshot-uploader upload a clipboard image or screenshot over SSH and copy the remote path. Most support several hosts.
- The VS Code Remote-SSH image-paste extensions do the same inside the editor's terminal.
dotshot goes further than getting an image across: it sends screen recordings
and any file too, names captures after what's on screen, and lets you pick the
machine per capture from a native pill, drop tiles, or a dotshot:// URL. Setup
tests each connection and says what to fix. Under the hood it's screencapture
plus scp on purpose, so nothing new runs on your destinations.
dotshot can read the screen only after you grant Screen Recording permission.
Captures stay private on your Mac (~/Shots, mode 700) and go only to destinations
you configure, over scp with key authentication, strict host-key checking, and no
password prompts. Files arrive with private permissions, under safe unique names,
and never overwrite anything. Names drop secret-looking words, and links that would
start a recording ask first. dotshot has no analytics, accounts, or update checks.
Once your agent opens a capture, the agent's model provider sees it.
SECURITY.md traces every copy of a capture and explains the protections and the remaining risks, such as prompt injection from captured content.
./scripts/build.sh # build ~/Applications/dotshot.app and launch it
./scripts/test.sh # unit tests, capture-script tests, shellcheck
./scripts/release.sh # universal DMG + ZIP + checksums (see docs/RELEASING.md)See CONTRIBUTING.md, docs/QA.md, and
docs/RELEASING.md. Screenshots and videos are generated from
the real app by the scripts in scripts/docs/ (see Refreshing screenshots and the demo).
dotshot was previously called Shot Pill. The first launch of dotshot imports Shot Pill's settings; see Migrating from Shot Pill.








