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

ScenarioBrowser loopHermes3 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 mnemo Learning Manager — Fractions WebMCP: 7 tools active PROGRESS 5 TOTAL TOPICS 2 NOT STARTED 1 LEARNING 2 MASTERED 1 DUE NOW LEARNING INSIGHTS Analyze Patterns reviews: 12 avg quality: 4.2 days active: 6 resource types: article PROPOSED ADJUSTMENTS PACE Increase study pace from medium → fast avg quality 4.2 across last 12 reviews · suggests learner is under-challenged Approve Dismiss RESOURCE_TYPE Try a video resource on the next ready topic only article-type resources seen across the 6-day window Approve Dismiss

localhost:8000 · learner #1 · after 3 sessions and one round of POST /api/agent/insights/1