All 8 phases complete · 100%
mnemo
A privacy-first, local-first AI learning-management agent
Spaced repetition · curriculum sequencing · quiz generation · adaptive coaching — running on your own device.
SQLite on-device
Hermes3 via Ollama
WebMCP progressive
69 tests passing
Kids deserve a learning agent that doesn't leak
- Hosted tutors send a child's struggles, mistakes, and reading level to someone else's server.
- Browser-only loops forget everything the moment the tab closes — no cross-session adaptation.
- LLMs hallucinate URLs and quiz answers; nothing stops an unreviewed link reaching a 6th-grader.
mnemo's answer: keep data on the device, gate every external resource on a human approval, and give the agent real memory across sessions.
Why Hermes3, not a stateless loop
| Scenario | Browser loop | Hermes3 agent |
| Learner keeps failing fractions across 3 sessions |
Sees today's queue only |
Reads events trail, spots pattern, proposes extra review |
| Adapt difficulty over a 4-week trend |
No cross-session memory |
Per-learner memory injected into every session prompt |
| Detect 3 days of inactivity |
Only runs when tab is open |
Backend marks items overdue, adjusts ease_factor |
| Propose new study pace for approval |
Can't write persistent state |
generate_adjustments() → human approve / reject |
Local-first architecture
┌──────────────────────────────────────────────┐
│ Dashboard (localhost:8000) │
│ progress · reviews · quiz · SSE session │
│ insights · proposals · privacy controls │
│ registers WebMCP tools (Chrome 146+) │
└────────────────┬─────────────────────────────┘
│ REST + SSE (25+ endpoints)
▼
┌──────────────────────────────────────────────┐
│ FastAPI · webapp/app.py │
└──────┬───────────────────────┬───────────────┘
▼ ▼
┌─────────────┐ ┌──────────────────────────┐
│ SQLite │ │ Hermes3 via Ollama │
│ 3 migrations│ │ cross-session memory │
│ 7 tables │ │ pattern analysis │
│ source_ │ │ adjustment proposals │
│ allowlist │ │ HF API fallback │
└─────────────┘ └──────────────────────────┘
Hermes3 digest pinned by SHA256. Allowlist startup assertion. HF fallback requires explicit opt-in.
Two gates before anything reaches a child
Gate 1 — Human approval
Every external resource starts
approved = 0 in the schema.
A parent or teacher clicks
Approve in the dashboard before the learner ever sees it.
✓ Enforced at INSERT (schema DEFAULT)
✓ Enforced at SELECT (SQL WHERE clause)
✓ Tested:
test_scenario_content_gate_two_layers
Gate 2 — Source allowlist
recommend_resources joins
source_allowlist at the query layer.
Even an
approved = 1 resource is suppressed if its origin isn't a trusted source (e.g.
khan-academy,
ck12).
✓ Enforced in SQL subquery (not application logic)
✓ Discovered + added during Phase 8 code review
✓ Scenario test verifies both gates independently
Quiz questions carry an ⚠ Unreviewed badge until a teacher signs off. Agent proposes pace changes — a human confirms.
Complete — all 8 phases shipped
localhost:8000 · learner #1 · after 3 sessions and one round of POST /api/agent/insights/1