Inspiration
Emergency department triage prioritizes medical urgency. It does not measure lived burden.
Two patients with the same CTAS level and the same 90-minute wait can experience that wait completely differently. A patient with chronic pain, limited mobility, sensory sensitivity, cognitive strain, or a language barrier experiences compounded distress that traditional wait metrics do not capture.
CIHI reports that approximately 25–30% of patients who leave without being seen (LWBS) do so because the environment became unbearable, not because their medical urgency changed.
That gap is invisible in current systems.
We built FairQ to make accessibility-adjusted waiting burden measurable and actionable without replacing triage or interfering with clinical decision making.
What We Learned
Burden is nonlinear
Waiting distress escalates exponentially rather than linearly. Small increases in wait time can produce disproportionately large increases in distress for high-vulnerability patients.
Accessibility data becomes operational when modeled
When mobility, pain, sensory, cognitive, language, and social isolation flags are structured into a vulnerability multiplier, staff can intervene before disengagement occurs.
Real-time feedback changes prioritization
When burden and LWBS risk update instantly after a check-in, staff can shift from reactive responses to preventive action.
How We Built It
FairQ is a full-stack real-time system built with:
- NestJS backend using Node.js and TypeScript
- Angular frontend
- Modular burden modeling engine
- Real-time recomputation pipeline
We structured development into four components:
| Component | Focus |
|---|---|
| Math Engine | Nonlinear hazard and burden modeling |
| API and State | Real-time updates and patient state |
| Patient UI | Accessibility-first intake and check-in |
| Staff and Admin UI | Operational dashboard and equity view |
The Burden Model
Each patient receives a Burden Index: $$ B \in [0,100] $$ $$ B = \operatorname{clip}\left(\left[S(t) + W(t) + \Delta_{\text{leave}} + \Delta_{\text{post87}}\right]\cdot(1+V),\,0,\,100\right) $$
Where:
- ( S(t) ) models nonlinear distress
- ( W(t) ) anchors wait impact to CIHI median stay
- ( \Delta_{\text{leave}} ) escalates risk when intent to leave is signaled
- ( \Delta_{\text{post87}} ) models post-median escalation
- ( V ) is the vulnerability multiplier
Nonlinear Hazard Scaling
$$ H_0(t,c) = 0.001\,e^{0.02t}\,(6-c) $$
Where $$ c \in {1,2,3,4,5} $$ represents CTAS level.
This ensures higher urgency increases hazard growth without replacing triage.
CIHI-Anchored Wait Impact
Using Alberta NACRS median stay of 238 minutes:
$$ W(t) = \min\left(\frac{t}{238}\cdot 60 + 8\,\mathbf{1}_{t>90},\,75\right) $$
This grounds the model in public Canadian health data.
Vulnerability Multiplier
$$ V = \sum_i w_i f_i $$
Weights informed by Statistics Canada disability impact data:
- Chronic pain: (0.25)
- Mobility: (0.20)
- Cognitive: (0.15)
- Sensory: (0.15)
- Language barrier: (0.10)
- No support person: (0.10)
LWBS Escalation
$$ \Delta_{\text{leave}} = 15\cdot w_{\text{env}} $$
Where:
$$ w_{\text{env}} = \frac{\text{LWBS}_{\text{facility}}}{0.05} $$
This normalizes risk around Alberta’s 5% LWBS baseline.
Staff Dashboard
Staff see:
- Real-time burden index
- LWBS probability
- Accessibility flags
- Equity gap versus baseline
- Suggested actions
Patients are prioritized using:
$$ P = 0.4\,\text{CTAS} + 0.4\,B(t) + 0.2\,V $$
Each check-in triggers full curve recomputation in under 50 milliseconds, enabling live updates.
Admin Dashboard
The admin interface provides:
- Burden distribution
- Equity gap by accessibility category
- Simulation of facility-wide wait reductions
It does not override triage or clinical decisions.
Challenges
Calibrating nonlinear growth
Exponential hazard functions risk saturating too early. We tuned parameters against CIHI median benchmarks to maintain realistic escalation behavior.
Stacked escalation control
Vulnerability scaling, LWBS escalation, and post-median adjustment could compound excessively. We bounded escalation terms and clipped the final score to ensure stability.
Real-time performance
Each check-in recomputes burden curves across multiple time points per patient. Achieving sub-50 millisecond updates required minimizing memory allocation and redundant computation.
Designing for accessibility
The intake interface had to be usable one-handed, with large tap targets and minimal cognitive load, and completable in under 90 seconds. Building an accessibility tool that is itself accessible was a core design constraint.
Accomplishments That We Are Proud Of
- Built a transparent, mathematically grounded equity model anchored in public health data
- Delivered a working real-time full-stack system within a hackathon timeframe
- Made accessibility measurable without interfering with medical workflows
- Created an interpretable burden engine instead of a black-box model
What’s Next
We plan to:
- Integrate real-time provincial wait time APIs
- Validate vulnerability weights with clinicians and patient advisors
- Expand multi-hospital analytics
- Incorporate historical ED data for calibration
- Conduct usability testing with patients with lived accessibility needs
Closing
FairQ does not replace triage.
It adds an equity layer to make invisible burden visible.
Built With
- angular.js
- docker
- nextjs
- node.js
- rest-apis
- typescript
Log in or sign up for Devpost to join the conversation.