GYSTC v1.4.0 — stable / memory daemon / persistent context
FILE: index.html BUILD: 1.4.0 / 2026-06 TARGET: claude desktop / cli FREE · SOURCE PUBLIC ON GITHUB
+----------------------------+
|  MEM[Claude] = ∅           |
|  > start session #47       |
|  > "explain project again" |
|  > ...                     |
|  GYSTC.attach()            |
|  MEM[Claude] := vault/     |
|  > "based on march decs..."|
+----------------------------+

Get your shit together, Claude.

Your AI forgets everything. Every. Single. Session. This fixes that — a local memory daemon for Claude. One shared brain process, every client plugs in. Persistent across sessions, projects, and months.

scroll ↓ local-first · no cloud · no telemetry 013 sections
// organized like a brain // one daemon, every client // loads the model once, remembers forever
[ 02 ] / THE PROBLEM

Every session is groundhog day.

>>>

You've explained your project structure to Claude 50 times. It forgets your architecture decisions. It doesn't know your conventions. Every session — finally productive — starts at zero.

// recurring symptoms — "remind me what stack you use"
— "what was that file called again?"
— "should I use tabs or spaces here?"
— "wait, who decided this?"
— repeats every ~1h.
[ 03 ] / HOW IT WORKS

Three steps. No accounts, no cloud.

STEP_010:00 → 0:30
Install
Run the EXE (Windows) or open the DMG (macOS). The setup wizard registers the MCP server with Claude. No package manager, no PATH dance.
$ ./gystc-setup.exe
STEP_020:30 → 0:45
Point at vault
One config field: the folder Claude should remember. Markdown, code, notes — anything textual.
vault_path = "D:/notes/work"
STEP_030:45 → ∞
Forget about it
Every new session, Claude pulls relevant context automatically. You stop re-explaining.
claude > auto_context: ok
[ 04 ] / BEFORE · AFTER

Same prompt. Different memory.

before — vanilla claude Session #47
[ 14:02 ] you > let's keep working on the auth refactor.

[ 14:02 ] claude > Sure! Quick question — can you
explain your project structure again?
What auth library are you using? Where
do tokens live? Any conventions I
should follow?

[ 14:03 ] you > ......
after — with gystc Session #47
[ 14:02 ] you > let's keep working on the auth refactor.

[ 14:02 ] claude > Based on your architecture decisions
from March, you're using session
cookies (not JWT) and the helper lives
in lib/auth/session.ts. Want me to
extend the rotation logic we sketched
last Tuesday?
[ 05 ] / THE UPGRADE

One brain. Every client.

GYSTC is a daemon now. Claude CLI, Claude Desktop, your agents, the dashboard — they all plug into one shared brain process instead of each booting their own.

before — one server per client ≤ v1.3.3
claude cli   ──>  server #1  [~400 MB model]
claude desk  ──>  server #2  [~400 MB model]
agent        ──>  server #3  [~400 MB model]

3× RAM · ~6 s cold start, every time
after — the daemon v1.3.4+
claude cli   ──>  proxy ─┐
claude desk  ──>  proxy ─┼──>  ONE DAEMON
agent        ──>  proxy ─┘
model loaded once · RAM ×1
~6 s once — then instant for everyone
// plain english

Before, every Claude window started its own copy of GYSTC — and every copy loaded its own embedding model. Open three clients, pay three times. Now one background process holds the brain and everyone shares it. It even shuts itself down when idle and comes back the moment something asks — you never see or manage it.

// why that's hard (the dev cut)
  • stdio↔HTTP proxy — clients still speak plain MCP over stdio; the proxy auto-spawns the daemon and respawns it if it dies mid-session. No client ever hangs.
  • locked down by default — loopback-only (127.0.0.1), per-run bearer token, Origin allow-list against DNS rebinding, request bodies capped.
  • single-writer index — a file lock elects exactly one writer for the FAISS index; readers stay searchable and are auto-promoted if the writer exits.
  • idle-shutdown — frees the model from RAM after 30 min of silence; the next call transparently respawns it.
  • no orphans — a parent-death watchdog kills any server whose client is gone, instead of leaving zombies holding the database.
[ 06 ] / FEATURES

