Skip to content

Image-Paste Pipeline (Zipline + ShareX + sharex-clip2path)

S2 · Pattern 🔬 Research 2026-04-17

Terminal-based AI coding CLIs (Claude Code, Gemini CLI, Codex) can reference images by URL but cannot accept pasted image data from the OS clipboard. This is a real friction: when explaining a UI bug or sharing a diagram, you screenshot → save → upload → paste URL → finally tell the AI. Five steps for what should be one.

The pattern: hotkey a screenshot → auto-upload to a personal image host → URL copies to clipboard → paste into terminal. Five steps become one hotkey + one paste.

ShareX (Windows) sharex-clip2path Zipline (self-hosted)
│ (my tool) │
│ PrintScreen hotkey │ │ Tailscale-gated
│───────────────────────────→ │ Configures ShareX │ img.<your-local-domain>/u/ABCD.png
│ │ to upload to Zipline │
│ Captures screenshot │ │
│ │ Copies final URL │
│ ShareX uploads to Zipline ──┼──────────────────────────→│
│ │ │
│ │ URL now on clipboard │
│ │ │
│ Ctrl+V in terminal │ │
│ → paste URL │ │
│ │ │
│ │ │
└── Claude Code reads the URL → fetches image ────────────┘
  • What it is: zipline.diced.sh — a self-hosted file/image uploader with short URLs, API, auth. Think “private imgur with a real API.”
  • Where it runs: Docker container on my home server.
  • Access: Tailscale-gated. The URL img.<your-local-domain>/u/ABCD.png only resolves on my tailnet. No public exposure.
  • Install: Zipline setup guide.
  • What it is: open-source Windows screenshot + upload tool. Highly configurable: hotkeys, upload destinations, post-actions.
  • Why it: mature, works with custom uploaders, has every knob you’d want. Free.
  • Alternative for Mac/Linux: Flameshot + custom upload script (similar but more DIY).
  • Repo: github.com/cybersader/sharex-clip2path
  • What it is: a small utility I built to load hotkeys into ShareX that implement the full “screenshot → upload → URL on clipboard” flow with my preferred conventions.
  • Why built: ShareX’s out-of-box hotkey config is verbose. clip2path packages the workflow into one configurable block.
Terminal window
# On the home server (Docker)
docker run -d \
--name zipline \
-p 3000:3000 \
-v /path/to/uploads:/zipline/uploads \
-e CORE_SECRET=<random-secret> \
ghcr.io/diced/zipline:trunk

Set a reverse proxy (Nginx, Caddy) if you want a pretty hostname. Tailscale handles the auth layer — the reverse proxy just provides hostname + HTTPS termination inside the tailnet.

In Tailscale ACLs (or the host’s firewall), restrict Zipline’s port to the tailnet. No 0.0.0.0 binding. If you’re running behind a reverse proxy, bind the proxy to the tailnet interface only.

Download from getsharex.com. Default install fine.

Follow the README. It configures ShareX’s upload destination to point at your Zipline instance, sets hotkeys, and wires the clipboard handoff.

  • Press the screenshot hotkey
  • ShareX captures + uploads to Zipline (via tailnet)
  • URL lands on clipboard
  • Paste into a terminal running Claude Code: Look at this bug: https://img.<your-local-domain>/u/ABCD.png
  • Claude fetches the image and responds

Not as polished. What works:

  • Flameshot + custom script that calls Zipline’s upload API and puts URL on clipboard.
  • imgcat + a rehost step.

I use Windows for most of my agentic dev (via WSL), so ShareX is the primary path.

Termux has termux-clipboard-set and can upload via curl to the Zipline API. Combined with Android’s sharing menu → send to Termux script, you can approximate the same flow.

  • Tailscale ACLs — restrict the image host to devices/users that actually need it.
  • Upload retention — set max age on Zipline or you’ll accumulate old screenshots forever.