Add self-hosted server option to onboard wizard along and refactor to use config YAML
LettaBot
Your personal AI assistant that remembers everything across Telegram, Slack, WhatsApp, and Signal. Powered by Letta Code.
Features
- Multi-Channel - Chat seamlessly across Telegram, Slack, WhatsApp, and Signal
- Unified Memory - Single agent remembers everything from all channels
- Persistent Memory - Agent remembers conversations across sessions (days/weeks/months)
- Local Tool Execution - Agent can read files, search code, run commands on your machine
- Heartbeat - Periodic check-ins where the agent reviews tasks
- Scheduling - Agent can create one-off reminders and recurring tasks
- Streaming Responses - Real-time message updates as the agent thinks
Quick Start
Prerequisites
- Node.js 18+
- A Letta API key from app.letta.com
- A Telegram bot token from @BotFather
Install
# Clone the repository
git clone https://github.com/letta-ai/lettabot.git
cd lettabot
# Install dependencies
npm install
# Build and link the CLI globally
npm run build
npm link
Setup
Run the interactive onboarding wizard:
lettabot onboard
This will guide you through:
- Setting up your Letta API key (or OAuth login)
- Configuring Telegram (and optionally Slack, WhatsApp, Signal)
- Enabling heartbeat and scheduled tasks
Run
lettabot server
That's it! Message your bot on Telegram.
CLI Commands
| Command | Description |
|---|---|
lettabot onboard |
Interactive setup wizard |
lettabot server |
Start the bot server |
lettabot configure |
View and edit configuration |
lettabot skills status |
Show enabled and available skills |
lettabot destroy |
Delete all local data and start fresh |
lettabot help |
Show help |
Multi-Channel Architecture
LettaBot uses a single agent with a single conversation across all channels:
Telegram ──┐
├──→ ONE AGENT ──→ ONE CONVERSATION
Slack ─────┤ (memory) (chat history)
WhatsApp ──┘
- Start a conversation on Telegram
- Continue it on Slack
- Pick it up on WhatsApp
- The agent remembers everything!
Channel Setup
| Channel | Guide | Requirements |
|---|---|---|
| Telegram | Setup Guide | Bot token from @BotFather |
| Slack | Setup Guide | Slack app with Socket Mode |
| Setup Guide | Phone with WhatsApp | |
| Signal | Setup Guide | signal-cli + phone number |
At least one channel is required. Telegram is the easiest to start with.
Configuration
Environment Variables (.env)
# Required: Letta API Key
LETTA_API_KEY=your_letta_api_key
# Telegram (easiest to start)
TELEGRAM_BOT_TOKEN=your_telegram_bot_token
TELEGRAM_DM_POLICY=pairing # pairing, allowlist, or open
# Slack (optional)
SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_APP_TOKEN=xapp-your-app-token
# WhatsApp (optional)
WHATSAPP_ENABLED=true
# Signal (optional)
SIGNAL_PHONE_NUMBER=+1XXXXXXXXXX
# Scheduling (optional)
CRON_ENABLED=true
# Heartbeat - periodic check-ins (optional)
HEARTBEAT_INTERVAL_MIN=30
Full Configuration Reference
| Variable | Required | Description |
|---|---|---|
LETTA_API_KEY |
Yes | API key from app.letta.com |
TELEGRAM_BOT_TOKEN |
* | Bot token from @BotFather |
TELEGRAM_DM_POLICY |
No | pairing/allowlist/open (default: pairing) |
TELEGRAM_ALLOWED_USERS |
No | Comma-separated Telegram user IDs |
SLACK_BOT_TOKEN |
* | Slack bot token (xoxb-...) |
SLACK_APP_TOKEN |
* | Slack app token (xapp-...) |
WHATSAPP_ENABLED |
No | Set to true to enable WhatsApp |
SIGNAL_PHONE_NUMBER |
* | Phone number registered with signal-cli |
WORKING_DIR |
No | Agent workspace (default: /tmp/lettabot) |
CRON_ENABLED |
No | Enable scheduled tasks |
HEARTBEAT_INTERVAL_MIN |
No | Heartbeat interval in minutes (e.g., 30) |
HEARTBEAT_TARGET |
No | Where to deliver (e.g., telegram:123456789) |
* At least one channel must be configured
Bot Commands
| Command | Description |
|---|---|
/start |
Welcome message and help |
/status |
Show current session info |
/heartbeat |
Manually trigger a heartbeat check-in |
Skills
LettaBot supports skills that extend the agent's capabilities.
View Skills
lettabot skills status
Shows enabled skills and skills available to import:
Enabled (3):
✓ gog
✓ google
✓ scheduling
Available to import (20):
obsidian
weather
...
Feature-Gated Skills
Some skills are automatically enabled based on your configuration:
| Feature | Config | Skills Enabled |
|---|---|---|
| Scheduling | CRON_ENABLED=true |
scheduling |
| Gmail | GMAIL_ACCOUNT=... |
gog, google |
Install from skills.sh
LettaBot is compatible with skills.sh:
# Interactive search
npm run skills:find
# Install skill packs
npm run skills:add supabase/agent-skills
npm run skills:add anthropics/skills
Heartbeat & Scheduling
Heartbeat
LettaBot can periodically check in with you:
HEARTBEAT_INTERVAL_MIN=30
Silent Mode: During heartbeats, the agent's text output is NOT automatically sent to you. If the agent wants to contact you, it uses the lettabot-message CLI:
lettabot-message send --text "Hey, just checking in!"
This prevents spam - the agent only messages you when there's something worth saying.
Scheduling
When CRON_ENABLED=true, the agent can create scheduled tasks:
One-off reminders:
lettabot-schedule create \
--name "Standup" \
--at "2026-01-28T20:15:00Z" \
--message "Time for standup!"
Recurring schedules:
lettabot-schedule create \
--name "Morning Briefing" \
--schedule "0 8 * * *" \
--message "Good morning! What's on today's agenda?"
Security
Network Architecture
LettaBot uses outbound connections only - no public URL or gateway required:
| Channel | Connection Type | Exposed Ports |
|---|---|---|
| Telegram | Long-polling (outbound HTTP) | None |
| Slack | Socket Mode (outbound WebSocket) | None |
| Outbound WebSocket via Baileys | None | |
| Signal | Local daemon on 127.0.0.1 | None |
Tool Execution
By default, the agent is restricted to read-only operations:
Read,Glob,Grep- File explorationweb_search- Internet queriesconversation_search- Search past messages
Access Control
LettaBot supports pairing-based access control. When TELEGRAM_DM_POLICY=pairing:
- Unauthorized users get a pairing code
- You approve codes via
lettabot pairing approve telegram <CODE> - Approved users can then chat with the bot
Development
# Run in development mode (auto-reload)
npm run dev
# Build for production
npm run build
# Start production server
lettabot server
Local Letta Server
To use a local Letta server instead of Letta Cloud:
LETTA_BASE_URL=http://localhost:8283 lettabot server
Troubleshooting
Session errors / "Bad MAC" messages These are normal Signal Protocol renegotiation messages. They're noisy but harmless.
Messages going to wrong chat Clear the session and re-link:
rm -rf ./data/whatsapp-session
lettabot server # Scan QR again
Signal
Port 8090 already in use
SIGNAL_HTTP_PORT=8091
General
Agent not responding Delete the agent store to create a fresh agent:
rm lettabot-agent.json
lettabot server
Documentation
License
Apache-2.0