Attachments — images and files in a message

Shipped

View as Markdown

An attachment is an image or a text file you send alongside your message. The model reads it as part of the turn — describing a screenshot, reviewing a log, answering questions about a config file. What you can attach depends on the model you brought: the app only offers what the model advertises it can read.

Why it matters

A prompt is text, but the thing you actually want help with often isn't. An attachment lets you hand the model the artifact itself — a photo, an error log, a CSV — instead of retyping or describing it. And because the attach options are driven by the model's advertised capabilities, the app never lets you send an image to a model that would reject the whole turn for it.

What you can attach

Source-code files of every kind are read as plain text; the model still sees the real filename, so it knows it's looking at, say, a Dart file rather than a Python one.

Attaching one

The composer's attach button opens a short menu. Which entries appear depends on what the model accepts:

Each attachment shows in the composer before you send — an image as a thumbnail, a file as a document chip — and you can remove any of them before sending. The attach button itself is hidden entirely when the model accepts neither images nor files, so it's never a dead control.

How the model receives it

If you switch a conversation to a model that can't read an image already in it, the turn still runs: the image is left out of the request and the app shows a warning saying so, rather than failing the send. The point is that a model swap never silently breaks a turn.

Where attachments live

Attachment bytes are stored encrypted on your device, in a blob store separate from the conversation database, and are cleaned up when you delete the message or conversation that referenced them. This is the same local-first, encrypted-at-rest handling the rest of your data gets — see Local-first & private by design.

What it doesn't do yet