Inspiration

Meetings move fast, but most assistants only produce a transcript after the useful moment has passed. We built plus1 to be a real-time participant: a visible AI teammate that listens, reasons over messy information, speaks when invited, and gets work done while everyone is still in the room.

Insurance became a natural proving ground. Buyers need an easier, more transparent quoting experience, while underwriting teams need help turning incomplete submissions, appetite rules, and external risk signals into defensible decisions.

What it does

plus1 joins a Google Meet as a visible participant (a HeyGen LiveAvatar face, an ElevenLabs voice). It hears the room with speaker attribution, stays quiet until addressed, and acts on what is said:

  • Answers in the call. Ask it a question mid-meeting; it runs the right tool and speaks the answer back. Humans can talk over it: barge-in interrupts playback immediately.
  • Quotes insurance with Intact. Car and tenant estimates as a conversation: it asks only for the missing details, decodes a VIN, prices with a deterministic rating engine, explains why this price, drafts a PDF and offers to email it. Complex cases go to a broker.
  • Underwrites with Federato. Ingests every open submission, enriches each address with six public risk sources, classifies the book against the appetite guide, answers plain-English questions with validated queries, and drafts a source-tagged contract package.
  • Drives a real browser with Browserbase. Google Maps, a government portal, any site you can see. It fills things in, presents its live browser tab into the Meet, and asks before it submits.
  • Remembers with MongoDB Atlas. Transcripts, decisions, notes, settings and shareable PDFs persist across meetings, searchable by text.

How we built it

Architecture. A Next.js console (apps/dashboard), a Node backend (apps/backend) that owns every network call, and a pure decision core (packages/brain) that never imports anything network-bound. All cross-process messages are zod schemas (packages/protocol). The rule that kept it coherent: the runner makes no decisions.

The seat in the meeting. A Playwright-driven Chrome joins the Meet as a signed-in profile. packages/liveavatar puts a HeyGen LiveAvatar (LITE mode: we push 24 kHz PCM, it streams lip-synced video into a LiveKit room) onto that tab's fake camera and mic. The room's remote audio is tapped with Web Audio and streamed as 16 kHz PCM over the Gemini Live API for real-time transcription with speaker context (meetTranscribe.ts). A room fragment arriving while plus1 is speaking interrupts it (barge-in is mechanical, not prompted).

Gemini (Google). Three jobs: live transcription over the Live API, the agent brain (a fast gate that decides ignore / answer / act on each utterance, then structured tool calls and a narrated reply, with tool chaining capped at three hops), and the Federato query planner. Gemini's Lyria model also composed the music bed of our launch video.

ElevenLabs. packages/voice streams text to 24 kHz PCM (eleven_flash_v2_5) with a filler cache for sub-second first words; the same voice narrates the launch video.

Intact (personal lines quoting). Six tools: intact_quote_car, intact_quote_tenant, intact_vehicle_lookup (real NHTSA vPIC VIN decode), intact_explain, intact_email_quote, intact_next_step. Gemini owns the conversation and extraction; a deterministic TypeScript rating engine in packages/brain/src/intact owns the price, so every estimate is auditable and shows its assumptions, coverage recommendations, payment options and the factors behind the number. Uncertain or high-risk cases escalate to a broker instead of inventing a premium. The quote card, PDF and email flow are the quoting interface: voice in the meeting, a card in the console, a PDF you can share.

Refer to: INTACT.md for the full technical details

Federato (underwriting). The pipeline is explicitly ingest → enrich → classify. submissions.ts ingests open submissions and the insured's history; enrichment.ts pulls FEMA National Risk Index, OpenFEMA disaster declarations, NFIP claims, USGS earthquakes, Open-Meteo five-year extremes and OSM reverse geocoding; packages/brain/src/federato scores against the 2025 appetite table and explains every factor. federatoQuery.ts is agentic: goal → Gemini planner over the live schema → payload validation → run → re-plan on empty or error → collapse the API's per-record "grouped" rows → a trace of every attempt. contractTemplate.ts drafts an eleven-section contract package where every field is tagged with its source (submission, insured history, expiring policy, external data, appetite engine, to be provided).

Browserbase + Stagehand. browserbaseWork.ts and jevAgent.ts run a cloud Chrome session: Stagehand act/extract steps (Maps search, FEMA lookups, form fields), Gemini for the step planner, and every step logged with an ok/fail detail. The session's live-view URL is opened in a work tab that Playwright Presents into the Meet, so the room watches plus1 work. Autonomy and a confidence threshold are dials in the console; irreversible actions (email, submissions) wait for a human "yes".

MongoDB Atlas. store.ts mirrors every session (meetings collection: settled transcript lines, decisions, operator notes, status, duration, a flattened transcript field with a text index for search). docStore.ts keeps generated PDFs as Binary documents behind a 192-bit share token with a TTL index (expiresAt), so Atlas expires shared artifacts itself. Settings live in a settings collection; the console treats localStorage as a cache and Atlas as the record.

Challenges we ran into

  • Being useful without being disruptive. Speaking rules, a confidence gate, action policies, and true barge-in took most of our iteration.
  • Messy, conflicting data. Federato's API returns one row per record for grouped queries, its where clause only sees scalar fields, arrays need $elemMatch, and external sources disagree or go missing. We answered with schema-aware planning, payload validation, error recovery, client-side group normalization, source tracing and explicit "missing" scores rather than trusting the first model response.
  • Speed. How to make our agent talk in real-time.

Accomplishments that we're proud of

  • A meeting participant that listens, reasons, speaks and acts in real time, with barge-in.
  • A conversational Intact quoting flow with transparent assumptions, VIN lookup, PDF summaries, email hand-off and broker escalation.
  • A Federato underwriting agent whose decisions are explainable and whose queries survive a messy API, with live external risk enrichment and a source-tagged contract draft.
  • A Browserbase work browser that the whole meeting can watch, with an approval step before anything irreversible.
  • Safe boundaries throughout: nothing is sent or bound without a human confirmation.

What we learned

The best agents are not chatbots with tools. They need boundaries, observable reasoning and graceful behaviour when data is incomplete or conflicting. AI should own the ambiguous, conversational half of a workflow; deterministic systems should own the consequential calculations.

What's next for plus1

We want to connect real insurer rating and broker systems behind the existing tool interfaces, add bilingual English and French support, and support consent-based driving-record verification. For underwriting, we plan to expand the external risk data sources, improve portfolio-level analysis, and let teams configure their own appetite policies. More broadly, we want plus1 to become the dependable extra participant for any high-context meeting where decisions need to become actions.

Built With

Share this project:

Updates

Submission history