How to give each harness a screenshot, mockup or diagram from its terminal, what it accepts, and whether the image survives in the saved session.
Getting an image in
| Question | Codex CLIchecked at 0.162.1 | Claude Codechecked at 2.1.299 | Cursor Agentchecked at 2026.10.12-d47ca18 | OpenCodechecked at 2.0.28 | pichecked at 1.2.0 |
|---|---|---|---|---|---|
| Paste from the clipboard | Copy an image (or an image file in Finder or Explorer), then press Under WSL, if the Linux clipboard has no image Codex runs PowerShell to fetch the image from the Windows clipboard. Image paste does not work on Android/Termux, and over SSH it reads the clipboard of the machine running Codex, not your local one.
| Yes. Press Linux needs Over SSH the remote machine cannot see your local clipboard; copy the file across with | Press Windows clipboard support is listed in the January 2026 changelog, but image paste on Windows is not described separately. Source | Press | Press A pasted image arrives as a temp-file path in the prompt text, not as an attachment, so the model sees the pixels only after it reads that file. If the clipboard holds files copied in Finder (macOS), |
| Attach an image file | Start with A pasted or dropped path only attaches if Codex can read the image's dimensions; otherwise it is inserted as text. The top-level | Drag an image file onto the terminal, or paste or type its path (for example A Pasted and attached images are also saved to a per-session | Drag an image file into the terminal, paste its path, or type On macOS, screenshots dragged straight from the floating thumbnail can be unreadable (permission denied); the CLI suggests Only PNG, JPEG, GIF and WebP contents are accepted when the message is sent, so HEIC, BMP or TIFF files dropped in fail with an unsupported-type error. Source | Paste or drag image paths into the prompt: one path, or up to 32 space-separated paths totalling 20 MiB, using the extensions | At launch, pass Only |
| Images in scripted runs | Yes:
| Yes. The simplest route is to name the file in the prompt, as in Each stream-json message must be a single newline-terminated JSON line. Reading an image path in | The documented way is to put the path in the prompt, e.g.
There is no documented stdin or stream-json input for images. Source |
| Yes: combine |
| Images through the SDK or API | App Server Remote
ACP is available through the separate | Yes, through the Agent SDK (TypeScript and Python) in streaming-input mode: yield a user message whose Claude Code has no built-in ACP server; the SDK and | Over ACP ( In CLI 2026.10.12, ACP image blocks are passed through as raw bytes without the CLI's own resizing, and blocks that carry only a ACP also sends a |
| RPC mode ( Images sent with |
What is accepted
| Question | Codex CLIchecked at 0.162.1 | Claude Codechecked at 2.1.299 | Cursor Agentchecked at 2026.10.12-d47ca18 | OpenCodechecked at 2.0.28 | pichecked at 1.2.0 |
|---|---|---|---|---|---|
| Formats, limits and resizing | PNG, JPEG, GIF and WebP are accepted. PNG, JPEG and WebP are sent unchanged when no resize is needed, and anything else, including GIF, is re-encoded as PNG. Images are scaled down to at most 2048 px on the long side and 2,500 32-px tiles, so roughly 1600x1600 for a square image, and the model is told the original and new sizes. With An unreadable or unsupported file (for example SVG, BMP or HEIC) does not stop the turn. The model gets a text note saying the image is invalid or unsupported.
Clipboard pastes are always saved as PNG. Source | PNG, JPEG, GIF and WebP are sent as images; macOS TIFF screenshots, WSL BMP clipboards and CMYK JPEGs are converted first. Claude Code downscales anything over 2000x2000 px and compresses pasted, attached and Read-tool images to the same token budget, re-encoding a still-over-500KB result as JPEG. Requests are capped at 32 MB, and when the API's per-request image count or Claude Code's total image size cap would be exceeded, the oldest images and PDFs are dropped in batches. An image Claude Code cannot decode or resize is refused with a message telling you to convert it to PNG, JPEG, GIF or WebP. PDFs are separate: Read takes up to 20 pages per call for PDFs over 10 pages, and the API limit is 100 pages / 20 MB. Source | Images attached to a message must be PNG, JPEG, GIF or WebP (checked by file signature). In CLI 2026.10.12, attachments are scaled to fit 2048x2048 and re-encoded as JPEG (quality 80), with quality and size stepped down until the image is at most 5 MiB. Images the agent opens with its read tool are re-encoded as WebP at no more than 1280 px on the long side and 1 MiB. The CLI sets no per-message image count limit; the Cloud Agents API allows at most 5 images per prompt. Source | Partly Only PNG, JPEG, GIF and WebP reach the model. AVIF, BMP and other binaries are accepted but left out of the request, and SVG is sent as text. Each attachment can be up to 20 MiB decoded. Images over 2000x2000 px or 5 MiB of base64 are scaled down and re-encoded as PNG or JPEG; set this under v1's The media type is detected from the file bytes, so renaming a file does not change it. Source | Files are detected by content as PNG, JPEG, GIF, WebP or BMP (BMP is converted to PNG). By default ( An image that cannot be converted or shrunk below the limit is dropped and replaced by a text note such as Animated PNGs are not recognised as images. Source |
| An image with no text | Yes in the TUI: attach or paste an image and press Enter with no text, and the message is sent as just | Not documented The terminal docs don't say whether a prompt holding only a pasted image is accepted; a paste does leave an | Partly In the interactive CLI you can submit a prompt that contains only an attached image, but its | In the TUI, yes: the | Yes. |
| Models that can't see images | If the model's catalog entry doesn't list image input, the TUI refuses the attachment with If the model catalog can't be read, the TUI assumes the model supports images. Source | Not documented Claude Code runs Claude models, which all accept images, so there is no documented fallback for a model that can't see them. If the API refuses an image (too large, too many, or unprocessable), Claude Code swaps that image for a text placeholder or drops the oldest images and retries, and Claude no longer sees them. Behaviour with a non-Claude model behind | Not documented Cursor does not document what happens when the selected model cannot read images. In CLI 2026.10.12, the CLI never checks the model's image support itself; images go to Cursor's backend with the request, and any refusal comes from there. Source | The image is replaced by | Pi replaces each image with |
Afterwards
| Question | Codex CLIchecked at 0.162.1 | Claude Codechecked at 2.1.299 | Cursor Agentchecked at 2026.10.12-d47ca18 | OpenCodechecked at 2.0.28 | pichecked at 1.2.0 |
|---|---|---|---|---|---|
| Kept in the saved session | Yes. Each image is saved inline as a base64 data URL inside the session rollout under
Rollouts with screenshots can get large because the bytes are stored inline. Source | Partly The session transcript ( With If Claude needs a dropped or compacted image again, share it again. Source | Partly Image bytes are stored with the user message in the local chat store, so | Partly Attachments are stored as base64 in the session message, so resuming or forking keeps the pixels. After summary compaction, the kept recent conversation is converted to text and images become | Partly Image blocks are stored as base64 inside the session JSONL (user attachments and Images are encoded once at their first resize; changing models later does not re-encode stored images. Source |
| The agent opening images itself | Yes. The built-in The tool is unavailable on text-only models, and App Server clients see each use as an | Yes. The Read tool returns PNG, JPEG and other image files as visual content Claude can see, resized and recompressed to fit the model's limits, and reads PDFs page by page. Images returned by MCP tools (for example browser screenshots from Claude in Chrome or Playwright) are shown inline and also saved to the session's For fine detail in a large screenshot, ask Claude to crop the region first (for example with ImageMagick), since the copy it sees may be downscaled. Read detects the format from the file bytes, not the extension; a non-image saved as | Yes. The read tool returns image pixels for Attached and generated images show as inline previews in terminals that support inline images. Source | Yes. | Yes. The built-in |