
CEO & Co-founder of Visivo
Visivo v2.2.1: Data-Aware Agents and Sharper Tables
Visivo v2.2.1 lets agents read your data before they draft, adds layout and filter rules, and makes dashboard tables follow inputs and show dates clearly.

Visivo v2.2.0 gave your project an agent. Visivo v2.2.1 makes that agent look at your data before it writes anything, and gives it the same chart, layout, and filter rules a careful analyst would use. The rest of the release is the part every dashboard reader notices: tables that follow your inputs, dates that read like dates, and errors that stay on screen long enough to fix.
The v2.2.1 release shipped on October 14, 2026. It is a patch release on the 2.2 line, so your project keeps working as it is, with a few stricter checks listed in the upgrade notes at the end.
Let the agent read your data before it writes
In v2.2.0 the agent could read and draft project objects. It could not see the rows behind them, so a request like "chart revenue by region" depended on the agent guessing column names. v2.2.1 adds seven read-only data tools:
describe_sourcelists the tables and columns a source holds.preview_tableshows a sample of rows from one table.query_sourceruns a read-only query with a row, time, and size limit.profile_columnsandprofile_modelsummarize each column: distinct values, nulls, ranges, and the most common values.infer_columnsreads the columns a model's SQL produces.preview_insightruns a draft Insight, with input values filled in, before anything is saved.
Each tool calls the same service the viewer uses, so the agent sees what you see in Workspace and the Explorer. query_source refuses anything that is not a read, and every result is marked as data, not instructions, so text inside a table cannot steer the agent.
The tools work in the Agent tab of visivo serve and over MCP, so Claude Code, Cursor, or Gemini CLI get them too. The MCP setup guide shows how to connect a client, and the AI usage guide covers the four ways to run an agent and what each one costs. As in v2.2.0, every agent edit lands as a draft that you review and commit.
Chart, layout, and filter rules the agent can follow
Seeing the data is half of the job. The other half is turning it into a dashboard people can read. v2.2.1 ships rules for that, written as data and checked by tests:
- Chart rules for every chart type Visivo supports: when to use it, how many series it can hold, and the mistakes to avoid. The rules were measured in the viewer, not written from memory.
recommend_layouttakes the charts, tables, and inputs you plan to show and returns dashboard rows: filters first, a KPI strip, a hero chart, breakdowns, and detail tables last. Every result is validated against the dashboard model before it is returned, so it can be written without edits.recommend_inputssuggests filters from the column profiles, with defaults, and applies each filter to every Insight that reads the column.check_input_wiringfinds a half-wired filter: an input that filters some of the Insights on a model and silently skips others.
Skills load when a task needs them, for example "design a dashboard" or "make it interactive", so the agent carries the rules without carrying every rule on every turn. If you are new to how Visivo projects are structured for agents, the AI readiness overview explains why typed YAML and a semantic layer give an agent something solid to work with.
Tables that follow your inputs
Dashboard tables got the largest set of fixes in this release.
- Pivot and column tables react to inputs. A table built from an input-filtered Insight now re-runs when the input changes, the same way a chart does.
- Headers show plain names. A column without an alias shows the prop name, never an internal hashed column name.
- Dates read like dates. Pivot and column tables show dates and timestamps formatted, not as epoch numbers. Search matches what you see on screen, so typing "2021-01-01" finds that row. On a phone, date columns keep a readable width and the table scrolls sideways when it has to.
- Cell colors use the whole table.
format_cellsgradients now span every row, not only the visible page, and empty cells stay empty.
Here is the pattern, with a multi-select input whose default selects every option:
inputs:
- name: regions
label: Region
type: multi-select
options: ?{ SELECT DISTINCT region FROM ${ref(ev_sales)} }
display:
type: checkboxes
default:
values: all
insights:
- name: units_by_quarter_and_powertrain
props:
type: bar
x: ?{ ${ref(ev_sales).quarter} }
y: ?{ SUM(${ref(ev_sales).units_sold}) }
interactions:
- filter: ?{ ${ref(ev_sales).region} IN (${ref(regions).values}) }
- split: ?{ ${ref(ev_sales).powertrain} }
- sort: ?{ ${ref(ev_sales).quarter} ASC }
Before v2.2.1, values: all reached the filter as the literal text all, so the first render was empty. It now expands to every option. Query-based defaults are read, numeric range defaults compare as numbers, input names with hyphens work, and a slider accepts text options. The inputs concept page covers the full syntax.
Dashboards that read as one page
A few changes make a dashboard look designed rather than assembled:
- One series, one color. When the same series name appears on several multi-series or split charts, it now gets the same color on each of them. "Cost" stays orange next to "Revenue" and next to "Margin". Colors you set yourself still win.
- KPI numbers fit. Number-only indicator charts get their own small margins, so a KPI in a short row shows its number instead of padding.
- Rows size correctly. A chart in a
compactrow gets a real height, stacked and nested items are no longer clipped, and the canvas resize preview matches where the item lands.
These are the details that decide whether a stakeholder trusts a dashboard at a glance. The dashboards overview shows the layout model these fixes apply to.
Errors you can see and fix
A broken model used to take everything down with it. If any query failed during the start-up build, visivo serve exited. In v2.2.1 the server stays up, builds the healthy part of the project, and records the failure as a run. The Runs tab names each object that failed and why. visivo run is unchanged and still exits with an error on any failed query, so CI keeps failing loudly.
The error also shows up where you are working. A failed run shows its message in the edit panel and on the Insight canvas, in place of a bare status code or a 404.
Upgrade notes
v2.2.1 checks a few table settings earlier, at compile time, so a mistake fails before it reaches the browser:
- Pivot
valuesmust be aggregates. Each entry must have an aggregate at its root, such assum(...)orcount(*). A bare column,sum(x) + 1, a window function,coalesce(sum(x), 0), andcast(sum(x) as int)are now rejected with a message that names the value. Move the arithmetic into the Insight or the model. format_cellscolors must be hex.min_colorandmax_coloraccept values like"#ff0000". A color name such asrednow fails validation instead of rendering as a broken color.rows_per_pageoptions changed.10is now valid and15is no longer accepted. The options are 3, 5, 10, 25, 50, 100, 500, and 1000.- One table, one source. A table whose columns read from two sources with no relationship between them now fails at compile and names both sources. Before, it quietly read the first source.
Try v2.2.1
Upgrade the CLI and restart visivo serve:
pip install --upgrade visivo
# or, with the install script:
curl -fsSL https://visivo.sh | bash
New to Visivo? Get started walks you from install to your first Insight, and the examples show finished projects you can open locally. The full changelog lists every change in this release.
Previously in Visivo
v2.2.1 builds on the agent, themes, and template dashboards that arrived in the v2.2.0 release recap. For the Workspace and Explorer changes that came before that, read the v2.1.0 release recap.