* feat: custom heartbeat prompt via YAML config or file Wire up the existing but unused HeartbeatConfig.prompt field so users can customize what the agent sees during heartbeats. Adds three ways to set it: inline YAML (prompt), file-based (promptFile, re-read each tick for live editing), and env var (HEARTBEAT_PROMPT). Also documents the <no-reply/> opt-out behavior. Fixes #232 Written by Cameron ◯ Letta Code "The only way to do great work is to love what you do." -- Steve Jobs * test: add coverage for heartbeat prompt resolution Tests buildCustomHeartbeatPrompt and HeartbeatService prompt resolution: - default prompt fallback - inline prompt usage - promptFile loading - inline > promptFile precedence - live reload (file re-read each tick) - graceful fallback on missing file - empty file falls back to default Written by Cameron ◯ Letta Code "The only way to do great work is to love what you do." -- Steve Jobs
LettaBot Documentation
LettaBot is a multi-channel AI assistant powered by Letta that provides persistent memory and local tool execution across Telegram, Slack, Discord, WhatsApp, and Signal.
Guides
- Getting Started - Installation and basic setup
- Self-Hosted Setup - Run with your own Letta server
- Configuration Reference - All config options
- Commands Reference - Bot commands reference
- Scheduling Tasks - Cron jobs and heartbeats
- Gmail Pub/Sub - Email notifications integration
- Railway Deployment - Deploy to Railway
- Releasing - How to create releases
Channel Setup
- Telegram Setup - BotFather token setup
- Slack Setup - Socket Mode configuration
- Discord Setup - Bot application setup
- WhatsApp Setup - Baileys/QR code setup
- Signal Setup - signal-cli daemon setup
Architecture
LettaBot uses a single agent with unified memory across all channels:
┌──────────────────────────────────────────────────────────────────────────┐
│ Your Server / Machine │
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────┐ ┌───────┐ │
│ │ Telegram │ │ Slack │ │ Discord │ │ WhatsApp │ │ Signal│ │
│ │ (grammY) │ │ (Socket) │ │ (Gateway) │ │(Baileys) │ │ (CLI) │ │
│ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ └────┬─────┘ └───┬───┘ │
│ │ │ │ │ │ │
│ └───────────────┴───────────────┴──────────────┴────────────┘ │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ LettaBot Core │ │
│ │ (TypeScript) │ │
│ │ │ │
│ │ • Message Router │ │
│ │ • Session Mgmt │ │
│ │ • Heartbeat/Cron │ │
│ └─────────┬─────────┘ │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ Letta Code SDK │ │
│ │ (subprocess) │ │
│ │ │ │
│ │ Local Tools: │ │
│ │ • Read/Glob/Grep │ │
│ │ • Bash │ │
│ │ • web_search │ │
│ └─────────┬─────────┘ │
└────────────────────────────────────┼──────────────────────────────────────┘
│ Letta API
▼
┌──────────────────────────┐
│ Letta Server │
│ (api.letta.com or │
│ self-hosted Docker) │
│ │
│ • Agent Memory │
│ • LLM Inference │
│ • Conversation History │
└──────────────────────────┘
Key Features
- Multi-Channel - Chat across Telegram, Slack, Discord, WhatsApp, and Signal
- Unified Memory - Single agent remembers everything from all channels
- Persistent Memory - Conversations persist across days/weeks/months
- Local Tool Execution - Agent can search files, run commands on your machine
- Voice Messages - Automatic transcription via OpenAI Whisper
- Streaming Responses - Real-time message updates as the agent thinks
- Background Tasks - Heartbeats and cron jobs for proactive actions