End-to-end pattern: a meeting-notes app that listens to audio, extracts the durable facts (decisions, action items, key quotes), and stores them in a per-meeting namespace so later meetings can recall context from earlier ones.
A working code skeleton lives in the mnueron repo at
examples/apps/meeting_notes_skeleton.py.
Architecture
[live audio or audio file]
│
▼
Whisper / Deepgram / your speech-to-text of choice
│
▼
Transcript with speaker labels
│
▼
For each speaker turn:
mnueron.save(content=turn, namespace=f"meeting-${meeting_id}",
metadata={"speaker": name, "ts_s": offset_seconds,
"summarize": True})
│
▼
[v0.2.9] Fact extraction fires automatically for long turns:
decisions / recommendations / action items become CHILD memories
in the same namespace, tagged 'extracted-fact'
│
▼
After the meeting ends:
mnueron.search("what did we decide", namespace=f"meeting-${meeting_id}",
metadata_filter={"category":"decision"})
returns just the decisions for digest emails
Why per-meeting namespaces
namespace=meeting-2026-05-17-q3-roadmap scopes recall to one meeting.
For cross-meeting questions ("what have we ever decided about pricing"),
search without a namespace and filter on tags or metadata:
mem.search(
"pricing",
metadata_filter={"category": "decision"},
k=20,
)
This is exactly the pattern the Elevizio framework uses
(/docs/samples/elevizio).
Practical tips
- Speaker normalization: map speech-to-text speaker IDs to real names BEFORE saving so future filters work (
metadata.speaker="sarah"not"SPEAKER_01"). - Bulk search after the meeting:
m.bulk_search([list of agenda items])to see what was actually covered for each item. - Webhook to Slack: register a webhook on
memory.savedfiltered bymetadata.category="decision"to broadcast decisions to a channel in real-time.