Every canvas goes through the same pipeline before it renders. The result is a visual built on real data — not placeholder content.
Generation pipeline
User request: "Compare HubSpot vs Salesforce on pricing and key features."
↓
Step 1: Entity extraction
Identifies: ["HubSpot", "Salesforce"]
Canvas type: comparison_table
↓
Step 2: Pre-research (Brave Search × 3 in parallel)
web_search("HubSpot pricing 2026")
web_search("Salesforce pricing enterprise 2026") ← parallel
web_search("HubSpot vs Salesforce features") ← parallel
Scrapes live pricing pages where accessible
↓
Step 3: Schema construction
Research data mapped to comparison_table JSON schema
Kimi K2 fills sections: features, pricing tiers, verdict
Only verified data from step 2 used as facts
↓
Step 4: React render
comparison_table component renders inline in chat
All styling applied, no external iframe
Export button available immediately
Real data
Ultron runs 3 web searches before generating any canvas that involves external data. Pricing figures, feature lists, company stats — all sourced from live pages, not from training data.
If a source is unavailable or pricing is gated, the canvas notes it: “Enterprise pricing not publicly listed — verify at salesforce.com/pricing.”
Inline rendering
Canvases render as React components inside the chat thread. They’re not images. They’re live components with full visual fidelity — readable, scrollable (for long canvases), and exportable on demand.
For best results with comparison canvases, name specific products: “Compare HubSpot, Salesforce, and Pipedrive” produces better output than “Compare CRM tools.”