safety.viz release review 2026-10-02
safety.viz becomes something you can use on your own study. A demo app puts every chart on one study, says which ones your data can feed, and lets you load your own files and map their columns, all in the browser. Nine requests from the people who used the original renderers land on the existing charts. And a prototype of a fourteenth chart follows one participant through a trial; a prototype is not ready for production, so it is on the docs site only. Every capture below was taken from the live dev site, which is the release-candidate build.
13 charts in 1 demo app, 1 prototype 2,100 unit + 344 browser tests reviewed in three parts: 22 findings fixed, 5 filed, the narrative layer taken out nothing leaves the browser: asserted by test promotes dev → main via sv#158
The docs site keeps its gallery and its per-chart demos. The app is a page of its own, with its own header and footer, so the chart has the full width of the screen. The header has a tab for your data and a tab for each data domain, saying how many of that domain’s charts the loaded data supports. Beneath the tabs, on one line, are the open domain’s charts.

The demo study, on the hepatic explorer. Each domain has a hue, carried by a small hex beside its name: blue for labs and vitals, violet for ECG, teal for adverse events. The open chart’s chip is highlighted, and that chip is the view’s name: there is no separate heading taking up room.

With a participant selected, the chart’s own controls, the chart and the participant profile sit side by side. Keeping the app’s own parts to a header and a footer is what leaves the chart room here.
Why it matters
The original safetyGraphics app put a study’s charts in one place and told you which ones your data could feed. safety.viz had fourteen separate demo pages and no shared statement of what data a study supplies. This is that app again, running entirely in the browser.
Try it
Open the demo app#data, or use back and forward: the app follows it.Drop CSV or JSON files on the Data view. Each file is read in the browser and placed in a domain by its column names, with the number of that domain’s columns it carries. A sidebar keeps the work in sight: three steps, each showing where it stands, and the list of loaded files. A test asserts that no network request leaves the page from the first file onward.

The Data view as it opens. The sidebar’s three steps carry their own buttons, and the list beneath them flags a file only when one of its rows wants a look. The demo study menu offers three studies: the pilot study, a renamed-column study, and a labs-only liver cohort. The pilot study’s description says its labs file carries 110 synthetic liver and kidney participants who are in no other file. Chart views have no sidebar.

A study whose columns carry none of the default names, loaded after Reset. Four files are placed; the fifth belongs to no domain, and the page says so in one sentence and keeps it, with a picker to place it by hand. The sidebar counts what is left to do: 23 rows guessed, and six rows that a chart is waiting on.

One table per file: what the charts need on the left, your column on the right. A row filled because the name matched says “same name”. A row filled from a short list of known SDTM and ADaM alternatives says “guessed”. Nothing fuzzier is attempted. An empty row says how many charts need it. The same table asks what your data calls the measures some charts find by name. The sidebar stays in view as the tables scroll, and choosing a file there jumps to its table.

Before any correction, a chart that cannot draw says what it is missing, by name.

After six rows are set by hand, the same chart draws from the user’s own files. The data is never renamed or rewritten: the mapping only tells each chart which column to read.

The same app as one HTML file, under 1 MB, opened from disk with the network off. It starts empty, offers no demo studies, and uses your system’s fonts, because it loads nothing.
Two rules to confirm
Why it matters
A study programmer has a folder of extracts and wants to see them in the charts without installing anything or sending data anywhere. The old app did this in R. Here the files are read with the browser’s own file API, and the single file needs no server at all.
A guess is always labelled as a guess, and a gap is priced in the charts it turns off, by name. The mapping downloads as a small JSON file, and choosing that file again with your data restores it.
Try it
Open the Data viewA prototype of a fourteenth chart, and the first that looks at one participant and not across them: exposure, dose changes, adverse events, labs, concomitant medications, medical history and disposition as stacked lanes on one study-day axis. Clicking any mark anchors time on it and lists what was recorded around it.
Not counted a finished chart

One participant’s course on one study-day axis. Click any event and the panel beside the chart lists what was recorded around it, each item linked to its source row.
Why it matters
Reviewing a single participant usually means opening five listings and lining the days up by eye. This puts them on one axis, and makes the question “what else was happening then” one click.
Try it
Open the Patient Journey ExplorerWhen the RhoInc and SafetyGraphics renderers were retired they left 282 open issues behind. A survey of all twelve trackers found 144 still worth carrying over and picked nine that the shared modules made cheap. All nine are in this release.

The Shift Plot on a log scale, asked for in 2016. Both axes share one domain, so the identity line still means no change.

The QT explorer now prints the confidence intervals it was only drawing, and carries its caution in every view.
Why it matters
These were filed by the clinicians, programmers and reviewers who ran the original charts on studies, some as long ago as 2016. The release notes name the issue each one answers and, where the tracker recorded it, the person who filed it.
Try it
Open the Shift Plot