Attaching files and images
How to attach files to a task in the web app, drop or paste any file — images or documents — directly into task text, and use the CLI to upload, list, and download attachments.
CodeHerder gives you two ways to add files to a task: file attachments sit alongside the task as downloadable files in the Attachments section, and inline content is embedded directly into task text fields when you drop or paste a file there. The two overlap: when you drop or paste a file into a text field on a saved task, CodeHerder uploads it as a task attachment and the file also appears in the Attachments section.
Any member of the workspace can open any attachment. Agents are narrower: an agent working on a task reads only that task’s own attachments — including anything you dropped or pasted into the task’s text — so attach a file to the task whose agent needs it.
File attachments
Every task has an Attachments section on its detail page in the web app. Use it to attach supporting files — screenshots, specs, logs, or any other reference material.
To attach a file:
- Open the task detail page.
- Find the Attachments section.
- Click Attach file and choose a file from your computer.
CodeHerder uploads the file and adds it to the list. Any file type is accepted; the maximum file size is 50 MB. This picker takes one file at a time — drop or paste files instead (see below) if you want to add several at once.
Each row in the list shows the file name and size. From the list you can:
- Click Download to save a copy of the file to your computer.
- Click Delete to remove the attachment. CodeHerder asks you to confirm first, since the file is permanently removed from storage.
Adding files and images inline
Any Markdown text field in the web app — the task description, acceptance criteria, a new comment, and other custom text fields — accepts files dropped or pasted directly in. You can drop or paste any file type, including documents, spreadsheets, PDFs, and images.
One exception: editing a comment you’ve already posted works differently — a pasted image still displays inline but never joins the Attachments section, and a non-image file can’t be added at all; add files while writing the comment the first time, or use the Attachments section instead.
To paste a file: Copy a file or image to your clipboard, click inside a text field, then press Ctrl+V (or Cmd+V on macOS).
To drag a file: Drag one or more files from your file manager and drop them onto a text field.
You can drop or paste multiple files at once — CodeHerder inserts a placeholder for each one immediately so you can keep writing, uploads them in the background, then replaces each placeholder with the final content once the upload is complete. If an upload fails, its placeholder is removed and an error message appears.
How a file appears in the rendered text depends on its type:
- Images (PNG, JPEG, GIF, WebP) are rendered inline as images.
- All other file types appear as a chip showing a file-type icon, the file name, and a download button.
On a saved task, a file you drop or paste into a text field is also uploaded as a task attachment and appears in the task’s Attachments section — so it is accessible from both places. The size limit is the same as any other attachment: 50 MB.
When creating a new task, files you drop or paste into the description are uploaded as attachments once you submit the form, also up to 50 MB. The one exception is an image (PNG, JPEG, GIF, or WebP) pasted or dropped before you submit: while the task doesn’t exist yet, it’s held to a smaller 10 MB limit. Once you submit the form, that image becomes a regular attachment on the new task like everything else, and the same 50 MB ceiling applies to anything you add afterwards.
Managing attachments from the CLI
The ch CLI provides three commands for working with attachments — there is no separate “image” concept; everything is an attachment. Like most ch task commands, each one defaults its task argument from CH_TASK_ID when you omit it — see Agents and the CLI.
Upload a file:
ch task attach <taskId> <file>
This uploads the local file as a task attachment and prints its ID and download URL. Use --name <n> to store it under a different name than the local file’s. The file can be up to 50 MB.
To embed an image inline (rather than attach it as a separate file), add --embed; the command uploads it, adopts it as a task attachment so it also appears in ch task attachments, and prints a paste-ready inline-image markdown snippet you can drop straight into a description or comment. --embed ignores --name — CodeHerder assigns the embedded image its own file name automatically. It only accepts PNG, JPEG, GIF, or WebP, capped at 10 MB. For a larger image, attach it as a regular file instead (up to 50 MB) and link to it, or open the task and paste the image directly into a comment.
List a task’s attachments:
ch task attachments <taskId>
This lists every uploaded attachment together with any images embedded in the task’s description or custom text fields that haven’t already been adopted as an attachment. Each row shows KIND, ID, SIZE, NAME, and URL — KIND reads attachment for an uploaded file and embedded for an image found in the task’s text that isn’t an attachment yet. If the task has no attachments, a message is printed to indicate that.
For machine-readable output:
ch task attachments <taskId> --json
Download an attachment to a local file:
ch task attachment <taskId> <id>
Pass the ID shown by ch task attachments (a bare UUID, a /files/<uuid> token, or a /img/<uuid> token). CodeHerder saves the file to a temporary file and prints the path so you can open or process it immediately.
To save to a specific path instead of a temporary file:
ch task attachment <taskId> <id> --out ./screenshot.png
For writing task descriptions and acceptance criteria, see Writing tasks an agent can build. For the full ch task command reference, see Agents and the CLI.
