Connect Claude, Cursor, or Windsurf via MCP. Geshtu captures facts and decisions across every chat, scopes them per-project, and lets a teammate ask their AI for a digest of "what happened since Monday" in 30 seconds.
Every message your team sends to an LLM passes through Geshtu. Facts and decisions are extracted, embedded, and scoped to the project. The next teammate's chat starts where the last one left off.
Open Claude, Cursor, or Windsurf. Geshtu sits behind MCP. No new UI, no copy-paste.
Each message is captured, then a worker calls Claude Haiku to extract facts and decisions as structured JSON.
Facts are embedded with BGE-M3 locally, dedup'd against existing memory, and tied to the project they came from.
"Catch me up since Friday." Geshtu hands them a cited digest in seconds — what changed, what was decided, what's open.
Most "AI memory" tools collapse everything into one bucket of "memories". Geshtu keeps facts, decisions, and summaries separate — because retrieving "what's true" and "what we chose" are different questions, and the answers age differently.
Every message your team sends, untouched. Source of truth for everything else. Optional retention windows.
Extracted statements with embeddings, validity windows, and supersession links. Old facts don't vanish — they're marked outdated.
Explicit choices with the rationale stated, not inferred. Authored, dated, and reversible — first-class, separate from facts.
End-of-session markdown: what happened, what's open, what's next. The seed for tomorrow's digest.
Most memory systems were designed for one user's relationship with one AI. Geshtu is designed for one team's relationship with one project — a different shape, with different requirements.
"Every chat with an LLM starts cold. Multiply by 5 teammates and 3 tools, and your team spends an hour a day re-explaining context. Geshtu holds onto what you've heard — async, scoped, cited."// from the README
No Kubernetes, no dedicated vector DB, no auth library, no frontend framework. The simplicity is the product — every retrieval maps to one SQL filter against one of four tables.
Six tools, no more. Works in any MCP client — Claude Desktop, Cursor, Windsurf, Cline. Stable surface.
pgvector HNSW + pg_trgm fused via Reciprocal Rank Fusion. Sub-10ms similarity over a team's lifetime memory.
BGE-M3 on CPU. Multilingual. Free per call. Your message text never leaves your box for embedding.
Three depths: quick (~300w), standard (~800w), deep (~2500w). Sonnet writes them. Cited and dated.
Memory is partitioned per project from the schema up. One project's memory never leaks into another's.
Every read is logged. Every fact links to the message and author it came from. GDPR export & purge built in.
Why you chose Postgres, not just that you did. A required field, surfaced in every digest and search result.
Facts have valid_from / valid_until / superseded_by. Old answers don't silently stay true.
Postgres, Redis, FastAPI, Celery, MCP, Streamlit admin. Caddy out front. Five minutes from clone to running.
Clone, set one API key, bring up the stack, paste a JSON snippet into your AI client. Done. Hetzner CPX21 (~€8/mo) handles a team up to 15 people.
$ git clone https://github.com/crowditory/geshtu
$ cd geshtu && cp .env.example .env
# edit .env, set ANTHROPIC_API_KEY
$ docker compose up -d
$ docker compose exec api python -m geshtu.bootstrap \
--team "My Team" \
--admin-email "me@example.com" \
--admin-name "Me"
# → prints tk_... drop into your llm client{
"mcpServers": {
"geshtu": {
"command": "npx",
"args": ["-y", "@geshtu/mcp"],
"env": {
"GESHTU_TOKEN": "tk_...",
"GESHTU_URL": "http://localhost:3000"
}
}
}
}AGPL-3.0, no signup, no telemetry by default. Self-host today. Or join the cloud waitlist if you'd rather we run it.