ERINYS
Mentions Bootstrap in example use cases for applying optimization techniques to Bootstrap-related scripts.
Exports memory data to markdown format for compatibility with markdown-based tools like Obsidian.
Exports memory data to Obsidian-compatible markdown files with wikilinks for instant knowledge graph creation.
Supports PostgreSQL as a database option for production reliability, with conflict detection against other database choices.
Planned PyPI package distribution for easy installation of the memory server as a Python package.
Includes testing framework integration for running tests on the memory server implementation.
Built as a Python-based MCP server with Python environment setup and package management.
Uses SQLite as the local-first database storage with FTS5 and vector extensions for hybrid search capabilities.
ERINYS β Reflexive Memory for AI Agents
π―π΅ ζ₯ζ¬θͺη / Japanese
From memories that existed, it even creates memories that never did.
AI agent memory systems have always mimicked human memory. Short-term, long-term, episodic, semantic β textbook categories bolted straight onto implementations.
Something always felt off.
Humans forget. But existing memory systems don't. They grow endlessly, serving stale facts with the same weight as fresh ones. Humans notice "wait, didn't you say something different before?" But memory systems silently overwrite. Humans connect two unrelated experiences and think "oh, I can use that here." But memory systems just store and retrieve.
What needed to be mimicked wasn't the taxonomy of memory. It was the behavior.
That discomfort is what summoned ERINYS.
ERINYS is a guard dog. It remembers, forgets, questions, and bites.
What Makes ERINYS Different
Forgetting. Most memory systems only accumulate. ERINYS decays memories over time following the Ebbinghaus forgetting curve. Old noise sinks. Frequently accessed knowledge floats. Search results stay relevant without manual curation.
Distillation. A specific bugfix ("JWT httpOnly flag was missing") automatically generates three layers: the concrete fact β a reusable pattern ("new endpoints need a security checklist") β a universal principle ("security defaults should be safe without opt-in"). No other memory system does this.
Dream Cycle. Two memories are fed to an LLM: "is there a connection?" Candidate pairs are selected by semantic similarity β close enough to be related (cosine > 0.65), far enough to not be redundant (< 0.90). Scheduled overnight via cron, it finds connections you'd never think to look for. No magic β just automated note comparison at scale.
Design Philosophy
Memory has layers
Not all memory is equal. ERINYS organizes knowledge by abstraction level:
Concrete β what happened. "The JWT httpOnly flag was missing on
/api/auth."Abstract β patterns from facts. "New API endpoints need a security header checklist."
Meta β principles from patterns. "Security defaults should be safe without manual opt-in."
A single bugfix generates all three through distillation. The meta layer accumulates principles that transfer across projects and tech stacks.
Forgetting is a feature
Every memory has a strength score that decays over time. A memory saved 6 months ago ranks lower than one saved yesterday. Memories accessed frequently resist decay β repeated retrieval reinforces them.
When strength drops below a threshold, the memory becomes a pruning candidate. The database stays lean. Search stays relevant.
Facts change. History shouldn't disappear
When information updates β "we moved from AWS to GCP" β ERINYS doesn't overwrite. It creates a supersede chain: the old fact is marked as replaced but preserved. You can ask "what did we believe in March?" and get the answer that was true then.
Contradictions should be caught
If memory contains both "use PostgreSQL" and "use SQLite", ERINYS detects the conflict. Instead of silently switching, the agent asks: "you previously chose PostgreSQL β has the requirement changed?"
Search finds meaning, not just keywords
Two searches run simultaneously and fuse results:
Keyword search (FTS5) β exact term matching.
Vector search (sqlite-vec) β semantic similarity. "authentication" finds "login", "JWT", "session tokens".
Results merge via Reciprocal Rank Fusion (RRF). High in both = highest score.
Everything stays local
Single SQLite file. No cloud APIs. No API keys. No subscriptions. Offline-capable. Your agent's memory never leaves your machine.
Use Cases
1. Cross-Session Memory for Coding Agents
# Agent saves a learning after fixing a bug
erinys_save(
title="Fixed JWT httpOnly flag missing",
content="Cookie was accessible via JS. Added httpOnly: true, secure: true, sameSite: strict.",
type="bugfix",
project="my-app"
)
# Next week, similar task β agent searches memory
erinys_search(query="authentication cookie security", project="my-app")
# β Returns the JWT fix with relevance score2. Contradiction Detection
erinys_save(title="Database choice", content="Using SQLite for simplicity", project="my-app")
erinys_conflict_check(observation_id=42)
# β "β οΈ Conflicts with #18: 'Using PostgreSQL for production reliability'"3. Dream Cycle β Overnight Knowledge Synthesis
erinys_dream(max_collisions=10)
# Picks memory pairs in the "sweet spot" (cosine 0.65β0.90)
# Memory A: "RTK reduces token usage by 60-90%"
# Memory B: "Bootstrap Gate takes 3 seconds due to multiple script calls"
# β Insight: "Apply RTK prefix to Bootstrap Gate scripts to reduce overhead"4. Temporal Queries
erinys_timeline(query="deployment target", as_of="2026-03-01")
# β "AWS EC2 (decided 2026-02-15)"
erinys_timeline(query="deployment target", as_of="2026-04-01")
# β "GCP Cloud Run (superseded AWS on 2026-03-20)"5. Knowledge Distillation
erinys_save(title="Forgot CORS headers on new endpoint", type="bugfix", ...)
erinys_distill(observation_id=50, level="meta")
# β concrete: "CORS headers missing on /api/v2/users endpoint"
# β abstract: "New API endpoints need a CORS review checklist"
# β meta: "Security concerns should be opt-out, not opt-in"6. Obsidian Export
erinys_export(format="markdown")
# β Generates .md files with [[wikilinks]]
# Drop into Obsidian β instant knowledge graphQuick Start
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
# Run as MCP server (stdio)
python -m erinys_memory.server
# Run tests
PYTHONPATH=src pytest tests/ -vMCP Configuration
Claude Desktop / Claude Code
{
"mcpServers": {
"erinys": {
"command": "/path/to/ERINYS-mem/.venv/bin/python3",
"args": ["-m", "erinys_memory.server"],
"env": {
"ERINYS_DB_PATH": "~/.erinys/memory.db"
}
}
}
}Gemini (Antigravity)
Add to ~/.gemini/antigravity/settings.json under mcpServers:
{
"erinys": {
"command": "/path/to/ERINYS-mem/.venv/bin/python3",
"args": ["-m", "erinys_memory.server"],
"env": {
"ERINYS_DB_PATH": "~/.erinys/memory.db"
}
}
}Environment Variables
Variable | Default | Description |
|
| SQLite database path |
|
| fastembed model |
Tools (25)
Core
erinys_saveβ Save observation (with topic_key upsert)erinys_getβ Get by ID (full content, untruncated)erinys_updateβ Partial updateerinys_deleteβ Delete with FK cascadeerinys_searchβ RRF hybrid search (FTS5 + vector)erinys_save_promptβ Save user prompterinys_recallβ Recent observationserinys_contextβ Session context recallerinys_exportβ Obsidian-compatible markdown exporterinys_backupβ SQLite backuperinys_statsβ Database statistics
Graph
erinys_linkβ Create typed edgeerinys_traverseβ BFS graph traversalerinys_pruneβ Prune weak/decayed edges
Temporal
erinys_reinforceβ Boost observation strengtherinys_supersedeβ Version an observationerinys_timelineβ Query as-of timestamperinys_conflict_checkβ Detect contradictions
Dream Cycle
erinys_collideβ Collide two observations via LLMerinys_dreamβ Batch collision cycle
Distillation
erinys_distillβ 3-granularity abstraction (concrete β abstract β meta)
Batch & Eval
erinys_batch_saveβ Bulk save with auto-linkingerinys_evalβ LOCOMO-inspired quality metrics
Session
erinys_session_startβ Start sessionerinys_session_endβ End session with summaryerinys_session_summaryβ Save structured summary
How ERINYS Compares
Feature | ERINYS | Mem0 | Official MCP Memory |
Hybrid search (keyword + vector) | β FTS5 + sqlite-vec RRF | β Vector + graph | β Knowledge graph only |
Time-decay forgetting | β Ebbinghaus curve | β οΈ Priority scoring | β |
3-level distillation (concrete β abstract β meta) | β | β | β |
Dream Cycle (collision-based insight) | β | β | β |
Contradiction detection | β | β οΈ Overwrites via resolver | β |
Temporal queries ("what did we believe in March?") | β Supersede chain | β οΈ Graph invalidation | β |
Local-first (no cloud API) | β SQLite single file | β Cloud default | β |
Obsidian export | β [[wikilinks]] | β | β |
Auto-distill on save | β | β | β |
MCP native | β 25 tools | β | β |
Self-evaluation (LOCOMO metrics) | β | β | β |
TL;DR β Most memory servers store and retrieve. ERINYS also forgets, distills, and dreams.
Architecture
ββββββββββββββββββββββββββββ
β FastMCP Server β 25 tools, unified envelope
ββββββββββββββββββββββββββββ€
β search.py β graph.py β RRF hybrid β typed edges
β decay.py β session.py β Ebbinghaus β lifecycle
β temporal.pyβcollider.py β versioning β cross-pollination
β distill.py β db.py β abstractionβ SQLite + vec
ββββββββββββββββββββββββββββ€
β embedding.py β fastembed (BAAI/bge-small-en-v1.5)
ββββββββββββββββββββββββββββ€
β SQLite + FTS5 + vec0 β Local-first, no network at runtime
ββββββββββββββββββββββββββββRoadmap
Dream Daemon β Background auto-execution of Dream Cycle
Auto-Distill on Save β Trigger 3-granularity distillation on every save
Auto-Prune β GC decayed observations when DB exceeds size threshold
Cron-ready CLI β
erinys dream --max 10for scheduled overnight synthesisPyPI package β
pip install erinys-memoryMulti-agent support β Scoped memory per agent identity
License
MIT
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/GhostyAI-HA/ERINYS-mem'
If you have feedback or need assistance with the MCP directory API, please join our Discord server