Skip to main content

The Agent Canvas

Generative UI, Live Observability, and Agent-Built Dashboards Open source (MIT). Part of the OpenPawz project.

The Problem

Today’s AI agents are black boxes that output text. You ask an agent to analyze your CI pipeline, and it writes four paragraphs. You ask it to monitor your portfolio, and it dumps a table into a chat bubble. You ask it to track a deployment, and it says “done” — but you can’t see anything. This creates three pain points that compound as agents get more capable:
  1. Invisible execution. What is the agent doing right now? Why has it been “thinking” for 12 seconds? Which tools did it call, and in what order? Debugging agent behavior means reading logs — the equivalent of debugging a web app by reading console.log output in a text file.
  2. Flat output. Agents produce text, but humans think in dashboards, charts, and spatial layouts. A trading agent should show you a live P&L curve, not a paragraph describing your positions. A research agent should show you a structured findings table, not a wall of markdown.
  3. Ephemeral results. Even when an agent produces useful structured data, it vanishes when you scroll up. There’s no persistent surface where agent-generated insights accumulate and stay accessible.
Microsoft’s “Golden Triangle” — AG-UI, DevUI, and OpenTelemetry — identifies these exact gaps. The Agent Canvas is how Pawz solves all three in a single, coherent architecture.

The Invention

The Agent Canvas introduces three layers that work together: Each layer is independently useful. Together they transform Pawz from “chat with an agent” to “work with an agent that shows you what it’s doing and what it found.”

Layer 1: The Canvas — Generative UI

What Exists Today

Pawz already has a generative UI primitive: the skill output system. Agents call the skill_output tool with structured data (type, title, JSON payload), which is persisted to the skill_outputs SQLite table and rendered as widget cards on the Today dashboard. Five widget types exist: status, metric, table, log, kv. This works, but it’s limited in three ways:
  1. Post-hoc only. Widgets appear on the Today dashboard after execution — they are not visible during the agent turn.
  2. Static. Once rendered, a widget cannot be updated in real-time. The agent would need to call skill_output again and the user would need to refresh.
  3. Flat namespace. All widgets share the Today dashboard. There’s no concept of a per-session or per-agent canvas that groups related widgets into a coherent view.

What Changes

The Agent Canvas introduces a live rendering surface that agents populate during execution. Components appear as the agent streams — the user watches the dashboard materialize.
The Canvas window shows four components laid out in a responsive bento grid. The user can interact with the “Create Issue” action card, which triggers a tool call with confirmation.

Architecture

New Tauri Events

Two new EngineEvent variants:
These use the existing Tauri event system (app_handle.emit("engine-event", &event)) — no new transport needed.

Canvas Components

This extends the existing 5 skill_output widget types with 11 new types. The original types are kept for backward compatibility.

Agent Tools

Two new tools available to agents: These are registered in the dashboard tool domain so agents discover them via the Librarian when intent suggests visualization (“show me”, “display”, “chart”, “dashboard”, “monitor”).

Persistence

Canvas components are persisted to a new canvas_components table:
Components with session_id set are ephemeral — tied to a conversation. Components with dashboard_id set belong to a saved dashboard. When a canvas is saved as a dashboard, its components are re-scoped from session to dashboard.

Charts Without a Charting Library

For chart components, the Canvas renders lightweight SVG charts directly — no D3, Chart.js, or other dependency. This matches Pawz’s no-framework philosophy:
  • Line/area charts: SVG polyline + polygon with calculated viewBox
  • Bar charts: SVG rect elements with proportional heights
  • Pie charts: SVG path with arc calculations
  • Sparklines: Minimal SVG inline in metric cards
The chart renderer is a pure function: (data: ChartData) → string (SVG markup). This keeps the bundle tiny and avoids the security surface of a charting library in a desktop app.

Rich Visual Widgets

Beyond static content, the Canvas includes widgets that bring dashboards to life with animation, interactivity, and embedded content:

The embed Widget — Unlimited Visual Power

The embed type is the canvas escape hatch. It renders a sandboxed iframe (sandbox="allow-scripts" without allow-same-origin) containing arbitrary HTML, CSS, and JavaScript. The agent can include external libraries via CDN:
Supported libraries include (but are not limited to):
  • three.js — 3D scenes, data visualizations, particle effects
  • anime.js — Choreographed animations, morphing, timelines
  • D3.js — Advanced data-driven visualizations
  • Chart.js — Quick charts beyond the built-in SVG renderer
  • p5.js — Creative coding, generative art
  • Any library loadable via CDN <script> tag
Security: the iframe sandbox prevents access to the parent page’s DOM, cookies, storage, and navigation. The embedded content runs in complete isolation.

Relationship to Skill Outputs

The existing skill_output system is preserved. It serves a different purpose: An agent can use both: canvas_push for live visualization during a conversation, and skill_output to persist a summary widget on the Today dashboard after it’s done.

Saved Dashboards, Templates, Tabs, and Multi-Window

