# GZOO Cortex

GZOO Cortex — Local-first knowledge graph for developers

**Local-first knowledge graph for developers.** Watches your project files, extracts entities and relationships using LLMs, and lets you query across all your projects in natural language. > “What architecture decisions have I made across projects?” > > Cortex finds decisions from your READMEs, TypeScript files, config files, > and conversation exports — then synthesizes an answer with source citations. ## Why You work on multiple projects. Decisions, patterns, and context are scattered across hundreds of files. You forget what you decided three months ago. You re-solve problems you already solved in another repo. Cortex watches your project directories, extracts knowledge automatically, and gives it back to you when you need it. ## What It Does - **Watches** your project files (md, ts, js, py, json, yaml) for changes - **Extracts** entities: decisions, patterns, components, dependencies, constraints, action items - **Infers** relationships between entities across projects - **Detects** contradictions when decisions conflict - **Queries** in natural language with source citations - **Searches semantically** — blends keyword and vector (embedding) similarity so queries match by meaning, not just keywords (optional; see [Semantic Search](#semantic-search-embeddings)) - **Routes** intelligently between cloud and local LLMs - **Respects** privacy — restricted projects never leave your machine - **Web dashboard** with knowledge graph visualization, live feed, and query explorer - **MCP server** for direct integration with Claude Code ## Quick Start ### 1. Install ```bash npm install -g @gzoo/cortex ``` If global install fails with `EACCES`, use a user prefix instead: ```bash mkdir -p ~/.local npm config set prefix ~/.local echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc npm install -g @gzoo/cortex ``` Or install from source: ```bash git clone https://github.com/gzoonet/cortex.git cd cortex npm install && npm run build && npm link ``` Verify: `cortex --version` (current release: **0.8.1**) ### 2. Setup Run the interactive wizard: ```bash cortex init cortex doctor # verify config, providers, and DB ``` This walks you through: - **LLM provider** — Anthropic, Google Gemini, DeepSeek, Groq, OpenRouter, or Ollama (local) - **API key** — saved securely to `~/.cortex/.env` - **Routing mode** — cloud-first, hybrid, local-first, or local-only - **Watch directories** — which directories Cortex should monitor - **Budget limit** — monthly LLM spend cap `cortex init` writes global config to `~/.cortex/cortex.config.json`. API keys go in `~/.cortex/.env`. ### 3. Register Projects ```bash cortex projects add my-app ~/projects/app cortex projects add api ~/projects/api cortex projects list # verify ``` ### 4. Ingest, Watch & Query **Backfill existing files first** — the watcher only picks up new changes: ```bash cortex ingest "~/projects/app/src/**/*.ts" # one-shot backfill cortex serve # dashboard + API + file watcher (recommended) ``` | Command | What it does | |---------|-------------| | `cortex serve` | Web dashboard + API + file watcher (`ignoreInitial` — no re-ingest on start) | | `cortex watch` | CLI-only file watcher (no dashboard) | | `cortex ingest` | One-shot ingestion; events do **not** appear in the Live Feed | > **Don't run `watch` and `serve` together** — they compete for file changes. > The Live Feed shows real-time events from `cortex serve` only (file saves while the server is running). ```bash cortex query "what caching strategies am I using?" cortex query "what decisions have I made about authentication?" cortex find "PostgreSQL" --expand 2 cortex contradictions ``` ### 5. Web Dashboard ```bash cortex serve # open http://localhost:3710 ``` Remote access: ```bash cortex serve --host 0.0.0.0 ``` Auth is enforced automatically on non-localhost hosts. A bearer token is auto-generated and saved to `~/.cortex/.env` (read it with `grep CORTEX_SERVER_AUTH_TOKEN ~/.cortex/.env`). Open the dashboard once with `http://:3710/?token=` — the token is embedded only for requests that already prove possession of it and is then kept for the browser tab (so anonymous visitors never receive it). API/WebSocket calls behind a reverse proxy use `Authorization: Bearer `. ### Excluding Files & Directories Cortex ignores `node_modules`, `dist`, `.git`, and other common directories by default. To add more: ```bash cortex config exclude add docs # exclude a directory cortex config exclude add "*.log" # exclude by pattern cortex config exclude list # see all excludes cortex config exclude remove docs # remove an exclude ``` ## How It Works Cortex runs a pipeline on every file change: 1. **Parse** — file content is chunked by a language-aware parser (tree-sitter for code, remark for markdown) 2. **Extract** — LLM identifies entities (decisions, components, patterns, etc.) 3. **Relate** — LLM infers relationships between new and existing entities 4. **Detect** — contradictions and duplicates are flagged automatically 5. **Store** — entities, relationships, and vectors go into SQLite + LanceDB 6. **Query** — natural language queries search the graph and synthesize answers All data stays local in `~/.cortex/`. Only LLM API calls leave your machine (and never for restricted projects). ## LLM Providers Cortex is **provider-agnostic**. It supports: - **Anthropic Claude** (Sonnet, Haiku) — via native Anthropic API - **Google Gemini** — via OpenAI-compatible API - **DeepSeek** (Reasoner, Chat) — strong reasoning, very affordable - **Groq** — fast inference with free tier - **Any OpenAI-compatible API** — OpenRouter, local proxies, etc. - **Ollama** (Mistral, Llama, etc.) — fully local, no cloud required Cost tracking uses provider-aware rates for DeepSeek, Gemini, Groq, and OpenRouter models — not a blanket Anthropic fallback. **Embeddings** (for semantic search) are configured as a *separate* provider — independent of your chat model — so you can run chat on DeepSeek and embeddings on OpenAI. See [Semantic Search](#semantic-search-embeddings). ### Routing Modes | Mode | Cloud Cost | Quality | Ollama Required | |------|-----------|---------|-----------------| | `cloud-first` | Varies by provider | Highest | No | | `hybrid` | Reduced | High | Yes | | `local-first` | Minimal | Good | Yes | | `local-only` | $0 | Good | Yes | In **cloud-first** mode, all tasks route to your cloud provider. Ollama is not required and is only used if budget fallback is enabled. Hybrid mode routes high-volume tasks (entity extraction, ranking) to Ollama and reasoning-heavy tasks (relationship inference, queries) to your cloud provider. ## Requirements - **Node.js** 20+ - **LLM API key** for cloud modes — Anthropic, Google Gemini, DeepSeek, Groq, or any OpenAI-compatible provider - **Ollama** — only for `hybrid`, `local-first`, or `local-only` modes ([install](https://ollama.ai/)) ## Configuration Config is layered — later sources override earlier ones: | Priority | Location | Scope | |----------|----------|-------| | 1 | Built-in defaults | Global | | 2 | `~/.cortex/cortex.config.json` | Global (created by `cortex init`) | | 3 | `./cortex.config.json` | Project overrides (optional) | | 4 | `CORTEX_*` env vars | Session | API keys are stored separately in `~/.cortex/.env` (never in config JSON). ```bash cortex config list # see all non-default settings cortex config set llm.mode hybrid # switch routing mode cortex config set llm.budget.monthlyLimitUsd 10 # set budget cortex config exclude add vendor # exclude a directory from watching cortex privacy set ~/clients restricted # mark directory as restricted cortex doctor # validate setup ``` Full configuration reference: [docs/configuration.md](docs/configuration.md) ### Semantic Search (Embeddings) Cortex blends keyword (full-text) search with **vector similarity**, so queries match by meaning rather than exact words. Embeddings are **optional and off by default** — enable them with a cloud embeddings provider (no local GPU or Ollama required): ```bash cortex config set llm.embeddings.enabled true cortex config set llm.embeddings.baseUrl https://api.openai.com/v1 cortex config set llm.embeddings.model text-embedding-3-small cortex config set llm.embeddings.apiKeySource env:OPENAI_API_KEY cortex config set llm.embeddings.dimensions 1536 # then add the key to ~/.cortex/.env: echo 'OPENAI_API_KEY=sk-...' >> ~/.cortex/.env ``` The embeddings provider is **independent of your chat provider** — run chat on DeepSeek (or Anthropic, Groq, …) and embeddings on OpenAI. Any OpenAI-compatible embeddings endpoint works. New files are embedded automatically as they're ingested. To build the index for a graph you **already** ingested, run a one-time reindex: ```bash cortex reindex # all projects cortex reindex my-app # a single project ``` ## Commands | Command | Description | |---------|-------------| | `cortex init` | Interactive setup wizard | | `cortex doctor` | Validate config, providers, projects, secrets, and database | | `cortex projects add/list/remove/show` | Manage registered projects | | `cortex serve` | Web dashboard + API + file watcher (port 3710) | | `cortex watch [project]` | CLI-only file watcher | | `cortex ingest ` | One-shot file ingestion (separate from Live Feed) | | `cortex reindex [project]` | Rebuild the semantic (embedding) search index for existing entities | | `cortex query ` | Natural language query with citations | | `cortex find ` | Find entities by name | | `cortex status` | Graph stats, costs, provider status | | `cortex costs` | Detailed cost breakdown | | `cortex contradictions` | List active contradictions | | `cortex resolve ` | Resolve a contradiction | | `cortex models list/pull/test/info` | Manage Ollama models | | `cortex mcp` | Start MCP server for Claude Code | | `cortex report` | Post-ingestion summary | | `cortex privacy set/list` | Set directory privacy | | `cortex config list/get/set/validate` | Read/write configuration | | `cortex config exclude add/remove/list` | Manage file/directory exclusions | | `cortex stop` / `cortex restart` | Manage running watch/serve processes | | `cortex db` | Database operations | Full CLI reference: [docs/cli-reference.md](docs/cli-reference.md) ## Web Dashboard Run `cortex serve` to open a full web dashboard at `http://localhost:3710` with: - **Dashboard Home** — graph stats, recent activity, entity type breakdown - **Knowledge Graph** — interactive D3-force graph with clustering, click to explore - **Live Feed** — real-time file change and entity extraction events via WebSocket (from `cortex serve` only) - **Query Explorer** — natural language queries with streaming responses - **Contradiction Resolver** — review and resolve conflicting decisions ### Remote Deployment For access beyond localhost, bind to all interfaces and put Cortex behind a reverse proxy: ```bash cortex serve --host 0.0.0.0 ``` Example nginx config — protect `/api/` and `/ws` with basic auth; serve static assets without auth (the dashboard injects the bearer token into HTML): ```nginx location /api/ { auth_basic "Cortex"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:3710; proxy_set_header Authorization "Bearer $CORTEX_TOKEN"; } location /ws { auth_basic "Cortex"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:3710; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location / { auth_basic off; proxy_pass http://127.0.0.1:3710; } ``` Set `CORTEX_SERVER_AUTH_TOKEN` or `server.auth.token` in config. When auth is enabled, Cortex injects the token into the dashboard HTML so API and WebSocket calls authenticate automatically. ## MCP Server (Claude Code Integration) Cortex includes an MCP server so Claude Code can query your knowledge graph directly: ```bash claude mcp add cortex --scope user -- npx @gzoo/cortex mcp ``` This gives Claude Code **12 tools**: | Tool | Description | |------|-------------| | `cortex_ask` | Natural language questions about your projects | | `get_status` | System status and graph stats | | `list_projects` | List registered projects | | `find_entity` | Look up entities by name | | `query_cortex` | Structured knowledge graph queries | | `get_contradictions` | List detected contradictions | | `resolve_contradiction` | Resolve a contradiction | | `search_entities` | Search entities with filters | | `ingest_file` | Trigger file ingestion | | `add_project` | Register a new project | | `remove_project` | Unregister a project | | `session_brief` | Context summary for current session | ## Architecture Monorepo with eight packages: - **@cortex/core** — types, EventBus, config loader, error classes - **@cortex/ingest** — file parsers (tree-sitter + remark), chunker, watcher, pipeline - **@cortex/graph** — SQLite store, LanceDB vectors, query engine - **@cortex/llm** — Anthropic/Gemini/OpenAI-compatible/Ollama providers, router, prompts, cache - **@cortex/cli** — Commander.js CLI - **@cortex/mcp** — Model Context Protocol server (stdio transport, 12 tools) - **@cortex/server** — Express REST API + WebSocket relay - **@cortex/web** — React + Vite + D3 web dashboard Architecture docs: [docs/](docs/) ## Privacy & Security - Files classified as `restricted` are **never** sent to cloud LLMs - Sensitive files (.env, .pem, .key) are auto-detected and blocked - API key secrets are scanned and redacted before any cloud transmission - All data stored locally in `~/.cortex/` — nothing phones home Full security architecture: [docs/security.md](docs/security.md) ## Built With - [SQLite](https://sqlite.org/) via better-sqlite3 — entity and relationship storage - [LanceDB](https://lancedb.com/) — vector embeddings for semantic search - [Anthropic Claude](https://anthropic.com/) — cloud LLM provider - [Google Gemini](https://ai.google.dev/) — cloud LLM provider (via OpenAI-compatible API) - [DeepSeek](https://deepseek.com/) — cloud LLM provider (reasoning + chat) - [Groq](https://groq.com/) — fast cloud inference - [Ollama](https://ollama.ai/) — local LLM inference - [tree-sitter](https://tree-sitter.github.io/) — language-aware file parsing - [Chokidar](https://github.com/paulmillr/chokidar) — cross-platform file watching - [Commander.js](https://github.com/tj/commander.js/) — CLI framework - [React](https://react.dev/) + [Vite](https://vite.dev/) — web dashboard - [D3](https://d3js.org/) — knowledge graph visualization ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. ## License MIT — see [LICENSE](LICENSE) ## About Built by [GZOO](https://gzoo.ai) — an AI-powered business automation platform. Cortex started as an internal tool to maintain context across multiple client projects. We open-sourced it because every developer who works on more than one thing loses context, and we think this approach — automatic file watching + knowledge graph + natural language queries — is the right way to solve it.