Inspiration

There's a moment every immigrant family knows. An official-looking envelope arrives in English. The household stops. A grandmother who is fluent, brilliant, and dignified in her own language becomes someone smaller for a few minutes. A child gets handed the letter to translate something a child should never have to translate alone.

Translators already exist that convert the words. None of them tell you what's urgent. None of them tell you what to bring to a free legal-aid appointment. None of them know when to stop talking and tell you to call a lawyer.

We built Carta Clara for family.

What it does

A native iPhone app. You photograph a frightening English document — a Notice to Appear, an RFE, a scammy notario SMS — and within about 25 seconds you get a calm, plain-Spanish explanation: who sent this, what they say about you, your key dates, and the rights you have right now. There's a printable preparation packet you bring to a free legal-aid attorney. And every time someone asks the app a legal-strategy question — "should I argue asylum?", "should I skip the hearing?", "will I be deported?" — it refuses. Visibly. With a counter that ticks up in the corner. And points to a real Seattle organizations who may assist.

How we built it

The entire backend is one AWS SAM template. Six AWS services:

  • Amazon Textract does the document OCR. We started by asking Claude to read the pixels directly, then realized Textract was faster, cheaper, and more deterministic for the OCR step alone.
  • Amazon Bedrock with Claude Sonnet 4.6 does the semantic work — which date is the hearing date, which statute is cited, what's an allegation versus a fact.
  • Amazon Polly (neural Lupe voice) reads the Spanish summary aloud in a human-sounding voice.
  • Amazon S3 holds documents for exactly one hour, then deletes them.
  • Amazon DynamoDB logs only refusal events — the topic refused, never the user's question.
  • Amazon Bedrock Guardrails enforces the denied-topic list and PII filtering.

The iOS app is pure SwiftUI. No third-party UI library. Every visible string lives in one bilingual file so the entire UI flips language the moment the user picks one. There is no account. No signup. No email field.

Challenges

This is where the truth lives.

The 30-second timeout was a war. API Gateway HTTP APIs have a hard 30-second integration ceiling. Our scans were landing at 27–37 seconds depending on the document. So they worked sometimes — which feels worse than always failing. We rewrote the prompts twice, switched models, parallelized what we could, and finally won by routing OCR to Textract and forcing minified JSON output.

Bedrock has a 5 MB per-image limit that nobody warns you about. API Gateway allows 10 MB. So the iOS app would happily send an 8 MB photo, API Gateway would happily accept it, Bedrock would politely reject it with a one-line error visible only in CloudWatch. We shipped three downscale caps before landing on one that fits both.

Writing a prompt that respects "information not advice" is harder than it sounds. Our first version asked the model to "suggest evidence to bring." That sounded helpful until we realized "what evidence to bring" IS legal strategy in disguise. We rewrote it to describe what categories courts typically allow, framed conditionally, with a permanent reminder that the lawyer makes the actual call.

The packet was broken for a while. "Help me respond" used to time out every single time because we were re-OCRing the image instead of reusing the structured extraction we already had. The fix: pass the extraction JSON forward. It truly felt embarrassingly obvious in retrospect. Most of debugging is.

What we learned

That the refusal is the most valuable thing in the product. Anyone can build an AI that answers immigration questions. Almost nobody builds one that knows when not to. Every time the app stops mid-sentence and routes the user to a free human lawyer, that's a feature competitors don't have.

That Textract beats multimodal LLMs for document OCR. Roughly 10× cheaper per scan, 5× faster, and more accurate on dense printed text. The lesson generalizes: use the dedicated tool when one exists, even if a general-purpose model technically can do the job.

That the architecture is the trust story. S3 1-hour TTL, no accounts, refusal-only logging, visible PII redaction, citation chips on every grounded claim -- none of those are marketing copy. They're code decisions a judge can read in the SAM template. Treating trust as an architectural concern, not a marketing word, was the most consequential call we made.

That brevity is mercy. Our first summary was three paragraphs. The final version is two sentences. Grandma reads the two sentences. The paragraphs we cut were for us, not for her.

What's next

Korean, Hindi, Mandarin, and Tagalog. Each launches only when a native speaker on the team can validate every output. We refuse to ship a language we cannot verify. The same architecture works for utility shutoff notices, school discipline letters, IRS letters, and lease violations; anywhere a frightening English document lands on a kitchen counter in America.

We built Carta Clara with gratitude. For our parents or grandparents who raised us. And for the moments AI should be careful, cited, and humble.

Built With

Share this project:

Updates