Twelve things it does right.

  1. 01Shared daemon — model loaded once, every client plugs in.RUNTIME
  2. 02Persistent memory across sessions and projects.CORE
  3. 03Semantic search — FAISS vector similarity.SEARCH
  4. 04Full-text search — SQLite FTS5.SEARCH
  5. 05Hybrid search with Reciprocal Rank Fusion.SEARCH
  6. 06Cross-encoder re-ranking — optional, off by default.PRECISION
  7. 0712 knowledge regions for structured organization.STRUCTURE
  8. 08Segmental search — queries target relevant regions, not the whole vault.PRECISION
  9. 09Smart chunking for long documents.INDEXER
  10. 10Content versioning with rollback.STORAGE
  11. 11Auto-context on session start.RUNTIME
  12. 12408 tests — green on every commit, hardened by three audit rounds.QUALITY
[ 07 ] / MCP TOOLS

8 tools. Zero bloat.

Every tool is exposed via Model Context Protocol. Claude calls them autonomously — no slash commands, no manual triggers. Consolidated from 16 to 8 in v1.1.0 for faster, more reliable responses.

brain_retrieve SEARCH

Unified search: semantic (FAISS), keyword (FTS5), and graph traversal in one call. Pass a query, file paths, or both. Falls back to keyword-only if the model is still loading.

When Claude needs knowledge about any topic, project, or prior decision.

brain_store WRITE

Save a new note to the vault. Automatically embeds it, classifies it into a brain region, versions old content, and indexes it for future retrieval.

When Claude discovers something worth remembering across sessions.

brain_related GRAPH

Explore connections from a specific note. Follows backlinks and embedding similarity to surface related knowledge you didn't explicitly search for.

When exploring how concepts connect or finding adjacent knowledge.

brain_recent SEARCH

List recently changed notes, ordered by modification time. Instant — no model needed. The go-to tool while the embedding model is still loading.

When Claude needs to understand recent vault activity or changes.

brain_status META

Fast health check — note count, vector count, model status, region distribution. Always instant, responds in under 10ms.

Quick sanity check that the MCP server and vault are operational.

brain_regions META

List all 12 brain regions with note counts, descriptions, and customization options. Shows how the vault is organized.

When Claude needs to understand the vault's structure or pick a region.

brain_classify ORGANIZE

Classify notes into brain regions using keyword rules (no API key needed). Supports single-note, batch reclassify, and feedback corrections — all via the action parameter.

When notes need to be assigned to or moved between brain regions.

brain_versions VERSION

View history, diff against previous versions, or rollback a note. All versioning in one tool via the action parameter.

When investigating changes or restoring a previous version.

[ 08 ] / REGIONS

Organized like a brain. Searched like an index.

The vault is partitioned into 12 named regions. Segmental search routes queries to the relevant ones — not a flat sweep over everything you've ever written. The metaphor is anatomical; the goal is structure and performance, not simulating a brain.

// 12 regions · 77 communities · ranked by recall on internal benchmark bar = relative segmental hit rate
[ 09 ] / README

README.md

What is GYSTC?

GYSTC is a local memory daemon for Claude. It indexes your Obsidian vault (or any folder of markdown files), builds a semantic search index, and exposes MCP tools that let Claude retrieve, store, and connect knowledge across sessions.

No cloud. No accounts. Clients talk plain MCP over stdio; behind that, one shared daemon on 127.0.0.1 serves them all — the embedding model loads once, not once per window. Never phones home.

Requirements

  • Windows 10+ or macOS 12+
  • Claude Desktop or Claude Code (CLI)
  • An Obsidian vault (or any folder with .md files)

Installation

Download the EXE (Windows) or .app (macOS) from the release page. Run it. The setup wizard walks you through pointing at your vault and registering the MCP server with Claude.

That's it. Next time you open Claude, it has memory.

What Claude gets

  • brain_retrieve — hybrid search + file context + graph traversal (absorbed brain_context)
  • brain_store — save new knowledge as a note
  • brain_recent — see recently modified notes
  • brain_related — find connected topics via backlinks + embeddings
  • brain_classify — classify, reclassify, or teach the classifier (merged 3 tools)
  • brain_versions — history, diff, and rollback in one tool (merged 3 tools)
  • brain_regions — list all 12 regions with stats
  • brain_status — vault health check

How it organizes knowledge

Notes are classified into 12 brain regions by function, not topic. Architecture decisions go to the Prefrontal Cortex. API endpoints go to Motor Cortex. Config files go to Brainstem. When Claude searches, it targets the relevant regions first — not a flat sweep of everything.

Session auto-context

A SessionStart hook fires every time you open Claude. It reads your current git context and pulls relevant vault notes automatically. Claude starts every session already knowing what you're working on.

Dashboard

The EXE includes a 3D brain visualization built with Three.js. Your vault rendered as a force-directed graph — nodes are notes, edges are backlinks, colors are regions. Click any node to open the note in Obsidian.

Source code

