# Transcript **Status:** Implemented · **Code:** `Scripts/transcript.js` Nova sidebars hold only tree rows, so the readable conversation lives in an editor tab as Markdown. ## Where it lives `/Claude Transcript.md` (global storage when the window has no workspace). A real file rather than an untitled document so the tab has a name, survives restarts, and can be saved without a dialog. ## Incremental rendering `build()` produces the whole document; `_render()` diffs it against the previous render, finds the common prefix, and replaces only the differing tail: ```js edit.replace(new Range(prefix, current.length), text.slice(prefix)); ``` Because output is append-mostly, the common prefix is usually the entire previous text — one small edit at the end. This is what keeps scroll position and selection stable while tokens stream in. Renders are throttled to 140ms; `flush()` forces one and saves. The viewport is only auto-scrolled when the caret was already at the end, so a user reading earlier history is not yanked around. ## Format notes - Tool results are fenced and truncated to 12 lines / 1200 chars. - `Read` results are replaced by `read N lines` — echoing file contents Claude just read buries the conversation. - Fences widen past any backtick run in the body, so fenced content can't break out. - Thinking is rendered as a blockquote, controlled by `claudenova.showThinking`. ## Gotchas - The document is user-editable. `_render()` diffs against the *document's* current text, not a cached copy, so manual edits are overwritten rather than corrupting the diff. - `editor.onDidDestroy` clears the cached editor; the next `show()` reopens it.