CanvasXpress · Product Narrative

Every figure a recipe.
Every result reproducible.

A bioinformatics bench where you describe the analysis in plain language — and get publication-ready, interactive figures that regenerate themselves, forever.

01 The Monday 8:40 a.m.

The matrix arrives. The dread arrives with it.

Dr. Nadia Okafor has a fresh RNA-seq run — forty-one tumor samples, clinical annotations, a mutation table her collaborator swears is "basically clean." What she also has is the memory of last spring: three weeks of R scripts, a heatmap regenerated eleven times for the reviewers, and a final panel nobody could rebuild when the raw counts were re-normalized.

The biology is the easy part. The provenance is what eats the month — which script made which figure, from which version of the data, with which clustering seed. By the time the paper is accepted, the answer is a folder named final_v7_REALfinal.

02 The ask plain language

She doesn't open an IDE. She just says what she wants.

She drops the matrix into the bench and types the sentence she'd say to a rotation student:

Nadia

Cluster the samples, show an oncoprint of the top 20 mutated genes with the clinical tracks on top, and put a survival curve underneath split by cluster.

Under the sentence, the bench doesn't hand her a black-box PNG. It writes a recipe — a small, legible spec of every step — and renders it live with real, native widgets: a clustered heatmap with its dendrogram, an oncoprint no other browser library ships whole, a Kaplan–Meier below it.

stack(
  cluster: { rows: "ward.D2", cols: "pearson" },
  oncoprint: { top: 20, tracks: ["stage", "subtype"] },
  survival: { split: "cluster", ci: true }
)

03 The turn it talks back

She argues with the figure, and the figure keeps its history.

"Reorder the oncoprint by mutation frequency." Done. "That teal is too close to the stage track — make the subtype magenta." Done. Every nudge is another line on the recipe, every state a point she can step back to. When her collaborator asks why cluster 2 looks that way, she doesn't reconstruct her reasoning — she scrolls it.

The undo stack isn't a convenience. It's the lab notebook the field never had.

Because the whole thing is one portable {data, config} object, she pastes it into the manuscript's supplement as-is. Not a screenshot — the living recipe. A reviewer with the raw counts gets byte-for-byte the same panel, six months from now, on their own machine.

04 Why it can only be this library

Four things that almost never live together.

A Real bio widgets

Oncoprint, genome browser, clustered heatmap, network. Batteries-included and native — not something you hand-assemble from primitives.

B Charts as JSON

Every figure is a self-contained, diffable spec. Reproducibility isn't bolted on; it's the file format.

C Language in, figure out

A grammar substrate and natural-language authoring turn a sentence into a correct, editable recipe.

D The R on-ramp

ggplot parity imports the analyses Bioconductor users already have — no asking a lab to abandon its pipeline.

This isn't a mock-up. Here it is, running.

The story above ships in this repository. The cohort below was distilled from a simulated 20,000-gene run, packaged by a recipe, and rendered live — clustered heatmap, oncoprint, and Kaplan–Meier, each computed by CanvasXpress in the browser from figure-scale tables.

The reproducible bench rendered as a live dashboard: clustered expression heatmap, Kaplan–Meier survival curves by derived cluster, oncoprint of recurrently altered genes, and the cohort table
The bench as a live dashboard — open it and click anything.

And the "she just says what she wants" step is real too. Below, the Bench: survival dataset is ticked and the assistant is asked for a Kaplan–Meier plot — time, event, split by the derived cluster — and the figure lands on the canvas, ready to refine by hand or by chat.

The dashboard builder authoring a Kaplan–Meier plot by chat: the Bench survival dataset is ticked in the assistant panel and the resulting KM curves render on the editing canvas
Authoring by chat — open the Builder, tick Bench: survival, and ask for a KM plot.

The bench where the figure and its proof are the same object.

Aim the AI at the one audience whose charts nobody else can render — and reproducibility stops being a chore and becomes the default. That's the killer app.

The Reproducible Bench