Everything is free — the binary and the full source. The code is public on GitHub: read it, build it, self-host it. No paywall. If GYSTC saves you time and you want to support development, there's an optional Patreon — but the code is yours either way.

[ 10 ] / CHANGELOG

CHANGELOG

v1.4.0 2026-06-11 latest
    // full hardening pass — 3 adversarial audit rounds
  • 43 verified findings closed across lifecycle, index integrity, curation, daemon and dashboard — each one adversarially confirmed before the fix, each fix pinned by a regression test. Suite grew 243 → 408 tests
  • A failed embed can no longer leave a note silently mapped to its OLD content's vector (detach-then-embed, everywhere) — and re-embedding no longer leaks the previous vector
  • Slow model load no longer disables indexing for the whole session — watcher + keyword search start instantly, vectors backfill when the model is ready, and a broken writer hands the index to a healthy sibling
  • // vault curation
  • New brain_mcp curate: git-reversible vault cleanup — dead-link scan, semantic near-duplicate detection, directory archiving. Read-only analyze, human-gated apply with a full diff preview
v1.3.5 2026-06-08
    // daemon idle-shutdown
  • The shared daemon now self-terminates after --idle seconds (default 1800) of no activity — freeing the embedding model + index from RAM. The proxy transparently respawns it on the next call, so it stays invisible to clients
  • // security hardening (full audit + semgrep — all defense-in-depth)
  • Liveness probe fails closed on a pid-check error — never sends the bearer token to a possibly-reused port
  • /mcp request bodies capped at 8 MB (413) so a token-holder can't OOM the shared daemon
  • Upper bounds on network-facing dependencies (mcp<2, httpx<1) against silent / supply-chain upgrades
v1.3.4 2026-06-08 daemon
    // shared daemon — load the model once
  • All clients (Claude CLI, Hermes, Command Center) now share ONE long-lived daemon that loads the embedding model + index a single time — instead of each spawning its own ~400 MB server. Hermes stops paying a ~6s cold start on every run
  • brain_mcp serve is now a thin stdio↔HTTP proxy: it auto-starts the daemon and forwards to it; if the daemon dies mid-session the proxy respawns it and never hangs the client
  • Daemon is loopback-only (127.0.0.1) with a per-run bearer token + Origin allow-list (DNS-rebinding protection) and a held ephemeral port — no token-leak race
  • serve --direct keeps the previous in-process stdio server as a fallback
v1.3.3 2026-06-08 stability
    // the real disconnect fix
  • No more random "Connection closed" — stdio MCP runs one server per client (CLI + Hermes + Command Center), but startup used to kill every other GYSTC process. That global killer is gone for good
  • A server now self-terminates when its client exits (parent-death watchdog) instead of lingering as an orphan holding the database
  • Shutdown is single-winner + idempotent — teardown and the watchdog can't race on save/close, and exit never pre-empts an in-flight re-index
  • // multi-client index safety
  • Multiple servers now coexist safely — a single-writer file lock means exactly one instance owns the FAISS index; the rest run read-only but stay fully searchable. Prevents silent index corruption from coexisting writers
  • Read-only instances hand writes to the writer; if the writer exits, a reader is promoted automatically
  • // indexing correctness
  • File-change re-indexing is serial + debounced off the watcher thread, with a starvation cap — bursts (graphify, vault sync) no longer storm the DB lock
  • The watcher refreshes chunk vectors and removes them on delete — external/Obsidian edits no longer return stale snippets or leak vectors
  • // packaging
  • requirements.txt installs a runnable server again (it was missing every core MCP dependency)
v1.3.2 2026-06-03 dashboard
    // dashboard
  • Live activity terminal is alive — Claude's tool calls stream into the dashboard via a PostToolUse hook, and GYSTC memory ops light up the matching brain node in real time
  • Setup wizard now writes Claude Code's required nested hook schema — the SessionStart context hook and the new activity hook actually fire on install (the old flat format was silently ignored)
v1.3.1 2026-06-03 hang fix
    // the real hang fix
  • First search of a session no longer freezes — brain_retrieve falls back to keyword search instantly instead of blocking on model load; brain_related falls back to backlinks
  • Embedding now runs on a dedicated bounded pool — a slow embed can never starve the instant tools (status/recent/regions)
  • SessionStart context hook pointed at a non-existent module — auto-context was silently broken in every install; now fixed
  • // installer / packaged app
  • brain_mcp is now bundled in the EXE — Dashboard search, stats, reindex and settings work again
  • Setup wizard and MCP no longer overwrite each other's config.json keys (merge-on-write)
  • Clear "install Python 3.11+" message when no interpreter is found, instead of writing a broken MCP command
  • psutil is now a declared dependency — zombie-process cleanup works on clean installs
  • // data correctness
  • Editing a note refreshes its chunk vectors — search no longer returns stale snippets
  • Version rollback re-embeds restored content and keeps its tags (was leaving a ghost vector and wiping tags)
  • brain_classify apply returns a clear error when the note isn't stored, instead of a silent no-op
