/workspace. The
Editor and Bash tools read and write it, the files panel lists it, and the
canvas renders one file at a time beside the conversation.
Where files live
~/report.md and /workspace/report.md
both resolve to the same file, traversal outside the workspace is refused, and
/tmp raises an explicit error because every bash command gets its own /tmp
that no other tool can see.
Scratch belongs in .tmp/. It is hidden from the files panel and cleaned up, so
intermediate downloads and working data do not clutter what the user sees.
Opening a file on the canvas
TheCanvas tool opens one finished file in the side panel.
ui event:
What the canvas renders
Rendering is read-only. Any failure, including an unreachable service or an
unparseable file, falls back to the download card rather than an error page.
Configuring office rendering
Spreadsheets and.docx render from raw bytes in the browser and need no
service. Presentations and the PDF fallback call a shared render service,
configured with two environment variables:
.cache/office/ directory in the workspace, so
reopening a deck does not repay the conversion.
Uploads
Users attach files in the composer. The loop ingests them before the model call: images and PDFs go to the model as media when.vision(True), and every
attachment is written into the workspace so tools can open it.
.vision(False). The attachment stays in the
workspace and the model receives a note naming the file, which it can then read
with a tool.
The HTTP API
Files are also a REST surface, which is what the files panel and mobile clients use. All routes require auth.
Deleting moves a file to trash and keeps it restorable for thirty days through
GET /trash, POST /trash/{id}/restore and DELETE /trash/{id}.
Sharing
Next
Connectors and MCP
Let a user connect an account, then give tools the credential.