A free, evidence-informed assessment across 10 areas of shift worker health — built by a physician, designed to educate and empower you.
10 domains of shift worker health
Use these tools independently, or after completing your full assessment for personalised AI responses.
You indicated you may be experiencing thoughts of self-harm or suicide. This assessment has paused. Please reach out — help is available right now.
Assessment complete across all domains. Here's what we found — and your personalised next steps.
Three reports generated from your assessment — download each for your own records or to share with your healthcare provider. All processing happens in your browser; nothing is uploaded.
Interactive tools to explore your results and understand your shift work health risk.
Generation Health is built on peer-reviewed evidence and international clinical guidelines.
These results are educational. Download your PDF reports and bring them to your next appointment with your family physician or occupational health provider.
This platform is educational only. It does not diagnose conditions, prescribe treatment, or replace professional medical advice. Generation Health is compliant with CPSBC/CMPA educational platform standards and PIPEDA (Canada) · DPDPA 2023 / DPDP Rules 2025 (India). MAP framework © 2026 Generation Health Inc. All rights reserved.
Generation Health Shift Health MAP is built on Grade A and B evidence from international clinical guidelines. Every recommendation links to a peer-reviewed source or authoritative guideline.
D5 data never reportable: Mental health domain data (PHQ-9, GAD-7, burnout, moral distress scores) is categorically excluded from all Layer 2 aggregate reporting. No PHQ/GAD/burnout aggregate data is ever shared with any institution, regardless of consent settings.
D7 data never reportable: Substance use domain data is categorically excluded from all Layer 2 aggregate reporting with no exceptions. Higher individual consent bar required before D7 questions are shown.
D10 data never reportable: Reproductive and hormonal health domain data is categorically excluded from all Layer 2 aggregate reporting with no exceptions.
Designed in accordance with CPSBC Ethical Principles for AI in Medicine (October 2024, v1.1) · CMPA 2024 guidance · PIPEDA (Canada) · BC PIPA.
Privacy Policy · Terms of Use · Privacy Impact Assessment · Evidence Methodology · Accessibility
This calculator estimates your circadian disruption exposure and, optionally, your cardiovascular health indicators. Please read before using.
Enter your shift pattern to estimate your Circadian Disruption Index. Optionally add your lab results for a cardiovascular health picture.
CDI = (nights × 0.6) + (nightHrs / 10) + qrScore + consecScore + sjlScore + ctScore
nightHrs = nights × hoursqrScore = min(qr × 0.4, 3) // quick returns <11h, capped at 3consecScore = min(consec × 0.3, 2) // consecutive nights, capped at 2sjlScore = min(sjl × 0.5, 2.5) // social jetlag hours, capped at 2.5ctScore = evening→0.8 | intermediate→0.3 | morning→0CDI ≤ 5 → Flourishing (#4A8C5C)CDI ≤ 10 → Nurture (#2D7D7B)CDI > 10 → Room to Grow (#D4A849)
baseRisk = 1 − S₀₁₀ ^ exp(Σ(coefficients) − meanCoeffSum)durationMult = years > 5 ? 1 + (0.071 × ((years−5)/5)) : 1.0 // Torquati 2018sexMult = female → 1.1 | male → 1.0 // Vetter 2016 JAMAadjustedRR = 1.17 × durationMult × sexMult // Ho 2022 (×1.17 base)shiftRisk = 1 − (1 − baseRisk) ^ adjustedRRTyG = ln[(TG_mgdL × Glu_mgdL) / 2] // <4.68 normal | 4.68–8.46 IR | ≥8.46 highTG/HDL = (TG_mgdL) / (HDL_mgdL) // M: >2.6 elev, >3.5 high | F: >1.7 elev, >2.5 highTG → mg/dL: × 88.57 | HDL/TC → mg/dL: × 38.67 | Glu → mg/dL: × 18.02
Single-file HTML/CSS/JS application. No external dependencies except Google Fonts (preconnect). No data is transmitted, stored, or persisted — everything runs in browser memory. Session consent is stored in sessionStorage only.
File: shift-health-calculator-v4.html · ~1,550 lines · Generation Health Inc. · March 2026
Public JS namespace: SHCalc (IIFE). Dev namespace: SHDev (IIFE).
| Layer | Location | Notes |
|---|---|---|
| Consent gate | #consent-gate | Checkbox required before calculator loads. Dismissed state stored in sessionStorage('shCalcConsented') |
| Inputs | .calc-inputs | All inputs write to state object and call calculate() on every change |
| Lab accordion | #lab-accordion | Optional. PCE inputs. Opens/closes with SHCalc.toggleLabs() |
| Results section | #calc-results-section | Hidden until first calculation. Animated via max-height transition |
| Quick wins grid | #qw-grid | Rendered by renderResults() from TIERS[tierKey].wins data object. Repro status affects which 6th card shows. |
| Dev panel | #dev-panel | Hidden by default. Toggle via SHDev.toggle(). Updates on every renderResults() call. |
| Key | Type | Range | Description |
|---|---|---|---|
nights | int | 0–31 | Night shifts per month |
hours | int | 8|10|12|13|24 | Shift length in hours |
years | float | 0–50 | Years in shift work |
qr | int | 0–20 | Quick returns <11h per month |
consec | int | 0–14 | Max consecutive nights in a row |
sjl | int | 0–6 | Social jetlag in hours |
chronotype | string | morning|intermediate|evening | Self-reported chronotype |
reproStatus | string | none|planning|pregnant|menopause | Reproductive status — controls 6th advice card |
labsOpen | bool | — | Lab accordion open state |
age | int|null | 30–79 | PCE input |
sex | string | female|male | PCE equation selector |
tc | float|null | mmol/L | Total cholesterol |
hdl | float|null | mmol/L | HDL cholesterol |
sbp | int|null | mmHg | Systolic blood pressure |
bpMeds | string | yes|no | On antihypertensives |
smoker | string | yes|no | Current smoker |
diabetes | string | yes|no | Diabetes diagnosis |
tg | float|null | mmol/L | Triglycerides (optional biomarker) |
fg | float|null | mmol/L | Fasting glucose (optional biomarker) |
| Method | Signature | Description |
|---|---|---|
begin() | begin(skipAnim?) | Dismiss consent gate, show calculator |
step() | step(field, delta) | Increment/decrement nights|qr|sjl by delta |
setHours() | setHours(val, btn) | Set shift length. val: 8|10|12|13|24 |
setChronotype() | setChronotype(val, btn) | val: morning|intermediate|evening |
setConsec() | setConsec(val, btn) | Set consecutive nights (0–14) |
setYearsDirect() | setYearsDirect(val) | Set years from direct input (0–50) |
jumpYears() | jumpYears(delta) | Add delta to years (e.g. +5, −5) |
setReproStatus() | setReproStatus(val, btn) | val: none|planning|pregnant|menopause |
toggleLabs() | toggleLabs() | Open/close lab accordion |
setSex() | setSex(val, btn) | val: female|male |
setBpMeds() | setBpMeds(val, btn) | val: yes|no |
setSmoker() | setSmoker(val, btn) | val: yes|no |
setDiabetes() | setDiabetes(val, btn) | val: yes|no |
labInput() | labInput() | Fires on any lab field change, triggers PCE recalc if complete |
calculateLabs() | calculateLabs() | Manual PCE calculation trigger |
reset() | reset() | Clear all state and inputs back to defaults |
getResult() | getResult() → object | Returns lastResult: {cdi, tierKey, tier, nightHrs, annualShifts, cumulativeHrs, cumulYears, years, sjl, chronotype} |
prefillFromAssessment() | prefillFromAssessment(answers) | Accepts PPC/MAP assessment answer object, maps D1/D2 fields to calculator inputs and auto-calculates |
Accepts an object with d1 and d2 keys, each containing answer strings in format "DOMAIN-Qn-INDEX":
| Field | Answer Key | Mapping |
|---|---|---|
nights | d2['D2-Q1'] | 0→0, 1→4, 2→7, 3→11, 4→15 shifts/month |
consec | d2['D2-Q2'] | 0→0, 1→2, 2→4, 3→6, 4→7 nights |
hours | d2['D2-Q4'] | 0→12, 1→12, 2→13 hours |
qr | d2['D2-Q5'] | 0→0, 1→0, 2→1, 3→3, 4→6 per month |
years | d1['D1-Q1'] | 0→0.5, 1→2.5, 2→7, 3→12, 4→17 years |
Each tier key (fl, nu, rg) contains:
| Key | Type | Description |
|---|---|---|
label | string | Display name: Flourishing | Nurture | Room to Grow |
icon | string | Emoji icon |
color / bg / border | hex | Tier colour system (locked — matches PPC/MAP) |
msg | string | Hero paragraph text |
cite | string | Tier-level evidence citation |
cta | {label, href} | CTA button config |
wins.tonight | {title, body, cite} | Tonight card |
wins.week | {title, body, cite} | This Week card |
wins.provider | {title, body, cite} | Ask Your Provider card |
wins.schedule | {title, body, cite} | Your Schedule card |
wins.nutrition | {title, body, cite} | Nutrition & Fuel card |
wins.precon | {title, body, cite} | Preconception/Pregnancy card (shown if reproStatus ≠ none or years ≥ 2) |
| reproStatus | 6th card shown |
|---|---|
none + years < 2 | Hidden |
none + years ≥ 2 | wins.precon (general awareness) |
planning | wins.precon (preconception framing) |
pregnant | wins.precon (pregnancy-specific, label changes to "Pregnancy") |
menopause | Inline menopause card (hardcoded, not from TIERS data) |
| Claim | Source | Notes |
|---|---|---|
| CDI base weight nights × 0.6 | Vyas et al., 2012 — BMJ | 23% higher MI/coronary risk framework |
| SJL >30% CVD risk/hr | Gamboa Madeira et al., 2021 — J Sleep Research | Used for sjlScore weighting |
| +7.1% CVD per 5yr shift duration | Torquati et al., 2018 — Scand J Work Environ Health | durationMult after yr 5 |
| ×1.17 overall CVD shift work | Ho et al., 2022 — Int J Epidemiol (n=238,661) | Base RR for shift adjustment |
| ×1.23 MI-specific | Vyas et al., 2012 — BMJ | Displayed in note, not multiplied separately |
| ×1.1 women | Vetter et al., 2016 — JAMA | sexMult |
| PCE coefficients | Goff et al., 2014 — JACC | White female/male equations used as default per ACC/AHA guidance |
| TyG 4.68 cutoff | Guerrero-Romero et al., 2010 — JCEM | 96.5% sensitivity vs euglycaemic clamp |
| TyG 8.46 cutoff | Mavraganis et al., 2025 — Diabetes Obes Metab | CVD risk threshold |
| TG/HDL sex-specific | Salazar 2012 AmJCardiol; von Bibra 2017 HormMetabRes | M >2.6/3.5; F >1.7/2.5 mg/dL |
| Early menopause 25% higher risk | Stock et al., 2019 — Human Reproduction | ≥20 months rotating nights |
| ≤1 night/wk in pregnancy | Garde et al., 2020 — Scand J Work Environ Health | International scheduling consensus |
| Caffeine 6h cutoff | Drake et al., 2013 — J Clin Sleep Med | Reduces slow-wave sleep |
| Meal timing in night work | Qian et al., 2022 — PNAS (n=19) | 26% reduction in depression-like mood |
| Melatonin shift work | Liira et al., 2014 — Cochrane; Sletten et al., 2020 — Sleep | Timing and dosing |
The calculator exposes SHCalc.prefillFromAssessment(answers) for embedding in assessment flows. Pass the full answer object from the parent platform — the function extracts D1 and D2 keys and populates all relevant fields automatically.
To embed in an iframe: <iframe src="shift-health-calculator-v4.html" width="640" height="900" frameborder="0"></iframe>
To read the result after calculation: SHCalc.getResult() returns the full lastResult object. For cross-frame communication use postMessage — Dinesh/Akhil to implement the listener on the parent platform side.
| Tier | Hex | CSS var |
|---|---|---|
| Flourishing | #4A8C5C | --flourishing |
| Nurture | #2D7D7B | --nurture / --teal-deep |
| Room to Grow | #D4A849 | --rtg |
| Educational | #A09080 | warm taupe — used for dev/meta elements |
| Precon/Repro | #E8C0D4 / #FDF0F5 | Rose — not a tier colour, context only |