Open source stability statistics
ICH Q1E inspired
Python owned calculations
Public face for a real analysis engine

OpenPharmaStability

An open source, ICH Q1E inspired toolkit for reproducible pharmaceutical stability analysis.

Upload stability data, run transparent shelf life calculations, and generate audit friendly HTML, JSON, and plot artifacts from a Python statistical engine.

Hiring signal

Shows statistical modeling, pharma context, reproducible artifacts, and regulatory aware boundaries in one coherent product surface.

127.0.0.1:8765 local workspace
Setup
CSV or XLSX
assay_3batch.csv
CONDITION
25C / 60RH
ATTRIBUTE MODE
Single
List
All
POLICY
Q1E default
BQL as declared
Drug product
Supported
run 0142
17 months supported shelf life
Statistical crossing 17.95 months. Limiting attribute assay.
{{ chartHero }}
MODEL
common slope
POOLABILITY
partial
Artifacts
report.html
record.json
plot.png
sha256
4f9c9a8b21e7
AUDIT NOTE
Extrapolation flag retained in report record.
Python engine
CSV and XLSX
HTML and JSON
Q1E inspired
Many attributes
Hashed outputs
Method ledger

Not a calculator. A documented statistical run.

The page foregrounds the work hiring reviewers should notice: regression choices, poolability logic, confidence bounds, data warnings, and reproducible artifacts.

01
Load stability data
CSV or XLSX input, condition selection, attribute mode, product type, metadata, and BQL policy.
02
Run the engine
Batch regression, ANCOVA poolability, one sided confidence bounds, extrapolation checks, and diagnostics.
03
Export the record
HTML report, JSON decision record, confidence plot, optional PDF, input hash, library versions, and warnings.
Capability index

A statistical toolkit with visible assumptions.

Shelf life and retest period
Lower confidence bound crossing against specification limits.
Multi batch regression
Pooled, common slope, and batch specific model paths.
Poolability testing
Slope and intercept checks with transparent p values.
Attribute limiting
Many attributes can be screened and ranked by the limiting result.
BQL policy handling
Below quantitation choices stay explicit in the decision record.
Exploratory modules
Arrhenius, MKT, and sensitivity analysis are presented as exploratory.
Report specimen

A result sheet that can survive technical review.

The report preview does not bury the model. It shows the supported decision, statistical crossing, poolability status, warnings, and the confidence plot together. The linked artifacts are generated by the current Python engine.

Assay at 25C / 60RH
3 batches, 0 to 18 mo
Lower one sided 95% confidence bound against a 95.0% lower specification limit.
{{ chartReport }}
Common slope fit
95% bound
Batch data
Supported decision
17months supported shelf life
Statistical crossing
17.95 mo
Poolability
partial
Model
common slope + batch intercepts
Guidance profile
ICH Q1E (default)
Warnings 5
Step one slope poolability p value 0.9056. Step two intercept p value 1.658e minus 16.
Influence check flags four observations for review. No point is auto excluded.
Technical case study

The statistical core is the portfolio story.

This specimen comes from the bundled assay data and current engine. It demonstrates the part hiring reviewers should care about: model selection under Q1E style poolability logic, confidence bound crossing, and transparent warnings.

Input
42 assay observations
Three batches, condition 25C / 60RH, time coverage from 0 to 18 months.
Poolability
Partial pooling selected
Slope interaction passes with p value 0.9056. Batch intercepts differ with p value 1.658e minus 16.
Bound
One sided 95% lower bound
The decision uses the lower confidence bound crossing against a 95.0% lower specification limit.
Decision
17 months supported
Statistical crossing is 17.954842 months. The reported shelf life is rounded down to 17 months.
Architecture

The UI is thin. The Python engine is authoritative.

OpenPharmaStability separates presentation from calculation. The browser workspace submits data to a thin local service, while the Python engine owns the statistical model, report generation, JSON decision record, and artifact hashing.

No result is computed in the browser. The interface only renders what the engine has already decided, so a report opened in the UI and one produced from the CLI match the same decision record.

in
CSV / XLSX dataset
core
Python statistical engine
Stability result + decision record
out
HTMLJSONplot
ui
Local UI preview (render only)
Positioning

Educational, exploratory, reproducible decision support

OpenPharmaStability is intended for educational, exploratory, and reproducible decision support use. It is not a validated GxP system and does not provide 21 CFR Part 11 audit trails, electronic signatures, or data integrity controls.

What it is
Reproducible Transparent Audit friendly records Decision support
What it is not
Validated GxP system 21 CFR Part 11 Electronic signatures Data integrity controls
Run locally

Local by default. Your data stays on the machine.

Install & launch the workspace
bash
$ pip install openpharmastability
$ openpharmastability-ui --host 127.0.0.1 --port 8765

