**The primary skill for terminal TUI components.** Covers spawning, controlling, and interacting with terminal canvases. Use when displaying calendars, documents, or flight bookings.
Start here when using terminal canvases. This skill covers the overall workflow, canvas types, and IPC communication.
Try asking things like:
Calendar:
Document:
Flight:
Canvas provides interactive terminal displays (TUIs) that can be spawned and controlled via OpenCode tools. Each canvas type supports multiple scenarios for different interaction modes.
| 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 |
| Tool | Purpose |
|---|---|
canvas_spawn | Spawn a canvas in tmux split pane |
canvas_env | Detect terminal environment (tmux, mouse support) |
canvas_update | Send configuration updates to active canvas |
canvas_close | Close an active canvas |
canvas_get_selection | Get text selection from document canvas |
canvas_get_content | Get full content from document canvas |
| Tool | Purpose |
|---|---|
canvas_display_document | Display markdown document (read-only) |
canvas_edit_document | Open document for text selection |
canvas_pick_meeting_time | Calendar picker for scheduling |
canvas_display_calendar | Display calendar events (read-only) |
Check environment first:
Use canvas_env to verify tmux is available
Spawn a canvas:
Use canvas_spawn with kind="calendar", scenario="meeting-picker"
Or use high-level tools:
Use canvas_display_document with content="# Hello\n\nMarkdown here."
Interactive canvases communicate via Unix domain sockets.
Canvas -> Controller:
{ type: "ready", scenario } // Canvas is ready
{ type: "selected", data } // User made a selection
{ type: "cancelled", reason? } // User cancelled
{ type: "error", message } // Error occurred
Controller -> Canvas:
{ type: "update", config } // Update canvas configuration
{ type: "close" } // Request canvas to close
{ type: "ping" } // Health check
The canvas CLI is also available for standalone use:
# 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 '{...}'
| Skill | Purpose |
|---|---|
calendar | Calendar display and meeting picker details |
document | Document rendering and text selection |
flight | Flight comparison and seat map details |