Ask your data a plain question. See the view that answers it.
Get to the insight in complicated data, dense grids and tables. GridCue previews every change and never touches your data.
12 rows
| Account number | Household | Advisor | Registration type | Custodian | Market value | Concentration | Unrealized gain | Restricted holdings |
|---|---|---|---|---|---|---|---|---|
| AC-100000 | Fairholm Household | Emerson Hale | Roth IRA | Northgate | $1,838,562 | 23.7% | -$56,460 | No |
| AC-100001 | Fairholm Household | Blake Moreno | Trust | Summit Trust | $3,757,780 | 13.8% | -$229,595 | No |
| AC-100002 | Hollis Household | Avery Lane | IRA | Summit Trust | $2,383,609 | 2.3% | $231,042 | Yes |
| AC-100003 | Alder Household | Avery Lane | Trust | Harborline | $402,764 | 1.2% | -$28,515 | No |
| AC-100004 | Jessup Household | Blake Moreno | IRA | Northgate | $1,227,557 | 2.3% | $101,445 | No |
| AC-100005 | Hollis Household | Blake Moreno | IRA | Summit Trust | $347,548 | 38.6% | $21,965 | No |
| AC-100006 | Dunmore Household | Avery Lane | Roth IRA | Summit Trust | $449,829 | 31.2% | $103,972 | Yes |
| AC-100007 | Fairholm Household | Emerson Hale | Taxable | Northgate | $4,458,649 | 0.7% | $18,629 | No |
| AC-100008 | Kestrel Household | Avery Lane | Roth IRA | Summit Trust | $1,903,520 | 12.5% | $271,507 | No |
| AC-100009 | Jessup Household | Avery Lane | Trust | Harborline | $1,390,109 | 41.2% | $46,702 | No |
| AC-100010 | Hollis Household | Blake Moreno | Roth IRA | Northgate | $612,040 | 20.2% | $120,725 | No |
| AC-100011 | Kestrel Household | Casey Ortiz | Roth IRA | Northgate | $4,940,891 | 4.5% | $685,245 | No |
Running in your browser on the keyless Mock Provider, over synthetic accounts. No server, no key.
How it works
From a sentence to a view you can trust
- 01
You ask
Type or dictate what you want to see: “Roth IRAs grouped by rep”. GridCue splits the request into parts and matches your app's own column names and values.
- 02
GridCue previews exactly what will change
The model only picks among choices your app declared. Code builds a checked plan and shows it line by line. Anything ambiguous becomes a question, never a guess.
- 03
You apply, and can undo
Nothing changes until you apply. The change is atomic, and one click puts the previous view back.
The difference
Why the model doesn't write the filter
| An LLM writes the grid state | GridCue | |
|---|---|---|
| Who writes the grid state | The model generates it, and you hope the schema holds | Code writes it; the model only picks among closed choices |
| Before anything changes | Applied directly, often while it streams in | A deterministic Preview; apply only on approval, with undo |
| When it's unsure | It guesses | It asks one focused question, or declines |
186 labelled live requests on a synthetic wealth schema, 0 wrong views with either strategy (jev-1.13.0, Sept 2026).
Safe by design
Built for grids where a wrong view costs something
View-only
Filters, sorts, groups and columns. It never edits a record.
Preview before apply
Every change is shown before it happens, and nothing applies without approval.
Your rows stay yours
Rows never leave your app. The model sees the request, the values read from it, and the columns you expose.
Undo, and no key in the browser
Every change can be undone, and your provider key stays on your server.
What GridCue is not: not SQL, not a chatbot. It doesn't edit your data, and it doesn't compute answers; it arranges the view that shows them.
Providers: Jev · Mock · your provider
Grids: TanStack Table · any array · AG Grid (next)
Fits your domain
Your words, your categories, a few lines of setup
Every app says things its own way. Three optional declarations teach GridCue your domain: what a row is, which columns name other records, and your own categories over a column's values.
Choose how GridCue asks Jev: “fan-out” handles compound requests, nesting and “also”; “focused” asks fewer questions for simpler grids.
defineSchema(columns, {
rowNoun: "account", // "biggest accounts first" means the rows
columns: {
household: { entity: "household" }, // "largest households first": asks, never guesses
registration_type: {
valueGroups: [{ label: "Retirement", values: ["ira", "roth_ira"] }],
},
},
});
createJevProvider({ apiKey, strategy: "fan-out" }); // or "focused": fewer questionsQuick start
A working command bar in five minutes, no key
import { createGridCue } from "gridcue";
import { createMockProvider } from "gridcue/mock";
import { GridCueBar } from "gridcue/react";
import { createTanStackAdapter, gridcueFilterFn, schemaFromTanStack } from "gridcue/tanstack-table";
import "gridcue/styles.css";
const table = useTable({ features, columns, data, defaultColumn: { filterFn: gridcueFilterFn } });
const [cue] = useState(() => {
const schema = schemaFromTanStack(table);
return createGridCue({ schema, adapter: createTanStackAdapter({ schema, table }), provider: createMockProvider() });
});
<GridCueBar controller={cue} />The Mock Provider runs in the browser. When you're ready, turn on Jev behind your own endpoint. Read the docs.