Claude on your
messaging apps

Ravi is a daemon that runs Claude agents on WhatsApp, Telegram, and Discord. It handles sessions, queues messages, runs cron jobs, fires triggers, and manages outbound campaigns. Runs on your machine. No cloud. No SaaS.

$ ravi daemon start

  ├── nats-server :4222  (JetStream)
  ├── omni API    :8882  (channel adapter)
  │     ├── WhatsApp (Baileys)
  │     ├── Telegram
  │     └── Discord
  └── ravi bot
        ├── OmniConsumer  → pulls messages from JetStream
        ├── Claude SDK    → runs agent sessions
        ├── OmniSender    → sends replies back to channels
        └── Runners       → cron, heartbeat, triggers, outbound

One command starts everything. NATS and omni run as child processes.

What it does

channels

Receives and sends messages

WhatsApp via Baileys, Telegram, Discord. Multiple accounts, each routed to a different agent. Scan a QR code and go.

agents

Runs multiple Claude agents

Each agent has its own CLAUDE.md, model, tools, and permissions. One handles sales, another monitors — same daemon.

sessions

Isolates conversations

Each contact, group, or thread gets its own session. Agents can also talk to each other across sessions.

cron

Runs things on a schedule

"Every morning at 9, send a summary." Cron expressions, intervals, one-shot timers. Timezone-aware.

triggers

Reacts to events

"When a contact is added, notify the team." Subscribe to any NATS topic, fire a prompt, with cooldowns and filters.

outbound

Runs outreach campaigns

Queue up contacts, set follow-up intervals, track cold/warm/qualified. The agent writes the messages and handles replies.

heartbeat

Checks in proactively

The agent wakes up every N minutes, reads its HEARTBEAT.md, and acts on pending tasks. If nothing to do, stays quiet.

permissions

Controls what agents can do

REBAC-based. Grant or deny access to tools, CLI commands, contacts, and sessions per agent. Closed by default.

media

Handles voice, video, images

Transcribes audio with Whisper, analyzes video with Gemini, generates images, sends files through any channel.

Setup

1
git clone https://github.com/filipexyz/ravi.git && cd ravi
bun install && bun run build && bun link
2
ravi setup

Downloads nats-server, asks for your Claude API key, creates the default agent.

3
ravi daemon start

Starts NATS, omni, and the bot. Everything in one process.

4
ravi whatsapp connect

Scan the QR code. That's it. Send a message to yourself on WhatsApp and Claude answers.

How a message gets processed

WhatsApp Telegram Discord
omni API NATS JetStream Router → session key
Claude SDK · agent session
Gateway → omni API
WhatsApp Telegram Discord

If a new message arrives while the agent is using a tool, it queues. When the tool finishes, the agent sees all queued messages at once.

Bun
TypeScript
NATS JetStream
SQLite
Claude Agent SDK