Skip to content

Core features

Monaco editor & diffs

The editor panel is Monaco — the editor VS Code is built on — running inside the canvas.

Opening files

⇧⌘E opens an editor panel, ⌘P is the quick file finder and ⌘S saves. The file tree in the sidebar (⇧⌘X) is git-aware, so a modified file is marked as modified while you are looking at it.

TypeScript, JavaScript and Python files get completion, hover, go to definition, references, rename and diagnostics from a local language server, the same one your agents query. Go, Rust, C and C++ files get the same when gopls, rust-analyzer or clangd is installed and on your PATH. See LSP and tools for agents.

Reading what an agent changed

This is why the editor sits on the canvas next to the agents: a side-by-side diff of everything the agent touched, in the same view where the agent is still working.

 export async function refresh(t: Token) {
-  const res = await fetch(URL, { method: "POST" })
+  const res = await withRetry(() =>
+    fetch(URL, { method: "POST", signal }))
   if (!res.ok) throw new AuthError(res.status)
   return res.json() as Promise<Session>
 }

Read it, keep it or drop it — before it merges anywhere.

When an agent edits the same file

You have unsaved changes, and an agent writes to the same file. Catenary never overwrites what you typed. A strip appears above the editor: Changed on disk. Your unsaved edits are kept.

ButtonWhat it does
View diffShows the version on disk against your unsaved changes
ReloadTakes the version on disk
Keep mineKeeps your buffer; the next save writes it over the disk
Keep bothMerges the two. Edits that do not overlap combine; the ones that do get conflict markers, for you to review before saving

With no unsaved changes there is nothing to protect, and the editor simply reloads. If the file is deleted while it is open, the strip says so and offers Save to restore.

Previews

A Markdown file has a Source | Split | Preview switch at the top right, and ⇧⌘V toggles the preview. It renders tables and task lists, > [!NOTE] callouts, Mermaid diagrams and math, through KaTeX.

A Jupyter notebook (.ipynb) opens as a notebook, read-only: the Markdown cells as in the preview, the code colored by the editor and the outputs as the notebook saved them. Nothing runs, because there is no kernel. Open as JSON shows the raw file.

PDF, .docx and image files open in a document panel.

Hold ⌘ and click a http://, https:// or mailto: link in the editor, and it opens in your default browser.

⇧⌘F opens content search across the workspace, backed by ripgrep: literal or regex, case and whole-word options, include and exclude globs, and .gitignore respected by default.

Tabs and panels

One editor panel holds one file, the same way a terminal panel holds one session. Two files side by side means two panels — that is what the canvas is for. Drop several of them into the same dock zone and they stack as tabs there instead.

A single click in the file tree opens a preview panel: the next single click reuses it rather than piling up another one. Double-click the file, or edit it, and the panel is kept.

Back to home