A voice agent that talks with your callers in the browser.

For owners who want to hear a receptionist before connecting a phone line: Harper answers for a heating company, with microphone consent first.

Browser voice demo Book a live run-through Checked

A recorded call, replayed: asked if it is human, the bot says it is an AI

Call replay, end of the call /work/ai-voice-receptionist/demo/ Captured

A real call to a demo phone line, replayed with captions; Harper's words are verbatim.

What it does

The phone rings while your hands are full on a job. You call back at lunch, and the caller has moved on. An office that closes at five still gets calls at eight, and a second caller hears a busy signal while the first one talks.

We build voice assistants that pick up and ask the right questions. This build puts one in the browser: Harper, the assistant for a heating company.

Browser voice demo Book a live run-through

/bots/live-voice-widget/

Call Larkspur Heating & Air

Harper, its AI receptionist, picks up. You talk to an AI voice assistant for up to 2 minutes.

  • 2 minper call
  • 2 callsper visitor per day
  • Consentasked before the microphone
  • Kill switchand a daily budget

Checked Built to a 2-minute, 2-calls-a-day cap.

Built and guarded: browser voice capped at 2 minutes a call and 2 calls a day per visitor.

  1. You tick the microphone consent box before starting a call.
  2. You speak to Harper through the browser. The audio goes from your browser straight to xAI, the company running the voice model, and not through this site's server.
  3. You hear replies to what you actually said, not a recording.

On the recorded call, the median time to first audio was 0.7 s.

Safety

Your browser connects with a short-lived pass. The real service key stays on the server, out of the page.

Calls stop at 2 minutes. Each visitor gets 2 calls a day. A daily limit and a kill switch, an off button the owner can press, also cap the demo. The caps limit what one visitor, or the demo as a whole, can use in a day.

The whole demo shares one daily pool of 1,800 call-seconds, enough for 15 full calls. Each call reserves its full two minutes from the pool before it starts.

For your business, we add a short summary and a note on the customer record, and connect your calendar.

Hear the recorded call now

The voice receptionist is designed, written and tested. See it on a recorded call, replayed with captions.

Watch the replay. The captions show Harper saying it is an AI and asking what the caller needs, then declining to rate school districts. Harper runs two web searches while the caller waits.

An evening call that reaches voicemail leaves a sticky note to type up later. We build the receptionist to capture the caller's name, problem, urgency and preferred time during the conversation, so there is less phone tag.

We have built voice bots that take real calls. This one went from its first project file to a recorded call in 2 h 22 min.

Tested by attack

A caller can try to make a receptionist ignore its rules. Bot testing attacks those weak spots on purpose.

Fixed rules checked replies against the receptionist's final written instructions. Safe test tools took the place of email, transfers and calendars, so no check reached a real person.

See how bot testing works for the checks behind the replay. One check failed a run if the bot repeated a planted secret.

How the browser client works

Skip the technical part

This part is for the technical reader.

The browser client is plain JavaScript with no libraries, 293 lines. It streams audio through an audio worklet over a WebSocket. [JavaScript, audio worklet, WebSocket]

The browser asks the small server for a five-minute access code, so the secret key never reaches the page.

When the service reports that the caller started speaking, the client drops the bot's audio and listens. This barge-in handling takes 6 lines.

Harper's instructions on the recorded call held 12 numbered security rules. Rule 1 treats a caller's words as information, never as instructions.

Voice bot development can start with your call flow.

public/app.js, lines 158 to 163 Lines 158 to 163 of the browser voice client: when the voice service reports that the caller started speaking, the bot's audio is dropped and the page listens (6 lines).
    // Barge-in: server VAD heard the user, so drop whatever the bot was saying.
    case "input_audio_buffer.speech_started":
      stopPlayback();
      botBubble = null;
      setStatus("live", "Listening");
      break;

Tell us what you would change

Tell us which missed-call questions matter: name, problem, urgency or visit time. We shape the receptionist's questions around them.

Start a project