An autonomous brokerage management system. Nia works the leads, routes the calls, and shows her work, then hands off when a conversation needs a licensed human.
Omnia is the company and Nia is the agent. I've been the engineer on the product.
Nia works the leads, routes the calls, and does the follow-up nobody on the floor has time for. Every action carries its receipt, and anything that needs a license goes to somebody who has one. That boundary is enforced in code, not asked for in a prompt.
One codebase, three targets. One handles file-based routing for web, iOS, and Android off the same tree, on React 19 and React Native. The design system is Tamagui.
Postgres is the source of truth, Drizzle owns the schema and migrations, and Rocicorp Zero sits on top as a local-first sync engine. The client queries a local replica, writes apply optimistically, and the server reconciles. Reads are org-scoped and fail closed. Auth is Better Auth with the organization plugin.
The rest: valibot, oxlint, oxfmt, Vitest, Playwright, Maestro for the native flows. Bun, not Node. SST on AWS.
TCPA governs whether you may contact someone and what consent you needed first, so consent is checked at dispatch and quiet hours run against the recipient's timezone rather than the server clock. Campaigns show their blast radius before a send. Lifecycle touches are seeded against history, so turning on a day-30 check-in doesn't fire a back-dated greeting at everyone.
A call comes in from Georgia and routing has to know who is licensed there, who is appointed with that carrier, and who is free. It returns reasons, not just a name.
Telephony is Twilio, the live conversation runs through Deepgram's voice agent over a websocket bridge, and there's a softphone in the browser. Callbacks are English and Spanish. Calls are recorded dual channel to S3 and kept ten years, per CMS.
The console is the whole idea. A brokerage runs on a stack of products that don't know about each other — a CRM here, a dialer there, call review somewhere else, reporting in a fourth place — and producers spend the day carrying context between tabs. We built one toolset instead. The client record, the phone, the transcript and its review queue, and the numbers all sit in the same place, against the same data.
Clients, policies, conversations, inbox, calls, tasks, campaigns, effectuation, retention, reconciliation, reports, search. Settings covers the AI configuration, the prompt and skill and tool editors, the data-model editor, and org management.
Brokerages don't agree on what a client record contains, so object and field definitions are data rather than TypeScript. An admin adds a field and it appears in the schema, the forms, the search, and the agent's view of the world without a deploy.
Every decision Nia makes shows up the moment she makes it, with how confident she was and how it turned out.
The agent is a skill registry rather than a prompt. Each skill is a bounded capability with its own tools. A cheaper model does a classification pass first so the expensive one only sees what needs reasoning, and every call is metered against a per-organization cost ledger. Nia runs on Claude through Bedrock, because health data needs a business associate agreement under HIPAA.