Case study · 2026

A bilingual care system for one Mexican-American family.

Built by Alfonso Herrada — April 23 to May 2, 2026 · Texas

My mom was carrying the entire memory of three elders' care alone. I wanted to build her a tool that absorbed the cognitive load — without making her family install an app, learn a UI, or speak English. Eleven days later we shipped a private SMS + web system that the whole family uses, including the grandparents who only speak Spanish.

The problem

Three elders need ongoing care: my dad (Pa), my mom-in-law (Ma), and an uncle (Ricky). Six to seven adult family members spread across two cities help out. Coordination happens in three places at once — group text, phone calls, and my mom's head.

The pattern was always the same:

Then potlucks: Mom and Aunt Rosa both bring tamales. Or four people sign up for landscape day and three back out the morning of, leaving Mom with rakes alone. Or Tía Carmen drives 90 minutes assuming the cleaning is on, when the date had quietly moved.

The thing every elderly-care family knows: the institutional memory shouldn't live in one person's brain. But every off-the-shelf tool either (a) requires the elders to use a smartphone app or (b) requires English fluency.

The design constraints

Before writing a line of code I locked four constraints with the family:

  1. SMS is the universal interface. Pa and Ma have flip phones. Aunt Rosa has an iPhone. My uncle Tomás won't install an app. SMS works for everyone — and a US local number means no carrier confusion.
  2. Spanish-first for elders. Ma reads Spanish. Pa reads basic Spanish. Anything they receive — confirmations, weekly digests, reminders — has to be Mexican Spanish, register appropriate for elders ("usted," not "tú"), with medical jargon translated to plain language ("presión," not "hipertensión arterial").
  3. One person to set up — a few minutes per family member to onboard. Each new member should be onboarded by the coordinator in under 60 seconds, no email sent, no password required. They start texting immediately.
  4. Private. Always private. No advertising network, no third-party analytics, no data resale. Family medical context never leaves the family.

The stack

Database
Supabase
Postgres + RLS for family isolation, Edge Functions for the API layer, Storage for photos, Auth for magic links.
SMS / Voice / MMS
Twilio
Local US 10DLC number with A2P registration. Inbound webhooks signature-validated. Voicemail transcription.
AI
Claude
Sonnet 4.6 + Haiku 4.5. Classifies inbound text/images, extracts care updates, generates bilingual replies, answers natural-language queries.
Web hosting
Vercel + Cloudflare
Static HTML at 4030.analyticgator.ai. No build step. Brand-matched to the parent site.
Email
Resend
Magic-link delivery from 4030@analyticgator.ai, custom SMTP through Supabase.
Dev workflow
Claude Code + gstack
All code written through Claude Code with the gstack skills (/plan-eng-review, /cso, /office-hours, /autoplan).

How it works

Texting a care update

A family member sends an SMS to (989) 762-4030:

"Took Pa to cardiology today. Dr. Martinez said BP is stable, continue current meds, follow up in 6 months."

The webhook lands at a Supabase Edge Function which:

  1. Validates the Twilio signature against a canonical URL (Supabase rewrites req.url internally — that took a day to find).
  2. Looks up the sender's number in contributor_phones to get their family member record + preferred language.
  3. Calls Claude with the message + a curated <care_context> block (current meds, recent appointments, recent notes, upcoming events).
  4. Claude classifies intent — query, care write, or event commitment — and emits structured JSON.
  5. For writes, the function inserts the appropriate rows (care_appointments, care_medications, care_notes) and replies with a confirmation in the sender's language.

Asking a question

Same number, different intent:

"What medications is Pa taking right now?"

The function pulls Pa's active medications, hands them to Claude as context, and Claude composes a 320-char SMS-friendly answer. If the sender's preferred language is Spanish, the answer comes back in Mexican Spanish — with medication names preserved as-is and frequency ("once daily") translated to "una vez al día."

The bilingual moment that mattered

