TL;DR: Clipboard paste can’t work over SSH: the image lives on your local machine and Claude Code only sees the remote one. Get the file across instead. scp it and reference the remote path, drag it into VS Code’s Remote-SSH explorer, keep a synced screenshots folder, or commit it to the repo. Every fix is a variation of “put the file where Claude Code runs, then give it the path.”

Why Ctrl+V can’t work here

When you SSH into a box and run Claude Code there, it can only read what exists on that box. Your screenshot is sitting on your laptop’s clipboard. The remote machine is headless: it has no clipboard with your image on it, and SSH doesn’t forward image data. Terminal clipboard integration (OSC 52) only covers copying text out of the remote session, not pasting images in.

So this isn’t a bug you can fix with a keybinding. The image has to physically arrive on the remote machine as a file. Once it’s there, Claude Code reads it happily:

Look at /tmp/bug.png and tell me why the header is clipped

Four ways to get it there, fastest first.

Fix 1: scp it

scp ships with the OpenSSH client on Windows, macOS, and Linux, so you already have it:

scp bug.png user@server:/tmp/

Then in Claude Code on the server: Look at /tmp/bug.png ...

If you do this a lot, alias the round trip. This grabs the newest file from your screenshots folder and ships it:

sshot() {
  f=$(ls -t ~/.screenshots | head -1)
  scp ~/.screenshots/"$f" user@server:/tmp/ && echo "/tmp/$f"
}

It even prints the remote path so you can paste it straight into your prompt.

Fix 2: drag it into VS Code Remote-SSH

If you’re connected with VS Code’s Remote-SSH, drag the image file from your desktop into the Explorer sidebar. VS Code uploads it to the remote workspace. Then reference the path in Claude Code running in the integrated terminal. No scp incantation, and the file lands inside the project where relative paths are short.

Fix 3: a synced screenshots folder

For a machine you live on daily, sync the folder once and stop thinking about it. rsync in a loop, sshfs to mount the remote directory locally, or Syncthing if you want it continuous. Snip locally, and seconds later the file exists remotely at a predictable path.

Fix 4: commit it

When the screenshot is a repro artifact worth keeping, put it in the repo:

git add docs/repro/checkout-bug.png && git commit -m "repro" && git push

Pull on the remote and reference it. Heavyweight for a one-off, but the image is versioned next to the fix, which future-you appreciates.

The tmux wrinkle

Running tmux inside the SSH session adds a third clipboard to the pile, and image paste was never going to survive it. The file path doesn’t care. This is a big part of why the path method is the only one that works everywhere.

> Snip. Hotkey. Path pasted.

Invoke turns the clipboard image into a PNG on disk and pastes the file path into your terminal — one hotkey, works in Hyper, Wezterm, Windows Terminal, and WSL2. It's also the fastest way to dictate prompts to Claude Code. Free for 7 days, then $49 once.

Fix this for good →

The local half of the problem

Notice that every fix starts with “save the screenshot as a file.” That step is its own little tax: snip, open the save dialog, pick a folder, find it again in the shell. Invoke removes it. Snip with Win+Shift+S, press one hotkey, and the image is saved as a PNG in ~/.screenshots/ with its path on your clipboard. Local and WSL sessions get the path pasted straight into the terminal; for SSH you feed that fresh file to the sshot alias above and you’re done in two commands.

Two hotkeys, then one command

Invoke is a dictation app for developers. Snip, hotkey, path saved. Then hold a key and say the bug report: “the checkout button 404s on mobile, screenshot attached, trace it.” Local Whisper on your GPU, $49 once, no subscription. Free 7-day trial.