hexis
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hexissearch my notes for the YAML colon issue before we start"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
CortHeXis
A memory for AI agents that reads itself back.
Your agents forget between sessions, and they do not fail loudly when they do: they just know less, and you blame the model. CortHeXis keeps a folder of short notes — one fact each, plain markdown you own — and puts the right ones in front of the agent at every message, in any language. Then it does the part nobody does: every hour it re-reads the whole memory and tells you what went wrong — a server no session can reach, links to notes that no longer exist, a fact corrected in one place and not the other, a project still "in progress" two months later, a key pasted into a note — and proposes the repair, which is only written once you approve it.
Recall at every turn. A hook adds the relevant notes to each message, and to every sub-agent's prompt (a sub-agent otherwise starts with no memory at all). Over MCP, agents can also search (
memory_search) and read (memory_get) on their own.Hybrid, cross-lingual search. Meaning and keywords together; a French question finds an English note. Every result carries its age and where that date comes from.
A memory that checks itself. Health score, findings with their remedy, history, daily digest to your webhook, repairs with a diff and an approval.
Measured, on your notes. A recall bench built from your own questions and sessions, with every run kept and regressions flagged — and a public bench on the demo corpus that anyone can rerun.
Yours. Apache-2.0, self-hosted, no account. The notes are files; the index is derived from them and can be rebuilt at any time.
Built by Ninabot · corthexis.com · live demo on a fictional corpus: demo.corthexis.com

