--- description: "Terminal canvas for content drafting with live preview. Start split-pane sessions for email, message, and document composition. Triggers on: canvas, draft, compose, write content." experimental: true --- # Canvas - Terminal Content Drafting > ⚠️ **EXPERIMENTAL** - This feature is under active development. APIs may change. Requires Warp terminal for best experience. Terminal canvas for interactive content drafting with Claude. Creates a split-pane experience in Warp terminal where Claude writes content and you see live markdown preview. ## Arguments $ARGUMENTS - `start [--type email|message|doc]`: Initialize canvas session - `write "content"`: Write/update content in canvas - `read`: Read current canvas content back - `clear`: Clear canvas content - `close`: End canvas session and clean up ## Architecture ``` /canvas [options] │ ├─→ /canvas start [--type email|message|doc] │ ├─ Create .claude/canvas/ directory │ ├─ Initialize content.md with template │ ├─ Initialize meta.json with state │ ├─ Detect Warp terminal │ └─ Output setup instructions │ ├─→ /canvas write "content" │ ├─ Write content to .claude/canvas/content.md │ ├─ Update meta.json timestamp │ └─ Canvas TUI auto-refreshes │ ├─→ /canvas read │ ├─ Read .claude/canvas/content.md │ └─ Return content for Claude to process │ ├─→ /canvas clear │ ├─ Clear content.md (keep structure) │ └─ Reset meta.json │ └─→ /canvas close ├─ Optional: copy content to clipboard └─ Clean up .claude/canvas/ ``` --- ## Workflow ### Starting a Canvas Session ``` User: "Help me draft an email to my manager about the project delay" Claude: I'll help you draft that email. Starting canvas mode... [Executes internally:] 1. mkdir -p .claude/canvas 2. Write email template to .claude/canvas/content.md 3. Write meta.json with contentType: "email" [Output:] Canvas initialized with email template. To see live preview: 1. Press Cmd+Shift+D (or Ctrl+Shift+D on Windows) to split pane 2. In the new pane, run: canvas-tui --watch ``` ### Writing Content ``` [Claude writes the email draft:] /canvas write "# Email Draft **To:** manager@company.com **Subject:** Project Timeline Update --- Hi Sarah, I wanted to give you a heads-up about a delay in the Phoenix project... Best regards, [Name]" [Canvas TUI instantly shows the rendered markdown] ``` ### Reading Edits ``` User: "I edited the email in the canvas, can you make it more formal?" [Claude reads current content:] /canvas read [Returns content from .claude/canvas/content.md with user's edits] [Claude can now rewrite based on user's changes] ``` --- ## Execution ### /canvas start **Step 1: Create IPC Directory** ```bash mkdir -p .claude/canvas ``` **Step 2: Select Template** Based on `--type` flag (default: doc): | Type | Template | |------|----------| | email | Subject line, To/CC fields, greeting, body, signature | | message | Casual format for Slack/Teams/Discord | | doc | Structured markdown with sections | **Step 3: Initialize Files** Write `.claude/canvas/content.md`: ```markdown # Email Draft **To:** **Subject:** --- Hi [Name], [Your message here] Best regards, [Your name] ``` Write `.claude/canvas/meta.json`: ```json { "version": "1.0", "contentType": "email", "mode": "view", "claudeLastWrite": "2025-01-08T10:30:00Z", "userLastEdit": null } ``` **Step 4: Output Instructions** ``` Canvas ready with email template. Setup (one-time): cd claude-mods/canvas-tui && npm link To view canvas: 1. Split your terminal (Cmd+Shift+D in Warp) 2. Run: canvas-tui --watch I'll write your content and you'll see it update in real-time. ``` ### /canvas write **Parameters:** - Content (required): Markdown string to write **Execution:** 1. Ensure `.claude/canvas/` exists 2. Write content to `.claude/canvas/content.md` 3. Update `meta.json` with `claudeLastWrite` timestamp 4. Canvas TUI detects change via chokidar and re-renders **Output:** ``` Content updated in canvas. ``` ### /canvas read **Execution:** 1. Read `.claude/canvas/content.md` 2. Return content as string **Use Case:** After user edits content in canvas, Claude reads it back to incorporate changes. ### /canvas clear **Execution:** 1. Read current `meta.json` to preserve contentType 2. Write empty template to `content.md` 3. Reset timestamps in `meta.json` ### /canvas close **Execution:** 1. Optionally copy final content to clipboard (if requested) 2. Remove `.claude/canvas/` directory 3. Confirm cleanup --- ## Templates ### Email Template ```markdown # Email Draft **To:** **CC:** **Subject:** --- Hi [Name], [Your message here] Best regards, [Your name] --- *Draft started: {timestamp}* ``` ### Message Template ```markdown # Message Draft **To:** #channel / @person --- [Your message here] --- *Draft started: {timestamp}* ``` ### Document Template ```markdown # Document Title ## Overview [Brief description] ## Details [Main content] ## Summary [Key takeaways] --- *Draft started: {timestamp}* ``` --- ## Integration ### Warp Launch Configuration Install the launch config for one-click split pane setup: **Location:** `~/.warp/launch_configurations/claude-canvas.yaml` ```yaml name: Claude Canvas windows: - tabs: - title: Claude Canvas color: Blue layout: split_direction: vertical panes: - is_focused: true - commands: - exec: "canvas-tui --watch" ``` **Usage:** 1. Open Warp Command Palette (Cmd+P) 2. Search "Claude Canvas" 3. Select to open split layout ### Canvas TUI Package ```bash # Link globally from claude-mods repo cd claude-mods/canvas-tui && npm link # Then use from anywhere canvas-tui --watch # Watch .claude/canvas/content.md canvas-tui --file ./draft.md # Watch specific file canvas-tui --help # Show help ``` --- ## File Locations | File | Purpose | |------|---------| | `.claude/canvas/content.md` | Shared content file | | `.claude/canvas/meta.json` | Session metadata | | `~/.warp/launch_configurations/claude-canvas.yaml` | Warp split config | --- ## Notes - Canvas TUI is view-only in MVP; edit mode planned for Phase 2 - File watching uses chokidar with 100ms debounce - Works best with Warp terminal but compatible with any terminal that supports split panes - Content persists until `/canvas close` is called