Hello Folks,
For those who’ve been following this thread I’ve reached a genuinely meaningful milestone. Both the Inpatient and Assisted Living tracks are clinically navigable end-to-end, the eMAR is production-complete for floor nursing use, and a new Institutional Quality Dashboard ties everything together with live readiness scoring. Here’s a review and summary from my AI team of what the module can actually do today.
v0.17.0 Project Status
OpenEMR 7.3+ · PHP 8.1+ · Manifest-driven feature flags
Tracks: Emergency Department · Observation Stay · Behavioral Health · Assisted Living · Inpatient Hospital
Emergency Department & Observation Stay
The ED Board remains the module’s flagship view — a dense 15-column live census covering every active episode at a facility. Nurses and providers see room assignment, triage acuity (ESI 1–5 with color-coded badges), chief complaint, time-on-task metrics, protocol status, assigned staff, and a full action menu per row. Every column is the result of a real database query, not static scaffolding.
Triage captures a full vitals set with ESI auto-suggestion based on those vitals, supports re-triage sets numbered sequentially on the same episode, and feeds the alert engine directly.
Observation Stay has its own protocol engine supporting named clinical pathways — chest pain, COPD exacerbation, sepsis bundle, stroke, opioid overdose, pediatric fever, and a general OBS catch-all. Each protocol carries a target-hours clock and a runway warning threshold. The system tracks where each patient is in their protocol timeline and fires alerts when the runway is shrinking.
OBS Billing generates the CMS Two-Midnight Rule eligibility assessment for each observation episode, including medical necessity language, ready for the billing team to review before status conversion.
eMAR — Medication Administration Record
This is the most feature-dense component in the module and it is now production-complete for floor nursing workflows.
Ordering: Nurses can place scheduled, PRN, and STAT orders. STAT creates an immediate administration slot plus the rolling schedule simultaneously. Medication reconciliation imports active orders directly from OpenEMR’s native prescriptions table, with idempotent duplicate detection so running it twice is safe.
High-alert detection is automatic — a keyword list covering insulin, heparin, warfarin, opioids, vasopressors, concentrated electrolytes, and antiarrhythmics flags orders at the time they are placed. The flag is stored on the order, not recomputed at administration time.
Recording administration: Each scheduled slot shows a Record panel with outcome (Given, Held, Refused, Not Available, Missed), actual dose/unit/route if the nurse deviated from the order, injection site, lot number, and a nurse-supplied or back-documented timestamp. Amending a previously completed slot creates an auditable correction note.
Hold reasons are structured, not free-text: NPO, HR too low, BP too low, SpO2 too low, lab result pending, drug level too high, patient refused, physician order to hold, not available, and Other. The hold reason is stored separately from the administration note.
Waste and witness documentation appears automatically on high-alert administration rows — waste amount, waste unit, and a witness dropdown populated from active staff. This is not optional on high-alert drugs.
Two-nurse co-sign is fully implemented. High-alert administrations that have been recorded as Given show a co-sign status column. If a second nurse has co-signed, the column shows their name and timestamp in green. If not, it shows a red “Needed” badge. The co-sign action is a separate POST that enforces the GIVEN+high-alert guard before writing.
Nurse PIN re-authentication is wired. Before a high-alert administration can be committed, the nurse is required to re-enter their OpenEMR password via a modal PIN challenge. The verification hits the users_secure table directly and returns a JSON result without exposing credentials to the view layer.
Allergy checking runs against OpenEMR’s native allergy list (the lists table, type=‘allergy’) using bidirectional substring matching — drug name contains allergen, or allergen contains drug name. Warnings surface at the order placement step. It’s advisory, not a hard block, because clinical judgment prevails.
Shift summary gives charge nurses a day/night shift view grouped by episode, with waste badges and high-alert highlights for end-of-shift reconciliation.
What is not yet built in the MAR: drug-drug interaction checking, standing order auto-renewal, and BCMA barcode scanning (the last of these is explicitly out of scope for v1).
E-Referral
E-referral auto-drafts when a disposition is recorded. The service reads the disposition code, maps it to a referral type (Discharge, Transfer, or BH Placement), matches the destination name against the facility directory to pull fax number, phone, and address automatically, builds a reason-for-referral narrative, writes a clinical summary from episode and triage data, and populates the medications summary from the patient’s active MAR orders — all without the nurse having to type any of it.
The referral then moves through a Draft → Sent → Accepted/Declined lifecycle. Send methods supported are Manual, Fax, Direct, and Print. The facility referral dashboard shows all open referrals across active episodes with status and response tracking.
Inpatient Hospital
The Inpatient track reached full page coverage this cycle.
The Floor Board is the IP equivalent of the ED Board — a sticky-header sortable table with bed/unit, patient, age, service line, admission type, attending, actual LOS vs. expected LOS (green/amber/red badge), admitting diagnosis, next task due, and a full action row. Unit filter tabs let charge nurses narrow to their floor.
Admission uses the same live patient search widget as AL intake. The attending, service, admission type, bed, unit, and admitting diagnosis are all captured at admit time. Under the hood, admission follows OpenEMR’s three-step encounter creation process — generating a proper encounter number through the sequences table, inserting the form_encounter row, and registering it in the forms table — so the encounter appears natively in the OpenEMR chart timeline, CCDA, and FHIR exports.
The Patient Profile hub is what floor nurses open repeatedly throughout a shift. It aggregates the last six vitals readings as sparkline charts (BP, SpO₂, HR), today’s MAR administrations with outcome badges, care plan goals, open tasks, and care team members, all on one page. LOS vs. expected is prominently colored in the header.
Vitals monitoring uses tighter inpatient alert thresholds than AL: SpO₂ below 90%, systolic BP above 180 or below 80, heart rate above 120 or below 45. Trend sparklines are rendered directly in the browser from the stored readings.
Discharge planning is a two-stage Plan → Confirm workflow. Stage 1 records the disposition code (Home, SNF, Rehab, Hospice, Transfer, AMA, or Expired), destination, expected discharge date, and discharge summary narrative — the episode stays active. Stage 2 records the actual departure datetime, closes the episode, and fires an HL7 A03 event. At that point the e-referral auto-draft also triggers if a qualifying disposition was set.
Assisted Living
AL has the fullest workflow coverage of any track.
The Resident Board is a card layout with fall-risk color-coded left borders (red HIGH, orange MODERATE, green LOW), ADL overdue tinting, care level badges (Tier 1–3), and quick-action links to every sub-page from the card footer.
Intake uses the live patient search widget to find an existing OpenEMR patient and create an AL episode with room, unit, care level, fall risk tier, and admit reason.
The Resident Profile hub mirrors the IP profile — vitals snapshot, today’s MAR, ADL summary, care plan goals, open tasks, fall risk score, and navigation tabs to every sub-page.
ADL charting covers all seven standard domains (bathing, dressing, grooming, transfer, ambulation, eating, toileting) on a 0–4 independence scale per domain. Aggregate score is computed and cached on the AL overlay for fast board display. History table shows trend over time.
Morse Fall Scale assessments score all six items (fall history, secondary diagnosis, ambulatory aid, IV/heparin lock, gait, mental status), compute the 0–125 total, assign the risk tier, and maintain a timestamped history. The current score drives the board card color.
Incident reporting covers Fall, Fall with Injury, Elopement, Medication Error, and Other types, with severity levels, narrative, corrective action, and a mandatory-reporting flag with state notification tracking.
Activity logging records session type, name, time, location, and per-resident participation level (Full, Partial, Declined) with session-level notes. The board shows attendance counts.
AL MAR is a 5-day rolling nursing view purpose-built for the assisted living shift — same backend as the ED/IP MAR, different display optimized for medication-pass rounds.
Discharge mirrors the IP two-stage workflow with AL-specific disposition codes.
Institutional Quality Dashboard
New this cycle. The dashboard has four sections:
Operational timing measures (existing ED/OBS metrics now surfaced in the dashboard): door-to-room, door-to-provider, door-to-ECG, and sepsis 3-hour bundle compliance, each showing median, 75th percentile, and compliance rate with an animated SVG semicircle gauge.
Institutional readiness scorecard — six items each with a numerator, denominator, percentage, and status badge (Ready/Partial/Action): IP encounter linkage rate, AL encounter linkage rate, IP vitals capture rate, institutional MAR capture rate (IP+AL combined), AL fall-risk assessment rate, and IP discharge summary completion rate for closed episodes.
Hybrid extraction readiness is a composite meter showing the percentage of IP episodes that have both encounter linkage and vitals captured — the minimum floor for CMS hospital quality reporting extraction. The measure exists to give an honest answer to “can we generate a quality report from this data” before anyone tries.
Patient safety signals are live query-driven indicators: falls with injury from AL incident reports, opioid adverse events (naloxone administered following an opioid order), high-alert co-sign gaps, and IP discharge summary completion. Each shows a status of Good, Watch, or Action.
The dashboard is date-range filterable and pulls exclusively from live module tables.
Supporting Infrastructure
The Context Manager lets users switch clinical lens between ED Acute, Observation Stay, Inpatient, Behavioral Health, Assisted Living, Operations, and Full. The context drives which dashboard widgets and menu items appear.
Alerts fire on LWBS risk, sepsis indicators, BH boarding dwell time, OBS runway, and overdue MAR administrations. Alerts can be individually acknowledged with a configurable snooze window.
Shift Handoff is context-aware across ED, OBS, BH, AL, and IP — nurses get the right columns and episode links for their unit.
Transfer Tracking manages Transfer and BH Placement workflows with a checklist, accepting facility, and transport datetime.
Episode Timeline shows the full chronological event log for any episode — every status change, location move, task completion, and clinical event in order.
Throughput Analytics gives a single-day view of arrivals, dispositions, LOS distribution, and door-to-disposition times across episode types.
Operational Trends runs weekly or monthly series across the same timing metrics with a day-of-week heatmap for volume patterns.
Provider Scorecard ranks providers by volume, door-to-room, door-to-provider, door-to-disposition, LWBS rate, and OBS conversion rate over a configurable date range.
Multi-Facility Dashboard shows a system-wide census strip — one row per facility with live bed occupancy bar, census count, sepsis risk flags, pending MAR count, BH boarding count, and OBS count.
HL7 ADT fires A01 (admit/OBS start), A02 (location change), A03 (discharge), A04 (arrival/registration), and A08 (update) events into configurable MLLP or HTTP endpoints. A full outbound log with message body, ACK, status, and error is maintained.
Downtime mode runs a Service Worker that caches a facility snapshot to IndexedDB. If the network drops, nurses continue entering arrivals, vitals, and status notes into a browser-side write queue. On reconnect, the sync endpoint replays the queue in order.
What Remains
- Drug-drug interaction checking in the MAR
- Standing order auto-renewal
- eCQM catalog: lab result mapping to move the hybrid extraction readiness meter past Partial. I worked heavily on this in OpenEMR by adding the offering of all CMS measures included in selectable 2023-2025 besides those we certified for 2015 and 2025 attestations. 2026 measures can be available soon if they become a requirement moving forward.
- BCMA barcode scanning (explicitly deferred, out of scope for v1). I will get to this for sure.
Everything else is built, wired, and running on a live Docker/OpenEMR instance with a complete demo dataset of 5 demo AL residents, 5 demo IP inpatients, 13 ED/OBS patients, full MAR orders with administration history, care plans, tasks, triage vitals, incident reports, and ADT/HL7 log entries. I’ll post URL and credentials here by Monday 03/23 for all of you that want to take a look.
I truly appreciate all of you folks that are following my project. Based on all of my contributions to OpenEMR over the last ten years, I believe this to be the best.
Thanks and be well!