Pre-launch · v1.0 · Awaiting Twilio A2P approval

A bilingual care system for one Mexican-American family.

Built April 23 to May 3, 2026 · 11 days · 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. This is what I built. Eleven days from empty repo to a private SMS + web system the whole family will use, including the grandparents who only speak Spanish. The first family text is queued for the day Twilio approves outbound carrier delivery.

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 the household coordination layered on top: potlucks where Mom and Aunt Rosa both bring tamales, landscape days where four people sign up and three back out the morning of, cleaning rotations where 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. 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
Every line 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, event commitment, or house photo) and emits structured JSON.
  5. The function inserts the appropriate rows 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 + photos

The medical features were the seed. Then came events (landscape days, cleaning rotations, potlucks with dish-duplicate detection), a /house photo board (text any casual photo to the line; Claude classifies it as casual vs. medical and routes accordingly), a bilingual /calendar page merging events + appointments + refills + follow-ups, and an SMS broadcast layer that pings the family the moment any new event or appointment lands.

By v1.0 the system runs three different Sunday-and-daily SMS digests (weekly recap, daily morning huddle, event reminders), grouped by each member's preferred language. Everything Ma sees is Mexican Spanish. Everything Mom sees is English. Same database.

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.
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, missing .gitignore. All 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: photo board + dashboard. SMS photo classifier (medical vs casual), Storage bucket with family-scoped RLS, /house photo board, /calendar with month-grid + agenda, redesigned home dashboard with activity feed and care-recipient cards.

What's built

11
days from zero to v1.0
10
database tables
5
edge functions
3
scheduled crons
3
input modes (SMS · voice · web)
2
languages (English · Mexican Spanish)
14
web pages (en + es)
0
apps to install

What success looks like

The system is built. What I'm watching for once Twilio A2P approves outbound delivery and the family rolls in:

↻ I'll add a "30 days in" section to this page once the first run completes.

What I'd do differently

What unlocked the speed

Bilingual systemsFamily opsSMS UXClaude APISupabase RLSTwilio A2PAI-assisted dev

Next build →

Career Desk

My own job-search agent. LLM Wiki Paradigm over RAG, HITL at every gate, and a Puppeteer worker that runs from my Mac because the Apify cloud kept hitting Cloudflare.

Read the build →