-
-
-
-
plus1 can join, with both voice and video, and send messages
-
plus1 can screen share and navigate the web
-
plus1 can generate pdf files of insurance quotes and text or email it to users in the call
-
users can configure plus1's personality
-
users can configure different MCPs to give plus1 different tools and capabilities
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
whereclause 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
- browserbase
- elevenlabs
- federato
- gemini
- heygen
- mongodb
- nextjs
- node.js
- playwright
- react
- stagehand
- typescript



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