-
Notifications
You must be signed in to change notification settings - Fork 4
Memories System
Persistent context about people, projects, and your communication style — extracted locally, never uploaded.
Important
Memory files live entirely on your machine at ~/.claude/plugins/data/ops-ops-marketplace/memories/. They are plain markdown. Anthropic's API is called only to run the extraction — the same API call any Claude Code session makes. No separate upload, no separate logging. See Privacy and Security.
flowchart LR
subgraph Local[Your machine]
W[wacli SQLite<br/>WhatsApp messages]
G[gog cache<br/>Gmail threads]
M[memories/<br/>markdown files]
end
D[ops-daemon] -->|every 30 min| E[memory-extractor<br/>Haiku 4.5]
W --> E
G --> E
E -->|structured markdown| M
M -->|runtime context| S1[/ops:inbox]
M -->|runtime context| S2[/ops:comms]
M -->|runtime context| S3[/ops:go]
M -->|runtime context| S4[/ops:yolo]
classDef local fill:#22c55e,color:#fff,stroke:#15803d
classDef daemon fill:#6366f1,color:#fff,stroke:#4338ca
classDef skill fill:#8b5cf6,color:#fff,stroke:#6d28d9
class W,G,M local
class D,E daemon
class S1,S2,S3,S4 skill
-
ops-daemonschedules thememory-extractorservice every 30 minutes - The extractor reads only local files:
wacli's SQLite DB andgog's cache - It calls Claude Haiku 4.5 to summarize new content into structured profiles
- Profiles are merged (never overwritten) into existing markdown files
- Skills load the relevant files at runtime via their Runtime Context block
Tip
Merging means context accumulates over time. The profile for a contact you've been talking to for six months is richer than a contact you just started emailing.
The extractor runs when any of these are true:
| Trigger | Condition |
|---|---|
| Time | 30+ minutes since last run |
| Volume |
message_count in ~/.wacli/.health grew by >5 since last run |
| Manual | /ops:doctor --run-memory-extractor |
~/.claude/plugins/data/ops-ops-marketplace/memories/
├── preferences.md # Your communication style
├── contacts/
│ ├── john-smith.md # Per-contact profile
│ ├── alice-cooper.md
│ └── ...
└── projects/
├── my-app.md # Per-project context
└── ...
# John Smith
## Contact Info
- WhatsApp: +15551234567
- Email: john@acme.com
- Company: Acme Corp
## Communication Preferences
- Prefers WhatsApp over email
- Responds quickly in the morning (PST)
- Informal tone — uses first names, short messages
## Context
- CEO of Acme Corp — potential enterprise customer
- Last conversation: pricing discussion 2026-04-10
- Waiting on: proposal we sent 2026-04-11
## Topics
- my-app integration
- enterprise pricing
- Q2 budget approval# Communication Preferences
## Style
- Short, direct messages — no filler
- Never start with "Hope you're well"
- Sign off with first name only
## Defaults
- Primary channel: WhatsApp
- Calendar timezone: America/New_York
- Working hours: 8am–7pm ET# my-app
## Status
- Phase 6.2 in progress — push notifications backend
- Dev branch: feature/push-notifications
- Last deploy: 2026-04-12 14:30 UTC
## Key Contacts
- Alice (QA): alice@example.com
- Bob (backend): bob@example.comEvery skill has a Runtime Context block at the top of its SKILL.md that loads memory files via ! shell injection before the model reads the skill body:
!MEMORIES_DIR="$CLAUDE_PLUGIN_ROOT/../data/memories"
!cat "$MEMORIES_DIR/preferences.md" 2>/dev/null || echo "No preferences found"
!ls "$MEMORIES_DIR/contacts/" 2>/dev/null | head -20ops-inbox and ops-comms perform a contact lookup before drafting any reply:
sequenceDiagram
autonumber
participant S as /ops:inbox
participant M as memories/contacts/
participant P as memories/projects/
participant D as Draft reply
S->>M: read contacts/<sender>.md
M-->>S: style · topics · history
S->>P: read projects/*.md if topic matches
P-->>S: project context
S->>D: Draft in contact's expected tone + topic
D-->>S: Match language · match register · stay on-topic
Note
Skills never send without explicit user confirmation. Memory-aware drafting just means the first draft is already in your voice — you don't have to rewrite it.
All files are plain markdown. You own them. Edit/delete/add anything:
# View all contact profiles
ls ~/.claude/plugins/data/ops-ops-marketplace/memories/contacts/
# Edit a contact profile (any editor)
$EDITOR ~/.claude/plugins/data/ops-ops-marketplace/memories/contacts/john-smith.md
# Remove a contact from memory
rm ~/.claude/plugins/data/ops-ops-marketplace/memories/contacts/ex-boss.md
# Force an extraction run right now
/ops:doctor --run-memory-extractor
# Nuke all memories and start fresh
rm -rf ~/.claude/plugins/data/ops-ops-marketplace/memories/Caution
If you edit a file by hand, the next extractor run will merge new observations into your edits. It never overwrites but it does append. If you want a hand-curated profile that the extractor leaves alone, add <!-- extractor:skip --> as the first line — the extractor honors that directive.
| Component | Volume | Cost |
|---|---|---|
| Input tokens (30 min of messages) | ~5–15k | ~$0.001–0.004 |
| Output tokens (profile merges) | ~1–3k | ~$0.001–0.003 |
| Total per run | < $0.01 | |
| Monthly (48 runs/day × 30) | ~$3–10 |
Haiku 4.5 is ~20× cheaper than Sonnet and ~100× cheaper than Opus. The extractor is tuned to do just the pattern-matching work that Haiku is good at — nothing that needs deeper reasoning.
Important
Memory files never leave your machine. They are written, read, and edited entirely on local disk.
| Property | Status |
|---|---|
| Files stored locally only | Yes — ~/.claude/plugins/data/…/memories/
|
| Uploaded anywhere | No |
| Shared with other users | No |
| Survives plugin reinstall | Yes (they live in the plugin data dir, not the cache dir) |
Removed by /ops:uninstall
|
Yes — the uninstaller deletes the whole memories/ tree |
| Gitignored | Yes (via the plugin data dir, which is never in any repo) |
| Readable only by you | File mode 600 (umask 077 when the extractor writes) |
What does go to Anthropic: the Haiku API call itself, same as any Claude Code session. Message content is transiently processed by the extractor prompt, then the structured markdown result is written to disk. No additional telemetry.
See Privacy and Security for the full transparency report.
- Daemon Guide — how the extractor gets scheduled
-
Agents Reference —
memory-extractoragent spec - Privacy and Security — full local-data transparency
- Troubleshooting#memories-not-extracting — diagnosis checklist