Skip to content

v3.4.3 - Paste a screenshot into a ticket

Choose a tag to compare

@theyashgupta theyashgupta released this 03 Sep 17:50
de30592

A bug report usually starts as a screenshot, and Dispatch made you discard it. The New ticket box took text only. You described the picture in words, and every Claude session for that ticket started from the words. v3.4.3 lets you paste the screenshot into the box. The draft generator looks at the image before it writes the title and description. The card keeps the file, the detail view shows it, and each session that starts for the card reads the image before it does anything else. The same release repairs a quieter failure. A Done card whose tmux pane died while Dispatch was down showed "Terminal disconnected" forever, and a second Dispatch instance on the same machine could kill the first one's terminals.

See it

Dispatch v3.4.3 paste images into a ticket

Higher-quality video: dispatch-v3.4.3-paste-images.mp4

Paste a screenshot, get a ticket that saw it

Copy an image and paste it into the "What do you want to build or fix?" box. A thumbnail appears under the box with a remove control. Paste up to ten images. Plain text paste works exactly as before, and a paste with no image does nothing. Click Generate ticket and the draft run receives the pixels, not a file name. The title and description therefore describe what the screenshot shows. The thumbnails stay in the Review step, survive Regenerate, and go with Accept. Remove one before you accept and it never reaches the card.

The card stores each image under ~/.dispatch/attachments/<cardId>/, named by the hash of its bytes. Its description ends with a Screenshots section that links them. The detail view renders the images from the card's own attachment route. Only PNG, JPEG, GIF, and WebP are accepted. The server decides the type from the bytes, never from the clipboard's label, so a pasted TIFF or SVG never becomes a thumbnail.

Every session gets the picture

When a session starts for a card with attachments, the kickoff lists each image by absolute path. It tells Claude to read every file with the Read tool before it does anything else. The Read tool returns the image as visual content, so the session can describe the screenshot and act on it. Ask a fresh session what color the attached image is and it answers.

Dead sessions recover

A Done card whose tmux pane vanished now shows Session lost with a Resume button, in every column except To Do. Reconnect on a dead pane no longer loops on "tmux session no longer exists". It marks the session lost and runs the resume, so one click relaunches the recorded Claude session in the same worktree. The readiness poll answers Claude Code's new "Resume from summary" dialog with the recommended summary option. Before this release the poll timed out after 30 seconds and reported "Resume failed. The worktree may be gone."

A test instance stays isolated

A second Dispatch instance under a DISPATCH_DIR override hashed the same literal path for its ttyd instance key. Two instances therefore adopted and swept each other's terminals on every boot, and a shared tmux server let a test instance reach the real one's sessions. The instance key now hashes the resolved data directory. Every override instance runs on its own tmux server (tmux -L dsp-<instance id>). The home instance keeps tmux's default server, so an upgrade orphans nothing.

Underneath

  • Images travel as base64 in the existing JSON bodies of the create and draft routes. Only those two routes accept the larger body. Every other route keeps the 1 MB limit.
  • The draft run keeps zero tools. Images reach it as image blocks over stream-json stdin. The no-image draft invocation is unchanged.
  • The attachment route validates both path parameters and resolves the file under the card folder. It serves the file with nosniff, a sandbox Content-Security-Policy, and an immutable cache header.
  • Files are staged before the card row exists and moved into place after. A disk failure therefore never creates a card whose links point at missing files.
  • The subprocess helper gained a stdin option with an error listener. Without it, a child that exits before it drains a large input raises EPIPE and stops the server.
  • The repository now has a node:test suite (npm test) that runs inside npm run check. It covers attachment decoding, both routes, the exec helper, the kickoff builder, the paste helpers, the Markdown attachment branch, session-lost marking, the ttyd instance key, and the tmux server label.

Limits, stated plainly

Drag and drop of files is not supported. Images cannot be added to an existing card or to a Linear or group ticket. A local card that is later synced to Linear keeps its files, but its kickoff follows the Linear path and does not list them. There is no way to delete an attachment, because no card deletion path exists. The text-only draft can still fail when the model answers a code-flavored direction with tool markup instead of the two expected headers. That behavior predates this release. The resume-mode dialog is answered with the summary option only. Restart the running Dispatch after you upgrade. Each Done card with a dead pane then shows Resume, and a test instance shows its old sessions as lost once.

Full changelog: v3.4.2...v3.4.3

Requires Node ≥ 22.22, tmux, ttyd, git, and the Claude Code CLI. Setup is in the README.