Synapse Architecture
How Synapse is built — Fastify, PostgreSQL, FTS5, embeddings, MCP server.
Synapse Architecture
Synapse is a multi-tenant memory API built on Fastify, PostgreSQL with FTS5, and an optional embeddings service for semantic search.
High-Level Architecture
┌──────────────────────────────────────────────────────────┐
│ Clients │
├──────────────┬──────────────┬──────────────┬─────────────┤
│ LLM Agents │ Web Browsers│ MCP Clients │ Webhooks │
│ (curl/SDK) │ (humans) │ (Claude/etc) │ (external) │
└──────┬───────┴──────┬───────┴──────┬───────┴──────┬──────┘
│ │ │ │
└──────────────┴──────────────┴──────────────┘
│
▼
┌───────────────────────────────┐
│ Synapse API (Fastify) │
│ port 12800 │
│ - REST endpoints │
│ - Auth (Mind Key / JWT) │
│ - Rate limiting │
│ - Static file serving │
└───────────────┬───────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ PostgreSQL │ │ Embeddings │ │ MCP Server │
│ + FTS5 │ │ Service │ │ (separate) │
│ │ │ (optional) │ │ port 13100 │
│ - memories │ │ │ │ │
│ - tasks │ │ - generate │ │ - 79 tools │
│ - chat │ │ embeddings│ │ - stdio/SSE │
│ - scripts │ │ │ │ - WebSocket │
└─────────────┘ └─────────────┘ └─────────────┘Core Components
1. Synapse API (Fastify)
The main HTTP server. Handles:
- REST endpoints (
/memory,/chat,/mind/tasks, etc.) - Authentication (Mind Key for agents, JWT for humans)
- Rate limiting (
?key=auth only) - Static file serving (web UI at
/human,/docs, etc.) - Webhook dispatch
Built with Fastify 5 for performance. Runs on port 12800 in production.
2. PostgreSQL with FTS5
The primary data store. Uses PostgreSQL with the FTS5 extension for full-text search.
Key tables:
| Table | Purpose |
|---|---|
users |
User accounts |
minds |
Mind scopes (each has a Mind Key) |
memories |
Memory records with FTS5 virtual table |
tasks |
Task management |
chat_messages |
Chat history |
scripts |
Persistent scripts |
webhooks |
Webhook registrations |
cron_jobs |
Scheduled tasks |
variables |
Key-value store |
audit_log |
Audit trail |
FTS5 enables sub-millisecond full-text search across all memory content. See FTS5 Search for details.
3. Embeddings Service (Optional)
For semantic search, Synapse generates vector embeddings of memory content. These are stored alongside memories and used for similarity search.
- Provider: configurable (OpenAI, local model, etc.)
- Stored as
vectorcolumn inmemoriestable - Used by
/memory/semantic-searchendpoint - See Semantic Search
4. MCP Server (Separate Service)
The Synapse MCP server runs as a separate process (port 13100). It:
- Exposes 79 tools via Model Context Protocol
- Supports stdio, HTTP/SSE, and WebSocket transports
- Translates MCP tool calls into Synapse API calls
- Multi-tenant: one Mind Key per session
5. Browser Proxy (Separate Service)
For browser automation, a separate Playwright-based service runs on port 13000.
The MCP server can call this for browser_* tools.
6. SSH Proxy (Separate Service)
For SSH-based remote commands, a separate service runs on port 12900.
Multi-Tenancy Model
User Account (email + password)
│
├── Mind 1 (Mind Key 1)
│ ├── Memories
│ ├── Tasks
│ ├── Chat
│ └── Scripts
│
├── Mind 2 (Mind Key 2)
│ └── ... (isolated from Mind 1)
│
└── Mind 3 (Mind Key 3)
└── ...Each mind is fully isolated. Mind Keys grant access to exactly one mind. JWTs grant access to the user account (for managing minds).
See Multi-Tenancy for details.
Request Flow
Memory Store Request
1. Client sends POST /memory with Authorization: Bearer mk_xxx
2. Fastify receives request
3. Auth middleware validates Mind Key, attaches mind_id to request
4. Memory route handler:
a. Validate JSON body (zod schema)
b. Insert into memories table
c. Update FTS5 index
d. (Async) Generate embedding if embeddings enabled
e. Trigger webhooks for memory.store event
5. Return { id, status: "stored" }Memory Search Request
1. Client sends GET /memory/search?q=docker
2. Auth middleware validates Mind Key
3. Memory route handler:
a. Parse query (FTS5 syntax)
b. Execute FTS5 MATCH against memories table
c. Filter by mind_id (tenant isolation)
d. Rank by relevance
e. Return resultsDeployment
Synapse is deployed as a Docker container. See docker-compose.yml:
services:
synapse:
image: registry.gitlab.com/schaefer-services/synapse:latest
ports:
- "12800:12800"
environment:
- DATABASE_URL=postgres://...
- JWT_SECRET=...
- SYNAPSE_HOST=0.0.0.0
- SYNAPSE_PORT=12800
depends_on:
- postgres
postgres:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_DB=synapse
- POSTGRES_PASSWORD=...Performance Characteristics
| Operation | Latency | Throughput |
|---|---|---|
| Memory store | ~5ms | 1000+ req/s |
| Memory recall | ~20ms | 500 req/s |
| FTS5 search | ~10ms | 800 req/s |
| Semantic search | ~50ms | 200 req/s |
| Chat poll | ~5ms | 2000 req/s |