Viz Deck
Agentic visualization library with 9 chart types for dynamic generation
Viz Deck
Viz Deck is an agentic visualization library that enables AI systems to generate contextual, safe, and effective data visualizations dynamically. It provides 9 visualization types, a structured vocabulary of chart types, guardrails for safe generation, and production-ready React components following scientific visualization best practices.
Overview
Viz Deck provides a "deck of cards" approach where AI agents can:
- Select appropriate visualizations based on user intent and data shape
- Generate charts dynamically during conversations
- Enforce safety guardrails to prevent arbitrary generation
- Maintain consistency across the entire webapp
Key Features
🎯 Visualization Vocabulary
A small, explicit set of chart types with defined data shapes and constraints:
- Time Series (line/area) - Trends over time with confidence intervals
- Category Bar - Compare discrete categories (horizontal/vertical)
- Comparison Matrix - Heatmap-style multi-criteria comparison
- Histogram - Distribution analysis
- KPI Card - Single metric display with context
- Network Graph 2D - Visualize relationships between entities (nodes and edges)
- Network Graph 3D - Interactive 3D force-directed graph with WebGL
- Sankey Diagram - Flow visualization showing magnitude of connections
- Scatter Plot - Display relationships between two continuous variables
🛡️ Guardrails Engine
Automatic enforcement of best practices:
- Composition Simplicity - Max 4 visualizations per view
- Data Provenance - Auto-adds data source indicators
- Uncertainty Quantification - Requires confidence intervals for projections
- Temporal Freshness - Flags stale data
- Stakeholder Coverage - Ensures multiple perspectives
🎨 React Components
Production-ready visualizations built with:
- visx for chart rendering
- D3 for scales and data transformations
- shadcn/Tailwind for UI components
- React 19 optimized (no manual memoization)
🎨 Theme System
Configurable color palettes and styling:
defaultTheme- Light theme with Tailwind colorsdarkTheme- Dark mode variantcreateTheme()- Create custom themes- All charts accept a
themeprop
📊 Scientific Standards
All visualizations follow scientific best practices:
- Proper axis labels with units (e.g., "Temperature (°C)")
- Legends for multi-series/group charts
- Tooltips showing precise values with units
- Reusable
Legendcomponent for custom layouts
Installation
Add to your app's dependencies:
{
"dependencies": {
"@info-ppaai-app/viz-deck": "workspace:*"
}
}Basic Usage
Rendering a Visualization
import {
visualizationComponents,
type VisualizationId,
type TimeSeriesSeries
} from "@info-ppaai-app/viz-deck";
const vizId: VisualizationId = "timeSeries.line";
const Viz = visualizationComponents[vizId];
const series: TimeSeriesSeries[] = [
{
id: "series1",
label: "Water Quality",
data: [
{ x: "2024-01-01", y: 15.2 },
{ x: "2024-02-01", y: 16.1 },
{ x: "2024-03-01", y: 14.8 },
],
},
];
<Viz
series={series}
variant="line"
xLabel="Date"
yLabel="Salinity (ppt)"
yUnit=" ppt"
showLegend={true}
/>Agent Integration Pattern
import {
VISUALIZATIONS,
VISUALIZATION_BY_ID,
applyGuardrails,
visualizationComponents,
type PlannedLayout,
} from "@info-ppaai-app/viz-deck";
// 1. Agent selects visualization based on user query
const vizId = agentSelectVisualization(userQuery, VISUALIZATIONS);
const vizDef = VISUALIZATION_BY_ID[vizId];
// 2. Validate data shape
if (!validateDataShape(data, vizDef.dataShape)) {
throw new Error("Data shape mismatch");
}
// 3. Build layout
const layout: PlannedLayout = {
instances: [
{
componentId: "main-viz",
visualizationId: vizId,
dataSourceId: "databricks-query-123",
},
],
};
// 4. Apply guardrails (automatic safety checks)
const { adjustedLayout, triggered, notes } = applyGuardrails(layout, {
now: new Date(),
});
// 5. Render with guardrail-adjusted layout
const Component = visualizationComponents[adjustedLayout.instances[0].visualizationId];
return <Component {...chartProps} />;Available Visualizations
Time Series Chart
Display trends over time with optional confidence intervals.
Data Shape:
- Required:
timestamp,value - Optional:
seriesId,seriesLabel,confidenceLow,confidenceHigh
Constraints:
- Max 5 series
- Max 2000 points
- Requires monotonically increasing timestamps
When to Use: Trends, evolution over time, before/after effects
Category Bar Chart
Compare values across discrete categories.
Data Shape:
- Required:
category,value - Optional:
seriesId,seriesLabel
Constraints:
- Max 10 categories recommended
- Supports grouped or stacked bars
When to Use: Comparing discrete items, rankings, grouped comparisons
Comparison Matrix
Heatmap-style matrix for multi-criteria comparison.
Data Shape:
- Required:
entityId,dimensionId,value
Constraints:
- Best with 3-10 entities and 3-8 dimensions
When to Use: Multi-criteria decision analysis, option comparison, performance dashboards
Histogram
Show distribution of values across bins.
Data Shape:
- Required:
value - Optional:
bins
Constraints:
- Max 10,000 points
- Automatically bins continuous data
When to Use: Data distribution analysis, identifying outliers, understanding value ranges
KPI Card
Display a single key metric with context.
Data Shape:
- Required:
value - Optional:
label,unit,baseline,target,trend,explanation
Constraints:
- One metric per card
- Optional trend indicator (up/down/stable)
When to Use: Highlighting key metrics, goals, important single values
Guardrails
Composition Simplicity
Limits the number of visualizations per view to avoid cognitive overload.
- Rule: Maximum 4 visualization components per view
- Auto-applied: Yes
- Enforcement: Warning message when exceeded
Data Provenance Transparency
Ensures all visualizations indicate their data source.
- Rule: All visualizations must show data source and last update time
- Auto-applied: Yes
- Enforcement: Auto-adds data source indicator component
Uncertainty Quantification
Requires confidence intervals for projections and estimates.
- Rule: Projections must show confidence intervals or uncertainty ranges
- Auto-applied: Yes
- Enforcement: Requires confidence bounds in data or adds uncertainty indicator
Integration Examples
Dashboard Generation
import { visualizationComponents, applyGuardrails } from "@info-ppaai-app/viz-deck";
export const DynamicDashboard = ({ userContext, data }) => {
const layout = agentBuildLayout(userContext, data);
const { adjustedLayout } = applyGuardrails(layout, { now: new Date() });
return (
<div className="grid gap-4">
{adjustedLayout.instances.map((instance) => {
const Viz = visualizationComponents[instance.visualizationId];
const props = prepareChartProps(instance, data);
return <Viz key={instance.componentId} {...props} />;
})}
</div>
);
};Conversational Analytics
import { AgentDialoguePanel, AgentReasoningPanel } from "@info-ppaai-app/viz-deck";
export const AgentChat = () => {
const [messages, setMessages] = useState([]);
const [trace, setTrace] = useState(null);
const handleMessage = async (text: string) => {
const response = await trpc.agent.generateVisualization.mutate({
query: text,
context: currentContext,
});
setTrace(response.reasoning);
// Render visualization based on response
};
return (
<div className="grid grid-cols-2 gap-4">
<AgentDialoguePanel messages={messages} onSend={handleMessage} />
<AgentReasoningPanel trace={trace} />
</div>
);
};Playground
Visit /playground/deck in the web app to explore:
- Component catalog with metadata
- Data source definitions
- Guardrail rules and enforcement
- Interactive agent demo with mock data
Visit /playground/examples for live examples of all visualization types with real data.
Testing
The package includes comprehensive tests:
cd packages/viz-deck
bun testTests cover:
- Guardrail logic and enforcement
- Visualization catalog integrity
- Component registry mapping
Architecture
- Pure Presentational Components - No data fetching, props in → SVG out
- Type-Safe - Full TypeScript support with strict types
- Domain-Agnostic - Core library is generic; extend with domain overlays
- Extensible - Add custom visualizations and guardrails
Best Practices
- Always apply guardrails before rendering agent-generated layouts
- Validate data shapes against visualization requirements
- Use TRPC for backend-to-frontend communication
- Keep reasoning traces for debugging and transparency
- Test with mock data before connecting to Databricks
- Handle errors gracefully when data doesn't match expected shape
- Log guardrail triggers for monitoring agent behavior
Related Documentation
- Architecture - Overall system architecture
- Development Guide - Development setup and workflows
- Databricks API - Data source integration
Source Code
- Package:
packages/viz-deck/ - Playground:
apps/web/src/app/(auth)/playground/deck/ - Examples:
apps/web/src/app/(auth)/playground/examples/ - Integration Guide:
packages/viz-deck/INTEGRATION.md