Open source · Self-host free

The assistant that
never stops thinking

A personal AI that runs your life behind the scenes. It manages your calendar, tracks every person you mention, and writes your morning briefing before you wake up. Tell it something once and it remembers forever. Voice or text, Telegram or Slack — always running, always learning.

Open source. Self-host free. AGPL-3.0 licensed.

~
$ git clone github.com/operatorbot-io/operatorbot
$ cp .env.example .env # add your keys
$ npm install && npm run dev
/ voice-first

Not a chatbox.
A conversation.

Real-time voice powered by OpenAI's streaming API with your full context loaded into every call. Ask it about a meeting from two weeks ago while you're driving. It answers in under a second, with the right context, without you spelling anything out.

Sub-second latency via OpenAI Realtime API
All three memory layers active during voice
Seamless voice/text switching mid-session
Voice conversations update memory the same as text
Listening...
Full memory context active
/ architecture

One pipeline. Every channel.

Voice, text, Telegram, Slack. Every message hits the same pipeline: sanitize, classify, assemble context from three memory layers, route to the right model, respond, then update the knowledge graph async. This is the actual call trace.

processChat() call trace
// user says: "remind me about dave's budget thing before friday"
processChat(message)
├─ sanitize(input)2ms✓ clean
├─ classify(message)4ms→ route: mini (reminder + recall, no emotional complexity)
├─ assembleContext()89ms
│ ├─ livingProfileloaded(3,847 tokens)
│ ├─ rollingContextbuilt(1,923 tokens)
│ ├─ semanticSearch("dave budget")
│ │ → 3 results (0.94, 0.87, 0.81 cosine similarity)
│ │ → Mar 12: "budget approval pending at board level"
│ │ → Mar 8: "dave needs Q2 numbers for budget meeting"
│ │ → Feb 28: "acme annual budget cycle starts april"
│ └─ peopleGraphmatched: Dave Chen (14 interactions, 2 open commitments)
├─ generate()1.2sGPT-5.4-mini
├─ respond()streamed to client
└─ async: curator()background, always GPT-5
├─ reminder created: "ask dave about budget approval"
├─ profile section updated: Active Goals
└─ episode embedded (1536d vector)
GPT-5.4-mini, ~70% of messages GPT-5, complex + emotional⎯ async, runs after response sent
/ memory system

Three layers of
persistent context

A living profile that rewrites itself after every conversation. A rolling state rebuilt from your database on each call. A deep archive with pgvectorcosine search across everything you've ever said. This is what's loaded every time you talk to it.

1
Living Profile
// Rewrites itself after qualifying conversations. Always loaded.
## Identity
Carter, 32. Founder of a logistics startup in Austin.
Previously McKinsey (3yr) and Google (2yr). Detail-oriented,
prefers direct communication, impatient with small talk.
## Active Goals
- Close Series A by Q2 ($4M target, 3 firms in pipeline)
- Hire VP Engineering (2 candidates in final rounds)
- Ship v2 routing algorithm before April
## Behavioral Patterns
Tends to overcommit. Frequently says yes in meetings, then
realizes the deadline is unrealistic 48 hours later. Flag when
new commitments overlap with existing deadlines.
// ...8 sections total, curated from 4 months of conversation
2
Rolling Context
// Assembled fresh from DB queries. Your immediate state.
Today (Mar 27):
9:00 AM Sync with Jake, investor deck revisions
11:30 AM Called Dave Chen re: Q2 projections
New contact: Sarah Martinez, VP Partnerships @ Acme
Yesterday:
Sent revised pitch deck to 3 VCs
Design review with Anna ran 30 min over (again)
Pending:
⚡ Q2 projections for Dave, due tomorrow
Remind: ask Dave about budget approval
Follow up: VC responses by end of week
3
Deep Archive
// User asks: "what did dave say about the budget?"
SELECT transcript, created_at,
1 - (embedding <=> $query_embedding) AS similarity
FROM entries
WHERE similarity > 0.78
ORDER BY similarity DESC, created_at DESC
LIMIT 5;
// Results:
0.94 Mar 12 "Dave said budget approval is still pending at the board level."
0.87 Mar 8  "He needs Q2 numbers ready before the next budget review."
0.81 Feb 28 "Acme's annual budget cycle kicks off in April."
/ in action

It talks like a person, not a product

Short. Direct. No filler. It catches commitments you made in passing, cross-references your people graph, and surfaces things you forgot you said. These are real interaction patterns from the product.

C
transcription
just left the dave meeting, he wants Q2 numbers by friday which is tight. he's also looping in sarah martinez, apparently she just started as VP partnerships over there
OB
transcription
Noted. I'll remind you Thursday evening so you have time on the projections. Added Sarah Martinez to your graph under Acme Corp. Heads up, last call with Dave on the 12th, he said budget approval was still stuck at the board. Worth bringing up before you send anything.
C
transcription
oh yeah good point. remind me about that too
OB
Done. Budget approval question queued for your next Dave touchpoint.
/ stack

Production stack, zero magic

Next.js, Supabase, OpenAI. Standard tools, no proprietary infrastructure. Clone the repo, add your keys, deploy. Everything below is in the codebase you'll be reading.

stack.ts
// Everything OperatorBot runs on
const stack = {
framework: "Next.js 16",// App Router, TypeScript, Vercel
database: "Supabase",// Postgres, pgvector, Auth, RLS
llm: "GPT-5 / GPT-5.4-mini",// model routing, curator always GPT-5
embeddings: "text-embedding-3-small",// 1536 dimensions
voice: "OpenAI Realtime API",// STT + TTS, sub-second
calendar: "Google Calendar",// full CRUD, OAuth, briefing source
channels: "Telegram, Slack",// same processChat() engine
}
/ mcp

Plug your memory into
your IDE.

OperatorBot includes an MCP server that connects to Claude Code, Cursor, and any MCP-compatible client. Your AI coding assistant can read your personal context and write back into your memory. Two lines of config. Ten tools.

Read

get_profile

Your Living Profile — goals, patterns, context

search_memory

Semantic search across all conversations

list_people

Everyone in your People Graph

search_people

Look up a specific person by name

get_reminders

Active reminders and commitments

get_recent_entries

Recent conversation history

Write

log_entry

Feed context from your work into memory

add_person

Add someone to your People Graph

add_commitment

Track a promise or obligation

add_reminder

Set a reminder from any context

Write tools trigger the Curator automatically — your Living Profile updates, people are detected, embeddings are generated. The model gets smarter from your work without you opening the app.

terminal
# claude code
claude mcp add operatorbot \
--transport http \
https://your-instance.com/api/mcp/stream \
--header "Authorization: Bearer ob_mk_..."
/ commands

Different modes for
different thinking.

Type /in chat to switch how your agent thinks. Every command uses your real data — your commitments, relationships, habits, and history. Not generic AI. Your AI.

/coach

Hypes you up, asks the hard questions, pushes you forward.

/whatif

Model a scenario against your real commitments and relationships.

/devil

Challenge your plan. Find the holes before reality does.

/premortem

Imagine it failed in 6 months. Figure out why now.

/review

Honest weekly review. What you did, what you dropped.

/patterns

Behavioral patterns across your history you can’t see yourself.

/audit

Deep life audit. Where you are vs. where you say you want to be.

/ghosted

Relationships that are fading. Who to reconnect with.

/roast

A brutally honest, specific roast of your week.

/hype

What you actually accomplished this week. With energy.

/vibecheck

An honest read on how you’re actually doing.

/fortune

An eerily specific fortune cookie based on your life.

The last assistant
you'll ever train.

View on GitHub