{"id":"1459f7d6-6ade-44d3-a2ae-1607ec8f3e5b","slug":"claude-ssh-image-skill","kind":"skill","name":"claude-ssh-image-skill","summary":"A Claude Code skill + local daemon that enables pasting clipboard images into a Claude Code session on a remote server over SSH.","owner":"AlexZeitler","repoUrl":"https://github.com/AlexZeitler/claude-ssh-image-skill","license":"MIT","licenseTier":"permissive","trust":"community","stars":29,"match":null,"fewStars":false,"format":"skill","createdAt":null,"addedAt":"2026-10-14T06:27:11.249Z","logoUrl":"https://avatars.githubusercontent.com/u/287480?u=6e1d4a4a7937d07420295d2626bf09273b2f06c0&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra","developer-tools","design-media"],"tags":["claude-code","ssh"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-14T07:58:16.222Z","sample":false,"url":"https://conduits.dev/tools/claude-ssh-image-skill","language":"Go","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# claude-ssh-image-skill\n\nA Claude Code skill + local daemon that enables pasting clipboard images into a Claude Code session on a remote server over SSH.\n\nClaude Code doesn't natively support pasting images over SSH. This project solves that with a similar approach to [sshimg.nvim](https://github.com/AlexZeitler/sshimg.nvim), but specifically for Claude Code.\n\n## How it works\n\n```\nLocal Machine                            Remote Server (SSH)\n┌──────────────────────┐                 ┌──────────────────────────┐\n│  Clipboard (PNG)     │                 │  Claude Code             │\n│        │             │                 │        │                 │\n│        ▼             │                 │        ▼                 │\n│  ccimgd (Port 9998)  │◄────────────────│  /paste-image Skill      │\n│  - wl-paste          │  SSH Reverse    │  - TCP Request to ccimgd │\n│  - Returns base64    │  Tunnel         │  - Receives base64 image │\n│    image in response │  (Port 9998)    │  - Saves as temp file    │\n│                      │                 │  - Read → Claude sees    │\n└──────────────────────┘                 │    the image             │\n                                         └──────────────────────────┘\n```\n\n1. The `/paste-image` skill runs the `ccimg` client on the remote server, which sends a TCP request to `127.0.0.1:9998` (forwarded through the SSH reverse tunnel to the local machine)\n2. `ccimgd` reads the PNG image from the local clipboard (`wl-paste` on Wayland, `xclip` on X11, `pngpaste` on macOS)\n3. The image is returned as base64-encoded JSON\n4. `ccimg` saves it as a temporary PNG file and prints the path\n5. The skill uses Claude's `Read` tool to display the image\n\n## Requirements\n\n- **Local machine (Linux)**: `wl-paste` (Wayland, part of `wl-clipboard`) or `xclip` (X11)\n- **Local machine (macOS)**: `pngpaste` (`brew install pngpaste`)\n- **Remote server**: Claude Code\n- **Building from source**: Go\n\n## Building\n\nBuild both binaries (daemon + client):\n\n```bash\n./build.sh\n```\n\nThis builds statically linked binaries for all supported platforms:\n\n- `daemon/ccimgd-linux-amd64`, `daemon/ccimgd-darwin-amd64`, `daemon/ccimgd-darwin-arm64`\n- `client/ccimg-linux-amd64`, `client/ccimg-darwin-amd64`, `client/ccimg-darwin-arm64`\n\n## Setup\n\n### Local machine (Linux)\n\n```bash\ncp daemon/ccimgd-linux-amd64 ~/.local/bin/ccimgd\ncp daemon/ccimgd.service ~/.config/systemd/user/\nsystemctl --user daemon-reload\nsystemctl --user enable --now ccimgd\n```\n\n### Local machine (macOS)\n\n```bash\ncp daemon/ccimgd-darwin-arm64 /usr/local/bin/ccimgd   # or ccimgd-darwin-amd64 for Intel\ncp daemon/com.ccimgd.plist ~/Library/LaunchAgents/\nlaunchctl load ~/Library/LaunchAgents/com.ccimgd.plist\n```\n\n### Remote server\n\nCopy the client binary and skill to the remote server:\n\n```bash\nscp client/ccimg-linux-amd64 your-server:~/.local/bin/ccimg\nscp skill/paste-image.md your-server:~/.claude/commands/paste-image.md\n```\n\nTo avoid permission prompts each time, add this to `~/.claude/settings.json`:\n\n```json\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(ccimg)\"\n    ]\n  }\n}\n```\n\n### SSH connection\n\nConnect with a reverse tunnel:\n\n```bash\nssh -R 9998:localhost:9998 your-server\n```\n\nOr add to `~/.ssh/config`:\n\n```\nHost your-server\n    RemoteForward 9998 localhost:9998\n```\n\n## Usage\n\nIn Claude Code on the remote server, copy an image to the clipboard on your local machine and run:\n\n```\n/paste-image\n```\n\n## Comparison with sshimg.nvim\n\n| Aspect | sshimg.nvim | claude-ssh-image-skill |\n|---|---|---|\n| **Client** | Neovim plugin (Lua) | Claude Code skill |\n| **Daemon** | `imgd` (Port 9999) | `ccimgd` (Port 9998) |\n| **Image transfer** | Daemon → scp → Server | Daemon → base64 in TCP response → Client saves |\n| **Request needs** | `host` + `path` | Nothing (empty object) |\n| **Coexistence** | Port 9999 | Port 9998 — both can run simultaneously |\n\n## License\n\nMIT\n"}