Interactive Sandbox

See it work — not a slideshow

Hands-on demos that run real CuRE logic in your browser, on synthetic data. No login, no setup — start with the Cascade randomization engine below, the same code we validate for statistical equivalence against the randomizeR and carat reference implementations.

Synthetic data only — nothing here touches a real patient record or a backend.
CuRE Cascade · Randomization

Build a randomization schedule

Pick an algorithm, configure the arms and stratification, and generate an allocation sequence on synthetic subjects. Change the seed to see reproducibility; change the algorithm to see how each one trades off balance, predictability, and covariate control.

Arms shuffled within fixed-size blocks — balance is guaranteed at every block boundary.

Same seed → identical schedule, every time. That reproducibility is what makes a randomization list auditable.

Arm balance · 48 subjects

Treatment24 (50.0%)
Control24 (50.0%)

The vertical marker on each bar is the target allocation.

Allocation sequence

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

Why this is more than a toy

The schedule above is produced by a vendored, byte-for-byte copy of CuRE Cascade's randomization core — including its R-compatible MT19937 PRNG. In the product, that engine is validated for statistical equivalence against the randomizeR and carat packages as oracles, and every draw is written to the platform's OMOP store inside a 21 CFR Part 11 audit envelope. Here it runs entirely client-side on synthetic subjects.

CuRE Calculate · Cohort characterization

Characterize a cohort, live

Define inclusion criteria over a synthetic OMOP CDM slice and watch the characterization table recompute in your browser — demographics, condition and drug prevalence, and lab distributions, each compared against the background population. Filter to a condition and the enriched comorbidities and shifted labs fall out of the real aggregation, not a script.

Inclusion criteria over a synthetic OMOP CDM slice of 600 persons.

Cohort size
600
100.0% of 600 persons
Mean age
55.1
±16.8 · median 55
Female
48%
Age range
18–90

Condition prevalence

ConditionCohort vs. sourceCohortΔ
Hypertensive disorder
28.3% (170)
Obesity
26.2% (157)
Hyperlipidemia
21.7% (130)
Osteoarthritis
19.2% (115)
Major depressive disorder
13.2% (79)
Type 2 diabetes mellitus
12.5% (75)
Atrial fibrillation
9.5% (57)
Chronic kidney disease
9.0% (54)
Asthma
8.3% (50)

Lab measurements

MeasurementNMean (SD)MedianSource mean
Hemoglobin A1c %5455.6 (0.8)5.45.6
Systolic blood pressure mmHg566127 (13)125127
Body mass index kg/m²54728.1 (5.4)27.928.1
Total cholesterol mg/dL522194 (35)193194
eGFR mL/min/1.73m²52586 (13)8886

Drug exposure

DrugCohort vs. sourceCohortΔ
Lisinopril
21.2% (127)
Atorvastatin
14.7% (88)
Sertraline
9.3% (56)
Metformin
9.2% (55)
Albuterol
7.3% (44)

Bars show the cohort rate; the vertical marker is the rate in the full synthetic source population, so an enriched feature reads as a bar overshooting its marker. Every figure is aggregated in your browser from 600 synthetic OMOP persons — change a criterion and watch it recompute.

Why this is more than a toy

This is the OHDSI cohort-characterization pattern — the same shape as FeatureExtraction — running on real OMOP standard concept IDs (SNOMED conditions, RxNorm drugs, LOINC labs). Every count, prevalence, and mean is aggregated client-side from a synthetic population of 600 persons; nothing here calls a backend. In the product, CuRE Calculate runs this characterization methodology over a governed OMOP store and emits submission-grade, validated outputs.

CuRE Canary · Signal detection

Find a safety signal, live

Pick a drug–event pair from a synthetic spontaneous-reporting database, drag the observed co-report count, and watch the disproportionality statistics — PRR, ROR (both with 95% confidence intervals), the chi-square, and DuMouchel's Empirical-Bayes EBGM / EB05 — recompute in your browser, then the pair's triage move between validated, watchlist, and dismissed.

A synthetic spontaneous-reporting database of 60,000 reports across 5 drugs and 7 events.

Event +Event −
Drug +a = 288b = 1,312
Drug −c = 1,512d = 56,888

Drag above the expected count to manufacture disproportionality — watch EB05 shrink low counts back toward the null.

EB05 ≥ 2.0 and ≥ 3 co-reports ⇒ validated. Product default is 2.

Anticoagulant-XGI haemorrhage
Validated signal
PRR
6.95
95% CI 6.19–7.81
ROR
8.26
95% CI 7.20–9.48
EB05
5.42
EBGM 6.00
χ² (Yates)
1265.7
obs 288 vs exp 48.0