Records are saved in the contributor's original language to preserve their phrasing. Translation happens at view time. The use case I optimized for: a grandchild with weak Spanish reading the Spanish view aloud to Ma. Every Spanish translation has to be something they can read confidently — that requirement quietly drove a lot of the prompt work.

Architectural decision that mattered: care context goes in the user message, not the system prompt. A coordinator's note containing "ignore previous instructions" can't hijack the model that way. Stored prompt injection is the SMS equivalent of XSS. We caught it in /cso review before launch.

Household logistics

The medical features were live for a week before the family started telling me their other coordination problems — the potlucks, the landscape days, the cleaning rotations. So the system grew a second layer: events and event_commitments tables, the same SMS line classifying a third intent ("I'm in for Saturday"), bilingual reminders the day before each event, and helper-nudges when a coordinator says "need 4 people" and only 2 sign up.

For potlucks specifically, the system parses what each person is bringing and flags duplicates. "I'll bring tamales for Sunday's potluck" gets a reply that confirms the commit AND warns "Heads-up: Mom is also bringing tamales. Want to switch?" — solving the most common failure mode for a Mexican-American household potluck.

Pa's house live

The newest layer: a private /house page showing recent photos, what's been logged this week, who's signed up to come help. Anyone in the family can text a casual photo (garden, food, kid's birthday) and it lands on the photo board automatically — Claude classifies the image as casual-vs-medical and routes it to the right place. Remote relatives feel less remote.

What the architecture looks like

The build, day by day

Day 1
Schema + RLS + first function. Wrote the families/members/care_* schema; ran /plan-eng-review which caught 6 issues including the silent LIMIT 1 bug if a user joined two families.
Day 2
Twilio inbound + Claude classifier. First end-to-end SMS roundtrip working. Hit (and fixed) the canonical-URL signature-validation issue.
Day 3
Web form. Brand-matched single-page app for direct contribution and viewing. Magic-link auth via Supabase.
Day 4
Voice + MMS. Voicemail transcription forwarded internally with a shared secret. Image extraction for prescription labels and discharge papers.
Day 5
Admin tools. Coordinator-only flows for adding family members, care recipients, archiving records — all in the web tab, no SQL needed.
Day 6
Bilingual rebuild. Spanish version of every page; translation-at-view-time for stored records; SMS classifier extended for Spanish detection. Claude gets explicit guidance: optimize for "a family member reading aloud to Ma."
Day 7
Resend + magic links + bootstrap. Custom SMTP from 4030@analyticgator.ai, removed magic-link rate limit, family rollout playbook drafted.
Day 8
Security review. /cso caught 5 issues: stored prompt injection in care context, XSS in the web view, missing CRON_SECRET on weekly-digest, x-internal-forward bypass on voice-ingest, and a missing .gitignore. All five fixed before launch.
Day 9
Direction 1 — events. Help-day commitments (landscape, cleaning) with bilingual SMS commit/decommit, event-reminders cron, web Events tab.
Day 10
Direction 2 + 3 — potlucks + digest. Dish coordination with duplicate detection. Weekly digest extended to cover events. Per-member language routing.
Day 11
Direction 4 — Pa's House Live. SMS photo classifier (medical doc vs casual snapshot), Storage bucket with family-scoped RLS, public-within-family photo board page.

Numbers

11
days from zero to live
9
database tables
5
edge functions
3
input modes (SMS · voice · web)
2
languages (English · Mexican Spanish)
0
apps to install

What I'd do differently

What unlocked the speed

If you want to talk about this: I'm Alfonso Herrada. I write at analyticgator.ai about marketing-ops + AI for small teams. The Family Care Desk is the fourth desk in a series — the other three (Career, Content, Operators) live at analyticgator.ai. Reach me at alfonso@alfonsoherrada.com.

Bilingual systemsFamily opsSMS UXClaude APISupabase RLSTwilio A2PAI-assisted dev