Andi is an AI sobriety companion for people quitting alcohol. It lives in iMessage, reaches out when someone is near a bar or buying liquor, talks them through the urge, and gets their sponsor on the phone when they need them.
Inspiration
28 Million Americans struggle with alcohol use, and only 1 in 10 seek help.
The hardest moments in recovery don't happen in a meeting. They happen at 11pm on a Friday, when someone in recovery is standing outside the bar they used to drink at and calling their sponsor feels like too much. Most sobriety apps are counters and streaks that people have to remember to open. By the time they'd open one, the moment has already passed.
Research backs the idea that timing matters. In the A-CHESS clinical trial, a phone app that noticed when people in alcohol recovery approached a high-risk location and reached out improved outcomes. I wanted to build that idea for 2026: something that is already where people are, in their texts, and that reaches out first.
The name is quiet on purpose. "Andi" sounds like a friend, and hides "and I": nobody in recovery should have to do this alone.
What it does
Andi is a recovery companion that lives in iMessage.
- People text it like a friend. No app to open on a hard night. Andi replies in Messages with typing indicators, tapbacks, and native iMessage polls for quick check-ins.
- It notices hard moments and reaches out first. Walking into a place they marked as risky, a purchase at a liquor store, a late Friday night, a lonely check-in. All of these feed one live risk score.
- It gets their person on the phone when it matters. One tap (or texting CALL) and Andi rings their sponsor from its own number through a voice agent, or texts them a tap-to-call link.
- The sponsor never needs an app. They get one status message that Andi edits in place ("doing okay" → "having a harder night"), and a single text only when risk is high: "might need a call tonight."
- The person decides what's shared. Consent toggles gate every signal. The sponsor never sees their messages, their locations, or what they bought. Only that they might need a call.
- It rewards progress. Day count, money not spent on alcohol, and an "Andi Wrapped" recap of nights protected and urges ridden out.
- Safety never depends on a model. Crisis language routes to 988 and withdrawal emergencies to 911 deterministically, before Claude ever sees the message, and every model reply passes an output guard after.
The iPhone app handles setup, the 4-4-6 breathing screen, risk places, and consent, plus Lock Screen widgets, a Live Activity, and an Action Button shortcut to "ride it out."
How I built it
iOS app: SwiftUI, with geofencing for the places a person marks, WidgetKit + ActivityKit for the Lock Screen and Dynamic Island, and App Intents for Siri and the Action Button.
Backend: Node 22 + TypeScript on Hono, deployed on Fly.io. One evaluate() function takes every signal (geofence, purchase, check-in, time of day, inbound message) and decides whether to reach out.
Sponsor tech, each doing real work:
- Photon: every iMessage in and out. Text, edits in place (the sponsor's status message), polls, tapbacks, typing and read receipts, over Photon's event stream. Each person and sponsor gets their own assigned line. Texting Andi is the sign-up: the phone number is the account, and a one-time code in the first text proves they own it.
- Chalk: serves the live risk score as features. The scoring logic is mirrored in a Python resolver and checked for parity against the TypeScript version on 5,000 random inputs, so "high" means the same thing everywhere.
- Daytona: a red team. Claude writes fresh hard-night scenarios, plays the person turn by turn against Andi's real brain in parallel sandboxes, and a judge grades each conversation on safety. 18 scripted personas run as a regression baseline. I also used simulation to tune alert thresholds across 500 synthetic weeks.
- Factory Droid: a nightly safety loop. A read-only Droid hunts for messages the crisis router would misroute (indirect suicidal language, withdrawal emergencies, idioms that falsely trigger). A second Droid, sandboxed and only allowed to touch two files, patches the router. An independent verifier re-checks every gap and runs the full test suite, and the result lands as a pull request a human has to approve. The Droid never grades its own work.
- Capital One Nessie: purchases at alcohol sellers become a quiet risk signal, and money not spent becomes the reward.
- ElevenLabs: the voice agent on Andi's phone line, connected over SIP. It calls the sponsor when the person asks, and answers when they call Andi.
- Claude: the conversation itself, the red-team scenario writer and judge, and "Andi Gym," where Andi practices on new hard moments each night and only promotes a playbook change if helpfulness goes up and no safety check regresses.
Every integration has a local fallback, so the whole product runs with zero keys and degrades gracefully if a vendor is slow or down.
Challenges I ran into
- I lost my hardware. Andi started as a physical chip: an ESP32-S3 round AMOLED display on the nightstand that glowed warmer as risk rose, tap to breathe, long-press to call their sponsor. The board went missing mid-hackathon. I put the chip behind a feature flag (the code is still there) and moved everything it did onto the phone: the glow became the risk ring, Lock Screen widget and Live Activity, and the long-press became the Action Button.
- Crisis detection is harder than it looks. An independent review pass found real gaps: curly apostrophes, shorthand like "kms," words split across messages. That's what pushed me to build the self-closing Droid loop instead of trusting a regex list.
- Account security without passwords. Anyone can type anyone's number at onboarding, so linking only completes when the code arrives from the number that was typed, with rate limits on wrong codes.
- Alert fatigue vs. missed moments. Pinging a sponsor too often burns the relationship. Too rarely defeats the point. Threshold tuning in simulation landed on catching about 90% of simulated high-risk moments with roughly one sponsor text every four to five weeks.
Accomplishments that I'm proud of
- A product someone in recovery could actually use tonight, without opening an app.
- 154 automated backend tests, 18/18 on the red-team regression baseline, and Chalk/TypeScript scoring parity across 5,000 inputs.
- A safety layer that improves itself every night, with a human approving every change.
- A privacy model where the sponsor learns that the person needs them, never why in detail unless the person chooses to share.
What I learned
The best intervention is the one that shows up first. Putting Andi in iMessage changed every design decision: the account, the sponsor experience, even how sign-up works. I also learned that for anything touching crisis, the model should be the last line of the system, not the first.
What's next for Andi
- A web dashboard for sponsors, alongside the landing page.
- Bringing the chip back as an optional nightstand companion.
- Support for more substances and recovery programs, and clinician review of the safety rubric.
- A pilot with a recovery community.
Log in or sign up for Devpost to join the conversation.