Goal: user-facing product surfaces (currently the internal dashboard
app — patient imaging viewers, compute tooling, the blog) built on top of
vxData and the other infrastructure plumbing. No monthly report has ever
been filed for product; this page exists because a session recap landed
in inbox/ before the workstream had a wiki home (begin-work step 4 was a
dead end until this page was added — 2026-08-06).
Most of the concrete how-to material for dashboard-frontend/dashboard-api work still lives under infrastructure/sops/dashboard-app-dev-and-deploy.md (local dev, deploy, blog rendering) since that app is jointly owned with infrastructure. This page tracks product-specific feature work instead.
What’s documented so far
- Diffsim volume viewer: the patient page’s
DiffsimScanCardused to render oneVolumeBrowser(and one Niivue WebGL context) perDiffsimScan— hundreds per Essen01 patient. Collapsed to a singleVolumeBrowserwith a nested scan > volume sidebar via a new optionalgroups?: VolumeGroup[]prop; the flatvolumesprop remains the source of truth for selection/sorting/filtering/search/prefetch (virdx/mono#313-> draft PRvirdx/mono#314). Fixed a relatedVolumeViewerrace along the way: the volume-load effect readnvRefbefore the canvas-keyed mount effect had run, so a viewer whose volume was already known on first render never retried and stuck on Niivue’s own “loading…” screen.- Known local-dev trap this surfaced:
apps/vxdata-api’sjust inject-mockseeds diffsim volumes as plainVolumepayloads instead ofDiffsimVolume, so a freshly seeded diffsim scan shows zero volumes — see the “Local dev loop” gotchas in vxData SDK + schema model. - To get a viewer-testable volume into a local stack:
POST /s3/presignwithdirection: "upload",PUTthe bytes to the returned URL, and use the returneds3://path as the resource’surl/path_nii— the presign response is authoritative for the key, don’t assume a layout. - Headless Chromium renders Niivue canvases unreliably; use a headed browser for WebGL screenshot validation.
- Known local-dev trap this surfaced:
No sops/ or projects/ subdirectory exists yet for this workstream — add
them as more product work gets synthesized from inbox/.