Skip to content
ChannelDesk
Memory

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.

Before vs after

Same question. Two very different chats.

without memory · every new chat
Quick context: I'm the only operator. k3s on Proxmox, 1 master + 3 workers. We prefer 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?
Got it. Looking at worker-02 now…
…and you'll re-paste that block tomorrow, and the day after.
with memory · every new chat, forever
Why is worker-02 paging?
Read 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?
3 memories read, 0 context re-typed
Four types

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

Who the user is — role, goals, prior knowledge. Frames how the agent explains things. "I'm a Go dev, prefer terse replies."

feedback

A correction or a confirmed-good approach. Lead with the rule, then Why: and How to apply: lines. Survives sessions, stops the agent making the same mistake twice.

project

Work-in-flight context — current goals, deadlines, constraints. Decays quickly; refresh or delete. "Tier-1 polish ships Friday."

reference

Pointers to external systems. "Bugs live in Linear project X. Oncall dashboard is at Y. Postgres is at db:5432."
Three scopes

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.
Two-step list → get

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.

memory_list ()
[
  { 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
Manage at /memory

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.

user updated 2d

homelab-topology

k3s on Proxmox, 1 master + 3 workers. dev-worker is brian's PC, never schedule there.

feedback updated 5h

kubectl-conventions

Prefer rollout restart over delete pod. Why: keeps replicas honest. How: never reach for kubectl delete pod first.

project updated 1h

tier1-polish-deadline

Design polish branch ships Friday. Hold non-design PRs until next week.

reference updated 3w

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.