Trusted data. Better research.
The single-file artifact for procurement / data-protection / clinical-operations sign-off before a pilot or go-live. Covers status, architecture, features, demo credentials, production readiness, EU Annex 11 validation evidence, day-by-day go-live timeline, and pricing.
MedData is live in a single-org pilot
(meddata-pilot) at
https://meddata.eyadrasmi.com, with
Wave 0 (Departments, Delegation, Two-person
rule), Wave 1 (EDC queries, cross-field
validation, conditional visibility, cascading dropdowns,
visual rule builder, compare-versions),
Wave 2 (multi-site studies, subject registry,
visit scheduler, per-site record filter), and
Wave 3 (21 CFR Part 11 e-signatures, EU Annex
11 CSV, GDPR Article 15 DSAR) all shipped. The first
customer (Dr. Sara Al-Mutairi, Cardiovascular Outcomes in Kuwaiti Adults pilot) is
reviewing the platform this week.
docs/annex-11-csv.md is the formal artifact
the inspector reads.
| Capability | Status | Where it lives |
|---|---|---|
| Auth + MFA + sessions | Live (M0.2 + M0.7) | /signin · apps/api/src/modules/identity/ |
| Studies + instruments + 14 field types + rule DSL | Live (M0.3 + M0.6 + Wave 1) | /studies/:id · /studies/:id/instruments |
| Records + values + audit + cross-field validation | Live (M0.4 + Wave 1) | /studies/:id/records |
| Exports (CSV / JSON, encrypted, 7-day TTL) | Live (M0.5) | /studies/:id/exports |
| EDC queries + cascade dropdowns + visual rule builder | Live (Wave 1) | /studies/:id/queries |
| Multi-site studies + subject registry + visit schedule | Live (Wave 2) | /studies/:id/sites · /subjects |
| 21 CFR Part 11 e-signatures | Live (Wave 3) | /studies/:id/signatures |
| DSAR (GDPR Article 15) | Live (Wave 3) | /dsar · /org/:id/dsar |
| Org admin + departments + delegation + two-person rule | Live (Wave 0) | /org/:id · /settings/delegations |
| Public read API + per-study bearer tokens | Live (M1) | /v1/studies/:id/records |
| Biostatistics (20 tests, R-parity) | Live (M2) | /studies/:id/analysis |
MedData carries a bilingual EN+AR brand with a strict design system. The system is built CSS-first; the component library is 11 elements; the contrast pass is 56/56 WCAG AA; the Arabic glossary is 610 entries.
Symbol. A 4-node 2×2 grid (the "Cohort") with the bottom-right node in teal — the source of truth in a multi-site study. SVG with a 6 px clear-space and 24 px minimum.
Wordmark. MedData in
single-color navy with Data in teal.
The lowercase Arabic counterpart is مِد-داتا
(RTL-aware).
Palette. Navy #102A43 ·
Teal #087F8C · Tangerine
#e58a2e · Lime #6cba3b ·
Cream #FFFCF5. Status colors always pair
with an icon and a text label.
Typography. 3 variable fonts: Inter (Latin), Noto Sans Arabic (Arabic), JetBrains Mono (machine identifiers). 712 KB total.
A single-tenant modular monolith in NestJS, a single Next.js 14 web app, and a single Prisma + SQLite database in dev (Postgres in production). All GxP-impacting flows (records, exports, e-signatures, audit) go through the same RBAC + capability layer.
Browser → Cloudflare edge → cloudflared → Next.js :3000
│ (server action / API proxy)
├─→ NestJS API :3001
│ ├─ Prisma (SQLite / Postgres)
│ ├─ Local FS storage (dev) / S3 (prod)
│ └─ MailService (dev: console.log; prod: SMTP)
│
└─→ /public/dsar (no auth) + /dsar/verify
Modular monolith, not microservices. One
NestJS process; split when load demands. Decision 11 in
docs/decisions.md explains the reasoning.
Capability layer. 32 capabilities (28 → 32
across Wave 0+1+2+3), per-row overrides on
StudyMembership, role defaults in
apps/api/src/common/capabilities.ts. A single
chokepoint can(userId, capability, studyId,
{siteId?}) gates every privileged write.
Audit trail. Append-only streams per
entity: RecordAuditEvent,
ExportAuditEvent,
MembershipAuditEvent,
RecordQueryAuditEvent,
SubjectAuditEvent,
SignatureAuditEvent,
DsarAuditEvent. The audit timeline module
aggregates them into a single per-study view.
The pilot includes the features the first customer will
touch in week 1. The descriptions below match the
screenshots in the live pilot at
https://meddata.eyadrasmi.com.
6 roles, 32 capabilities, per-row overrides, site-scoped memberships. TOTP MFA for the 5 privileged capabilities. Sessions are HttpOnly cookies, 30-day TTL, with a "act as" delegation model (Wave 0).
14 field types, bilingual labels, immutable
version snapshots. The rule DSL has 4 kinds
(skip / visible /
validate / calculate) +
cross-field field_compare + cascading
dropdowns (Country → City) + a visual rule
builder (no JSON needed).
Auto-saved records, draft → complete → locked → archived. EDC queries: data manager raises a question on a field, the assignee answers, the questioner closes (or reopens). Every transition is in the audit trail.
Sites belong to a study; subjects belong to a site; visits are scheduled; records are linked to all three. Per-site record filter, site pills on every record card, site-scoped memberships. Withdrawn subjects' records become read-only.
5 reports (enrollment summary, field stats, crosstabs, baseline characteristics, completeness) + 20 statistical tests (t, ANOVA, χ², Fisher, McNemar, log-rank, KM curves, forest plots, Holm / BH / Bonferroni multiple-comparison correction). All hand-rolled in JS with R-parity fixtures.
CSV / JSON exports, AES-256-GCM encrypted,
7-day TTL, HMAC-signed download URLs, identifier
redaction. Per-study bearer tokens
(mdpat_…) for the v1 read API.
Org-level admin, department hierarchy, "I'm on
leave, Ayesha has my capabilities" delegation
(max 30 days), two-person rule for publish +
archive with a pilot-time
MD_SOLO_ADMIN_BYPASS env var.
Record completion now requires a password
re-verification + a meaning-of-signature dropdown
(author / reviewer / approver) + a free-text reason.
HMAC-SHA256 over the canonical payload, verifiable
at /studies/:id/signatures. Auto-invalidation
on re-open. See
docs/annex-11-csv.md §F for the
Part 11 §11.10/50/70/100/200 mapping.
Public intake at /dsar (no account
needed). One-time email verification (24h,
SHA-256 hashed). Org admin queue at
/org/:id/dsar with start / fulfill /
deny. 7-year retention on the DSAR row; 90-day on
the export file.
Two pre-seeded users are in the live pilot. Use these to walk through the full customer demo. All credentials below are sandbox-only; the production deployment has separate credentials managed by the customer's IT.
| User | Password | Role | |
|---|---|---|---|
| Dr. Sara (org admin) | sara@sumc.example |
correcthorse |
Owner · SUMC-CV-2026 (Cardiovascular Outcomes in Kuwaiti Adults) |
| Research Coordinator (data entry) | coordinator@sumc.example |
correcthorse |
Data entry · SUMC-CV-2026 |
The meddata-pilot org has one published
study (SUMC-CV-2026, Cardiovascular Outcomes in Kuwaiti Adults) with 5
instruments, 19 records, 24 subjects, 2 sites (DEFAULT
+ KWI-02), 1 visit scheduled, and 8 in-flight DSARs.
The platform is run-ready for a single-org deployment. The following items are in scope for the first 6 weeks of post-signoff operations.
| Item | Status | Notes |
|---|---|---|
| EU Annex 11 CSV | ✅ Done (Wave 3) | Module-level risk class + test counts + Part 11 mapping |
| 21 CFR Part 11 e-signatures | ✅ Done (Wave 3) | Password re-verification + meaning dropdown + HMAC-SHA256 |
| GDPR Article 15 DSAR | ✅ Done (Wave 3) | Public intake + email verification + admin queue |
| Bilingual EN+AR UI | ✅ Done (M0.0) | 610-entry glossary · RTL is structural |
| Audit trail (append-only, 7 streams) | ✅ Done (M0.4+) | Record, Export, Membership, Query, Subject, Signature, DSAR |
Operational runbook (docs/operations.md) |
✅ Done (M0.8) | Backup + DR + retention sweep + SLA monitoring |
| Metrics + OpenAPI + request-id + scheduler | ✅ Done (M0.9) | /metrics · /api/docs · AsyncLocalStorage |
| Postgres row-level tenant | ⏳ Deferred (M1+) | SQLite in dev, Postgres at deploy time. Schema is Postgres-compatible. |
| Hardware MFA / PKCS#7 signatures | ⏳ Deferred | Schema supports it; HMAC at MVP. Future ask. |
| Right to erasure (Article 17) | ⏳ Deferred | Separate sprint. The DSAR queue can mark a request as "right to erasure" but the workflow is out of scope at Wave 3. |
The formal Annex 11 CSV is the artifact a regulator /
inspector reads. It catalogs every module with its risk
class, the test counts that constitute the validation
evidence, and the mapping to 21 CFR Part 11. The
current state is at docs/annex-11-csv.md.
| Wave | Modules | Tests added | Running total |
|---|---|---|---|
| M0.1 / M0.2 | Studies, validation | 12 | 12 |
| M0.3 | Field rules | 21 | 33 |
| M0.6 | Field rules (4 kinds) | 21 | 66 |
| M0.7 | Capabilities | 15 | 81 |
| M2 | Biostatistics | 20 | 101 |
| Wave 0 | Departments, delegations, approvals | 15 | 116 |
| Wave 1 | EDC queries + cross-field + cascade + visible + builder | 19+ | 135 |
| Wave 2 | Sites, subjects, visits, per-site filter | 15+ | 150 |
| Wave 3 | Signatures, DSAR | 27 | 157 |
157 / 157 tests pass on the live pilot
at https://meddata.eyadrasmi.com. The
validation evidence is the test count: every behavior
the system is contracted to perform is exercised by at
least one test.
A single-org pilot → production go-live takes 4 weeks of effort on the customer's side, run in parallel with the customer's IT onboarding. Each step has a single responsible role on each side.
meddata.{customer-domain}.com. The
customer's IT fills in .env.production
with the connection strings.
brand/logos/
with the customer's. The CSS-token swap is 1 file.
Edit the cover + Arabic-review brief in
docs/dr-ahmad/. Translate the 610-entry
glossary to the customer's local language (3 days if
new locale).
docs/annex-11-csv.md + the operator
runbook. Sign the validation report.
docs/.
Single-org pilot + first year of operations. The pricing assumes a single Postgres instance on a small VPS (or managed Postgres from MedData) and a single SMTP provider.
| Line item | Monthly | Notes |
|---|---|---|
| MedData platform license (1 org, up to 25 users) | $1,200 / month | Includes all 32 capabilities, the v1 read API, and the customer-approval pack artifacts. Up to 5 studies + 50k records. |
| Postgres (managed, 2 vCPU / 4 GB / 100 GB) | $50 – $120 / month | Neon, Supabase, or AWS RDS. The customer picks; MedData is provider-agnostic. |
| SMTP (transactional) | $0 – $30 / month | DSAR + retention warnings + scheduled reports. SendGrid / Postmark / SES; up to 5k emails / month on the free tier. |
| Object storage (export files) | $1 – $10 / month | S3 / R2 / GCS. Exports are <100 MB each at pilot scale. |
| TLS + DNS (Cloudflare proxy) | $0 – $5 / month | Universal TLS on the free tier. |
| One-time onboarding (optional, 4 weeks) | $8,000 | 1 MedData engineer @ $200/hour × 40 hours. Includes the go-live cutover + 30-day check-in. |
| First-year total (with onboarding) | ~$23,000 | License + infra (avg) + onboarding. Annual renewal is license + infra only. |
To proceed with the pilot, three roles on the customer side must sign below. The MedData side signs the platform readiness at the bottom.
Name, role, date
Confirms the Annex 11 CSV + DSAR + e-signature set meets the org's regulatory requirements.
Confirms the price + go-live timeline.
Eyad Mahmoud — confirms the platform is live, the 157-test suite passes, and the Annex 11 evidence is on file.