INTEGRATED PM + EMR · SELF-HOSTED

One database. One loop. From check-in to paid.

Patient intake, scheduling, encounters, charges, claims, 837 submission, 835 posting, AR follow-up — all in one system, one audit log. No integration layer. No vendors that don't talk to each other.

X12 5010 NATIVE· 15+ SCRUBBER RULES· HCFA-1500 PDF· POSTGRES · TYPESCRIPT · REACT
THE SHIPPED VERTICAL · PATIENT → PAID
01
Patient
intake
02
Schedule
day · week · month
03
Encounter
cases · notes
04
Charge
CPT · ICD-10
05
Claim
scrubber · HCFA
06
837
X12 submit
07
835
ERA post
08
AR
aging · f/u

The claims queue where yours actually sit.

Aging buckets you can click. Balance with severity colors. Carrier-side filters. Exports to 837 in one action. The scrubber blocks 15+ categories of rejection before submission.

exmedic.local / claims / open
0 – 30 days
48
$ 112,840
31 – 60 days
22
$ 48,310
61 – 90 days
11
$ 19,420
91 – 120 days
6
$ 8,090
120+ days
4
$ 5,660
CLAIM #
PATIENT
CARRIER
BALANCE
STATUS
AGE
CLM-20261118-0471
Hernandez, Maria
Aetna PPO
$ 2,340.00
12d
CLM-20261115-0462
Chen, David
BCBS Texas
$ 845.00
15d
CLM-20261028-0398
Rossi, Angela
Medicare B
$ 1,210.00
Rejected
33d
CLM-20260815-0204
Patel, Aanya
Cigna HMO
$ 4,680.00
In review
108d
CLM-20260710-0142
Johnson, Marcus
UnitedHealth
$ 920.00
144d
WHY INTEGRATED

Because stitched-together stacks lose claims.

One audit log.

Every mutation across patient, schedule, charge, and claim writes to the same audit stream. When a biller asks "who changed this DOS," the answer is one query, not four vendor support tickets.

One coherent record.

A patient's demographics, visits, encounter notes, charges, claims, ERAs, and correspondence live in the same 135-table schema. No sync errors. No "why is the address different in the PM and the EMR."

Sets & Projections.

Named, composable selections across every table. "Medicare patients seen by Dr. X in March with an unpaid claim over 60 days" → four clicks. Power-user data work without a SQL prompt.