Inspiration

Most people who lose Medicaid never stopped qualifying for it. Roughly 24 million people were disenrolled when states resumed renewals after the pandemic, and about 69% of them lost coverage over paperwork rather than because anyone found them ineligible. Holdwell is somewhere to put the paperwork: log the letter, count down its dates, stamp every document you send, and keep score against the 80 hours a month the 2027 rules will ask for.

KFF tracked those disenrollments month by month from the reports states file with CMS: procedural disenrollments were 74% of all disenrollments in the first month of unwinding and were still 66% in the twelfth. (KFF, "How Did Medicaid Renewal Outcomes Change During the Unwinding?", 2024: https://www.kff.org/medicaid/how-did-medicaid-renewal-outcomes-change-during-the-unwinding/)

Two thirds of the people who lost their health insurance lost it to a form. KFF's own explainer of those rates says what everyone in the field already knew: high procedural disenrollment means many people who remain eligible for Medicaid are losing coverage anyway. (KFF, "Understanding Medicaid Procedural Disenrollment Rates": https://www.kff.org/medicaid/understanding-medicaid-procedural-disenrollment-rates/)

It is still happening, and the population is enormous. In May 2026 there were 73.5 million people on Medicaid and CHIP, and enrollment had fallen by 5 million, or 6%, in twelve months. (KFF, Medicaid Enrollment Tracker, 2026: https://www.kff.org/medicaid/medicaid-enrollment-tracker/)

Here is what it costs.

Many of the people dropped over paperwork come back, which is the clearest sign they were eligible the whole time. About a third of everyone who left Medicaid in 2018 had re-enrolled within a year, and 4.2% of all enrollees left and returned inside 90 days. (MACPAC, "Effects of Churn on Hospital Use", 2022: https://www.macpac.gov/wp-content/uploads/2022/07/Effects-of-churn-on-hospital-use_issue-brief.pdf. KFF analysis of T-MSIS, 2021, updated 2025: https://www.kff.org/medicaid/issue-brief/medicaid-enrollment-churn-and-implications-for-continuous-coverage-policies/)

The gap in the middle is not harmless. MACPAC found that emergency visits and hospital admissions for the conditions ordinary outpatient care is supposed to prevent more than doubled in the first month after someone lost coverage, and were still higher three months after they got it back. For adults aged 40 to 64 with COPD or asthma, inpatient admissions went from 25.9 per 100,000 member months before disenrollment to 70.4 in the month after re-enrollment. The longer the gap, the worse the spike. (MACPAC, 2022, Mathematica analysis of 2017 to 2019 T-MSIS: link above)

While the gap is open, people stop getting care and start owing money. In 2024, 38.6% of uninsured adults delayed, skipped or went without care or medication because of the cost, against 17.0% of adults with private coverage. 42.0% of uninsured adults said their health got worse as a result. 34% carry past-due medical debt, against 26% of insured adults. (KFF, "Key Facts about the Uninsured Population", 2026: https://www.kff.org/uninsured/issue-brief/key-facts-about-the-uninsured-population/) The bill still lands somewhere. A treat-and-release emergency visit cost $750 on average in 2021, and $600 when Medicaid paid it. (AHRQ, HCUP Statistical Brief #311, 2024: https://hcup-us.ahrq.gov/reports/statbriefs/sb311-ED-visit-costs-2021.pdf)

The 2027 work requirement is the same failure lined up again, and we have already watched it happen once. Arkansas ran one in 2018. More than 18,000 people lost coverage, about a quarter of everyone subject to the rule, and the losses came mainly from failing to report work or document an exemption rather than from not working. More than 70% of the people subject to the rule were unsure whether it even applied to them. Employment did not rise. Half of the Arkansans aged 30 to 49 who lost Medicaid reported serious trouble paying medical debt afterwards, and 64% delayed medications because of cost. (KFF, "5 Key Facts About Medicaid Work Requirements", 2025: https://www.kff.org/medicaid/issue-brief/5-key-facts-about-medicaid-work-requirements/. Sommers et al., Health Affairs 39(9):1522-1530, 2020, PMID 32897784)

SNAP sits on the same households and works the same way. 42.1 million people were receiving it in fiscal 2025, at an average of $189 a month each. The average SNAP household got $341 a month in fiscal 2024, and a household with children got $593. (USDA FNS, SNAP annual summary, 2026: https://www.fns.usda.gov/pd/supplemental-nutrition-assistance-program-snap. USDA FNS, "Characteristics of SNAP Households: Fiscal Year 2024": https://www.fns.usda.gov/sites/default/files/resource-files/snap-fy2024householdcharacteristics-report.pdf) That is a family's grocery money, and it turns on returning a recertification packet on time.

I went looking for what that feels like from the inside, so I read 293 posts in r/Medicaid and r/foodstamps. 206 were about renewal and recertification, 115 about paperwork and portals, 20 about notices that never arrived. The titles say it plainly. "Missouri renewal gone awful." "Ohio, unable to renew and benefits discontinued." One person wrote that they might sue their state, because they had been uninsured for months and did not know.

From 2027 it gets harder. Many adults on Medicaid will have to show 80 hours a month of work, study, a work program or community service. 44 of those 293 posts were already about it, asking things like whether missing the hours costs the whole family its coverage. That is a second clock, running every month, with nothing keeping score.

None of this is about people being careless. A letter arrives with a date buried in the third paragraph and asks for four documents, and there is nowhere to put any of it. No date on a calendar, no record of what went back, no proof it arrived. That is the gap Holdwell fills, and it is a small enough gap that software can actually fill it.

What it does

Holdwell keeps the paperwork that decides your coverage.

The date you never saw. A letter arrives with the deadline buried in a paragraph. Miss it and coverage stops. So you log the letter when it arrives, copy in its dates and tick the papers it asks for, like pay stubs, proof of address or ID. Every deadline you have goes on one runway, in order, counting down. Any of them can go into your phone's calendar with a reminder, so the reminder still arrives even if you never open Holdwell again.

The paper the agency says it never got. This is the argument nobody can win, because the person has no record of what they sent. So each document gets stamped with the day you sent it and how you sent it: by mail, by fax, a portal upload or in person. When an agency says nothing arrived, you have a dated list of what went and when.

The letter that never came. People are dropped without ever seeing a date, because the notice went to an old address or never arrived. So if your renewal month is close and no renewal letter has been logged, the runway says so instead of staying quiet.

The hours nobody counted. From 2027 many adults must show 80 hours a month. So you log shifts, classes and volunteering as they happen, and the meter shows how far off 80 you are and roughly how many hours a day would close the gap. The month goes out as a PDF if someone asks for it.

The rule you cannot find. Answers online are guesses, and a confident wrong answer costs coverage. So the Rules tab quotes the federal text word for word with the source for each line. Mark a line "This might be me" and Holdwell writes it out as a question to put to your caseworker. It never tells you what your agency will decide.

How I built it

Kotlin and Jetpack Compose, Material 3, one screen per job. Everything is stored on the device with DataStore and app-private JSON. There is no account, no server of my own and no analytics.

Deadlines are written to the phone's calendar through the calendar provider, so the reminder survives the app being closed or never opened again. Local reminders run on AlarmManager inexact windows, so the app needs no exact-alarm permission and no connection. Prepare and Notes can be locked behind a fingerprint or the screen lock with androidx.biometric.

The rules that drive the runway are computed from the federal text, not from a rule of thumb. The SNAP change-reporting date is one of them. The Rules tab carries the quote and the citation next to it, so anyone can check the app against the law it came from. A test asserts that every quote in the app is byte-equal to a fixture saved from its source, and another scans every string in the app to make sure none of them says "you qualify" or "you're eligible".

Body text is 17pt on 25pt of line, in Atkinson Hyperlegible Next, a face drawn for people with low vision. Every screen was checked at the largest text size Android offers.

OneSignal carries the check-ins that have to survive a closed app. The details are in the award section below.

How Holdwell uses RevenueCat

The person losing coverage is broke. That is most of why they are on Medicaid. Charging them to keep it would be obscene, and a paywall in front of a deadline is a paywall in front of someone's insulin.

So everything a household needs for itself is free, for up to two households. RevenueCat's Android SDK (10.21.1) runs the entitlement check and the paywall, and the paywall only ever appears in one place: when you add a third household.

Helper is the subscription, and it exists for a specific person. The daughter tracking her mother's renewal alongside her own. The volunteer at a clinic watching six. Those people have a caseload, they are not the ones in trouble, and they are the only users who can reasonably pay. Helper adds unlimited households and a Caseload view that puts every household's next item on one list, soonest first. It starts with a 14-day free trial.

There are also one-time tips. They unlock nothing at all, and the app says so on the screen, because a tip that quietly buys something is a subscription with better manners.

If a Helper subscription lapses, the households already added keep working in full. The app just stops you adding another. Nobody loses a record of their mother's renewal because a card expired.

A navigation test asserts the paywall is never reachable from Runway, Hours or Rules. The free tier is not a trial of the product. It is the product.

Challenges I ran into

The hardest part was deciding what Holdwell must refuse to do.

Benefits rules vary by state, and a confident wrong answer could cost someone their coverage. Every instinct in app design pushes the other way: answer the question, reduce the friction, tell the user what to do. I had to build the opposite. The app never interprets. It quotes the federal rule, shows the source, and turns anything uncertain into a question for the agency. A test scans all 159 strings in the app for the words "you qualify" and "you're eligible", because I did not trust myself to hold the line by hand.

The second was date arithmetic. Deadlines in these letters are not all the same kind of clock. Some run from the date printed on the letter, some from the date it reached you, some from the end of a month. Getting that wrong is worse than useless, so every rule that drives the runway is unit tested against the written rule it came from.

The third was privacy against usefulness. A check-in that arrives two weeks before your renewal is only possible if something off the phone knows when your renewal is. The answer was to send timestamps and nothing else. OneSignal can time a message to someone's renewal without ever learning that they are on Medicaid.

The fourth was mundane. Three Gradle builds at once filled 30 GB of RAM and swap, and systemd killed my desktop twice. I capped the daemons and ran one build at a time after that.

Accomplishments that I'm proud of

The free tier is the whole product for the person in trouble. Nothing about a deadline, a document, the hours meter or the rules is behind a payment. I held that through every version of the business model, including the ones that would have made more money.

Every rule in the app is traceable to the federal text it came from, and a test proves it. If the law changes, the fixture breaks and the build tells me.

It shipped on 24 August 2026 and has passed 1,000 downloads.

The app reads at the largest text size Android offers, on a screen held by someone whose hands are shaking. 30 commits, 123 tests, and a Rules tab that answers "what does this mean for me" with "here is the question to ask", which is the honest answer.

What I learned

Procedural disenrollment is a design problem, not a knowledge problem. People do not need the rules explained. They need to know which date starts the clock, what they already sent, and whether anyone received it. Almost no software does that job, because the job has no upside for anyone who could fund it.

I also learned that restraint is a feature you have to test for. It is easy to write "this app gives no advice" in a spec and then ship a screen full of strings that quietly give advice anyway.

And I learned how much of this work is emotional. Reading 293 posts from people about to lose coverage changed the tone of every string in the app. "Mark sent" instead of "Submit". "Papers due" instead of "Action required".

What's next

Photograph the letter and let on-device text recognition fill the dates in, so the hardest step becomes one tap.

A shared view, so a family member can watch a household's runway with that household's permission. People in those forum threads ask for this constantly, usually on behalf of a parent.

Per-state rules, once each one can be sourced and quoted properly. I will not ship a state rule I cannot cite.

Built With

  • android
  • jetpack-compose
  • kotlin
  • onesignal
  • purchases-android
  • revenuecat
Share this project:

Updates

Submission history