MITHeadlessBuilt for Jev

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.

Try one of these

12 rows

Account numberHouseholdAdvisorRegistration typeCustodianMarket valueConcentrationUnrealized gainRestricted holdings
AC-100000Fairholm HouseholdEmerson HaleRoth IRANorthgate$1,838,56223.7%-$56,460No
AC-100001Fairholm HouseholdBlake MorenoTrustSummit Trust$3,757,78013.8%-$229,595No
AC-100002Hollis HouseholdAvery LaneIRASummit Trust$2,383,6092.3%$231,042Yes
AC-100003Alder HouseholdAvery LaneTrustHarborline$402,7641.2%-$28,515No
AC-100004Jessup HouseholdBlake MorenoIRANorthgate$1,227,5572.3%$101,445No
AC-100005Hollis HouseholdBlake MorenoIRASummit Trust$347,54838.6%$21,965No
AC-100006Dunmore HouseholdAvery LaneRoth IRASummit Trust$449,82931.2%$103,972Yes
AC-100007Fairholm HouseholdEmerson HaleTaxableNorthgate$4,458,6490.7%$18,629No
AC-100008Kestrel HouseholdAvery LaneRoth IRASummit Trust$1,903,52012.5%$271,507No
AC-100009Jessup HouseholdAvery LaneTrustHarborline$1,390,10941.2%$46,702No
AC-100010Hollis HouseholdBlake MorenoRoth IRANorthgate$612,04020.2%$120,725No
AC-100011Kestrel HouseholdCasey OrtizRoth IRANorthgate$4,940,8914.5%$685,245No

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

  1. 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.

  2. 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.

  3. 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 stateGridCue
Who writes the grid stateThe model generates it, and you hope the schema holdsCode writes it; the model only picks among closed choices
Before anything changesApplied directly, often while it streams inA deterministic Preview; apply only on approval, with undo
When it's unsureIt guessesIt 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 questions

Quick start

A working command bar in five minutes, no key

npm i gridcue
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.