Codester demo · Scripts & Code → Python
Memory layer for voice agents: per-caller briefs in one local JSON file. Node + Python SDKs, personal data scrubbed.
The package ships a demo with two fictional calls from the same caller (Maya). Call 1 ends and the memory is written — personal data scrubbed on the way in. Call 2 opens with the brief already in the system prompt, and the flow planner skips the steps the memory covers. This is the demo's real output.
$ node demo/demo.cjs
┌──────────────────────────────────────────────────────────────┐
│ voice-memory — live demo │
│ Free, self-hosted voice-agent memory · zero dependencies │
└──────────────────────────────────────────────────────────────┘
▸ STEP 1 — Call 1 ends — recording the transcript
Caller 5551234567 (Maya) · 1 call(s) recorded
Stored brief — PII redacted before anything was written:
preferences (1)
· Avoid: morning callbacks if you ever need to reach me — please never call after 6pm [call-1]
open threads (2)
· the insurance quote we discussed last week [call-1]
· Caller asked: Can you follow up on that [call-1]
resolved (1)
· Marked resolved in call [call-1]
facts (1)
· My email is [email] if you need it [call-1]
▸ STEP 2 — Call 2 starts — injection block for the system prompt
┌─ system prompt · memory block ────────────────────────────┐
│ [Caller memory — 1 prior call (Maya)] │
│ Preferences: Avoid: morning callbacks if you ever need to │
│ reach me — please never call after 6pm. │
│ Open threads: the insurance quote we discussed last week; │
│ Caller asked: Can you follow up on that. │
│ Recently resolved: Marked resolved in call. │
│ Facts: My email is [email] if you need it. │
└────────────────────────────────────────────────────────────┘
▸ STEP 3 — Flow planning — which scripted steps can be skipped?
[ASK] Greet caller
[ASK] Verify identity
[SKIP] Ask callback preferences — Memory covers "morning callbacks"
[SKIP] Review billing issue — Memory covers "resolved"
Open threads never skip — they need follow-up.
▸ STEP 4 — Markdown export — the brief as a portable document
┌─ brief.md ────────────────────────────────────────────────┐
│ # Caller brief: Maya │
│ Calls: 1 · Updated: 2026-11-11T17:47:28.622Z │
│ │
│ ## Preferences │
│ - Avoid: morning callbacks if you ever need to reach me — │
│ please never call after 6pm │
│ ## Open threads │
│ - the insurance quote we discussed last week │
│ - Caller asked: Can you follow up on that │
│ ## Recently resolved │
│ - Marked resolved in call │
│ ## Facts │
│ - My email is [email] if you need it │
│ │
└────────────────────────────────────────────────────────────┘
Done. The store lives at demo/demo-store.json — one JSON file, human-readable.
PII redaction is on by default; names are kept because the brief is per-caller.Everything lives in one local JSON file you can open and read — demo/demo-store.json, written by the run above (excerpt). The Node and Python SDKs read and write the same file.
{
"version": 2,
"callers": {
"5551234567": {
"callerId": "5551234567",
"displayName": "Maya",
"createdAt": "2026-11-11T17:47:28.602Z",
"updatedAt": "2026-11-11T17:47:28.622Z",
"callCount": 1,
"preferences": [
{
"text": "Avoid: morning callbacks if you ever need to reach me — please never call after 6pm",
"addedAt": "2026-11-11T17:47:28.621Z",
"lastMentionedAt": "2026-11-11T17:47:28.621Z",
"tags": [],
"source": "call-1"
}
],
"openThreads": [
{
"text": "the insurance quote we discussed last week",
"addedAt": "2026-11-11T17:47:28.621Z",
"lastMentionedAt": "2026-11-11T17:47:28.621Z",
"tags": [],
"status": "open",
"source": "call-1"
},
{
"text": "Caller asked: Can you follow up on that",
"addedAt": "2026-11-11T17:47:28.622Z",
"lastMentionedAt": "2026-11-11T17:47:28.622Z",
"tags": [],
"status": "open",
"source": "call-1"
}
],
"resolvedItems": [
{
…Screenshots shipped inside the Codester package.
