Coworker agents that
live in your chat
kern runs agents as long-lived containers with one persistent memory across Slack, Matrix, Telegram, Discord, IRC, and Nostr. They run background jobs, fan out sub-agents, and report back in the channel where the work was asked for.
No dashboards to host. No ports to expose. One volume per coworker.
On it. Spawning a sub-agent to analyze Postgres slow logs and starting detached integration tests with remindEvery: 60.
Identified missing index on orders(account_id, created_at) causing sequential scan on 2.4M rows during peak checkout locks.
48 test suites passed, 192 tests ok. Zero regressions in checkout pipeline.
Root cause isolated: query lock on orders table. Integration tests confirmed clean. Migration ready:
CREATE INDEX CONCURRENTLY idx_orders_account_created ON orders (account_id, created_at DESC);
A fleet is just containers
No complex daemon networks or master controllers. Each agent is a directory with its own volume and chat account. Name them after their job:
services:ops:image: ghcr.io/oguzbilgic/kern-airestart: unless-stoppedvolumes: ["ops-home:/home/agent"]environment:KERN_NAME: opsOPENROUTER_API_KEY: sk-or-...SLACK_BOT_TOKEN: xoxb-...SLACK_APP_TOKEN: xapp-...research:image: ghcr.io/oguzbilgic/kern-airestart: unless-stoppedvolumes: ["research-home:/home/agent"]environment:KERN_NAME: researchOPENROUTER_API_KEY: sk-or-...MATRIX_HOMESERVER: https://m.matrixMATRIX_USER_ID: "@research:matrix"MATRIX_ACCESS_TOKEN: syt_...volumes:ops-home:research-home:
Docker owns the lifecycle
Restarts, health checks, CPU limits, and memory caps belong to your container runtime. `!restart` in chat cleanly signals Docker to reboot the container.
Zero exposed ports
Coworkers live inside your chat networks over outbound WebSocket and HTTPS connections. No reverse proxies, no open firewall ports, no attack surface.
Self-sufficient workspaces
The persistent volume holds sessions, memory DBs, git repositories, and any packages the agent installs for itself (npm -g, pip, SSH keys).
One brain, every channel
Slack, Matrix, Telegram, Discord, IRC, and Nostr feed into one continuous session. Ask on Telegram, follow up in Slack — the agent remembers both.
Slack ────────┐ Matrix ───────┤ Telegram ─────┤── one session Discord ──────┤ IRC / Nostr ──┘
Memory like a coworker
Conversations are segmented by topic, summarized, and rolled up into a DAG hierarchy (L0 → L1 → L2). Plus, a git repository of notes and knowledge it maintains itself.
L2 ▪▪ (weeks) L1 ▪▪▪▪▪▪ (days) L0 ▪▪▪▪▪▪▪▪▪▪ (topics) raw ────────────────── + knowledge/ & notes/
Does the real work
Background shell commands run detached while the agent stays responsive. Parallel sub-agents fan out research. Platform tools let agents pin, react, and inspect chat history.
bash({ background: true })
spawn({ prompt: ... })
slack({ action: "pins" })
matrix({ action: "widget" })Works where your team works
Every network feeds the same brain with turn envelopes and operator pairing.
Built for production homelabs & workspaces
Not demo scripts. Primitives engineered for long-lived reliability.
Background shell jobs
Detached long-running tasks. Exit status and tail output announce back into the channel that started them.
Parallel sub-agents
Spawn bounded read-only workers to research docs or evaluate candidates in parallel. Uses cheaper models.
Lossless context (LCM)
Topic segmentation DAG. Context never collapses — older turns compress into structured semantic summaries.
Offline DB repair
Scripts like recall-health, segment-prune, and recall-repair keep sqlite vector stores clean and consistent.
Voice message I/O
Audio notes transcribed automatically via Gemini audio or Whisper. Outbound voice notes synthesised inline.
Chat commands
Native /status, /wyd, /jobs, /subagents, /skills, and /restart. Works with ! prefix on reserved chat nets.
Dynamic skills & MCP
Load reusable skills dynamically without restarts. Connect external Model Context Protocol tool servers.
Shared artifact links
Chat-native agents share tables, reports, and dashboards via Botbin.io or matrix iframe room widgets.
Multi-provider
OpenRouter, Anthropic, OpenAI, or fully local Ollama. Point cheap models at background summaries and subagents.
How kern compares
Engineered specifically for coworker agents living in chat.
| kern | Claude Code | Codex | OpenClaw | |
|---|---|---|---|---|
| Operating model | Coworker in chat | CLI developer tool | Coding assistant | Chatbot gateway |
| Session model | One brain across all | Per-project terminal | Per-task sandbox | Per-channel isolation |
| Process lifecycle | Plain Docker container | Interactive terminal | Cloud sandbox | Monolithic daemon |
| Background tasks | Origin-routed jobs | Blocking CLI execution | Sandboxed run | Background exec |
| Sub-agents | Parallel fan-out | Sub-tasks | ✗ | Sub-sessions |
| Long-term memory | Hierarchical DAG + Git | CLAUDE.md | Task memory | Daily resets |
| Inbound ports | Zero (pure outbound) | Zero (local) | Cloud API | Gateway ports |
| Open source | MIT | ✗ | ✗ | Apache 2.0 |
Deploy your first coworker
Give it a container, a bot token, and a volume. It remembers everything from here.
docker run -d --restart=unless-stopped \ -v myagent:/home/agent \ -e KERN_NAME=ops \ -e OPENROUTER_API_KEY="sk-or-v1-..." \ -e TELEGRAM_BOT_TOKEN="123456:ABC-DEF..." \ ghcr.io/oguzbilgic/kern-ai