Inspiration

When states restarted Medicaid renewals after the pandemic, most people who lost coverage lost it over paperwork. KFF counted 69% of disenrollments as procedural: a missed form, a late reply, a letter nobody opened in time. Those people lost coverage without any finding that they no longer qualified.

The paperwork is about to grow. The July 2025 federal budget law requires most Medicaid expansion adults to show 80 hours a month of work, volunteering or school, starting January 1, 2027. Oregon began mailing notices in September 2026. More letters means more chances to lose coverage over a date you didn't see.

We pictured Marisol, a delivery driver on a prepaid Android phone. She finds an Oregon Health Plan letter two weeks after it arrived. It runs long and uses program codes, and she can't sit on hold during a shift. We built Coverage Keeper for her.

What it does

  1. You agree to a consent screen. It says your photo goes to an AI service, we save nothing, and the app can't decide whether you qualify.
  2. You photograph or upload one page of the letter. Your browser shrinks the photo before upload.
  3. You get a plain-language summary, the deadline with days left, the line from the letter we read it from, a checklist of documents to send, and a phone number.
  4. For Oregon letters, you answer yes/no questions from Oregon's published exemption list. The app lists the exemptions that may apply and links the state's page with the date we checked it.
  5. If you said yes to a health condition, you can draft a note to your doctor from a template, then copy or share it.

A call button sits on every screen with the number from your letter, or OHP's 800-699-9075. If the model can't read the letter, the app says so and points you to that number. It never tells you that you are or aren't eligible.

Try it: https://coverage-keeper.vercel.app

How we built it

  • App: Next.js 16, React 19 and TypeScript, hosted on Vercel. Atkinson Hyperlegible for the text, dark mode, 44 px touch targets. Your browser re-encodes photos to JPEG under 2 MB so they upload on a weak signal.
  • Letter reading: Claude (claude-opus-5-5) reads the image and returns structured output that has to match a zod schema: notice type, summary, deadline, the quoted deadline line, required action, documents, phone and confidence. Our code computes days left in Pacific time. If the model refuses, times out after 30 seconds, or returns something invalid, the app shows an "unsure" result with the phone number.
  • Screening without AI: Oregon's exemptions live in data/rules/or.json with the source URL and retrieval date. The screening code returns the rules you answered yes to. The model never touches eligibility.
  • Guardrails: The schema has no eligibility field, so the model has nowhere to put a verdict. A filter replaces any sentence like "you are eligible" with a safe fallback and the OHP number. The prompt treats letter text as data, and adversarial fixtures test it. The safety suite blocks any merge that fails.
  • Privacy: We process the photo in memory and drop it after the response. No database, no accounts, no analytics. The server logs status, latency, model and error class, and nothing from the letter. The upload route has a rate limit and rejects oversized bodies early.
  • CI: Every pull request runs a secret scan, dependency audit, license check, lint, types, unit tests, the safety suite, integration tests, a build, and Playwright E2E on iPhone and Android profiles with axe accessibility checks. Merges to main deploy to Vercel.

Evaluation

We labeled 13 images: page 1 of 10 public sample notices from state .gov sites (3 Oregon, 7 Vermont) and 3 phone photos. We fixed the split before the first run: 4 dev, 9 test. Nobody tuned the prompt on test failures.

Test split, 9 letters, claude-opus-5-5:

Metric Result
Printed deadline read correctly 4 of 4
No deadline correctly reported as none 5 of 5
Notice type correct 8 of 9
Required action correct 6 of 9
Document recall (mean) 1.00
Document precision (mean) 0.83
Eligibility verdicts in output 0

The set is small and mostly Vermont, and the phone photos show a screen, not paper. We publish the failures in the repo README.

Challenges we ran into

  • Oregon publishes three sample notices. We needed more letters to score the reader, so we added seven public Vermont samples and labeled each one's state.
  • Placeholder dates. Sample notices print MM/DD/YYYY where a real date would go. We labeled those as "no deadline" and scored the reader on saying so instead of inventing one. Our first prompt marked those readable letters as low confidence, which hid a good summary behind "we couldn't read this". Prompt v2 fixed it, and the test numbers held.
  • Phone numbers with extras. Letters print lines like "800-699-9075 (TTY 711)". Our first parser took the last ten digits and dialed the wrong number. It now dials the first full number.
  • Helpful without deciding. People want a yes or no on eligibility, and only the state can give one. We wrote "this may apply, ask OHP about it" and put the call button everywhere.
  • No real letters. We used only public .gov sample notices. CI rejects any eval file without a .gov source.

Accomplishments that we're proud of

  • The reader got every printed deadline right on the test split (4 of 4) and never invented a deadline for the 5 letters that had none.
  • Zero eligibility verdicts across the safety suite and the eval.
  • Three people shipped a deployed, tested app with a published eval in one day.

What we learned

  • Showing the line the deadline came from lets you check the app against the paper in seconds.
  • Keep rules out of the prompt. With Oregon's exemptions in a data file, a code path you can test decides what "may apply", and each rule carries its source.
  • Report N of M and the failures. A percentage on nine letters hides more than it tells.

What's next for Coverage Keeper

  • Spanish UI and summaries. Oregon publishes Spanish sample notices, and Marisol prefers Spanish for official mail.
  • Multi-page letters.
  • Deadline reminders.
  • More states' exemption rules, each with its own labeled eval set.
  • Phone photos of printed letters in the eval, and a pilot with an Oregon community health worker program before any real-user launch.

Built With

Share this project:

Updates

Submission history