Not every canvas is throwaway. A trading dashboard you check every morning, a CI monitor you keep open during releases, a project health overview that lives for weeks — some dashboards become permanent fixtures of how you work. The Canvas supports a full dashboard lifecycle: ephemeral → saved → pinned → live. It supports templates for reusable blueprints, a tab system for managing multiple dashboards, and native OS windows for popping dashboards out of the app entirely.

Dashboard Lifecycle

How Saving Works

Or manually — the user clicks the save icon in the canvas toolbar, names it, and optionally pins it.

Persistence

Agent Tools for Dashboard Lifecycle

These are in the dashboard tool domain alongside canvas_push / canvas_update.

Dashboard Templates

Templates are reusable dashboard blueprints — a set of component definitions with placeholder data that an agent instantiates and populates. Think of them as the difference between an empty spreadsheet template and a filled-in spreadsheet.

Where Templates Come From

  1. Agent-created. Any saved dashboard can be exported as a template by stripping its live data and keeping the component structure:
  1. Built-in. Pawz ships with starter templates for common use cases:
  1. Community. Templates are shareable through PawzHub (the existing skill marketplace). A template is just a JSON manifest — same distribution mechanism as community skills:

How Instantiation Works

The template provides structure. The agent provides data. The user gets a fully populated dashboard in one conversation turn.

Persistence

Agent Tools for Templates

Tabs — Multiple Dashboards in One View

A user working with Pawz might have three, five, or ten dashboards they care about at once. The Canvas uses a tab bar to manage multiple dashboards within a single view — the same UX pattern as browser tabs or VS Code editor tabs.

Tab Layout

Tab Types

Tab Operations

  • Click a tab to switch dashboards
  • Middle-click or × to close (pinned tabs require confirmation)
  • Drag to reorder
  • Right-click for context menu: Close, Close Others, Pin/Unpin, Pop Out to Window, Duplicate, Refresh Now
  • + button opens a dashboard picker: saved dashboards, templates, or “New blank canvas”
  • Tab overflow — when tabs exceed available width, a dropdown shows the full list (same pattern as VS Code tab overflow)

Tab State Persistence

Open tabs are persisted so the workspace restores on app launch:
On startup, Pawz restores the tab bar exactly as the user left it — same order, same active tab.

Multi-Window — Dashboards as Native OS Windows

This is the key UX unlock: dashboards don’t have to live inside the Pawz app. Any tab can be popped out into its own native OS window. The user arranges Pawz and their dashboard windows across monitors, workspaces, or virtual desktops however they want.

How It Works

Tauri v2’s WebviewWindowBuilder creates additional native windows at runtime. Each window is a lightweight webview that renders a single dashboard (or its own tab bar of dashboards) — no sidebar, no chat, no navigation chrome. Just the bento grid of components.

The Multi-Window Workflow

Pawz main app on monitor 1 for chatting. Two dashboard windows on monitor 2 for at-a-glance monitoring. Each window updates independently — when an agent pushes a CanvasUpdate, the event reaches all windows rendering that dashboard.

Window Management

Event Routing Across Windows

When the engine emits a CanvasPush or CanvasUpdate, Tauri delivers it to every window. Each window’s event listener filters by dashboard:
Main app tab, popped-out window, and WebChat all stay in sync automatically. One agent update → all views reflect it instantly.

Window Persistence

Refresh — Keeping Dashboards Current

Live dashboards need fresh data. The refresh system ties into Pawz’s existing task/cron infrastructure:

How Scheduled Refresh Works

The refresh is invisible — no chat notification, no popup. The dashboard quietly gets fresh data. A subtle timestamp in the header shows “Last updated: 3m ago.”

How It All Fits Together


Layer 2: The Inspector — Agent X-Ray

The Concept

The Inspector is a collapsible panel that shows what the agent is doing under the hood — real-time, during execution. Think “browser DevTools, but for your AI agent.” While the Canvas is user-facing (“show me the results”), the Inspector is developer/power-user-facing (“show me the process”).

What It Shows

Architecture

The Inspector requires no new Rust events. All the data it needs already flows through the existing engine-event channel:
  • delta → shows the agent is generating
  • thinking_delta → chain of thought (already emitted by Anthropic/Google providers)
  • tool_request → tool about to execute
  • tool_result → tool finished (with timing)
  • tool_auto_approved → tool was auto-approved by policy
  • complete → turn finished (with usage token counts)
The only addition is a small metadata envelope on some events:
These optional fields are ignored by existing consumers and consumed by the Inspector.

Frontend

The Inspector renders as a collapsible drawer on the right side of the chat view (or below the canvas when both are open). Toggle via keyboard shortcut (Cmd+Shift+I / Ctrl+Shift+I) or a button in the chat toolbar.

Orchestrator Integration

For multi-agent flows (boss/worker orchestration and Conductor Protocol flows), the Inspector shows additional context:
  • Agent roster: Which agents are active, their roles, current status
  • Delegation graph: Boss → Worker assignments with message flow
  • Conductor strategy: Phase diagram showing collapse merges, parallel branches, and cycle rounds — matching the execution strategy from the Conductor Protocol’s compilation step
