For biostatistics and statistical reporting

Every number traces back to
its source

BuildTLFs generates Tables, Listings, and Figures from one analysis spec with cell-level provenance and identical Python, R, and SAS output, while patient data never leaves your boundary.

21 CFR Part 11CDISC ARS Cell-level provenancePython = R = SAS RTF + HTML
Use the arrows below, your keyboard's ← → keys, or swipe
The cost of the status quo

A table is only as trustworthy as the trail behind it

TLFs are the regulatory output, yet traceability and reproducibility are still manual. One number a reviewer cannot tie back to source can stall a submission, and re-running an old output is rarely byte-for-byte the same.

× Provenance lives in people's heads

When a reviewer asks where a cell came from, the answer is a programmer reconstructing the logic by hand from scripts and memory.

× Outputs are hard to reproduce

Re-running last quarter's table on today's tools rarely returns the exact same numbers, so a defended result quietly drifts.

× Raw data has to travel

Many tools require shipping patient data to the engine, widening the privacy and compliance surface you have to defend.

The solution in one line

One spec, three identical outputs, every cell traceable

BuildTLFs drives generation from a CDISC-aligned spec, computes once and proves Python, R, and SAS agree, and links every output cell to its source. The control plane holds specs and provenance and never touches patient data.

One spec

Author the analysis shell once. The same spec drives the compute and both code exports, so the spec is the single source of truth.

Triple equivalence

Python compute, the R export, and the SAS export are checked to produce identical results before a table can advance.

Cell-level provenance

Every cell links to its dataset, variable, where-clause, and the N behind it, so any number is verifiable in seconds.

Walkthrough · 1 of 7
Authoring

Build the shell, or ingest the SAP

How it works
  • Start from scratch, ingest an analysis spec, or copy a global template. The shell is CDISC-aligned from the first row.
  • An ingested SAP populates the row and column structure, which you keep, edit, or extend.

Why it mattersThe spec is the single source of truth, readable and reusable across studies rather than buried in one-off code.

app.buildtlfs.io/shells
Table 14.1.1 Demographics SAP ingest proposed
Population analysis set, treated. Rows kept from the template. Age (years), n, Mean (SD), Median, Min, Max - populated from the ingested analysis spec. Columns by planned arm.
Walkthrough · 2 of 7
Equivalence

Python, R, and SAS, proven identical

How it works
  • The spec compiles to Python, R, and SAS that follow the same summary logic line for line.
  • The platform runs all three and confirms the outputs match before the table can advance.

Why it mattersPick any language to reproduce a result and trust it agrees with the other two, so the triple-language promise is verified, not assumed.

app.buildtlfs.io/compute
PythonRSAS
# Table 14.1.1 - Age summary by arm (generated)age = adsl.query("SAFFL == 'Y'")summ = (age.groupby("TRT01A")["AGE"] .agg(n="count", mean="mean", sd="std", median="median", lo="min", hi="max"))out = render_shell("T_14_1_1", summ)
Walkthrough · 3 of 7
Traceability

Every cell links back to its source

How it works
  • Select any cell to see its dataset, variable, where-clause, and the N behind it.
  • The trace is captured at generation time, so it is always current with the value on the page.

Why it mattersA reviewer verifies any number in seconds, which is the difference between a clean review and a finding.

app.buildtlfs.io/trace
Age (years)PlaceboDrug 50mgDrug 100mg
n848685
Mean (SD)54.2 (11.3)55.8 (10.7)53.9 (12.1)
Median54.056.053.0
Min, Max31, 7834, 7929, 81
Selected cell trace Mean (SD), Drug 50mg
dataset  ADSL
variable  AGE
where  SAFFL = 'Y' and TRT01A = 'Drug 50mg'
N  86 records
Walkthrough · 4 of 7
Outputs

Submission-ready RTF and HTML

How it works
  • Generate RTF for the dossier and HTML for review from the same run, with no re-keying.
  • Headers, footnotes, and population labels render straight from the spec.

Why it mattersOne spec yields the formats both your submission and your reviewers need, so the dossier and the review copy can never disagree.