Open http://127.0.0.1:8765 and upload a CSV/XLSX stability dataset.

Or run a single analysis from the CLI
bash
$ openpharmastability analyze examples/assay_3batch.csv \
    --condition "25C/60RH" \
    --attribute assay \
    --output report.html

Writes report.html plus a matching JSON record and confidence plot.

Local workspace

Stability analysis for assay_3batch.csv

engine connected at 127.0.0.1:8765
openpharmastability workspace
Setup
Dataset
assay_3batch.csv
18 rows, 3 batches, drag to replace
Condition
Attribute mode
Single
List
All
Product type
Drug product
Drug substance
Guidance profile
BQL policy
{{ advChevron }} Advanced options
Complete ran in 0.42s
Supported decision
17mo
Limiting attribute
assay
Guidance profile
ICH Q1E
Model
common slope + intercepts
report.html preview
Stability report

Assay supported shelf life

Condition 25C/60RH, 3 batches, ICH Q1E inspired evaluation
{{ chartApp }}
Supported shelf life17 months
Statistical crossing17.95 months
Specification (lower)95.0 %
Modelcommon slope + batch intercepts
Poolabilitypartial (slopes independent)

The lower one sided 95% confidence bound of the common slope regression intersects the 95.0% specification limit at 17.95 months; the supported shelf life is therefore reported as 17 months. Slope poolability was rejected at alpha 0.25, so batch specific slopes were retained for the limiting estimate.

Poolability
Slope poolability rejected at alpha 0.25 with p = 0.18. Independent slopes retained; the most conservative batch governs the supported shelf life.
Extrapolation
Reported shelf life at 17 mo extends beyond the 18 month observed coverage only marginally; treat the estimate as exploratory per ICH Q1E extrapolation guidance.
Data quality pass
No below quantitation values detected. All six time points present across three batches.
record.json
{
  "attribute": "assay",
  "condition": "25C/60RH",
  "supported_shelf_life_months": 17,
  "statistical_crossing_months": 17.95,
  "spec_limit_lower": 95.0,
  "model": "common_slope_batch_intercepts",
  "poolability": "partial",
  "guidance_profile": "ich_q1e_default",
  "warnings": 2,
  "artifact_sha256": "4f9c...a1e7"
}
Artifacts
report.html
get
record.json
get
plot.png
get
report.pdf
get
Audit facts
Input SHA 256
c1a7 9e4f 22b0 8d63 ... 4f9c a1e7
Engine version
openpharmastability 0.4.0
Run timestamp
2026-06-22T14:08:21Z
Reproducible
inputs + config hashed
Not a validated GxP system. No 21 CFR Part 11 controls.
DESIGN.md

A design system for a scientific instrument

Warm, editorial, and precise. The system favors restraint, subtle borders over heavy shadows, generous whitespace over decoration, and functional color over ornament. Built to read as a serious analytical tool, not a marketing page.

01

Color

Surfaces & text
Parchment
#f4f0e7 page
Warm panel
#fdfbf6 panels
Charcoal
#211f1b text
Stone
#6f685d secondary
Accent & functional data colors
Terracotta
#b35a3a accent
Sage
#5e7a56 pass and batch
Ink blue
#3f5d78 data and batch
Amber
#b07a32 warning
Accent is reserved for primary actions, links, and the regression line. Functional colors carry meaning (sage = pass / supported, amber = caution, ink = data series) and are never used decoratively.
02

Typography

Aa
Newsreader
Display and headings serif
Aa
IBM Plex Sans
UI and body sans serif
Aa
IBM Plex Mono
Code, data & hashes
DisplayNewsreader 500, 46 to 58px
Section headingNewsreader 500, 30 to 36px
Subhead or card titlePlex Sans 600, 15 to 18px
Body copy, readable and compactPlex Sans 400, 14 to 16px
Eyebrow or labelPlex Mono, 12px, 0.16em
03

Spacing, radius & elevation

Spacing scale, 8px base
8
16
24
40
56
Radius, maximum 12px
4 control
8 card
12 panel
Elevation, borders first
04

Components

Buttons
Status badges
SupportedPartial
Segmented control
List
Single
All
Code / mono
$ openpharmastability analyze
Warning panel
Poolability
Slope poolability rejected at alpha 0.25. Independent slopes retained.
05

Usage rules

Do
Lead with the decision. The supported number is the hero.
Use subtle borders to separate; reserve shadow for the one floating surface.
Keep numbers, hashes, and code in IBM Plex Mono.
State limitations plainly and visibly.
Don't
No gradients, glassmorphism, or decorative blobs.
No nested cards or heavy drop shadows.
No claims of validation, GxP, or 21 CFR Part 11 compliance.
No accent color used purely for decoration.
note Full token reference exported as DESIGN.md alongside this component.