Ellis is a people-first agentic immigration assistant built to help individuals navigate the U.S. naturalization process.
Inspiration
The U.S. naturalization process is incredibly difficult to navigate. The bureaucracy behind the N-400 form is confusing, the process requires you to remember obscure details from years ago, and for those whose first language isn't English, naturalization is a nightmare. This story is personal to us as a team: several of our parents have gone or are currently going through this process, and like most Americans-to-be they found it incredibly frustrating and were often lost along the way.
What it does
An applicant talks through their case in the language of their choice, at their own pace, instead of filling out forms. Cartesia's voice agent carries the conversation, streaming what they say as they say it, and Sonic's word-level timestamps tell Ellis exactly which word it was cut off at, so it knows what the applicant didn't hear. Every fact gets checked as it's said. A hedged answer is held until it's read back and confirmed. A stated fact that needs a document opens a gap on the case. Anything touching a serious issue (arrest, removal, fraud) is caught before the AI ever sees the words: Ellis plays a fixed, pre-written stop message, stores only the category, sets that section aside, and puts it in front of an attorney. No AI judgment call is involved.
Behind that single conversation, four specialized Creao legal agents work the case like a real legal team. A case manager decides what Ellis should ask next, a document paralegal checks uploads against stated facts, a docketing clerk tracks deadlines, and a QA reviewer does a final pass. Each one proposes changes through a typed, authority-checked API rather than writing to the case directly.
When the case is complete, the clinic's attorney reviews everything flagged and marks it ready. The applicant confirms each answer and signs, and Ellis builds the filing packet: the N-400, an evidence index, a fee sheet and a filing checklist. Ellis never files anything itself. Applicants working with their own attorney can download a draft to bring to them. Because most applicants will want a professional to look over their case, Ellis includes a workspace where clinics can follow their applicants and see exactly which parts need a person's follow-up.
How we built it
Ellis runs as a single Docker container on a Vultr server, deployed with Coolify: FastAPI serves both the React app and the API from one origin, Coolify handles HTTPS for ellisai.work, and every push to main redeploys automatically. The Cartesia voice agent is the main interface. The applicant taps the mic to talk, and the browser streams mic audio (PCM16) through a level gate that keeps their voice and filters out the room. Cartesia's Ink-2 transcribes it live over a WebSocket, and its turn.resume signal ("they thought they were done, then kept going") is passed to the model as a sign of hesitation. The turn is sent three seconds after the last word, so someone thinking through an old date isn't cut off; tapping mid-turn mutes and unmutes the mic.
Replies stream back through Sonic text-to-speech with word-level timestamps (add_timestamps: true). Tapping while Ellis is speaking stops playback immediately, and the timestamps tell Ellis exactly where it was interrupted. The consent disclosure, the stop-now safety script and the secure-entry prompts are fixed, pre-written lines that the model never words itself, and sensitive numbers such as an A-number are always typed, never spoken.
Ellis talks in all 44 languages Sonic 3.6 speaks, in the accent the applicant picks (for example es-MX, fr-CA or pt-BR), and each applicant can choose Ellis's voice after hearing it. For languages Ink-2 doesn't hear (it covers English, Spanish, French, Hindi and Japanese), speech-to-text switches to ink-whisper. The same Claude-driven liaison is also wired up as a Cartesia Line Agent (line_app.py, metadata.case_id), callable with ELLIS_LINE_BRAIN=llm for an LlmAgent behind HTTP tools.
On the backend, a team of four specialized Creao agents works the case and tells the voice agent what to follow up on. The case manager, document paralegal, docketing clerk and QA reviewer are each their own Creao app, with their own API key and app ID and custom playbooks adapted from Harvey's Legal Agent Benchmark (LAB) task patterns. We chose LAB because its tasks are written by practicing lawyers, and we wanted our agents to have real legal context for naturalization work. From there, we specialized each agent into a focused legal role with prompts built around the relevant benchmark tasks. After each change to the case, Ellis sends the agents a case bundle. The case manager returns a question queue, which becomes what Ellis asks next; the paralegal returns document checks and gaps; the docketing clerk returns deadlines and findings; and the QA reviewer returns its findings for the attorney.
Our backend calls each agent directly (POST …/apps//runs, then polls GET …/runs/ until it leaves pending/running). It then translates whatever native shape that agent's engine returns (a fenced JSON block in chat text for some, a downloadable artifact file for others) into one typed proposal envelope. Authority is enforced in our own code, not assumed from the prompt: a table keyed by agent name defines exactly which item types each agent may propose, and anything outside that is rejected and logged, not silently dropped. Agents propose; they never write to the case directly.
Everything else is a straightforward FastAPI + React stack: Python 3.12, Postgres and file storage on Supabase, and React + Vite + TypeScript on the frontend. The case's history is an append-only event log: corrections supersede earlier answers, never overwrite them. Dates, deadlines and fee math run through a pure rules engine with a versioned config, so no model ever computes a date. Document extraction runs in a sandboxed subprocess with no database credentials. And the clinic can't mark a case ready until every required answer is confirmed by the applicant: read back and agreed to out loud, or confirmed on the form.
Agents (IDs and links): Case manager: f34f8806-2859-47bb-bd13-2e2745df9da6, Document paralegal: 72a8da32-5d0b-43bb-8444-6bac87d7aa28, Docketing clerk: eac1bd98-c08a-441e-b1bd-97e29c33f0cb, QA reviewer: 95f10378-bceb-4b2d-9376-e75f5cca3906. Install links are in the Try it out section; run share links: Case manager run: https://agent.creao.ai/install/f34f8806-2859-47bb-bd13-2e2745df9da6?version=c7684901-ea53-4e5e-815d-b36fd6aae9d7, Document paralegal run: https://agent.creao.ai/install/72a8da32-5d0b-43bb-8444-6bac87d7aa28?version=c7664e28-c9d8-426a-bbd4-448e2f1ae7df, Docketing clerk run: https://agent.creao.ai/install/eac1bd98-c08a-441e-b1bd-97e29c33f0cb?version=b766e0c9-4cd9-4d0a-99bb-4c51ced3427a, QA reviewer run: https://agent.creao.ai/install/95f10378-bceb-4b2d-9376-e75f5cca3906?version=6832ec16-ed7e-4dc4-82fa-f675cffd200d
Why we built it this way
We wanted the experience to feel seamless for people whose first language isn't English. That's why we chose Cartesia, which supports many languages and accents, and why we're excited to show in the live demo on Sunday that Ellis speaks many of them. Many people are also unsure about what they're saying during naturalization, since so much of it is obscure or from years ago, so we wanted voice software that could pick up on hesitation and follow up on it. For the backend, we used a team of Creao legal agents because we wanted to deploy specialized agents that could not only do naturalization work but also steer the voice agent toward the right questions. The entire project would break without Creao: its no-code prompting and API deployment made it easy to build and deploy the agents, so we could spend our time making each agent as specialized as possible.
Challenges we ran into
- Early versions of the Cartesia voice agent felt like it was reading off a checklist instead of having a real conversation.
- The voice agent was too sensitive to background noise, so we built tap-to-talk and a decibel-based gate that works out who the main speaker is.
- The web app had several bugs that hardcoded Spanish into text on the website.
- Creao's MCP connectors initially refused to connect cleanly and required outside API keys that wouldn't register.
- Creao's playbooks and agents sometimes didn't save, forcing us to redo work.
Accomplishments that we're proud of
- The Creao agents are very good at their tasks thanks to the legal benchmark tasks used to build them, and they work well together.
- The Creao agent team steers the Cartesia voice agent toward the questions it needs to ask.
- The Cartesia voice agent flows naturally and feels like talking to a real person.
- The voice logic we built handles background noise well and picks up on uncertainty in how people answer.
What we learned
- A third-party agent platform having a tool connected doesn't mean the agent's instructions ever tell it to use that tool. We confirmed this when one agent reported its Gmail connector was active but never used it, because nothing in its prompt said when to.
- Although it doesn't relate to the sponsor products themselves, we learned that developing on multiple separate tracks and merging them later was the most effective strategy for us.
What's next
Expanding into other parts of the immigration process, such as visas and asylum, and reaching out to small legal clinics to test Ellis in real working environments.
Built With
- cartesia
- creao
- fastapi
- react
- vultr


Log in or sign up for Devpost to join the conversation.