app.buildtlfs.io/outputs
DemographicsPlacebo n (%)Drug 50mg n (%)Format
Sex - Female41 (48.8)45 (52.3)RTF
Sex - Male43 (51.2)41 (47.7)RTF
Race - White60 (71.4)62 (72.1)HTML
Race - Black14 (16.7)13 (15.1)HTML
Race - Other10 (11.9)11 (12.8)one run
Walkthrough · 5 of 7
Templates

A library that compounds across studies

How it works
  • Demographics and AE-incidence anchors ship in as global templates.
  • Promote your own proven shells to a global library that every study can draw from.

Why it mattersEach study reuses proven shells instead of re-authoring, which cuts time and variation across your portfolio.

app.buildtlfs.io/templates
Global templates shipped in
Demographics T 14.1.x
summary by arm, safety population
AE incidence T 14.3.x
Study templates promoted by your team
Exposure summary promoted
Lab shift table promoted
Walkthrough · 6 of 7
Privacy boundary

Specs cross the boundary, data never does

How it works
  • The control plane holds specs, generated code, and provenance.
  • A data-plane runner executes at your boundary and returns only metadata, code, and audit.

Why it mattersYour patient data stays in your environment, which shrinks the compliance surface to almost nothing.

app.buildtlfs.io/boundary
Metadata and code only

Patient data and ADaM datasets stay in your environment. Only specs, generated code, provenance, and audit ever cross.

Stays in
patient data, ADaM datasets
metadata + code only
Crosses
specs, generated code, provenance, audit
Walkthrough · 7 of 7
Structure

Studies, deliverables, and outputs in order

How it works
  • Organize TLFs under deliverables such as CSR, DMC, SDR, and IA within each study.
  • Every table, listing, and figure has a home, so the backlog stays clean.

Why it mattersThe backlog mirrors how your team actually delivers, so nothing is orphaned and status is clear at a glance.

app.buildtlfs.io/studies
Study ABC-101 4 deliverables
CSR 38 outputs
T 14.1.1 Demographics
T 14.3.1 AE incidence by SOC
F 14.2.1 Mean change over time
DMC 12 outputs
SDR 9 outputs
IA 6 outputs
Why BuildTLFs

Built for outputs you can defend line by line

CapabilitySAS macrosProprietary TLF toolsIn-SCE scriptingBuildTLFs
One spec, identical Python, R, and SAS
Cell-level provenance to source
Submission-ready RTF and HTML from one run
Reusable template library
Patient data never leaves your boundary
Append-only Part 11 audit trail
Built for every seat

One generator, six points of view

Statistical programmer

Author the analysis shell once and generate Python, R, and SAS for the same table, with no hand-syncing across languages.

Biostatistician

Trust that every reported number ties back to the ADaM source, with the where-clause and N visible on any cell.

Medical writer

Pull submission-ready tables and figures straight from the run, knowing the numbers in the report match the dossier.

QC programmer

Review the triple-engine compare in one place and sign off knowing Python, R, and SAS produced identical output.

Data manager

See which deliverables and outputs depend on each ADaM dataset, so a data refresh has a clear, scoped impact.

QA / auditor

Open any output cell and follow the captured trail to its source logic, ready for inspection on demand.

Compliance and trust

Regulatory rigor, by construction

The controls auditors look for are inherent in the system, not bolted on after the fact.

21 CFR Part 11

Append-only audit trail, server-time stamping, access control, and human-gated approvals on every output.

Control and data-plane separation

Patient data stays at your boundary. The control plane holds only specs, code, and provenance, never the rows.

Cell-level provenance audit

Every output cell links to its source logic, so any number can be traced to dataset, variable, where-clause, and N.

Tenant isolation

Row-level security separates every tenant's specs, outputs, and audit at the database, verified through the request path.

Generate one of your TLF shells in a 30-day pilot

See BuildTLFs turn your spec into RTF and HTML, prove Python, R, and SAS agree, and trace every cell to source in days. Your data stays at your boundary and the code is yours to keep.

  • We load a study spec into a private workspace
  • Your team authors a shell and generates a TLF set
  • You keep the R and SAS plus the provenance
  • A readout on review time saved
Talk to us · info@the-bdkm.com · BDKM LLC · Back to Life Sciences