EBGM is the Empirical Bayes Geometric Mean of the reporting ratio under a two-component Gamma-Poisson (DuMouchel MGPS) posterior; EB05 is its conservative 5th-percentile lower bound — the score Canary triages on because it self-corrects for the small counts that inflate raw PRR/ROR.

All pairs · ranked by EB05

6 validated3 watch26 dismissed
Drug → EventaPRREB05Disposition
SSRI-Z → Serotonin syndrome12118.1510.99Validated signal
Statin-Y → Rhabdomyolysis13814.879.48Validated signal
Biologic-V → Injection-site reaction10511.598.39Validated signal
Anticoagulant-X → GI haemorrhage2886.955.42Validated signal
NSAID-W → Acute kidney injury1915.003.97Validated signal
NSAID-W → GI haemorrhage1633.412.79Validated signal
SSRI-Z → Nausea2291.421.24Watchlist
SSRI-Z → Headache1821.311.13Watchlist
NSAID-W → Nausea2381.211.07Watchlist
Statin-Y → Acute kidney injury491.320.97Dismissed
Anticoagulant-X → Acute kidney injury481.210.89Dismissed
Statin-Y → Serotonin syndrome121.210.62Dismissed

Every statistic is computed in your browser from the synthetic 2×2 tables — no backend. Notice a high raw count is not enough: a common event like a background headache can post a big a yet stay dismissed once EB05 shrinks it against how often it is reported anyway. That shrinkage is what separates a real signal from reporting volume.

Why this is more than a toy

These are the FDA/EMA/WHO-UMC disproportionality formulas — Evans (2001) PRR, van Puijenbroek (2002) ROR, and DuMouchel's (1999) Multi-item Gamma-Poisson Shrinker — ported faithfully from CuRE's signal-detection methodology, including the product's default MGPS prior and the EB05 ≥ 2 triage rule. The key move a real PV engine makes, and this demo shows, is shrinkage: a common event with a big raw count stays dismissed once EB05 corrects for how often it is reported anyway. In the product, Canary runs this over an OMOP-native report store and routes validated signals into case management.

CuRE Curtain · De-identification review

Gate a release on re-identification risk

Tune k-anonymity, l-diversity, t-closeness, and the generalization budget on a synthetic OMOP release, and watch the equivalence classes reform, the privacy↔utility tradeoff shift, and the export gate open or close — computed live in your browser by the same generalize-then-suppress fixed point the product runs.

A synthetic release of 140 records — quasi-identifiers age, zip, sex and a sensitive diagnosis.

Minimum equivalence-class size. Classes smaller than k are generalized or suppressed.

Distinct diagnoses required per class — guards against the homogeneity attack.

Max EMD between class and global sensitive distribution (numeric attributes).

How far age can bin (10→20→40…) and ZIP can truncate (5→3→*) before a class is suppressed instead.

Over-suppressed
46 records suppressed to satisfy the thresholds — loosen k / l or raise the generalization budget to keep more.
🔒
Records released
94
of 140 · 67% retained
Suppressed
46
too identifying to release
Classes clearing gate
6/14
min class size 1
Privacy posture
43%
classes passing k·l·t

Privacy ↔ utility tradeoff

Privacy (classes passing)
43%
Utility (records retained)
67%

Tighten k or l and privacy rises but utility falls as more records suppress; spend more generalization budget to recover utility by merging classes instead. That is the officer's whole job — and it is a real fixed-point computation here, not a mockup.

Equivalence classes · generalized [age | zip | sex]

Generalized quasi-identifierSizekltDisposition
0-39 · 020 · *96Suppressed · k
80-119 · 021 · *83Suppressed · k
40-79 · 020 · *86Suppressed · k
0-39 · 024 · *75Suppressed · k
40-79 · 024 · *65Suppressed · k
80-119 · 020 · *42Suppressed · k
0-39 · 021 · *33Suppressed · k
80-119 · 024 · *11Suppressed · k/l
20-29 · 021 · *257Released
60-69 · 021 · *165Released
40-49 · 021 · *166Released
30-39 · 021 · *154Released
70-79 · 021 · *115Released
50-59 · 021 · *116Released

Each row is an equivalence class after generalization — note how age widens into decade bins, zip truncates to three digits, and sex redacts to *. k-anonymity, l-diversity (distinct diagnoses), and t-closeness are computed in your browser for every class; nothing calls a backend.

Why this is more than a toy

This is a faithful, dependency-free copy of CuRE's re-identification-risk methodology — the same equivalence-class formation, k-anonymity, distinct l-diversity, and 1-D Earth Mover's Distance t-closeness (Li, Li & Venkatasubramanian 2007), driven by the identical fixed-point generalize-then-suppress loop. In the product that methodology is owned by CuRE Calculate and rendered by Curtain for a privacy officer to gate a release against 45 CFR §164.514 Expert Determination; here it runs entirely client-side on synthetic records. Every k, ℓ, and t figure is recomputed in your browser — no backend.

