Your memory lives here. Chat with an AI that knows who you are — and builds your knowledge graph as you talk.
Docs: PROJECT_OVERVIEW.md (architecture) · benchmarks/EVAL_REPORT.md (eval numbers) · benchmarks/README.md (reproduce)
flowchart TD
User("User")
User -->|Google OAuth| Supabase("Supabase Auth")
User --> Frontend
subgraph Frontend ["React + Vite"]
direction LR
Login("Login") --> Onboarding("Onboarding") --> Chat("Chat") --> Graph("Graph")
end
Frontend -->|JWT| Flask
subgraph Flask ["Flask API"]
direction TB
ChatAPI("/chat") --> LLM
ChatAPI -->|extract entities| LLM
OnboardChat("/api/onboard-chat") --> LLM
Import("/api/import") --> LLM
NodeAPI("/api/graph/node") --> LLM
LLM("Groq\nllama-3.3-70b")
end
ExternalAI("ChatGPT / Claude") -->|memory export| Import
Flask -->|read & write| Neo4j[("Neo4j\nKnowledge Graph")]
Flask -->|conversation history| Redis[("Redis")]
Supabase -->|verify JWT| Flask
| Layer | Tech |
|---|---|
| Frontend | React + Vite, canvas graph renderer |
| Backend | Flask (Python) |
| Auth | Supabase (Google OAuth) |
| LLM | Groq — llama-3.3-70b via litellm |
| Graph DB | Neo4j |
| Cache | Redis (conversation history) |
| Endpoint | Purpose |
|---|---|
/chat |
Generate replies using memory context |
/chat (post-reply) |
Extract entities from conversation → graph nodes |
/api/onboard-chat |
Onboarding conversation → profile JSON |
/api/import |
Parse memory export → structured profile |
/api/graph/node |
Normalize user-typed labels (spelling correction) |
/api/wallet |
(reads graph, no LLM) |
python3 app.py
# open http://localhost:3000GROQ_API_KEY
LLM_MODEL # default: groq/llama-3.3-70b-versatile
NEO4J_URI
NEO4J_USER
NEO4J_PASSWORD
NEO4J_DATABASE
SUPABASE_URL
SUPABASE_JWT_SECRET
REDIS_URL # optional
LongMemEval-S harness in benchmarks/. Dev slice (n=10): Aegis QA accuracy 80% vs flat BM25 RAG 70% at recall@10 parity — see EVAL_REPORT.
pip install -r requirements-benchmark.txt
python3 benchmarks/download_data.py
python3 benchmarks/run_retrieval.py --backend flat_rag --limit 5 # smoke test
python3 benchmarks/verify_reference.py --run-id dev # vs committed reference