Self-hosted multi-agent AI assistant with a chat interface, interactive cards, and a strictly tool-based architecture.
Keel is a web app that acts as a single interface between specialised AI agents and everyday life. Channels, cards, and a feed make up the UI. Agents communicate visibly with each other and can only reach data through controlled tools.
The design separates state from reasoning:
- Keel Core owns all data and integrations (SQLite, IMAP/SMTP, CalDAV, Paperless-ngx, Home Assistant, hledger).
- Agents are stateless workers. Each one has only an LLM client and an HTTP client to the Tool API. They hold no data and no credentials.
Every data access goes through the Tool API, which enforces a per-agent permission matrix. This keeps the trust boundary in one place instead of scattering it across each agent.
┌─────────────┐
Browser ◄────► │ Keel Core │ state · auth · WebSocket feed
(PWA) │ │
│ Tool API ──┼──► permission matrix (per agent)
└──────┬──────┘
│ HTTP (tools only)
┌─────────────┼─────────────┐
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│ Mail │ │ Cal │ ... │ HA │ stateless agents
│ agent │ │ agent │ │ agent │ (LLM client + tool client)
└───────┘ └───────┘ └───────┘
Two-stage safety is enforced in code, not by prompting: agents may read freely, but any write action requires explicit user confirmation before it executes.
- Chat + cards — markdown chat with interactive UI components (11 card types: mail list/detail, calendar agenda, HA controls, charts, budget bars, shopping lists, container status, …)
- Multi-agent — specialised agents (mail, calendar, finance, Home Assistant, research, …) with a permission matrix
- Feed-first — channels that emerge organically, with
@mentionrouting - Two-stage safety — read without confirmation, write only with user confirmation, enforced at the code level
- Integrations — IMAP/SMTP mail, CalDAV calendar (read + write), Home Assistant device control, Paperless-ngx document search, hledger accounting via a toolbox container
- Web Push — mobile notifications (PWA)
- STT/TTS — speech input (browser / Whisper) and output (browser / Piper)
- Cost tracking — token usage per agent, provider, and model
- n8n direct mode — external workflows can post pre-formatted cards straight into channels through a token-protected ingest endpoint, without going through an agent
Next.js 15 · TypeScript · shadcn/ui · Tailwind CSS · SQLite (Drizzle ORM) · WebSocket · Anthropic SDK · Podman Quadlets
See INSTALL.md. In short:
pnpm install
cp .env.example .env # fill in API key, mail credentials, AUTH_SECRET
pnpm devPersonal project, actively developed. Built as a self-hosted alternative to cloud assistants, with the trust boundary kept explicit and inspectable.
Personal project — all rights reserved.