Quick start
Docker with Compose 2.20 or later, ~2 GB of RAM, 4 cores.
git clone https://github.com/ninabot-ch/corthexis && cd corthexis
./setup.sh # token, your notes folder, the model licence question
docker compose up -d # → http://localhost:8420./setup.sh writes .env (a random CORTHEXIS_TOKEN, the notes folder, your uid), builds
the image and asks which embedding model to use (see Licences). Without an
argument it points at examples/agent-memory; give it your folder:
./setup.sh ~/.claude/projects/<project-slug>/memory (where Claude Code keeps its memory)
or any folder of markdown notes. Unattended: CORTHEXIS_ACCEPT_GEMMA_TERMS=1|0 ./setup.sh DIR.
Open http://localhost:8420 and paste the token (grep CORTHEXIS_TOKEN .env). The first
indexing takes a few seconds per note on a CPU; the graph fills as it goes.
Related MCP server: memory-vault
Connect your agent
MCP (any MCP client; Claude Code shown):
claude mcp add -s user --transport http corthexis http://localhost:8420/mcp \
--header "Authorization: Bearer $(sed -n 's/^CORTHEXIS_TOKEN=//p' .env)"-s user matters: a server declared in one project only is missing from every session
started elsewhere — the most common way a memory silently disappears.
Recall at every message (Claude Code hooks, standard library only, nothing to install):
python3 corthexis/hook.py install # ~/.claude/settings.json — every session
python3 corthexis/hook.py install --scope local --project-dir ~/my-project # one project
python3 corthexis/hook.py uninstall # removes only its own entriesIt installs a UserPromptSubmit hook and a PreToolUse hook on Task|Agent, reads the
token from ./.env and keeps it in ~/.config/corthexis/ (mode 600). The block it adds is
framed as data, not instructions — notes are written by agents, and a note may carry an
order. Notes already given in a session are not given again.
Without HTTP: pip install . then claude mcp add -s user corthexis -- corthexis mcp
with CORTHEXIS_DATABASE_URL and CORTHEXIS_EMBED_URLS in its environment (stdio).
Projects and levels
A memory is one project and every note is at the default level until you say otherwise; nothing above changes a standalone install. When several teams share one memory:
one notes folder = one project (
CORTHEXIS_MEMORY_PROJECT=radioon that folder's indexer); names, links and history are per project, and a project namedsharedis readable next to one's own;a note's frontmatter may carry
classification: confidential— five levels,public<team<project(default) <confidential<restricted; an unknown value isrestricted, an edit of the file never lowers a level;CORTHEXIS_RECALL_PROJECTS=radio,shared@1gives a process (the recall hook, the MCP server, the CLI) its scope: the notes ofradioup toproject, ofsharedup toteam. The scope holds at every stage of the search and for a note quoted by name; every scoped read is in the access log (note_access).
CHANGELOG 2.1.0 has the whole of it; SCHEMA.md the field.
The dashboard
Graph | notes as neurons, |
Recall | the same search as the agents', with scores and excerpts. |
Health | score 0-100 and its history, findings grouped by severity with the remedy and the notes concerned, open problems and mean time to fix. |
Repairs | relink, merge, rename, close a dormant project: each is a proposal with the full diff; approve to write (a copy of what is overwritten is kept, and a note edited in between makes the repair refuse itself). |
Bench | hit@1, hit@5, MRR on your own questions; add questions, run it, see regressions. |
Pulse | freshness, types, families, the model and servers in use, the licence. |
English and French (?lang=fr, CORTHEXIS_UI_LANG). Reading needs the token unless
CORTHEXIS_DASHBOARD_PUBLIC=1; writing always does. The port is bound to loopback: to
share it, put your own access proxy in front.
What the review checks
Each check is a failure that happened in production before it was written down:
Theme | Checks |
chain | the MCP server answers when started the way a session starts it; embedding and reranking servers up; the indexer keeps up; the index is in sync with the files |
structure | unreadable header, no description, no type, file outside the naming convention, very long notes |
graph |
|
dates | notes without a date, reconstructed dates, a whole folder rewritten at once |
drift | dormant projects still open, a description corrected but not the body, near duplicates |
security | key-shaped strings (kind and line only, never the value), text giving orders to the agent |
recall | regressions of the bench |
Notifications: CORTHEXIS_NOTIFY_WEBHOOKS (JSON, or slack+, discord+, ntfy+,
mattermost+, teams+ prefixed URLs) and/or CORTHEXIS_NOTIFY_CMD (a command fed the
message). One digest a day when the findings changed (CORTHEXIS_REVIEW_DIGEST_AT), at once
on a new critical problem. Test: docker compose exec corthexis corthexis notify-test.
From the sessions' side (is the server declared in the agent's configuration, is the hook
installed?) run corthexis review --chain on the agent's machine — systemd/ has a timer.
Profiles
Profile | Embedding | Reranker | For | Query p50 | MRR |
| EmbeddingGemma-300m Q8, CPU | — | 4 cores, 4 GB | 53 ms | 0.82 |
| same, CPU | bge-reranker-v2-m3, background only | ≥ 8 cores, ≥ 16 GB | 35 ms | 0.82 (0.84 reranked) |
| same, GPU | Qwen3-Reranker-0.6B, every search | a GPU with ≥ 4 GB | 13 ms | 0.88 |
Figures: memory bench of 03.10.2026 (300 questions in French, English and German over a real
corpus, hybrid search; GPU pass on an Intel Arc Pro B60). On the same bench the 1.x model,
MiniLM, scored 0.55 and the MIT fallback, multilingual-e5-base, 0.74.
docker compose exec corthexis corthexis profile recommends one for the machine.
# GPU, Intel Arc (SYCL) or NVIDIA (CUDA, needs the NVIDIA Container Toolkit)
echo CORTHEXIS_MEMORY_PROFILE=gpu >> .env
docker compose -f docker-compose.yml -f docker/compose.gpu-intel.yml --profile rerank up -d
docker compose -f docker-compose.yml -f docker/compose.gpu-nvidia.yml --profile rerank up -dApple GPU: Docker has no Metal — run docker/embed/run.sh natively (LLAMA_SERVER=llama-server)
and set CORTHEXIS_EMBED_URLS. Several servers of the same model can be listed (GPU then CPU):
a server that fails is skipped for 30 s, and a server answering another dimension is refused
instead of polluting the index. Changing the embedding model builds a new index generation
next to the active one; searches use the old one (keywords only while the model differs) until
the new one is complete.
Docker hosts whose address pools are exhausted: add -f docker/compose.bridge.yml.
Licences
The code is Apache-2.0 (LICENSE). The dashboard ships d3 (ISC) and marked (MIT), see NOTICE. No model weights are shipped: they are downloaded on first run, pinned to a repository commit and checked against their SHA-256.
The default embedding model, EmbeddingGemma-300m (Google), is distributed under the
Gemma Terms of Use, which are not an open-source licence
(use restrictions apply). ./setup.sh shows their summary and asks; the decision is recorded
with the version of the terms, the date and who answered (licence.json in the models
volume). If you decline, or do not answer, CortHeXis runs multilingual-e5-base (MIT)
instead, with no loss of function — recall is a bit lower. Change your mind later:
docker compose run --rm corthexis-embed-fetch python /opt/corthexis/models.py setup --accept
docker compose restart corthexis-embed corthexis # the index is rebuilt with the new modelA machine without internet access: copy the GGUF file into the models volume (gguf/); it
is used if its hash matches. Mirror: CORTHEXIS_MODEL_BASE_URL.
Upgrading from CortHeXis 1.x
1.x kept a SQLite index next to the notes (MiniLM, CORTHEXIS_NOTES_DIR, CORTHEXIS_DB).
corthexis migrate carries it over without loss — archive first, every note and every date
checked before the switch, the old index left untouched for a rollback. See
docs/MIGRATION.md.
What is where
Everything shown on corthexis.com and on the demo runs from this repository.
This repository | SOKKAN 3.x | |
Engine: store, hybrid search, reranker, dates and provenance | ✓ | ✓ (same code) |
Recall at every turn and in sub-agents (Claude Code hook) | ✓ | ✓ in every session it starts |
MCP | ✓ | ✓ |
Review: score, findings, history, digest, repairs with approval | ✓ | ✓ CortHeXis tab |
Dashboard: graph, recall, health, bench | ✓ | ✓ CortHeXis tab |
Recall bench, gated profile/model switch | ✓ | ✓ + Magnitude memory card |
Migration from 1.x / SOKKAN 2.x | ✓ | ✓ automatic on upgrade |
Projects (one folder = one project, scoped recall) and five classification levels with audited recall | ✓ | ✓ projects, teams and clearances from SSO groups |
Agent cockpit: parallel sessions, approvals, board, terminals | — | ✓ |
CortHeXis alone if you want a memory for the agents you already run (Claude Code or
anything that speaks MCP). SOKKAN if you also want the cockpit that
runs those agents: its memory tab is CortHeXis, installed and wired for you, and its
projects, teams and clearances drive the scope of every recall. The
SOKKAN_* variable names are read as a fallback of the CORTHEXIS_* ones.
What we run ourselves that is not in this repository: our notes (see About the examples) and the 300 questions of the reference bench written on them (see bench/README.md).
Configuration
Every setting is a CORTHEXIS_* variable; .env.example lists the ones of the
Docker install, docs/ENGINE.md all of them (store, search, recall, review
thresholds, profiles, models). The command line (corthexis --help) is in the image:
docker compose exec corthexis corthexis status
docker compose exec corthexis corthexis search "how do we deploy?"
docker compose exec corthexis corthexis get deploy-runbook
docker compose exec corthexis corthexis review | head
docker compose exec corthexis corthexis eval add "how do we deploy?" deploy-runbookAbout the examples
examples/agent-memory/ holds eight engineering notes written for this repository — the
HTTP 202 trap, the browser profile lock, the YAML colon that silently kills recall — useful
to anyone and specific to no one. examples/mirabeau-conseil/ is the corpus of the public
demo: 38 notes of a fictional consulting firm, in French, with one broken link left on
purpose so that the review has something real to find.
Neither is a sample of the corpus CortHeXis was built on. That one is private — months of notes written while actually running a company, infrastructure and commercial detail in nearly every file — and a redacted copy would leak by its shape alone. The engine is real and it is all here; the proof that matters is what it does with your notes.
Development
python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/ruff check corthexis tests && .venv/bin/pytest -q
# the store, recall and dashboard tests need a Postgres with pgvector:
docker run -d --name cx-test-pg -p 127.0.0.1:55432:5432 -e POSTGRES_USER=cx \
-e POSTGRES_PASSWORD=test pgvector/pgvector:pg16
CORTHEXIS_TEST_PG_DSN=postgresql://cx:test@127.0.0.1:55432/postgres .venv/bin/pytest -qSCHEMA.md — the note format · docs/ENGINE.md — the engine · docs/DEMO.md — a public read-only showcase · bench/README.md — the recall benches · CHANGELOG.md
This server cannot be deployed
Maintenance
Related MCP Connectors
Hosted MCP memory for coding agents: persistent across sessions, editable markdown, team sharing.
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Cross-session memory for AI agents with a Source Receipt for every memory, over MCP.
Token-efficient MCP memory for Markdown vaults. Tiered search, GraphRAG, AI memories.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMarkdown-first long-term memory for AI coding agents, enabling hybrid search over local files via MCP tools.18Apache 2.0
- AlicenseAqualityBmaintenanceProvides cross-session persistent memory for coding agents via MCP tools to store, retrieve, and manage notes with hybrid keyword/semantic search and automatic deduplication.8387 npmMIT
- AlicenseAqualityBmaintenanceEnables coding agents to store, search, and retrieve long-term memory as plain Markdown files with a disposable SQLite index, including note management, decision/bug tracking, and codebase symbol lookup via MCP.8MIT
- AlicenseNot gradedqualityAmaintenanceGives coding agents a persistent memory by searching a local, read-only index of existing markdown and letting them write findings back as notes that the next session can retrieve. It serves ranked, context-sized results over MCP, injects standing conventions at session start, and keeps data on your machine with secret redaction and archive-only deletion.65 PyPIMIT