CuRE Caliber · Risk-based quality monitoring

Flag the outlier site, live

Run centralized statistical monitoring across a synthetic multi-site study. Each site's Key Risk Indicators are scored against their thresholds and summed into a risk score; move the outlier sensitivity and watch the flags move; expand a site to see its KRI breakdown — including the AE under-reporting signal that catches missed safety events.

A synthetic study across 8 sites — six Key Risk Indicators evaluated per site over their operational data.

A site is flagged when its risk score is a robust z-score (median / MAD) of at least this above its peers. Lower to widen the net; raise to surface only the extreme outliers.

KRI library
  • Screen failure · dropout · enrollment
  • Query rate · protocol deviations
  • AE under-reporting (sidecar method)
Sites monitored
8
With ≥1 breach
8
at least one KRI over threshold
Outliers flagged
3
z ≥ 2.0
Top risk site
SITE-07
risk score 42

Sites · ranked by additive risk score

Key risk indicatorValueThresholdWeightStatus
Screen failure rate42%> 30%6breach +6
Subject dropout rate32%> 20%8breach +8
Enrollment rate (actual/planned)56%< 70%5breach +5
Open query rate per subject3.09> 26breach +6
Protocol deviation rate21%> 10%7breach +7
AE under-reporting signal· sidecar13 obs vs 24 expected AEs0.008< 0.0510breach +10

Risk score is the sum of breached KRI weights (TransCelerate RBQM · ICH E6(R3) catalog).

Every KRI value, breach, risk score, and z-score is computed in your browser from the synthetic site data — no backend. The KRI codes, thresholds and weights are the seeded CuRE Caliber catalog (TransCelerate / ICH E6(R3)); the AE under-reporting signal is the exact Poisson lower-tail probability that a site's few reported AEs would occur if it truly reported at the study rate — the simaerep concept that, in the product, runs in the oracle-validated calculate-stats sidecar.

Why this is more than a toy

The KRI codes, default thresholds, and additive weights are the seeded CuRE Caliber catalog — recognized TransCelerate RBQM and ICH E6(R3) indicators. Per the platform's analytics-placement boundary (ADR-PLT-044), Caliber itself does only threshold-and-weight math; the oracle-validated statistical methods live in the CuRE Calculate sidecar. The headline AE under-reporting signal here is the exact Poisson lower-tail probability that a site would report so few adverse events if it truly reported at the study rate — a faithful, self-contained stand-in for the sidecar's simaerep method. Everything is computed client-side on synthetic sites; nothing calls a backend.

CuRE Conduct · FHIR → OMOP mapping

Map FHIR to OMOP, field by field

Pick or edit a FHIR Condition resource and watch Conduct's mapper produce the OMOP condition_occurrence row live — resolving the source code to an OMOP standard concept (following Maps to when the source is non-standard), applying the onset-date priority chain, and flagging domain-routing or unmapped codes.

A non-standard ICD-10-CM source code — the resolver follows "Maps to" to the SNOMED standard concept, so source_concept_id ≠ condition_concept_id.

omop.condition_occurrence
Mapped
Concept resolution
icd-10-cm|E11.9source concept 45542738Maps to201826 · Type 2 diabetes mellitus
OMOP domain Condition · standardized from a non-standard source code
condition_concept_id201826
condition_source_concept_id45542738
condition_source_valuehttp://hl7.org/fhir/sid/icd-10-cm|E11.9
condition_start_date2022-11-30
condition_end_date
condition_type_concept_id32817
condition_status_concept_id32902
condition_status_source_valueactive

This is Conduct's real Condition mapper running client-side: the onset-date priority chain (onsetDateTime → onsetPeriod.start → recordedDate), the clinicalStatus→concept map, the EHR type concept, and the concept resolver that follows OMOP Maps to so a non-standard source code lands on the right standard concept while its origin is preserved in source_concept_id. Edit the JSON above and the row remaps instantly — no backend.

Why this is more than a toy

This is Conduct's actual Condition mapper, ported dependency-free from the platform monorepo (apps/conduct/…/mapping-engine): the same FHIR-system→OMOP-vocabulary table, vocabulary-priority coding selection, concept resolver, and field-for-field condition_occurrence construction. In the product Conduct owns the canonical FHIR→OMOP mapping (Conduit → Conduct → omop, per ADR-PLT-026) and resolves concepts against the full OMOP vocabularies; here it runs against a hardcoded vocabulary slice, entirely in your browser. No backend.

CuRE Capture · Validation EDC

Catch a bad value as it's entered

Enter values into a sample case report form and watch Capture's edit checks fire — an out-of-range lab or a physiologically implausible vital auto-raises a data query on the spot, with a 21 CFR Part 11 audit attribution. Fix the value and the query clears; break a cross-field rule and a new one appears.

