Skip to content

lukietee/PRESENT

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

67 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

PRESENT!

An AI agent that answers your phone calls as you.

Present! picks up incoming phone calls, speaks in your cloned voice, and handles real tasks β€” searching files, reading documents, checking your calendar, creating events, and sending emails with attachments. You monitor everything in real-time from a live dashboard.

Watch the video

Demo

Call the Twilio number. The AI agent answers as you, has a natural conversation, and executes tasks on your computer β€” all while you watch the live transcript and approve tool calls from the dashboard.

Live Dashboard: dashboard-ten-rho-71.vercel.app

How It Works

Caller dials your number
        β”‚
        β–Ό
   Twilio receives call β†’ streams audio via WebSocket
        β”‚
        β–Ό
   Deepgram STT β†’ real-time speech-to-text (nova-2)
        β”‚
        β–Ό
   Gemini 2.5 Flash β†’ decides what to say + which tools to use
        β”‚
        β–Ό
   ElevenLabs TTS β†’ synthesizes response in YOUR cloned voice
        β”‚
        β–Ό
   Audio streamed back to caller via Twilio
        β”‚
        β–Ό
   Dashboard shows live transcript, tool calls need your approval

Features

Voice Agent

  • Answers phone calls as you β€” first-person, casual, natural
  • Cloned voice via ElevenLabs β€” sounds like you, not a robot
  • Real-time speech β€” streams TTS audio back to the caller with low latency
  • Barge-in support β€” caller can interrupt the agent mid-sentence
  • Adaptive debounce β€” waits for natural pauses before responding

Tool Execution

The agent can perform real actions on your computer during a call:

Tool What it does
list_files Searches Desktop/Documents/Downloads for files
open_file Opens and reads .docx, .txt, .csv, .json, .md files
check_calendar Queries Apple Calendar for events
create_event Creates calendar events via .ics files
send_email Sends emails with attachments via Outlook/Mail.app
browse_url Opens URLs in a headed browser

Dashboard

  • Live transcript β€” see the conversation as it happens, with timestamps
  • Tool approval gate β€” Claude Code-style Allow/Deny before any tool executes
  • Call duration timer β€” live elapsed time counter
  • Fullscreen chat mode β€” expand to full viewport for mobile use
  • Past sessions β€” browse previous calls with expandable transcripts (persisted in Supabase)
  • Voice cloning β€” record or upload audio to clone your voice from the dashboard
  • Copy transcript β€” one-click copy of the full conversation
  • Confirmation dialogs β€” safety net before ending calls
  • Toast notifications β€” feedback for actions
  • Mobile-friendly β€” deployed on Vercel, accessible from your phone

Tech Stack

Layer Technology
Phone Twilio (Voice API + Media Streams WebSocket)
Speech-to-Text Deepgram (nova-2, real-time streaming)
LLM Google Gemini 2.5 Flash (multi-round tool calling)
Text-to-Speech ElevenLabs (turbo v2.5, instant voice cloning)
Tool Execution Playwright (headed Chromium for browser automation)
Server Node.js, Express, Socket.IO
Dashboard Next.js 16, React 19, Tailwind CSS 4
Database Supabase (PostgreSQL β€” session history)
Hosting Vercel (dashboard), ngrok (server tunnel)

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Dashboard (Next.js)               β”‚
β”‚  Live transcript β”‚ Tool approval β”‚ Voice cloning     β”‚
β”‚  Past sessions   β”‚ Fullscreen    β”‚ Connection status β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ Socket.IO (real-time)
             β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Server (Express)                   β”‚
β”‚                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ Twilio   β”‚  β”‚ Orchestrator β”‚  β”‚ Browser Agent  β”‚ β”‚
β”‚  β”‚ Media WS β”‚β†’ β”‚ (Gemini)     β”‚β†’ β”‚ (Playwright)   β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚       β”‚              β”‚                    β”‚           β”‚
β”‚       β–Ό              β–Ό                    β–Ό           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ Deepgram β”‚  β”‚ ElevenLabs   β”‚  β”‚ Files, Calendarβ”‚ β”‚
β”‚  β”‚ STT      β”‚  β”‚ TTS          β”‚  β”‚ Email, Browser β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚ Supabase β€” session history + transcripts         β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Setup

Prerequisites

  • Node.js 24+
  • Twilio account with a phone number
  • Deepgram API key
  • Google Gemini API key
  • ElevenLabs API key
  • Supabase project
  • ngrok (for exposing the server to Twilio)

Environment Variables

Copy .env.example to .env and fill in:

TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_PHONE_NUMBER=
DEEPGRAM_API_KEY=
GEMINI_API_KEY=
ELEVENLABS_API_KEY=
ELEVENLABS_VOICE_ID=
SERVER_URL=           # ngrok host (e.g. abc.ngrok-free.app)
SUPABASE_URL=
SUPABASE_ANON_KEY=

Running

# Terminal 1 β€” expose server to Twilio
ngrok http 3001

# Terminal 2 β€” start server
cd server && npm install && npm run dev

# Terminal 3 β€” start dashboard
cd dashboard && npm install && npm run dev

Set your Twilio Voice webhook to https://<ngrok-host>/api/twilio/voice.

Open http://localhost:3000 to see the dashboard.

Team

Built by Lucas Tran (@lukietee)

About

[πŸ† 1st Place Overall and Best Use of ElevenLabs || 2026 HackDartmouth Hackathon] Autonomous AI phone agent w/ OS-level tool calls orchestrated by Google Gemini 2.5

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors