Skip to content

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.

You never start Canvas from scratch. The memo is produced upstream by the analysis pipeline (the LangGraph worker), then handed to Canvas:

  1. 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).
  2. 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.
  3. 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.

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:

ContentWhat you can do
Headings & proseEdit text directly; standard formatting (bold, italic, lists, links, alignment)
TablesEdit cells, alignment, and styling; tables round-trip through save/load
ChartsDecision-oriented charts rendered inline — see Charts
ImagesDeal imagery with crops and captions — see Image Intelligence
Footnotes & citationsEvery factual claim carries a [SRC:n] citation linked to a source document
CommentsThreaded review anchored to text or sections — see Comments and Feedback
AI suggestionsProposed edits you accept or reject — see Editing and AI Suggestions

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.

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.

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.

  • src/canvas/models/section_lifecycle.pyDocumentState (DRAFT/EDITING/APPROVED) and the per-section state machine
  • src/canvas/routes/canvas_routes.pyGET /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 initialization
  • canvas-ui/src/types/editorMode.ts — the three editor modes (viewing / suggesting / editing) and their definitions
  • canvas-ui/src/components/document/DocumentView.tsx — debounced autosave and save-failure toast
  • CLAUDE.md — Canvas tech stack (FastAPI + React, ProseMirror WYSIWYG), markdown boundary
  • memory/prosemirror_roundtrip_contract.md — the Python↔TypeScript markdown boundary and what survives the round-trip