Case report form · Visit 3

Subject 1042 · edit a value and validation re-runs on the spot.

g/dL
mmHg
mmHg
%
mEq/L
Auto-raised queries
2 open
error·HemoglobinOPEN

Hemoglobin value 10.2 g/dL is outside the reference range (12–17.5). Please verify the source.

source: AUTO·System·rule range_hemoglobin
error·Systolic BPOPEN

Systolic BP value 166 mmHg is outside the reference range (90–140). Please verify the source.

source: AUTO·System·rule range_systolic_bp

Each query is raised by the same field-save validation core CuRE Capture runs — the out-of-range comparator, cross-field consistency checks, template rendering, and the active-query de-duplication guard, all computed in your browser. In the product each auto-query is written with a 21 CFR Part 11 audit trail (source AUTO, opened by the system user, timestamped and hash-chained) and routed to a coordinator; here nothing calls a backend.

Why this is more than a toy

The validation running here is Capture's actual field-save auto-query core, ported dependency-free from the monorepo (apps/capture/…/data-capture/auto-query-service.ts): the out-of-range comparator, cross-field consistency checks, the query-template renderer, and the active-query de-duplication guard, producing the same QueryFlag shape (source AUTO, status OPEN, system-attributed). In the product each query carries a hash-chained 21 CFR Part 11 audit trail and routes to a coordinator; here it all runs client-side on synthetic data. No backend.

A demo for every app

Each CuRE app has a workflow worth touching. We're building them out one at a time — live ones are reachable now; the rest are on the way. All synthetic, all in-browser.

CuRE Cascade Live

Generate a real randomization schedule — block, stratified, biased-coin, or minimization — and watch arm balance hold.

Try it
CuRE Cyto Live

Parse a free-text ISCN karyotype string into structured, queryable data in your browser.

Try it
CuRE Capture Live

Type into a sample eCRF and watch AI validation flag an out-of-range lab and auto-raise a query.

Try it
CuRE Conduit Planned

Paste a CSV header row and see columns classified to OMOP domains with confidence scores.

CuRE Conduct Live

Paste a FHIR Condition resource and watch it map to an OMOP condition_occurrence row.

Try it
CuRE Calculate Live

Build a cohort over a synthetic OMOP slice and see the characterization table compute live.

Try it
CuRE Compass Planned

Complete an EQ-5D ePRO instrument and see the validated index score computed instantly.

CuRE Cue Planned

Pick a synthetic patient and watch an OMOP cohort rule fire a point-of-care alert.

CuRE Control Planned

Step through study startup milestones and an enrollment funnel on a synthetic study.

CuRE Caliber Live

Run centralized statistical monitoring across synthetic sites and flag the outlier.

Try it
CuRE Canary Live

Enter drug–event counts and compute PRR / ROR / EB05 disproportionality signals.

Try it
CuRE Curtain Live

Compute k-anonymity / l-diversity on a synthetic release and gate it for export.

Try it
CuRE Clarion Planned

Submit a sample AI call and watch the hash-chained audit entry append — then verify the chain.

CuRE Compend Planned

Drop a document title and see it classified to its DIA TMF zone with a readiness score.

CuRE Commons Planned

Match a synthetic protocol's criteria against computed site-capability profiles.

CuRE Credo Planned

Walk a deviation into a CAPA, with the linked training and evidence trail.

CuRE Consign Planned

Assemble an eCTD sequence (new / replace / append / delete) and see the lifecycle tree.

CuRE Consulate Planned

Track a registration across health authorities through variations and renewals.

CuRE Cachet Planned

Diff two label versions and inspect the structured product (SPL) record.

Planned · cross-app

The whole platform, end to end

The point of CuRE is that the apps share one governed record. These guided journeys will let you follow a single synthetic case across app boundaries — the story no single-app demo can tell.

One governed record, every app

Follow one synthetic patient as their data lands, maps to OMOP, is captured, analyzed, surfaced at the point of care, and screened for safety signals.

Design once, generate everywhere

Change one study-design element and watch the CRF, SDTM mapping, and define.xml regenerate from the shared metadata repository.

RWD-to-submission evidence chain

Trace an adverse event from capture, to an E2B(R3) case, into the TMF, and out as an eCTD sequence — one sealed evidence chain.

Randomize, supply, analyze

A randomization and dispensation event written to the OMOP store is read straight back by analytics — no separate IRT silo.

Safety signal to quality action

A pharmacovigilance signal becomes a quality KRI, which opens a CAPA — the safety-and-quality loop on one substrate.

Want to run this on your own data?

The sandbox is synthetic. Let's talk about a walkthrough on a workflow that matches your program.