System diagram
Component roles
Service
The core engine that does all the work. It connects to messaging channels, runs the LLM agent to process conversations, and manages tasks, contacts, and reminders. Exposes a REST API on port 3100 and an MCP server for tool integration. The service operates in two modes controlled by theBACKEND environment variable:
local— stores everything in SQLiteremote— stores messages locally in SQLite but proxies task and contact operations to the cloud API
Cloud
A multi-tenant Next.js application backed by Supabase PostgreSQL. Provides a web dashboard with Kanban board, team management, API token authentication, and push notifications. Row Level Security (RLS) policies enforce data isolation between teams.Client
A lightweight Next.js frontend that connects directly to the service REST API. No database, no authentication — designed for local use. Provides a Kanban board, task detail views, contact management, and reminder scheduling.Mobile
An Expo React Native app with offline-first architecture. Uses a local SQLite database with a sync engine to push and pull data from the cloud. Supports push notifications via APNs and FCM.Deployment modes
Fully local
All data stays on your machine. The service uses SQLite for everything and the client provides the UI.| Component | Runs on | Storage |
|---|---|---|
| Service | localhost:3100 | SQLite |
| Client | localhost:3000 | None (proxies to service) |
Hybrid
The service runs locally (or on a VPS) for channel processing, but tasks and contacts are stored in the cloud for team access.| Component | Runs on | Storage |
|---|---|---|
| Service | localhost / VPS | SQLite (messages only) |
| Cloud | Vercel / remote | Supabase PostgreSQL |
| Mobile | User devices | Local SQLite + cloud sync |
Fully remote
Everything runs on servers. Users interact through the cloud web UI or mobile app.| Component | Runs on | Storage |
|---|---|---|
| Service | VPS / server | SQLite (messages only) |
| Cloud | Vercel / remote | Supabase PostgreSQL |
| Mobile | User devices | Local SQLite + cloud sync |
Data flow
- Channel listeners receive messages from Slack, WhatsApp, iMessage, Telegram, or Gmail
- Messages are stored in the conversations and messages tables
- The scheduler runs every 60 seconds, checking for conversations that have been quiet for the debounce period (default 5 minutes)
- Qualifying conversations are claimed and sent to the LLM agent
- The agent analyzes the conversation context and uses tools to create/update tasks, manage contacts, and search for duplicates
- Tasks and contacts are persisted to the configured backend (SQLite or cloud API)
- The reminder engine periodically reviews open tasks and sends notifications when due
Tech stack
| Layer | Service | Cloud | Client | Mobile |
|---|---|---|---|---|
| Runtime | Node.js 22+ | Next.js 16 | Next.js 15 | Expo 55 |
| Framework | Hono | React 19 | React 19 | React Native |
| Database | SQLite | Supabase PG | None | Expo SQLite |
| Auth | API tokens | Supabase Auth | None | Supabase OTP |
| Search | QMD (BM25 + semantic) | Supabase FTS | None | Local SQLite |