safety.viz release review 2026-10-02

What v1.8.0 adds, annotated

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

sv#149–#150 · hub#352

The demo app

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 app on the demo study: a header with the safety.viz wordmark, a Data tab and tabs for Labs and vitals, ECG and Adverse events with their supported counts; beneath it one row of the nine labs charts with Hepatic Explorer highlighted; and the hepatic safety explorer drawn across the full width of the page.

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.

The same view after selecting a participant: the chart’s control panel on the left, the eDISH scatter in the middle with the participant’s path traced, and the participant profile open on the right with header details and a labs-over-time chart.

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
  1. Click the ECG tab: it opens straight onto the QT explorer.
  2. Click Labs and vitals, then Hepatic Explorer in the row beneath.
  3. Click a point on the scatter: the participant profile opens beside the chart.
  4. Change the address to end in #data, or use back and forward: the app follows it.
sv#151–#152, #159, #163, #165 · hub#352

Load your own study

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 on the pilot demo study. A sidebar on the left lists three steps: Load your files, done, with a demo study menu reading Pilot study, a sentence describing the study, and Choose files and Reset buttons; Check the mapping, done, reading 4 guessed, 0 needed by a chart, with a Download mapping button; and Open a chart, current, reading 13 of 13 charts ready, with an Open first chart button. Beneath them the four loaded files are listed, adbds.csv flagged 4 guessed. To the right are the drop zone and the mapping table for adsl.csv.

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.

The Data view after Reset and then choosing five files: a note that site_notes.csv was not placed in a domain; the sidebar reading 4 files loaded, 23 guessed, 6 needed by a chart, and 7 of 13 charts ready, with each file flagged by its guessed and needed rows and site_notes.csv listed as not placed; and a card for dm.csv placed in Subject-level with 3 of 7 columns found and its mapping table.

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.

The mapping table for labs_final.csv beside the sidebar: rows such as Participant mapped to SUBJID and Measure to LBTEST marked guessed, Sex and Race marked same name, Upper limit of normal empty and marked needed by 3 charts, and key measure rows such as ALT is called ALT (SGPT). In the sidebar labs_final.csv is flagged 8 guessed, 3 needed.

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.

The app header on the renamed study before any correction: Labs and vitals reads 6 of 9, and the hepatic explorer view shows the message Not mapped yet: Upper limit of normal, Total bilirubin.

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

The hepatic safety explorer drawn from the renamed study after six rows were corrected by hand, with Labs and vitals reading 9 of 9.

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 single-file build opened from disk: the same header with every domain tab at zero; the sidebar with the three steps Load your files, Check the mapping and Open a chart, a Choose files button, no demo study menu, and the message No files are loaded; and the drop zone.

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

  • Which measures each chart cannot draw without (ALT and total bilirubin for the hepatic explorer, creatinine for the kidney explorer, one QTc correction for the QT explorer) is read from the charts’ code, not from a reviewed clinical rule.
  • When a labs file has no study-day column, the hepatic charts and the participant profile are given visit order instead, as the site’s own demo pages do.

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 view
  1. In the sidebar’s demo study menu choose Renamed columns. The sidebar reads 23 guessed, 6 needed by a chart, and 7 of 13 charts ready.
  2. Click labs_final.csv in the sidebar. In its table set Upper limit of normal to ULN, Treatment arm to TREATMENT, and Total bilirubin to Tot. Bilirubin.
  3. Set Treatment arm to TREATMENT under ae.csv and ecg.json, and End-of-study day to LASTDAY under dm.csv. The sidebar now reads 0 needed by a chart and 13 of 13 charts ready, and “Check the mapping” is done: guesses stay counted and flagged, but only a row a chart is waiting on holds the step.
  4. Click Open first chart, then Hepatic Explorer in the row of charts.
  5. Back on Data, click Reset, then choose Liver cohort, labs only: one file, and the charts of the other domains say they have no file.
  6. To load the same study as files of your own, save labs_final.csv, dm.csv, ae.csv and ecg.json, click Reset, and drop them on the drop zone.
  7. In the footer, choose Download as one file, open it from your disk, and drop the four files there.
sv#142, #176 · hub#349

Patient Journey Explorer

Prototype

A 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

  • The review of this release found five cases where the chart misdraws or drops part of a record, among them false dose changes when two drugs are given over the same days, and a record far to the left of the axis that is counted as drawn but cannot be seen (safety.viz#167).
  • The AI narrative layer that sat on top of this chart is not in the release. The reviews found it could cite another participant’s rows and pass its own checks, so it was taken out; its code is kept on a branch and its findings are filed (safety.viz#168, safety.viz#176).
  • So it ships as a prototype: on the docs site, outside the demo app and the standard domain set, and its two requirements stay open.
The Patient Journey Explorer for one participant: lanes for exposure, dose changes, adverse events, four lab tests with reference bands, and concomitant medications, with a subject picker and lane and filter controls on the left.

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 Explorer
  1. Pick a participant from the list on the left.
  2. Click an adverse-event bar: the panel beside the chart lists the labs, medications and dose changes around it.
  3. Click an item in the panel: it opens the source row it came from.
  4. Read the evidence page: each requirement row traces to a named test.
sv#136, #166 · hub#33

Nine requests from the original renderers’ users

When 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 Safety Shift Plot with Axis Type set to log: baseline against week 26 alanine aminotransferase, the points spread along the dashed identity line.

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 Safety Explorer with its standing caution, the central-tendency chart by arm, and beneath it a table of mean change by visit and arm with the 90 percent confidence interval bounds.

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
  1. Set Measure to Alkaline Phosphatase and Axis Type to log.
  2. Scroll to the foot of the controls and choose Reset chart.
  3. Open the QT explorer and read the table under the chart.
before you approve

What is not in this release

  • One set of arm, site and population filters across every chart, and a saved study configuration.
  • The participant profile opening from every chart on the mapped identifier.
  • Detecting the standard, not only the domain, of a file.
  • A demo study inlined in the single file, and a size budget for it.
  • The Patient Journey Explorer as a finished chart: it is a prototype, with its review findings filed.
  • AI narratives on the Patient Journey Explorer: taken out before release, kept on a branch.
  • Several files in one domain, such as labs and vitals delivered apart: a second file takes the domain and the first is kept, set aside (hub#365).

Where to look further