canvas
Spawn and control interactive terminal displays (calendars, documents, flights) with real-time IPC communication
View on GitHubTable of content
Spawn and control interactive terminal displays (calendars, documents, flights) with real-time IPC communication
Installation
npx claude-plugins install @dvdsgl/claude-canvas/canvas
Contents
Folders: commands, skills, src
Files: CLAUDE.md, README.md, package.json, run-canvas.sh
Documentation
Interactive terminal TUI components for Claude Code.
Overview
Canvas provides spawnable terminal displays (calendars, documents, flight booking) with real-time IPC communication. Claude can spawn these TUIs in tmux split panes and receive user selections.
Canvas Types
| Type | Description |
|---|---|
calendar | Display events, pick meeting times |
document | View/edit markdown documents |
flight | Compare flights and select seats |
Installation
# Add as Claude Code plugin
claude --plugin-dir /path/to/claude-canvas/canvas
# Or via marketplace
/plugin marketplace add djsiegel/claude-canvas
/plugin install claude-canvas@canvas
Usage
# Show calendar in current terminal
bun run src/cli.ts show calendar
# Spawn meeting picker in tmux split
bun run src/cli.ts spawn calendar --scenario meeting-picker --config '{"calendars": [...]}'
# Spawn document editor
bun run src/cli.ts spawn document --scenario edit --config '{"content": "# Hello"}'
Commands
/canvas- Interactive canvas spawning
Skills
canvas- Main skill with overview and IPC detailscalendar- Calendar display and meeting pickerdocument- Markdown rendering and text selectionflight- Flight comparison and seatmaps
Requirements
- tmux - Canvas spawning requires a tmux session
- Bun - Runtime for CLI commands
- Terminal with mouse support - For interactive scenarios
License
MIT
Included Skills
This plugin includes 4 skill definitions:
calendar
|
View skill definition
Calendar Canvas
Display calendar views and enable interactive meeting time selection.
Example Prompts
Try asking Claude:
- “Schedule a 30-minute meeting with Alice and Bob sometime next week”
- “Find a time when the engineering team is all free on Tuesday”
- “Show me my calendar for this week”
- “When is everyone available for a 1-hour planning session?”
- “Block off 2-4pm on Friday for focused work”
Scenarios
display (default)
View-only calendar display. User can navigate weeks but cannot select times.
bun run src/cli.ts show calendar --scenario display --config '{
"title": "My Week",
"events": [
{"id": "1", "title": "Meeting", "startTime": "2025-01-06T09:00:00", "endTime": "2025-01-06T10:00:00"}
]
}'
meeting-picker
Interactive scenario for selecting a free time slot when viewing multiple people’s calendars.
- Shows multiple calendars overlaid with different colors
- User can click on free slots to select a meeting time
- Selection is sent back via IPC
- Supports configurable time slot granularity (15/30/60 min)
bun run src/cli.ts spawn calendar --scenario meeting-picker --config '{
"calendars": [
{
"name": "Alice",
"color": "blue",
"events": [
{"id": "1", "title": "Standup", "startTime": "2025-01-06T09:00:00", "endTime": "2025-01-06T09:30:00"}
]
},
{
"name": "Bob",
"color": "green",
"events": [
{"id": "2", "title": "Call", "startTime": "202
...(truncated)
</details>
### canvas
> |
<details>
<summary>View skill definition</summary>
# Canvas TUI Toolkit
**Start here when using terminal canvases.** This skill covers the overall workflow, canvas types, and IPC communication.
## Example Prompts
Try asking Claude things like:
**Calendar:**
- "Schedule a meeting with the team next week"
- "Find a time when Alice and Bob are both free"
**Document:**
- "Draft an email to the sales team about the new feature"
- "Help me edit this document — let me select what to change"
**Flight:**
- "Find flights from SFO to Denver next Friday"
- "Book me a window seat on the morning flight"
## Overview
Canvas provides interactive terminal displays (TUIs) that Claude can spawn and control. Each canvas type supports multiple scenarios for different interaction modes.
## Available Canvas Types
| Canvas | Purpose | Scenarios |
|--------|---------|-----------|
| `calendar` | Display calendars, pick meeting times | `display`, `meeting-picker` |
| `document` | View/edit markdown documents | `display`, `edit`, `email-preview` |
| `flight` | Flight comparison and seat selection | `booking` |
## Quick Start
```bash
cd ${CLAUDE_PLUGIN_ROOT}
# Run canvas in current terminal
bun run src/cli.ts show calendar
# Spawn canvas in new tmux split
bun run src/cli.ts spawn calendar --scenario meeting-picker --config '{...}'
Spawning Canvases
Always use spawn for interactive scenarios - this opens the canvas in a tmux split pane while keeping the conversation terminal available.
bun run src/cli.ts spawn [kind] -
...(truncated)
</details>
### document
> |
<details>
<summary>View skill definition</summary>
# Document Canvas
Display markdown documents with optional text selection and diff highlighting.
## Example Prompts
Try asking Claude:
- "Draft an email to the marketing team about the Q1 product launch"
- "Help me edit this blog post — show it so I can highlight the parts to revise"
- "Write a project proposal and let me review it"
- "Show me the README so I can select sections to update"
- "Compose a response to this customer complaint"
## Scenarios
### `display` (default)
Read-only document view with markdown rendering. User can scroll but cannot select text.
```bash
bun run src/cli.ts show document --scenario display --config '{
"content": "# Hello World\n\nThis is **markdown** content.",
"title": "My Document"
}'
edit
Interactive document view with text selection. User can click and drag to select text, which is sent via IPC in real-time.
- Renders markdown with syntax highlighting (headers, bold, italic, code, links, lists, blockquotes)
- Diff highlighting: green background for additions, red for deletions
- Click and drag to select text
- Selection automatically sent via IPC
bun run src/cli.ts spawn document --scenario edit --config '{
"content": "# My Blog Post\n\nThis is the **introduction** to my post.\n\n## Section One\n\n- Point one\n- Point two",
"title": "Blog Post Draft",
"diffs": [
{"startOffset": 50, "endOffset": 62, "type": "add"}
]
}'
email-preview
Specialized view for email content display.
bu
...(truncated)
</details>
### flight
> |
<details>
<summary>View skill definition</summary>
# Flight Canvas
Cyberpunk-themed flight comparison and seat selection interface.
## Example Prompts
Try asking Claude:
- "Find flights from San Francisco to Denver on January 15th"
- "Book me a window seat on the cheapest nonstop to NYC"
- "Compare morning flights from LAX to Seattle next Monday"
- "I need a business class seat to Chicago with extra legroom"
- "Show me United flights to Boston under $300"
## Scenarios
### `booking` (default)
Interactive flight comparison and seat selection.
- Shows flight options with airline, times, duration, and price
- Interactive seat map for seat selection
- Keyboard navigation between flights and seats
- Returns selected flight and seat via IPC
```bash
bun run src/cli.ts spawn flight --scenario booking --config '{
"title": "// FLIGHT_BOOKING_TERMINAL //",
"flights": [
{
"id": "ua123",
"airline": "United Airlines",
"flightNumber": "UA 123",
"origin": {
"code": "SFO",
"name": "San Francisco International",
"city": "San Francisco",
"timezone": "PST"
},
"destination": {
"code": "DEN",
"name": "Denver International",
"city": "Denver",
"timezone": "MST"
},
"departureTime": "2026-01-08T12:55:00-08:00",
"arrivalTime": "2026-01-08T16:37:00-07:00",
"duration": 162,
"price": 34500,
"currency": "USD",
"cabinClass": "economy",
"aircraft": "Boeing 737-800",
"stops": 0,
"seatmap
...(truncated)
</details>
## Source
[View on GitHub](https://github.com/dvdsgl/claude-canvas)