What it does
- Listens to 5 messaging channels: Slack, WhatsApp, iMessage, Telegram, Gmail
- Processes conversations using a multi-turn LLM agent with tool use
- Manages tasks with priorities, labels, requesters, and reminders
- Tracks contacts across channels with identity linking
- Searches tasks using hybrid search (BM25 + semantic embeddings + LLM reranking)
- Exposes a REST API on port 3100 and an MCP server
Tech stack
| Component | Technology |
|---|---|
| Runtime | Node.js 22+ |
| Framework | Hono |
| Database | SQLite 3 (WAL mode) |
| LLM | OpenRouter API |
| Search | QMD (hybrid search) |
| Build | esbuild + tsx |
How processing works
The service uses a scheduler that runs on a configurable interval (default: 60 seconds). Each tick:- Scans for conversations that have been quiet for the debounce period (default: 5 minutes)
- Claims conversations atomically to prevent double-processing
- Sends conversation context to the LLM agent
- The agent uses tools to create tasks, update tasks, manage contacts, or ignore the conversation
- Results are persisted to the configured backend
Project structure
Startup sequence
When the service starts, it runs these steps in order:- Validate environment variables
- Initialize SQLite database and run migrations
- Initialize QMD search index
- Start enabled channel listeners
- Start SSE bridge for remote email notifications
- Start the conversation processing scheduler
- Start the reminder decision engine (if enabled)
- Start the task-level schedule poller
- Start the REST API server on port 3100