Drag, drop, and the table is there

Drag a variable to rows, another to columns, and the table is on the screen. Add measures (count, percent, mean, weighted base), apply filters, switch percentaging direction, change weight schemes — each edit recomputes immediately. There's no server round-trip in the way, because there is no server in the way.

A crosstab in the Recense canvas, showing region by snack preference with column percentages.
Drag a variable to rows, another to columns — the table renders without a round-trip.

What it understands about survey data

  • Variable types out of the box. Categorical, numeric, Likert, multiple-response (sets and grids), date, currency, free text. Type inference runs on import; you can override anywhere.
  • Missing-value semantics. SPSS user-defined missing codes, system-missing, and explicit "not asked" routing are honoured throughout. Bases are calculated correctly without manual filtering.
  • Weighting. Apply per-table weights from variables in the dataset, or define new weighting schemes (RIM, post-strat) from the canvas. Effective base is reported alongside unweighted count.
Sidebar showing variables typed as categorical, Likert, multi-response, numeric, and date.
Variable types, missing-value codes, and multi-response sets are first-class.

Derived variables and formula cells

  • Significance testing. Pairwise z-tests across columns, with effective N for weighted data. Sig levels are configurable per table.
  • Derived variables. Build new categories, recodes, and groupings without leaving the canvas. Derivations are first-class — they recompute when source data changes.
  • Formula cells. Excel-style cell formulas live inside the table. Compute net scores, indices, point differences from neighbouring cells — without exporting to Excel.
A derived variable being defined in the canvas alongside the table that consumes it.
Derive nets, recodes, and indices without leaving the canvas.

Why it's fast

The engine is written in Rust and compiled to WebAssembly. Survey datasets are stored in a columnar layout with content-addressable column storage (so multiple datasets reuse identical columns) and residency is managed against your browser's available memory. The critical paths — group-by, filter, weight, sig test — are tight numerical code, not glue around an interpreter.

On a typical laptop, a crosstab on a 48,000-respondent survey (over 20 million data points across 425 variables) returns in under half a second. There is no progress bar to stare at.

A crosstab on a forty-eight-thousand-respondent dataset, rendered in under half a second.
Tight numerical Rust on a columnar layout, compiled to WebAssembly.

See it on real data

The homepage has a live, working canvas with two demo datasets loaded.