An agent-driven indexed memory store with a 3D MRI/CAT-scan-style dashboard. Memories are neurons in anatomical brain regions, shared tags become synapses, and live agent activity fires the regions in real time. Your agent queries the store; Synaptic remembers, organizes, and surfaces what's relevant.
If you want the short read on what Synaptic is and isn't, start with
docs/WHAT_SYNAPTIC_IS.md.
By NomadsGalaxy
Hello, I'm Nomad, and welcome to Synaptic. For a long time, I've been fascinated by how the brain works, how we think, store memories, conciousness as a whole. As I started to use AI more as a tool in my workflows, I wanted to better understand and visualize how it remembers things, I wanted to see what it would look like if I put my agent's brains in an MRI machine, and watch as the synapses fired, like lightning bolts in clouds.
So, I decided to try my hand at making it, admittedly heavily using Claude to generate it, and after several iterations, I want to publish it. What started as a visualizer ended up growing a full memory backend underneath — so it now does both: an indexed memory store your agent can write to and recall from, and the 3D brain dashboard that shows you what your agent is thinking. I hope you enjoy it as much as I do.
The best experience is to have the visualizer on a secondary monitor while using the plugin method like in Claude CLI, there are some configurations, so have fun with it.
The dashboard itself is dependency-free in the browser. Everything else is layered, so you only install the pieces you actually use. Docker is the convenience path, not a hard dependency — every component has a native install option, and the visualization runs end-to-end on the built-in mock engine with nothing more than Python + a browser.
| Component | Native requirement | Docker alternative | Required? |
|---|---|---|---|
SD Core + dashboard (single Go binary; SD Core serves index.html + assets at port 9911) |
Go ≥ 1.25 (go build produces a static binary, no runtime deps) and a modern browser (Chrome / Edge / Firefox / Safari, recent versions) |
synaptic-core container |
Required unless you only want the mock dashboard at :8765 (see below) |
Mock-only dashboard (python serve.py, no SD Core) |
Python 3.7+ and a modern browser | — (skip Docker entirely) | Optional, lower-fidelity. Brain runs on simulated activity; can't accept real adapter events. |
| Ollama (region classifier Tier 3 + thought bubbles) | Native install from https://ollama.com, then ollama pull llama3.2:3b |
synaptic-ollama-tier1 container |
Optional — falls back to keyword-only classification + pre-baked bubble pool |
| MCP adapter | Node.js ≥ 18 (run npm install in bridge/mcp-adapter/ once) |
— (always native) | Only if you wire an MCP-aware client |
| OTel adapter | Node.js ≥ 18 (bridge/otel-adapter/) |
— (always native) | Only if your runtime exports OpenTelemetry traces |
| Claude Code plugin | Nothing — Claude Code manages it via /plugin install |
— (always in-process) | Only if you use Claude Code |
| Python SDK | Python ≥ 3.9 (no third-party deps) | — | Only for custom integrations |
| TypeScript SDK | Node.js ≥ 18 / browser | — | Only for custom integrations |
Yes — fully. The minimal "no Docker, no anything" install is:
- Go 1.25+ →
cd bridge/core && go build -o sd-core . && ./sd-core --listen 127.0.0.1:9911 --data-dir ../..— that single binary serves the dashboard at/, the API at/event//events//bank/*, and the WebSocket at/ws. Openhttp://localhost:9911in your browser. - (Optional) Native Ollama for nicer classification + bubbles. Skip this and the dashboard still runs.
- (Optional)
npm installinbridge/mcp-adapter/if you want to wire an MCP client; the adapter itself is always run natively as a stdio child of your client.
If you don't want to install Go, you can still run just the dashboard on the mock event engine via python serve.py — see Option B in Quick Start. Brain runs on simulated activity; real adapter events can't reach it without SD Core.
Disk footprint, native install: SD Core binary ≈ 15 MB; repo + dashboard ≈ 30 MB; Ollama runtime ≈ 1 GB plus model weights (llama3.2:3b ≈ 2 GB, smaller models down to ≈ 400 MB). Docker stack equivalent is ≈ 4 GB total once images and volumes are populated.
Three steps from a clean machine: bring up the dashboard, plug in your AI client, verify the bridge is live. Total wall-clock time is about five minutes if Docker is already installed.
Hot-swap, no restart. As of v2.3.0b1, changing your Tier 2 / Tier 3 provider (Ollama ↔ AirLLM ↔ remote API) from the Config panel takes effect live —
PUT /settings/providers/{tier}rebuilds the tier from the freshly-saved config and atomically swaps it in, so in-flightChat()calls finish on the old provider and the next lookup sees the new one. The Save response carrieshot_swapped: true+active_provider: "..."so the UI confirms which model is wired in. Only.envchanges (e.g. rotatingSD_API_TOKEN) still requiredocker compose up -d coreto re-read the file.
The canonical install path uses the bundled installer to put the runtime in the per-user OS-standard data directory (%LOCALAPPDATA%\Synaptic on Windows, ~/Library/Application Support/Synaptic on macOS, ~/.local/share/synaptic on Linux). Updates and uninstalls run from the same script, so the source you downloaded becomes throwaway carrier and the install lives in a stable location.
# From the unzipped source tree (or this repo's Dev/Prod tree):
python tools/install_to_appdata.py
# Prints the resolved install path. cd into it for the next step.
cd "<install path>"
docker compose up
# Then open http://localhost:9911The installer copies only what the runtime needs (no node_modules/, no .venv/, no dev-only docs), generates a default env file, and writes _meta/ markers so future --update and --uninstall calls find the right target. User data (memories.json, synapses.json, thought_bubbles.json, env) is preserved across --update runs.
If you'd rather skip the AppData install and run from wherever you extracted (no relocation, no installer), Options A/B/C below all work standalone — just docker compose up from inside the source tree. You give up the canonical install location and the --update workflow, but it's a valid quick-start.
docker compose up
# Then open http://localhost:9911Brings up the default stack:
synaptic-coreon port 9911 — Go binary that serves the dashboard, hosts the API + WebSocket, runs the bubble generator, and persists memories. (Triple duty replaces the previous separate dashboard container.)synaptic-ollama-tier1on port 11434 — always-on local LLM for the Tier 1 (Encoder) workload. The model pull (llama3.2:3b, ~2 GB) is baked into the container's entrypoint and runs once on first launch.synaptic-ollama-tier2(profile-gated, port 11435) andsynaptic-airllm-tier2(profile-gated, port 11436) — Tier 2 (Nightly) services that only spin up when their compose profile is enabled in the Config UI.
No Python, no Node, no manual ollama pull — just Docker. Bank + per-tier Ollama models + AirLLM caches persist in named volumes across restarts. The dashboard works immediately even before the model finishes downloading; classification falls back to keyword-only and bubbles to the pre-baked pool until Ollama is ready.
If you already run Ollama on the host (port 11434 in use), Docker compose will fail to start synaptic-ollama-tier1. Either stop the host Ollama or comment out the ollama-tier1 service in docker-compose.yml and set SD_OLLAMA_URL=http://host.docker.internal:11434 (or your host LAN IP) on the core service.
To enable Bearer-token auth (recommended for any deployment exposed beyond localhost), drop a .env next to docker-compose.yml with SD_API_TOKEN=<token> (generate one with openssl rand -hex 24). See docs/REMOTE.md for the full remote-operation guide.
For lower-spec hardware (Raspberry Pi 4/5), swap the Tier 1 model to a smaller one:
SD_OLLAMA_TIER1_MODEL=llama3.2:1b docker compose upThe docker-compose.yml lists Pi-friendly options including qwen2.5:0.5b, tinyllama:1.1b, gemma2:2b, and phi3:mini.
python serve.py
# (Windows: double-click serve.bat. macOS/Linux: ./serve.sh)
# Dashboard opens at http://localhost:8765/index.htmlYou need a modern browser (Chrome, Edge, Firefox, Safari recent versions) and Python 3.7+. No npm install, no build step. The dashboard is a single index.html plus a few JSON data files in assets/. The brain runs on the built-in mock event engine — every UI feature works (themes, cognitive modes, MRI slice, regions panel, timeline scrubber, thought bubbles from the pre-baked pool) but real adapter events can't reach the dashboard without SD Core.
To see your real AI client drive the brain, use Option A or C instead. Or open the dashboard via Option B and then point it at a remote SD Core via the Config panel's Bridge section.
Why a server and not just double-click? Modern browsers block
fetch()fromfile://URLs for security. The bundledserve.pyruns Python's standard-library HTTP server in this folder — no external dependencies, ~20 lines of logic.
If you don't want Docker on this machine at all:
# SD Core (Go ≥ 1.25 required) serves both the API AND the dashboard at :9911.
cd bridge/core
go build -o sd-core .
./sd-core --listen 127.0.0.1:9911 --data-dir ../..
# Now open http://localhost:9911 in your browser.
# Optional second terminal — Ollama for classifier + bubbles
ollama serve &
ollama pull llama3.2:3bThe Go build produces a static binary (~15 MB, CGO disabled) — no runtime dependencies, runs anywhere. Cross-compile for distribution with GOOS=linux/darwin/windows GOARCH=amd64/arm64 go build.
If you skip Ollama, the dashboard falls back to keyword-only region classification and the pre-baked thought-bubble pool — everything still works, the bubbles just feel less personalized.
If you'd rather not install Go either, fall back to Option B above — just python serve.py runs the mock-only dashboard.
After any of A / B / C you have a working dashboard. The HUD shows MODEL: MOCK and the brain pulses with simulated activity. To see your real AI client drive the brain, do Step 2.
Pick whichever surface your tool exposes — they all land at SD Core on localhost:9911 and any number of them can run side-by-side. The full per-client reference (Claude Desktop, Cursor, Cline, Continue, Gemini CLI, Antigravity, OpenCode, Goose, Aider, …) is in docs/INTEGRATIONS.md. For wiring devices on a different network than the dashboard host (laptop on the road talking to a desktop at home), see docs/REMOTE.md — Cloudflare Tunnel + Bearer token (recommended) or Tailscale (private-mesh alternative).
If the AI you want to wire up is itself the one reading this README, point it at
docs/AGENT_INSTALL.md— it is the same content rewritten as a self-driving runbook so the agent can install Synaptic into its own client without a human in the loop.
Uses Claude Code's native hook surface, no MCP layer, no model-side prompting needed. From inside any Claude Code session:
/plugin marketplace add /abs/path/to/synaptic-<version>
/plugin install synaptic-claude-code@synaptic
Or, after publishing to GitHub:
/plugin marketplace add nomadsgalaxy/Synaptic-Disorder
/plugin install synaptic-claude-code@synaptic
Directory-marketplace path: point at the repo root, not the plugin subdirectory. Claude Code's directory marketplace discovers plugins by reading
.claude-plugin/marketplace.jsonat the path you give it, then scanning thesourcepaths listed there. For Synaptic, that file lives at the repo root and points at./bridge/claude-code-plugin.
- ✓ Correct:
/plugin marketplace add C:\path\to\synaptic-2.3.0b1- ✗ Incorrect:
/plugin marketplace add C:\path\to\synaptic-2.3.0b1\bridge\claude-code-pluginIf you accidentally point at the plugin subdirectory, the install will fail with "plugin not found in marketplace". The nested.claude-plugin/plugin.jsonis fine where it is — don't move it; Claude Code expects to read it from there.
Tool calls flash motor cortex, prompts hit Wernicke's, responses hit Broca's, errors fire the amygdala. The plugin never blocks the host session — every hook exits within ~1.2 s regardless of whether SD Core is reachable. Full reference: bridge/claude-code-plugin/README.md.
The plugin defaults to localhost:9911. To point at a tunneled SD Core (e.g. https://cognito.example.com), set SD_CORE_URL and SD_API_TOKEN in the plugin's mcpServers env block — see bridge/claude-code-plugin/README.md. The plugin works without Docker installed on the client machine: it's pure forwarding to whatever SD Core URL you give it.
Works with anything that speaks Model Context Protocol. Two MCP tools are exposed: report_event (any v1.0 event) and report_memory_save (memory_added wrapper).
First install the adapter once:
cd bridge/mcp-adapter && npm installThen add to your client's mcpServers config:
{
"mcpServers": {
"synaptic-disorder": {
"command": "node",
"args": ["/abs/path/to/synaptic-disorder/bridge/mcp-adapter/index.js"],
"env": {
"SD_CLIENT": "claude-desktop",
"SD_MODEL": "claude-opus-4-7"
}
}
}
}Config file location per client:
| Client | Config path |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
| Claude Desktop (Linux) | ~/.config/Claude/claude_desktop_config.json |
| Cursor | Settings → MCP → Add new server |
| Cline | VS Code Cline panel → ⚙️ → MCP Servers → Edit JSON |
| Continue | ~/.continue/config.json |
| Gemini CLI | ~/.gemini/mcp_servers.json |
| Goose | ~/.config/goose/config.yaml |
| OpenCode | ~/.opencode/config.json |
Restart the client after editing. Set SD_CLIENT to a label that matches your client (e.g. cursor, cline) so the multi-session HUD distinguishes parallel agents. Adapter reference: bridge/mcp-adapter/README.md.
Anything with an OpenInference or GenAI semantic-conventions instrumentation works — opentelemetry-instrumentation-anthropic, opentelemetry-instrumentation-openai-v2, OpenInference for LangChain / LlamaIndex / AutoGen / CrewAI, etc. It's also the only path that surfaces token-level streaming.
cd bridge/otel-adapter && npm install && node index.js
# Receiver listening on http://127.0.0.1:4318/v1/tracesThen point your app's OTLP exporter at http://localhost:4318. Span-kind to event-type mapping (LLM → broca, RETRIEVER → hippocampus, TOOL → motor cortex, AGENT → prefrontal cortex) is in bridge/otel-adapter/README.md.
For your own agent loop, an in-house framework, or a tool plugin emitting from inside its own process. Two-line wire-up:
# pip install synaptic
import synaptic as sd
with sd.connect(adapter_id="my-tool", model="claude-opus-4-7") as c:
c.emit("tool_call", {"tool_name": "bash"}, region_hint="motor_cortex")// npm install @synaptic/sdk
import { connect } from "@synaptic/sdk";
const c = connect({ adapterId: "my-tool", model: "claude-opus-4-7" });
await c.emit(
"tool_call",
{ tool_name: "bash" },
{ regionHint: "motor_cortex" },
);Both SDKs validate against the v1.0 event schema, auto-emit session_start / session_end, and are fire-and-forget over a 1.5 s timeout. SDK references: bridge/sdk/python/README.md and bridge/sdk/typescript/README.md.
If your agent saves memories (via report_memory_save, the SDK, or any memory provider feeding assets/memories.json), the tags you attach decide which brain region the neuron lives in and which other neurons it forms synapses with. Read docs/MEMORY_AUTHORING_GUIDE.md before integrating — untagged memories produce orphan neurons floating disconnected from the rest of the brain.
curl http://localhost:9911/healthz # SD Core up?
curl 'http://localhost:9911/events?limit=5' | jq '.events[].type' # Events arriving?The dashboard's HUD model line flips from MODEL: MOCK to MODEL: <your-model> · BRIDGE LIVE once at least one adapter is firing. Multiple concurrent clients show up as MODELS: claude-opus-4-7 (12) · gpt-5 (3) — the SessionTracker tops by recent event count and times sessions out after ~60 s of silence.
If the dashboard never flips out of MOCK, see the Troubleshooting section of docs/INTEGRATIONS.md.
A fresh install ships with no memories — assets/memories.json and assets/synapses.json don't exist in the public release at all. SD Core auto-creates empty stubs on first start, so the dashboard launches with an empty brain (voxels visible, no neurons yet). This is normal and intentional: the project doesn't ship anyone else's memory data, and your brain should be your own.
Two paths to populate it:
-
Connect a memory provider —
tools/memory_providers/ships with three providers: Hindsight (backup file or live MCP), JSON file, and Markdown folder. Pick the one matching where your memories already live, run it, and it writesassets/memories.jsonwith proper tags. The dashboard picks up the changes via the file watcher. -
Have an AI agent populate via
report_memory_save— the MCP adapter exposes areport_memory_save(text, tags, …)tool. Any AI you've connected (Claude Desktop, Cursor, Cline, etc.) can call it, and a fresh neuron lights up in the right anatomical region with synapses to whatever shares its tags.
Read docs/MEMORY_AUTHORING_GUIDE.md before populating either way. Tags decide where a memory's neuron lives and which other neurons it connects to via synapses. Untagged memories produce orphan neurons floating disconnected from the rest of the brain. Five minutes with the guide saves you a hairball-shaped brain.
Optional: run python tools/seed_with_example.py to populate the brain with the synthetic example dataset (168 memories across all 14 regions, ~857 synapses). Useful for screenshots, demos, or just seeing what a "loaded brain" looks like before wiring up your real data.
The seed is self-disposing: it carries a synthetic: true flag, and SD Core auto-wipes it the moment your first real adapter fires a memory_added event. The brain transitions cleanly from demo data to your own activity with no manual cleanup.
A slowly-rotating 3D brain built from ~80,000 Allen Atlas voxels. Each glowing point is one of your memories, placed in the anatomical region whose function matches the memory's content (visual cortex for web/UI work, motor cortex for tool execution, hippocampus for memory consolidation, etc.). Synapses are real tubes routed through brain tissue and thicken with use over time (Hebbian learning). The HUD shows scan readouts, an EEG-style activity graph, the event log, live neurogenesis counters, brain age, and the strongest pathways your brain has built up.
When SD Core is reachable, real activity from your AI clients fires regions in real time — visual cortex flashes when Claude takes a screenshot, motor cortex flares on a tool call, the amygdala goes red on errors. When events fire, synapse pulses travel along the connecting tubes from the firing neuron toward its neighbors. Thought bubbles spawn from individual neurons (which activate when their thought surfaces) and Ollama generates new bubbles every ~30 s conditioned on your active cognitive modes, recent events, and a sample of your real memories — so the bubbles read like THIS brain thinking, not stock GPT.
A timeline scrubber at the bottom of the viewport lets you drag back to the earliest memory and watch the brain develop neuron-by-neuron — the marching-cubes brain surface visibly shrinks and grows with the visible set.
If memories in your brain are missing embeddings or deep encoding (common after importing a backlog or switching Tier 2 models), the Deep encoding card surfaces a single Backfill memories · N embed + M encode CTA. One click runs /admin/embed-all first to fill any missing embeddings so Phase 1 dedup can stop skipping, then chains into /admin/deep-encode-all for Phase 0b enrichment. Two stacked progress bars track each phase in real time via the embed_backfill_progress / deep_encode_backfill_progress WS events.
| Symptom | Likely cause | Fix |
|---|---|---|
/plugin install synaptic-claude-code@synaptic → "plugin not found in marketplace 'synaptic'" |
Marketplace path points at bridge/claude-code-plugin instead of the repo root |
Re-run /plugin marketplace add with the path to the unzipped root (synaptic-<version>/) — the directory that contains .claude-plugin/marketplace.json |
| Plugin installed but hooks not firing | forward.js can't find its peer files |
Don't move files around inside bridge/claude-code-plugin/. The plugin expects its original layout and resolves ${CLAUDE_PLUGIN_ROOT}/../mcp-adapter/index.js from the plugin dir |
Dashboard 404s on GET / after a Profile Enable in the Services panel |
Compose-helper bug (.env not read, or wrong project-dir bind) — fixed in 2.1.2b1 |
Update to ≥ 2.1.2b1 and rerun. If still 404, cd "<install>"; docker compose up -d --build from a host shell to bypass the helper |
Dashboard HUD says MODEL: MOCK after wiring an adapter |
Adapter isn't reaching SD Core | Check curl -fsS http://localhost:9911/healthz (Bearer-token form if auth enabled); adapter logs (docker compose logs -f core); confirm SD_CORE_URL + SD_API_TOKEN env vars are set in the adapter's config |
| Remote MCP adapter (Cloudflare Tunnel) returns 401 | Bearer token mismatch | Token in adapter's SD_API_TOKEN must equal SD_API_TOKEN in SD Core's .env. Tokens are case-sensitive and the full string (no trailing newlines) |
external volume "synaptic-disorder-bank" not found on fresh install |
Stale 2.0.1b1 ZIP (compose volume was external) | Use 2.0.2b1 or newer. The volume is compose-managed in current releases |
On viewports ≤ 900 px CSS pixels, the dashboard reflows automatically: brain canvas takes the top 50 vh, all HUD blocks + chip switchers stack into a scrollable bottom panel, the timeline pins to the seam between brain and panel, and the side panels (theme/modes/regions/etc.) open into the bottom half so you can see the brain react live as you toggle settings.
- Subject name — click
SUBJECT: SUBJECT-01in the HUD to rename your subject (persists inlocalStorage). - Themes — 13 built-ins (Medical, Tron, Matrix, CRT Amber, Bioluminescent, Blueprint, Solar Flare, Clinical Light, Research Print, Dark Hex, Dark Hex Pro, Light Hex, Light Hex Pro) plus a full custom-theme editor with JSON import/export.
- Cognitive modes — 10 stackable opt-in modes (The Voices, The Tism, ADHD, Synesthesia, Pattern Seeker, Stim Mode, Time Blindness, Hyperempathy, Special Interest, Sensory-Soothing). Every one of the 1024 possible combinations gets a unique fun name (45 hand-curated pairs like
AuDHD,Cozy Mode,Internal Council; the rest generated deterministically as evocative 2- or 3-word names likeFrantic SpiralorTender Wrapped Hourglass). - MRI slice — Off / Horizontal / Sagittal / Coronal with auto-flip.
- Render panel — live tuning of voxel/sphere/synapse/brain mesh appearance.
- Regions sidebar — sortable list of all 14 anatomical regions with real-anatomy + dashboard-mapping descriptions and per-region memory drill-down.
The dashboard runs fine cross-machine: your dashboard host hosts SD Core + the dashboard, your client machine runs an adapter that forwards events from any network. Two transport options — Cloudflare Tunnel + Bearer token (recommended; works from anywhere, optional SSO via Cloudflare Access) and Tailscale (private mesh; no public hostname). Step-by-step setup for both, plus the dashboard's runtime URL+token Config panel and one-token-fits-all-machines convention, is in docs/REMOTE.md.
The dashboard uses the same code path locally and remotely — point a browser at the URL, it figures out same-origin vs configured-elsewhere automatically. Once a real adapter event arrives over the bridge, the mock engine is locked out for the rest of the session so the dashboard never misleads you with simulated activity in front of real activity.
Two pluggable layers, both ports-and-adapters.
Live activity (real-time, push-based) — adapters emit events to SD Core (bridge/core/, Go single static binary on port 9911). SD Core fan-outs to dashboards via WebSocket and persists memory_added events to a SQLite fallback bank (/bank/* HTTP endpoints).
Shipped adapters:
bridge/claude-code-plugin— Claude Code plugin via marketplace; HTTP hooks forSessionStart/End,UserPromptSubmit,PreToolUse,PostToolUse,PostToolUseFailure,SubagentStop,Stop. Zero-dep Node forwarder, never blocks the host session.bridge/mcp-adapter— universal MCP server withreport_eventandreport_memory_savetools; works with Claude Desktop, Cursor, Cline, Continue, Gemini CLI, Claude Code.bridge/otel-adapter— OTLP/HTTP receiver on port 4318 (JSON + Protobuf) that translates OpenTelemetry traces fromopentelemetry-instrumentation-anthropic,opentelemetry-instrumentation-openai-v2, and OpenInference (LangChain, LlamaIndex, AutoGen, CrewAI, etc.) into Synaptic events.bridge/sdk— dual-language adapter SDK (Pythonsynaptic-disorder+ TypeScript@synaptic/sdk) for anything custom.
Memory state (slow loop, persistent) — memory providers translate any backing store into a normalized memory schema. v1 ships with JSON file, Markdown folder, MCP-AI-reported (with the SQLite fallback bank), and a backup-file importer for migrating from other memory tools.
Region classifier is a layered cascade in tools/classifier.py (build-time, runs Ollama Tier 3) plus a runtime mirror in the dashboard for live memory_added events (Tier 1 tag patterns → Tier 2 keyword scan; falls back to frontal_lobe).
See docs/event-schema.md and docs/memory-schema.md for the full contracts.
Synaptic uses a small local LLM via Ollama for two jobs:
- Region classifier — Tier 3 (shipped). The build pipeline (
tools/classifier.py) walks each memory through a tag-pattern → keyword-scan → LLM cascade. Cache is content-hashed. - Thought-bubble generator (shipped, runtime). The dashboard asks Ollama for one new phrase every ~30 s, conditioned on (a) the user's active cognitive modes, (b) the recent event stream, (c) 3 random memories sampled from your bank — and only adds it to the persistent pool if a second Ollama call says it's not too similar to existing entries. Phrases are seeded with rotating "flavors" (sudden questions, weird memories, cravings, hyperfixations, intrusive worries, etc.) so the bubbles feel idiosyncratic rather than generic.
Both fail gracefully when Ollama is offline. The Docker stack pulls and serves Ollama for you; for native install:
ollama pull llama3.2:3b # 2 GBAs of v2.3.0b1, SD Core auto-sizes Ollama's num_ctx per request — estimated prompt tokens + completion budget, rounded up to the next power-of-two (floor 2 KB, ceiling 16 KB). Heavy nightly prompts (dream-entry, Phase 0b enrichment) get the headroom they need; lightweight Tier 1 calls keep their small windows. Without this, Ollama's default 2048-token window silently truncated long prompts mid-word.
Earlier in development I tried capturing live data with a man-in-the-middle proxy for stubborn agents like Gemini that lack a plugin surface. I cannot recommend setting up an intentional MITM proxy just for a novelty dashboard — it requires installing a system-wide root certificate that exposes all your traffic. The adapter approach above is dramatically less invasive.
Synaptic Disorder/
├── docker-compose.yml Release-mode stack (core + per-tier ollama + AirLLM Tier 2 sidecar)
├── .claude-plugin/marketplace.json Claude Code plugin marketplace manifest
├── index.html The dashboard. Single file.
├── serve.py / serve.bat / .sh Local launcher.
├── assets/
│ ├── voxels.json ~80k Allen Atlas voxels (auto-generated)
│ ├── memories.json Memories on voxels (auto-generated; PERSONAL DATA)
│ ├── synapses.json Computed shared-tag paths through voxels
│ └── anatomy.json 14 region definitions (centers, radii, tag patterns)
├── docs/
│ ├── INTEGRATIONS.md Per-client wiring (Claude Desktop, Cursor, Cline, …)
│ ├── REMOTE.md Cloudflare Tunnel + Tailscale paths for cross-machine setup
│ ├── MEMORY_AUTHORING_GUIDE.md How to tag memories so they land in the right region
│ ├── data_privacy.md What data exists, where it lives, where it travels
│ ├── event-schema.md Live activity event contract (v1.0)
│ ├── event.schema.json
│ ├── memory-schema.md Memory record contract (v1.0)
│ ├── memory.schema.json
│ ├── CREDITS.md Third-party attribution (Allen Atlas, Three.js, etc.)
│ ├── AGENT_INSTALL.md Install runbook written for AI agents to self-drive
│ └── BETA_UPGRADE.md Upgrade runbook for existing beta installs
├── tools/
│ ├── install/ Installer scripts
│ ├── install_to_appdata.py Copy runtime config to AppData/Local/Synaptic
│ ├── seed_with_example.py Opt-in synthetic example dataset
│ └── memory_providers/ Per-provider scripts that produce memories.json
└── bridge/
├── core/ SD Core (Go binary; serves dashboard, API, WS, bubble gen)
├── claude-code-plugin/ Claude Code hooks adapter
├── mcp-adapter/ Universal MCP server adapter
├── otel-adapter/ OpenTelemetry OTLP/HTTP receiver
└── sdk/
├── python/ synaptic-disorder package
└── typescript/ @synaptic/sdk package
- Phase 1 (complete) — dashboard with mock events, themes, panels, Hebbian synapses, thought bubbles, voxel-based brain
- Phase 2 (complete) — SD Core, three primary adapters (Claude Code / MCP / OTel), Adapter SDK, three memory providers, SQLite fallback bank, Ollama bundle in Docker
- Phase 3 (complete) — timeline scrubber, synapse pulse animation, layered classifier (tag/keyword/Ollama), runtime classifier, mobile layout, multi-agent session tracker, customizable subject, every-combo-named cognitive modes, Ollama-driven quirky thought bubbles
- Phase 4 (in progress) — release-mode build (D1 ✅ — Prod ships without user data; SD Core auto-creates empty on first run), synthetic example dataset (D2 ✅ — fully randomized 168-memory seed for Pages + opt-in via
seed_with_example.py), final docs/credits pass (D3 ✅), portable ZIP + start scripts (D4 partial ✅; native Windows.exe/ macOS.dmg/ Linux.deb/.rpmstill pending — design atdocs/dev/INSTALL_DESIGN.md), public demo (D5 — GitHub Pages workflow ready, one manual trigger away from live), one-page docs site (D6 ✅ —docs/site/index.html) - Phase 5 — Memory cognition (in progress) — purpose-built embed model (P ✅), hybrid BM25+cosine retrieval (J ✅), inline auto-dedup (K ✅), dormant-memory lifecycle (L ✅), cross-encoder rerank with dynamic scaling (✅), keyword-rewrite multi-probe retrieval (✅);
sd_linklexicon-link MCP tool (M) and entity resolution (N) still in flight. Seedocs/WHAT_SYNAPTIC_IS.mdfor the design philosophy. - Polish — A4 stencil-buffer cap-fill for sliced spheres remains as the only Track-A item not yet shipped (low priority)
Default mode is localhost-only — nothing leaves your machine. SD Core binds to 127.0.0.1, Ollama runs locally, no analytics, no phone-home. The one unavoidable third-party network call is the dashboard fetching Three.js from cdnjs.cloudflare.com; self-hosting alternative documented in docs/data_privacy.md. When you opt into remote operation (Cloudflare Tunnel or Tailscale), the privacy doc walks through exactly what each transport can see and log.
docs/data_privacy.md is the precise reference: what data exists, where it lives on disk and in volumes, where it travels, what's NOT collected, and your controls (env flags to disable bubble gen, wipe the bank, clear localStorage, self-host CDN assets, etc.).
See docs/CREDITS.md for the full attribution detail.
In short:
- Anatomical atlas — Allen Human Reference Atlas – 3D, 2020, © 2019 Allen Institute for Brain Science, RRID:SCR017764, CC BY 4.0. Dataset citation: Ding et al. (2020); structure ontology citation: Ding et al. (2016), _J. Comp. Neurol. DOI 10.1002/cne.24080.
- Three.js — MIT.
- Ollama —
ollama/ollamaDocker image (MIT). - Inspiration — Neurotorium's Brain Atlas and the BrainMinds 3D Atlas Viewer.
Synaptic is released under the Open Community License v1.1 + Software Attribution v1 (OCL v1.1 + SWAtt v1).
See LICENSE and LICENSE-SWAtt.md for the full terms.
Derivatives must retain visible attribution ("built on Synaptic") in their UI and source per SWAtt v1.