NEWv0.25.0 — Agent-built dashboards, multi-modal media, desktop app →

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.

#eng-operations
2 bots online
OG
oguztoday at 14:02
@ops staging checkout service is throwing 504 gateway timeouts. Profile the query latency and run the integration suite in the background.
OP
opsAPP14:02

On it. Spawning a sub-agent to analyze Postgres slow logs and starting detached integration tests with remindEvery: 60.

spawn(subagent: query-profiler)bash(job: npm test --suite=integration)
✓ [subagent:query-profiler done, 14s]14:02:44

Identified missing index on orders(account_id, created_at) causing sequential scan on 2.4M rows during peak checkout locks.

✓ [job:job_e9b41a exited 0, 48s] npm test --suite=integration14:03:18

48 test suites passed, 192 tests ok. Zero regressions in checkout pipeline.

OP
opsAPP14:03:22

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:

compose.yamlDocker Compose
services:
ops:
image: ghcr.io/oguzbilgic/kern-ai
restart: unless-stopped
volumes: ["ops-home:/home/agent"]
environment:
KERN_NAME: ops
OPENROUTER_API_KEY: sk-or-...
SLACK_BOT_TOKEN: xoxb-...
SLACK_APP_TOKEN: xapp-...
research:
image: ghcr.io/oguzbilgic/kern-ai
restart: unless-stopped
volumes: ["research-home:/home/agent"]
environment:
KERN_NAME: research
OPENROUTER_API_KEY: sk-or-...
MATRIX_HOMESERVER: https://m.matrix
MATRIX_USER_ID: "@research:matrix"
MATRIX_ACCESS_TOKEN: syt_...
volumes:
ops-home:
research-home:
1

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.

2

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.

3

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.

⚡SlackBot + App Token
MMatrixAny homeserver
✈TelegramDirect bot API
👾DiscordGuild & DM bots
#IRCIRCv3 + TLS
🟣NostrNIP-04/17 DMs

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.

kernClaude CodeCodexOpenClaw
Operating modelCoworker in chatCLI developer toolCoding assistantChatbot gateway
Session modelOne brain across allPer-project terminalPer-task sandboxPer-channel isolation
Process lifecyclePlain Docker containerInteractive terminalCloud sandboxMonolithic daemon
Background tasksOrigin-routed jobsBlocking CLI executionSandboxed runBackground exec
Sub-agentsParallel fan-outSub-tasks✗Sub-sessions
Long-term memoryHierarchical DAG + GitCLAUDE.mdTask memoryDaily resets
Inbound portsZero (pure outbound)Zero (local)Cloud APIGateway ports
Open sourceMIT✗✗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
💡 DM the bot on Telegram. The first user to message is automatically paired as the operator.