Stop re-typing context.
ChannelDesk has a persistent, per-user knowledge store that every agent session reads at the start of every conversation. Tell it once that you're the only operator on this homelab, or that you always test against a real DB in integration specs, and every future chat — agent, cluster, dashboard, flow, quick action — starts already knowing.
Same question. Two very different chats.
kubectl rollout restart over deleting pods. Don't touch
the dev-worker, it's my Windows PC. Branch convention is
design/* / fix/*.
Now: why is worker-02 paging?
memory_list → got homelab-topology,
kubectl-conventions, dont-touch-dev-worker. worker-02
is at 91 % disk on /var/log — proposing
kubectl rollout restart on the orchestrator deployment to free
the journald handle, then a vacuum. Skipping dev-worker entirely. Go ahead? Same taxonomy Claude Code uses.
We borrowed the four types verbatim from Claude Code's auto-memory. Prompts and
conventions move between Claude Code and ChannelDesk without renaming —
feedback memories from one tool read identically in the other.
user
feedback
Why: and How to apply: lines. Survives sessions, stops
the agent making the same mistake twice.
project
reference
db:5432." Personal, per-agent, or shared.
Every memory row is keyed by (scope, scopeId, name). Two users can each
have their own coding-style without collision; one user can have a
coding-style for the whole homelab and a different one for a specific
agent.
| Scope | Keyed by | Who reads it |
|---|---|---|
| user | userId | Every session that user spawns, on every chat surface. |
| agent | agentId | Only sessions of one specific agent. Use it when one bot needs a private playbook. |
| org | null · single-tenant | Every session of every user. Admin-managed shared knowledge. |
Cheap to scan, cheap to skip.
memory_list is fingerprint-sized — name, description, type, dates.
The agent scans it on every turn without burning tokens, picks the rows that
actually matter, then fetches their bodies one by one with memory_get.
Body up to 64 KiB, validated
server-side. Description capped at 200 chars so the index stays small even at
hundreds of memories. lastAccessedAt + accessCount are
bumped only on get — the index doesn't pollute its own usage signal.
[
{ name: "homelab-topology", type: "user",
description: "k3s on Proxmox, 1 master + 3 workers" },
{ name: "kubectl-conventions", type: "feedback",
description: "prefer rollout restart over delete pod" },
{ name: "dont-touch-dev-worker", type: "feedback",
description: "k3s-dev-worker is brian's PC" },
{ name: "tier1-polish-deadline", type: "project",
description: "design polish ships Friday" }
]
// agent picks 3, fetches their bodies
// memory_get(scope, name) → full body, ≤64 KiB A page for humans, an API for agents.
Type-filtered card grid on desktop, tap-target list on mobile. Each card shows the type badge, the name, the description, and when it was last touched. Click to edit; the editor has per-type body placeholders that nudge you toward the right shape.
homelab-topology
k3s on Proxmox, 1 master + 3 workers. dev-worker is brian's PC, never schedule there.
kubectl-conventions
Prefer rollout restart over delete pod. Why: keeps replicas honest. How: never reach for kubectl delete pod first.
tier1-polish-deadline
Design polish branch ships Friday. Hold non-design PRs until next week.
cluster-service-urls
Internal: sonar-http.sonarqube, prometheus-server.monitoring, redis-master.databases. Bypasses Cloudflare Access.
Names are slug-validated (^[a-z0-9](?:[a-z0-9-]{0,94}[a-z0-9])?$),
so the same row reads the same in the UI, the API, and the agent's tool calls. The
UI today writes scope=user; agent- and org-scoped
rows are created from inside an agent session via the memory-tools MCP
server.
Teach your fleet once. Forever.
Memory turns ChannelDesk from a chat surface into something that already knows how you work — across every agent, every flow, every device.