v1.3.0 2026-05-16 stability
    // stability — zero-hang guarantee
  • All 8 MCP tools now fully async with run_in_executor + 30s timeout — impossible to block the event loop
  • Zombie process killer on startup — stale brain_mcp processes from crashed sessions are auto-cleaned
  • Periodic FAISS index save every 60s — index survives process kills and crashes
  • SQLite busy_timeout=5000ms + wal_autocheckpoint — eliminates "database locked" under concurrent access
  • // features
  • Semantic search in Dashboard GUI — async /api/search endpoint merges with local results
  • Comprehensive MCP tool verification test suite (all 8 tools with timeout checks)
v1.2.0 2026-05-12 hang fix
    // critical fix — mcp hang eliminated
  • wait_ready() moved from async event-loop to executor thread — this was the root cause of all MCP hangs
  • Model loading no longer blocks the event loop — server stays responsive during the full 6s startup
  • WAIT_READY_TIMEOUT increased 10s → 20s (model load takes ~11s, timeout was too short)
  • Reranker _ready.set() moved to finally block — no more permanent hang on abnormal exit
  • // performance
  • HF_HUB_OFFLINE=1 — skips ~20 HTTP cache-validation requests on every startup
  • Model load time reduced from ~11s to ~6.4s (44% faster)
  • Library logging suppressed — clean stderr output in MCP mode
  • // safety
  • _handle_file_change now checks is_ready before embedding — prevents blocking on model lock
  • brain_store skips embedding cleanly when model not loaded (was silently broken)
v1.1.0 2026-05-10 consolidation
    // consolidation
  • 16 → 8 MCP tools — merged context into retrieve, history/diff/rollback into versions, classify/reclassify/feedback into classify
  • Removed brain_reindex, brain_enrich, brain_autolink from MCP (CLI only now)
  • Cross-encoder re-ranker now off by default — enable via reranker: "cross-encoder" in config
  • // stability
  • FTS-only fallback when embedding model not ready — search always works
  • Reduced timeouts: 10s model wait, 30s tool timeout (was 60s/90s)
  • Empty query no longer triggers unnecessary model wait
  • is_ready check now detects failed model loads correctly
  • // instructions
  • Rewritten BRAIN_INSTRUCTIONS — explicit "when NOT to search" guidance to prevent Claude search loops
v1.0.2 2026-05-09 patch
    // stability
  • Event-loop hang fix — wait_ready() moved from async event-loop to executor thread
  • Embedder _load() now always signals readiness (via finally), even on crash
  • All async MCP tools wrapped in asyncio.wait_for(timeout=60) — returns error instead of hanging forever
  • Explicit is_ready check after wait_ready to detect failed model loading
v1.0.1 2026-05-09 patch
    // async
  • All embedding-heavy MCP tools moved to async + run_in_executor
  • brain_store skips embedding when model not loaded yet (graceful fallback)
v1.0.0 2026-05-08 initial release
    // release
  • First public release — EXE build for Windows, .app for macOS
  • Setup wizard with vault picker, API key config, one-click MCP + hooks install
  • GitHub Actions CI pipeline — automatic builds for Windows + macOS on every tag
  • // search
  • Cross-encoder re-ranker (ms-marco-MiniLM) — enabled by default for precision
  • Hybrid search with Reciprocal Rank Fusion (FAISS + FTS5)
  • Smart chunking — long notes split at headings, each chunk gets its own vector
  • SessionStart auto-context hook — Claude loads relevant vault notes on every session
  • // storage
  • Content-addressable versioning — brain_versions (history, diff, rollback)
  • Max 50 versions per note, deduplicated by content hash
  • // security
  • XSS fix in dashboard (innerHTML to textContent for untrusted content)
  • HTML sanitizer bypass fix — inner content of highlight spans now escaped
  • Path traversal guards on all file operations
  • Hook command path quoting for Windows paths with spaces
  • // dashboard
  • Flicker fix — --in-process-gpu Chromium flag (60fps preserved)
  • Obsidian toolbar button via QWebChannel bridge (replaces alert())
  • Full rebrand from Neural Brain to GYSTC