This replaces the need for a separate debugging tool. The Inspector is the DevUI.

Layer 3: Telemetry — Observability

The Concept

Structured tracing across the full request lifecycle, surfaced in the Canvas and Inspector rather than requiring an external tool like Jaeger.

Instrumentation

The Rust backend uses the tracing crate (already in the Tauri ecosystem) with OpenTelemetry-compatible span names:

Metrics Collected

Surfacing

Telemetry data flows to two places:
  1. Inspector panel — real-time flame graph of the current agent turn. Each span is a row with a proportional duration bar. Users see exactly where time is spent.
  2. Canvas/Today dashboard — summary metric cards that agents can auto-generate:
  1. Optional export — for users who want full distributed tracing, the tracing spans can be exported to any OTLP-compatible backend (Jaeger, Grafana Tempo, Azure Application Insights) via environment variable:
This is purely optional. The Inspector provides the “80% solution” without any external infrastructure.

Implementation Plan

Phase 1: Canvas Core

Goal: Agents can push live UI components into a persistent per-session surface.

Phase 2: Saved Dashboards + Templates

Goal: Dashboards persist as named entities, templates enable reuse, sidebar shows pinned dashboards.

Phase 3: Tabs + Multi-Window

Goal: Multiple dashboards open simultaneously, with pop-out native windows.

Phase 4: Inspector Panel

Goal: Real-time visibility into agent internals during execution.

Phase 5: Telemetry

Goal: Structured tracing with metrics surfaced in the UI and optionally exported.

Design Principles

1. No Framework, No Dependency

The Canvas renders with the same vanilla DOM approach as the rest of Pawz. Charts are SVG strings. Layouts are bento grid CSS. No React, no D3, no charting library. This keeps the bundle small and the security surface minimal.

2. Existing Transport

Everything flows through the existing engine-event Tauri channel. No new WebSocket servers, no HTTP endpoints, no open ports. The Canvas is just new event types on the same IPC bridge.

3. Agent-Driven, Template-Assisted

The Canvas doesn’t decide what to show — agents do. Templates provide structure, but the agent populates them with live data and can modify the layout on the fly. This means the Canvas works for any domain: templates accelerate common cases, and the agent handles everything else from primitives.

4. Progressive Disclosure

  • Casual users see the Canvas (results) and never touch the Inspector
  • Power users toggle the Inspector to understand agent behavior
  • Developers export OTLP spans to Jaeger for full distributed tracing
Each layer adds depth without requiring the others.

5. Backward Compatibility

The existing skill_output system is unchanged. Agents that use skill_output today will continue to work. The Canvas is additive — new tools, new events, new view. No breaking changes.

Channel Integration

Agents on channels (Slack, Discord, Telegram) can reference saved dashboards by name:
Deep links use pawz://dashboard/{dashboard_id} for saved dashboards and pawz://canvas/{session_id} for ephemeral session canvases. Both formats route to the Canvas view. For WebChat users, the dashboard renders inline in the browser chat interface. For desktop users, it opens the dashboard tab (or pops out a new window if the user prefers).

Inspiration

This architecture draws from:
  • AG-UI Protocol — standardized Agent-User interaction with streaming responses, server-side UI pushing, and human-in-the-loop. The Canvas implements AG-UI’s generative UI concept within Pawz’s native Tauri architecture.
  • DevUI (Microsoft Agent Framework) — inner-loop debugging with chain-of-thought visualization and real-time state monitoring. The Inspector is Pawz’s answer to DevUI, integrated into the app rather than a separate tool.
  • OpenTelemetry — distributed tracing and metrics collection. The Telemetry layer uses the same span/metric model with optional OTLP export.
  • The Golden Triangle — Kinfey Lo’s articulation of how these three concerns form a complete development lifecycle for agentic applications.
The key difference: in Pawz, all three layers are native to the desktop app. No external servers, no separate debugging tools, no cloud-hosted dashboards. Everything runs locally, through IPC, with zero open network ports.

Try It

Coming soon. The Agent Canvas is under active development. When available:
  1. Open a chat session with any agent
  2. Ask it to analyze, monitor, or visualize something — the Canvas appears automatically
  3. Say “save this as my [name] dashboard” to persist it
  4. Pin it to your sidebar for one-click access
  5. Pop it out into its own native window and put it on your second monitor
  6. Set up a refresh schedule so it stays current while you work
  7. Press Cmd+Shift+I / Ctrl+Shift+I to toggle the Inspector
  8. Share a dashboard link with your team via Slack or Discord

License & Attribution

The Agent Canvas architecture is part of OpenPawz and is released under the MIT License. You are free to use, modify, and redistribute this design in any project, commercial or otherwise. Attribution is appreciated but not required. If you reference this work in academic papers or technical writing:
OpenPawz (2026). “The Agent Canvas: Generative UI, Live Observability, and Agent-Built Dashboards.” https://github.com/OpenPawz/openpawz