The Canvas Editor
Canvas is the web application where you read, edit, collaborate on, and export an investment memo. After Memosa analyzes a deal’s documents, the resulting memo lands in Canvas as a fully-formed, section-by-section draft — your starting point, not a blank page.
The editor is a WYSIWYG document surface built on ProseMirror. You see the rendered memo — headings, prose, tables, charts, footnotes, images — and edit it directly, the way you would in a familiar document editor. There is no separate “source” and “preview”; what you see is the document.
How the drafted memo arrives
Section titled “How the drafted memo arrives”You never start Canvas from scratch. The memo is produced upstream by the analysis pipeline (the LangGraph worker), then handed to Canvas:
- The worker analyzes the deal’s PDFs, Excel models, and CoStar exports and writes each memo section as markdown to durable storage (Postgres, via the Store).
- When you open the deal in Canvas, the app issues
GET /api/canvas/{deal_id}, pulls the stored markdown, and parses it into the editor. - The memo opens in the Draft state — freshly loaded, untouched by any human editor.
If the deal is still being analyzed when you open it, Canvas shows generation progress (GET /api/canvas/{deal_id}/progress) rather than an empty memo. The full intake flow is covered in Slack intake and web chat intake.
The editing surface
Section titled “The editing surface”A memo is organized into sections — Executive Summary, the investment thesis, risk, comparables, financial analysis, and so on. Each section is a first-class block in the document. As you work, Canvas tracks per-section state (draft, editing, reviewed, approved) alongside the document-level lifecycle, which drives the AI-assisted revision and review workflows.
The editor supports the full range of memo content:
| Content | What you can do |
|---|---|
| Headings & prose | Edit text directly; standard formatting (bold, italic, lists, links, alignment) |
| Tables | Edit cells, alignment, and styling; tables round-trip through save/load |
| Charts | Decision-oriented charts rendered inline — see Charts |
| Images | Deal imagery with crops and captions — see Image Intelligence |
| Footnotes & citations | Every factual claim carries a [SRC:n] citation linked to a source document |
| Comments | Threaded review anchored to text or sections — see Comments and Feedback |
| AI suggestions | Proposed edits you accept or reject — see Editing and AI Suggestions |
Editor modes
Section titled “Editor modes”What you can do in the editor depends on your deal role and the document’s state. Canvas exposes three modes, mirroring the model you already know from collaborative document tools:
- Viewing — read-only. You can select text and read comments, but not change the document.
- Suggesting — your typing becomes tracked suggestions (proposed edits) rather than direct changes. Someone with edit rights accepts or rejects them.
- Editing — direct edits that change the document immediately.
Your role determines which modes are available. A viewer is always in viewing mode; a commenter works in suggesting mode; an owner or editor gets all three and can switch freely. The mode is a per-user preference — your choice has no effect on anyone else in the same memo. The full mapping is documented in Roles and Permissions and Editing and AI Suggestions.
Autosave
Section titled “Autosave”You do not manually manage files. Canvas autosaves your work: edits are debounced and persisted in the background to both Redis (fast session state) and the durable Store (decomposed by section). You can also save explicitly with ⌘ S.
The first save on a fresh memo automatically promotes the document from Draft to Editing — the moment a human touches the memo, it stops being a pristine pipeline draft. If a save fails (for example, during a network blip), Canvas surfaces a toast so you know the edit did not persist; it does not fail silently.
What comes next
Section titled “What comes next”Once the memo reads the way you want it, you move it through its lifecycle — Draft → Editing → Approved — and approval unlocks exports (the Investor Packet, a Canvas PDF, and OMCMS publishing). Read Document Lifecycle for exactly what each state means, and the approval gate for what approval unlocks.
Sources
Section titled “Sources”src/canvas/models/section_lifecycle.py—DocumentState(DRAFT/EDITING/APPROVED) and the per-section state machinesrc/canvas/routes/canvas_routes.py—GET /api/canvas/{deal_id},GET .../progress,POST .../save(autosave, draft→editing promotion, permission matrix)src/canvas/services/session_manager.py— session restore, markdown decomposition into sections, per-section state initializationcanvas-ui/src/types/editorMode.ts— the three editor modes (viewing / suggesting / editing) and their definitionscanvas-ui/src/components/document/DocumentView.tsx— debounced autosave and save-failure toastCLAUDE.md— Canvas tech stack (FastAPI + React, ProseMirror WYSIWYG), markdown boundarymemory/prosemirror_roundtrip_contract.md— the Python↔TypeScript markdown boundary and what survives the round-trip