v0.4.0 2026-05-06 pre-release
    // features
  • Auto-classifier with weighted tiers for brain region assignment
  • brain_reclassify tool for manual region overrides
  • Local search with visual filter in dashboard
  • Settings UI panel with config API
  • // fixes
  • MCP cold-start hang — background startup with lifespan fix
  • Edge visibility overhaul — direct alpha-buffer replaces DataTexture
  • Region gravity with non-linear distance scaling
v0.3.0 2026-05-03 pre-release
    // features
  • Full MCP server with 16 tools (retrieve, store, context, recent, related, etc.)
  • FAISS vector index with L2-normalized cosine similarity
  • SQLite FTS5 full-text search with BM25 scoring
  • File watcher with self-write detection
  • Vault tagging script — assign brain regions to all notes
  • // security
  • Thread safety hardening, FAISS cleanup, FTS5 sanitization
  • Silent failure hardening — narrow exception types, add logging
v0.2.0 2026-04-28 pre-release
    // features
  • Three.js 3D brain visualization via QWebEngineView
  • Bloom, Fresnel-Rim, starfield, dormant synapse animation
  • Obsidian REST API integration — click nodes to open notes
  • // fixes
  • Serve web files via local HTTP server instead of file://
v0.1.0 2026-04-17 initial
    // foundation
  • Project scaffold with 12 brain region definitions
  • Force-directed physics engine with region gravity
  • Orbit camera with perspective projection
  • Ray-casting picker for 3D node selection
  • OpenGL widget with render loop
[ 11 ] / INSIDE

What it looks like when it's running.

./gystc — running FAISS · FTS5 · CrossEncoder ● indexing · 0 errors
GYSTC Dashboard — 3D brain visualization with 1853 nodes, 12 regions, live Claude Code terminal
// GYSTC Dashboard — 1853 nodes · 6379 edges · 12 brain regions · live Claude Code terminal · tweaks panel · minimap
[ 12 ] / TECH

For the devs who want to know.

// runtime
Python 3.11+
CPython, packaged as a single signed EXE.
// vector index
FAISS
L2-normalized cosine, IVF flat for vaults < 1M chunks.
// fts
SQLite FTS5
BM25 with custom tokenizer. WAL mode, embeddable.
// embeddings
SentenceTransformers
Lazy-loaded in background thread. Offline cache, ~6s cold start.
// transport
FastMCP
MCP over stdio — proxied into the shared daemon. --direct for in-process fallback.
// daemon
streamable-http
Loopback-only, bearer token + Origin allow-list, idle-shutdown, single-writer index lock.
stack ::= Python · FAISS · SQLite FTS5 · SentenceTransformers · FastMCP · shared daemon · content-addressable storage with versioning.
[ 13 ] / FAQ

Asked anyway. Answered anyway.

Is my data sent anywhere?
No. Everything runs on your machine — the daemon binds to 127.0.0.1 only. No account, no telemetry, and the fonts are self-hosted, so the page itself makes zero third-party requests too.
What does it cost?
$0. The binary and the full source are free, no paywall, no trial. If it saves you time, there's an optional Patreon.
How is this different from Claude's built-in memory?
Built-in memory is short conversation summaries. GYSTC is your entire vault — semantic + full-text search over everything you've written, versioned, organized into 12 regions, shared by every client. The files stay yours, in plain markdown.
What do I need?
Windows 10+ or macOS 12+, Claude Desktop or Claude Code, and a folder of markdown files. An Obsidian vault works perfectly — edits are picked up live.
How heavy is the daemon?
About 400 MB RAM while active — that's the embedding model. After 30 minutes of silence it shuts itself down and frees the RAM; the next call respawns it transparently.
What if it crashes?
The proxy respawns the daemon automatically, and a single-writer lock keeps the search index consistent. Your notes are plain markdown on disk either way — there is nothing to lose.
[ 14 ] / GET IT

.

Stop re-explaining. Start where you left off.

Windowsgystc-windows.zip

Extract the ZIP, open the GYSTC Dashboard folder, run GYSTC Dashboard.exe. The setup wizard walks you through vault selection, MCP install, and hook registration. Requires Python 3.11+ for the MCP server.

macOSgystc-macos.dmg

Open the DMG, drag GYSTC Dashboard.app to Applications. On first launch, the setup wizard configures your vault and installs the MCP server via pip. Requires Python 3.11+.

The app and the source are free — and always will be. No account, no telemetry, no upsell, no paywall. The full source is public on GitHub. If you want to support development there's an optional Patreon — if you can spare it: thanks. If not: everything still works.