Medical bills contain diagnosis codes. Diagnosis codes reveal conditions. We decided no patient should have to send that to a server just to check if they're being overcharged.
So we built a bill analyzer where everything runs in the browser: Tesseract OCR, code extraction, pricing lookups against Medicare fee schedules, and 3.3M CMS bundling rule checks. Zero network calls after initial load.
The hard problem was size. Raw CMS datasets run to tens of megabytes. We shard so first load is 198KB (479x reduction), detail shards on demand. Zod validation with fail-closed defaults: if data fails schema checks, the feature turns off rather than showing bad numbers.
12 sprints to get OCR to 95.0% F1 across 19 real bills. The failure modes are specific to medical documents: thermal printer ink where $45 becomes $4,500, layouts where every code shifts one column right, ZIP codes in headers extracted as charge amounts. We built a 7-stage filter pipeline to catch these before they reach the pricing engine.
The bundling checks are exhaustive. If a hospital bills code A and code B separately, but CMS says B is included in A, that's an unbundling violation. Most audit tools run this server-side. We load all 3.3M pairs into the browser via sharded JSON and in-memory indexing.
Hospital bills are especially confusing - pages of codes, huge numbers, zero transparency.
This was built to help:
- Upload your bill PDF or enter CPT codes
- Shows typical costs based on Medicare rates (adjusted for your area)
- Flags billing red flags:
• Duplicate charges
• Unbundling violations (charging separately for bundled procedures)
• Common coding errors
- Gives you questions to ask the billing office
Just caught someone's $400 overcharge: bill had both the complete EKG code (93000) AND the split technical/professional codes (93005 + 93010). You should only be charged one way.
Everything runs in your browser - no data leaves your computer, no signup.
Hey HN! Abdus and Sudu here, co-founders of OrbDoc. We are building Clicker - a handheld device that aggregates real-time patient data and health records to streamline clinical workflows.
Nurses spend over 30% of their shift manually gathering vitals, records, and notes. Clicker makes that data instantly accessible so nurses can focus on patients, not clicks.
We recently launched our alpha and are currently going through the YC application process. It's been an exciting and challenging journey so far.
We'd love to engage with the HN community to exchange perspectives, learn from your experiences, and ultimately strengthen our mission to improve healthcare workflows.
Ask us anything about:
- The problem we are solving and our solution
- Building hardware and integrating with clinical environments
- Lessons learned from past startups and domains
- Healthcare/medtech entrepreneurship
- Our journey and backstory
So we built a bill analyzer where everything runs in the browser: Tesseract OCR, code extraction, pricing lookups against Medicare fee schedules, and 3.3M CMS bundling rule checks. Zero network calls after initial load. The hard problem was size. Raw CMS datasets run to tens of megabytes. We shard so first load is 198KB (479x reduction), detail shards on demand. Zod validation with fail-closed defaults: if data fails schema checks, the feature turns off rather than showing bad numbers.
12 sprints to get OCR to 95.0% F1 across 19 real bills. The failure modes are specific to medical documents: thermal printer ink where $45 becomes $4,500, layouts where every code shifts one column right, ZIP codes in headers extracted as charge amounts. We built a 7-stage filter pipeline to catch these before they reach the pricing engine.
The bundling checks are exhaustive. If a hospital bills code A and code B separately, but CMS says B is included in A, that's an unbundling violation. Most audit tools run this server-side. We load all 3.3M pairs into the browser via sharded JSON and in-memory indexing.