ctxloom Documentation

Complete reference for all CLI commands, MCP tools, and configuration options.

Getting Started

Quick Start

Up and running in under a minute. No API keys, no cloud, no Python.

1

Install

bash
npm install -g ctxloom-pro
2

Configure AI tools

One-time. Detects all MCP clients automatically.

bash
ctxloom setup
3

Pin ctxloom to this project

One-time per project. Writes a .mcp.json in the project root with CTXLOOM_ROOT pinned to this directory, and appends .ctxloom/ to .gitignore.

bash
cd /path/to/your/project
ctxloom init
4

Index project

bash
ctxloom index

Prefer manual configuration? Two layers — a global entry so your AI tool can find the binary, plus a per-project .mcp.json so the server pins to the right codebase.

Global — what ctxloom setup writes:

~/.claude.json / ~/.cursor/mcp.json / …
{
  "mcpServers": {
    "ctxloom": {
      "command": "ctxloom",
      "args": []
    }
  }
}

Per-project — what ctxloom init writes (commit this with the repo):

.mcp.json (project root)
{
  "mcpServers": {
    "ctxloom": {
      "command": "ctxloom",
      "args": [],
      "env": { "CTXLOOM_ROOT": "/absolute/path/to/project" }
    }
  }
}

MCP clients like Claude Code and Cursor merge per-project config over global. Without the per-project entry, the server's cwd is whatever your editor was launched from — and most clients do not relaunch MCP servers when you switch projects in a running session, so the binding can stick to the wrong codebase. The CTXLOOM_ROOT in .mcp.json closes that gap.

For CI runners or Claude Desktop (no project concept), pin the global entry instead by adding "env": { "CTXLOOM_ROOT": "/path" } there too.

Reference

CLI Commands

CommandDescription
ctxloomStart MCP server (Stdio transport)
ctxloom initScaffold .mcp.json + .gitignore + agent-harness rules (CLAUDE.md / AGENTS.md / GEMINI.md), hooks (.claude/hooks/), and 6 pre-packaged skills
ctxloom setupAuto-detect 17 MCP hosts (Claude Desktop, Claude Code, Cursor, Windsurf, Zed, Gemini CLI, OpenAI Codex CLI, Kiro, VS Code/Copilot, Continue, OpenCode, Aider, Augment, Kilo, Kimi, Qwen, JetBrains) and register ctxloom MCP server in each one that is installed. Fixes 2026 vendor-path corrections for Continue (per-server YAML), Codex (TOML), and OpenCode (`mcp` key).
ctxloom init --host=<id>Write agent-rule files (CLAUDE.md-style) for an additional host: cursor, aider, copilot, windsurf. Comma-separated; --host=all writes every adapter. Distinct from ctxloom setup, which writes MCP server registrations.
ctxloom init --skip-harnessPre-v1.4 behavior: only .mcp.json + .gitignore (no rules/hooks/skills)
ctxloom init --dry-runPrint what would change, write nothing
ctxloom init --forceOverwrite HMAC-tampered rule blocks (refused without this flag)
ctxloom indexIndex current directory + build dependency graph
ctxloom budget-statsAggregate per-tool budget telemetry — fallback distribution + p50/p75/p95 original-token distribution. The p75 column is the input for per-tool default tuning
ctxloom budget-stats --window=NdWindow the report to last N days (default 14). Accepts 1d, 7d, 14d, 30d
ctxloom budget-stats --tool=<name>Filter to a specific tool (e.g. ctx_get_file)
ctxloom dashboardOpen the web dashboard at http://localhost:7842
ctxloom dashboard --port=NStart dashboard on a custom port
ctxloom dashboard --openLaunch and open browser automatically
ctxloom register <path>Register a repo for cross-repo search
ctxloom register <path> --alias <name>Register with a short alias usable as project_root in tool calls
ctxloom reposList all registered repos and aliases
ctxloom statusShow license tier, expiry, and machine binding
ctxloom trialStart a 14-day free trial (interactive email prompt)
ctxloom activate <KEY>Activate a purchased license on this machine
ctxloom deactivateRelease this machine’s seat (e.g. before re-imaging)
ctxloom grammarsShow grammar cache status
ctxloom grammars --downloadPre-download all language grammars
ctxloom rules checkCheck .ctxloom/rules.yml against the dependency graph
ctxloom rules check --jsonJSON output (schemaVersion: 1) for CI parsers
ctxloom rules check --use-snapshotSkip re-indexing, use existing graph snapshot
ctxloom rules check --limit=NLimit text output to N violations (default: 50)
ctxloom --helpShow help
Feature

Multi-Project Supportv1.1+

One ctxloom MCP server can serve multiple repos at once. Every tool accepts an optional project_root parameter — an alias or absolute path — so your agent can query across all your codebases from a single server.

register vs init— what's the difference?

ctxloom registerpassive data source

Adds one entry to ~/.ctxloom/repos.json. The target repo stays untouched. Sufficient when you only want to query that repo from another project — e.g. cross-repo search, or referencing it by alias in tool calls.

ctxloom initagent-ready workspace

Writes .mcp.json + agent-rule blocks (CLAUDE.md / AGENTS.md / GEMINI.md) + hooks + prepackaged skills into the repo. Required only when you open it in Claude Code / Cursor and want the harness, SessionStart banner, and PostToolUse auto-update active there too.

Setup

Register a second repo as a passive data source
# From anywhere — registers an alias in ~/.ctxloom/repos.json
ctxloom register /path/to/frontend --alias frontend

# List registered repos
ctxloom repos
…or fully bootstrap a project for local agent work
cd /path/to/frontend
ctxloom init      # writes .mcp.json + agent rules + hooks + skills
ctxloom index     # builds graph + vectors + git overlay
ctxloom register /path/to/frontend --alias frontend  # so other projects can target it

Using the alias in tool calls

Any MCP tool accepts project_root
// Read a file from the registered "frontend" repo
{
  "tool": "ctx_get_file",
  "args": {
    "path": "src/App.tsx",
    "project_root": "frontend"
  }
}

// Or pass an absolute path directly (no register needed)
{
  "tool": "ctx_search",
  "args": {
    "query": "useEffect",
    "project_root": "/path/to/frontend"
  }
}
First-touch auto-indexing. The first tool call to an unindexed alias triggers a synchronous Tier 1 graph build; vectors and git overlay (Tier 2) load in the background. The response wraps in a <ctxloom_indexing>envelope on the first touch so the agent knows it's a cold start.

Resolution order

  1. 1
    Explicit aliasproject_root matches a name in ~/.ctxloom/repos.json — resolves to that absolute path
  2. 2
    Absolute pathproject_root is an absolute path — used directly (must exist and be readable)
  3. 3
    Default projectproject_root omitted — falls back to the server's default (the dir it was launched from)
  4. 4
    Structured errorReturns alias_not_found / no_default_project / project_root_not_found XML if resolution fails — agents can recover instead of crashing

Tuning

Env variableDescriptionDefault
CTXLOOM_MAX_PROJECTSLRU cap on simultaneously-active project states. Older projects evict to disk; first touch re-hydrates.5
CTXLOOM_DISABLE_MULTIPROJECTSet to 1 to revert to v1.0.x single-project behavior (project_root is ignored).unset
🔒Privacy. Telemetry never sends project paths or alias names — each registered repo is referenced only by an opaque project_id (SHA-256 of the canonical path, first 16 hex chars). Disable entirely with CTXLOOM_NO_TELEMETRY=1.
Reference

MCP Tools34

detail_level="minimal" — 7 tools support this parameter for 40–60% fewer tokens in counts-only mode: ctx_blast_radius, ctx_hub_nodes, ctx_bridge_nodes, ctx_architecture_overview, ctx_knowledge_gaps, ctx_surprising_connections, ctx_detect_changes.
Search & Context7
ctx_get_minimal_context

Orientation anchor — every agent workflow’s mandatory first call. ~150 tokens covering graph readiness, recent changes, top hubs, and a task-aware suggested-first-tool. Pass task="<intent>" and regex routing picks the right next tool.

ctx_search

Hybrid semantic + graph search. Use it when: finding files by concept or relationship.

ctx_get_file

Safe file read, 5 MB limit, path traversal protected. Use it when: reading a specific file safely.

ctx_get_context_packet

Primary file + dependency skeletons + reverse importers in one call. Use it when: giving AI full context for a file.

ctx_similar_files

Find semantically similar files via vector embeddings. Use it when: finding related implementations.

ctx_cross_repo_search

Federated search across all registered repos. Use it when: working across multiple repos.

ctx_full_text_search

Hybrid keyword + vector with regex. Use it when: finding exact strings or patterns.

Graph Intelligence8
ctx_blast_radius

"What breaks if I change this?" import + call graph traversal. Supports detail_level="minimal".

ctx_hub_nodes

Top-N files by import degree (chokepoints). Supports detail_level="minimal".

ctx_bridge_nodes

Top-N files by betweenness centrality (connectors). Supports detail_level="minimal".

ctx_community_list

Louvain clustering — groups files into architectural modules.

ctx_architecture_overview

High-level summary: communities, hubs, coupling. Supports detail_level="minimal".

ctx_knowledge_gaps

Isolated files, untested hubs, dead code candidates. Supports detail_level="minimal".

ctx_surprising_connections

Circular deps, cross-community imports, prod→test violations. Supports detail_level="minimal".

ctx_find_large_functions

Functions/classes exceeding a line threshold, sorted by size.

Code Navigation6
ctx_get_call_graph

Bidirectional call graph with configurable depth.

ctx_get_definition

Symbol definition lookup via AST index.

ctx_execution_flow

DFS call graph traversal from entry point with cycle detection.

ctx_get_affected_flows

Given a set of changed files, returns the execution flows that pass through them — pinpoints which user journeys are at risk.

ctx_refactor_preview

Read-only symbol rename diff preview across entire codebase.

ctx_apply_refactor

Write symbol renames atomically (supports dry_run).

Review & Export9
ctx_git_diff_review

All-in-one review packet: git diffs + skeletons + blast radius.

ctx_wiki_generate

Generate .ctxloom/wiki/ — one Markdown page per community. No LLM needed.

ctx_graph_export

Export to GraphML, DOT, Obsidian, SVG, or interactive D3.js HTML.

ctx_suggested_questions

Graph-driven review questions without LLM.

ctx_detect_changes

Risk-scored change analysis (critical/high/medium/low). Supports detail_level="minimal".

ctx_graph_snapshot

Save named checkpoint of the dependency graph.

ctx_graph_diff

Diff two named snapshots — added/removed nodes and edges.

ctx_git_coupling

Co-change analysis from git history (Jaccard + recency decay).

ctx_risk_overlay

Per-file composite risk: churn 35% + bug density 30% + bus factor 20% + coupling 15%.

Utilities4
ctx_rules_check

Check .ctxloom/rules.yml against the live dependency graph. Returns {schemaVersion:1, violations, warnings}. Config reloaded on every call.

ctx_get_rules

Inject project rules from .cursorrules, CLAUDE.md, .ctxloomrc.

ctx_status

Server status: graph size, vector count, init state.

ctx_get_workflow

Pre-written tool sequences for review/debug/onboard/refactor/audit.

Feature

Git Risk Overlay

Enable
ctxloom . --with-git --git-window-days=365
Disable (tools degrade gracefully, risk block becomes null)
ctxloom . --no-git

New tools

ctx_git_coupling

Given a file, returns top co-changed siblings with confidence score.

  • node — target file path
  • limit — default 10
  • minConfidence — default 0.1
  • windowDays — default 365
ctx_risk_overlay

Per-file composite risk score 0–1.

low < 0.4
medium 0.4–0.7
high ≥ 0.7

Enriched tools

ctx_detect_changes— each file now includes overlay_risk block with churn, bug density, owners, coupled siblings.
ctx_blast_radius— adds historicalCoupling section for files that co-change but aren't reachable via imports.
🔒The overlay is local only. No code or commit metadata is sent anywhere.
Feature

Import Boundary Rules

Enforce import boundaries on your codebase as a CI lint step — no runtime overhead, no flaky tests. Marketed as the Architecture Rules Engine; the rest of this section uses that name.

Not the same as the Architecture (internals) section. That one explains how ctxloom is built. This section is a feature for linting your repo's import graph against rules in .ctxloom/rules.yml.

Quick start

bash
# Check rules against the indexed dependency graph
ctxloom rules check

# JSON output (CI-friendly)
ctxloom rules check --json

# Use existing snapshot, skip re-indexing
ctxloom rules check --use-snapshot

Config — .ctxloom/rules.yml

.ctxloom/rules.yml
version: 1
rules:
  - name: domain must not import infra
    type: no-import
    from: "src/domain/**"
    to: "src/infra/**"
    severity: error        # optional, defaults to "error"

  - name: no legacy shared imports
    type: no-import
    from: "src/features/**"
    to: "src/shared/legacy/**"
    severity: warning

Rule fields

FieldRequiredDescription
nameHuman-readable label shown in violations
typeAlways no-import in v1
frompicomatch glob — files that must not import
topicomatch glob — files that must not be imported
severity"error" (default) or "warning"

Exit codes

CodeMeaning
0Clean — no error violations (warnings are allowed)
1One or more error-severity violations found
2Config file invalid or I/O error

CI integration

.github/workflows/rules.yml
name: Architecture rules
on: [push, pull_request]
jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm install -g ctxloom-pro
      - run: ctxloom index
      - run: ctxloom rules check --json

MCP tool — ctx_rules_check

Exposes the same engine to your AI assistant. Config is reloaded on every call — no server restart needed when rules change.

Response (schemaVersion: 1)
{
  "schemaVersion": 1,
  "violations": [
    {
      "rule": "domain must not import infra",
      "severity": "error",
      "from": "src/domain/user.ts",
      "to": "src/infra/db.ts"
    }
  ],
  "warnings": []
}
v1 limitation: only direct imports are checked — transitive violations are not detected. Transitive support is planned for v2.
GitHub Action

ctxloom-bot

A GitHub Action that posts a risk-scored summary comment and inline review notes on every pull request — running entirely inside your CI. No hosted service, no LLM calls, no external accounts, no per-PR cost.

What it does on every PR:

  • Posts a risk-scored summary: overall risk label + score, blast radius, top high-risk files
  • Inline review comments anchored at the highest-risk hunks
  • Suggests reviewers from git ownership + co-change history
  • Optional Check Run to block merges above a risk threshold

Enable it on a repo

Option 1 — one command (if you have the CLI installed, npm install -g ctxloom-pro):

from your repo root
ctxloom install-pr-bot
git add .github/workflows/ctxloom-review.yml
git commit -m "ci: enable ctxloom pr-bot"
git push

It writes the workflow below — default branch auto-detected, action pinned to @v1. Use --force to overwrite an existing file or --ref v1.7.9 to pin an exact release for reproducible reviews.

Option 2 — paste the workflow yourself:

.github/workflows/ctxloom-review.yml
name: ctxloom review

on:
  pull_request:
    types: [opened, synchronize, reopened]

permissions:
  contents: read
  pull-requests: write
  checks: write

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0   # REQUIRED — git overlay needs full history
      - uses: kodiii/ctxloom-pr-bot@v1
fetch-depth: 0 is mandatory. Without it the graph can't build co-change and ownership data, and the bot falls back to file-count-onlyrisk scoring (you'll see a note saying exactly that on the PR comment). This is the #1 setup mistake.

First run builds the dependency graph (~10–60s for typical repos); subsequent runs reuse the workflow cache. Private repos also need a CTXLOOM_LICENSE_KEY repo secret — the MCP server refuses to start without it.

Configure via .ctxloom.yml

Optional — place at your repo root to override defaults:

.ctxloom.yml
risk_threshold: 0.7        # 0–1; comments fire above this
inline_comments: true       # post per-hunk inline notes
suggested_reviewers: true   # nominate reviewers from git history
check_run: false            # set true to BLOCK merge on high risk
excluded_paths: []          # globs the bot ignores
max_inline_per_pr: 10       # cap on inline comments (avoids spam)

Cost

ResourceWho pays
GitHub Actions minutesRepo owner (~30–90s/PR; free for public repos)
LLM tokensNobody — this action calls no LLM
Cloud / server hostingNobody — no hosted service exists

Optional: LLM-narrated reviews opt-in

Want a narrative layer on top of the deterministic analysis? A separate workflow runs four specialist Claude subagents (security, architecture, testing, performance) in parallel, each calling ctxloom's MCP tools for structural evidence so the LLM never hallucinates the graph. It's risk-gated— only fires on PRs the deterministic bot already flagged medium-or-higher, so you don't spend tokens on trivial changes. You can even run it locally from Claude Desktop / Claude Code with no API key using your existing session — no GitHub Action, no secrets. See the AI-REVIEWS.md guide in the repo for the three setup paths.

🔒Your code never leaves your runner. Analysis happens in the same CI job that checked out the code; the Action only calls the GitHub API to post comments and read the diff. No telemetry is collected.
Web Dashboard

Web Dashboard

A local web UI that visualises your codebase's graph, risk, ownership, and community data in real time — no cloud required.

Launch

bash
# Index first (with git history for full metrics)
ctxloom index --with-git

# Start the dashboard
ctxloom dashboard

Visit http://localhost:7842 — no browser extension required. Use --port=N to change the port or --open to auto-launch the browser.

Views

ViewWhat it shows
OverviewFile count, edge count, community count, git status, risk breakdown donut, top architectural hubs
Dependency GraphInteractive D3 force-directed graph — hover for details, click to highlight neighbours, search to pan, community colour legend, risk rings for high/critical files
RiskSortable, filterable table with composite risk score (churn × 0.3 + bug density × 0.3 + bus factor × 0.2 + coupling × 0.2)
CommunitiesAuto-detected Louvain modules — expandable cluster cards listing all member files
OwnershipPer-file primary owner, share %, bus factor — filterable by file or contributor name
Debt TrendsTime-series view of architectural debt — risk score, hub count, community count, and orphan count over the last N indexed snapshots. Surfaces regressions before they compound.
GuideIn-app reference explaining every metric and how to interpret the data

Interactivity

  • Click any filename in Risk, Ownership, or Communities to open a file preview drawer with full source and an Open in IDE button (VS Code, Cursor, or system default).
  • Auto-reload — the dashboard watches .ctxloom/graph-snapshot.json and reloads in-place when ctxloom index updates it. No server restart needed.
  • ↻ Refresh button in the Overview header triggers a manual reload of all graph and git data.

Risk Tiers

TierScoreMeaning
critical> 0.8Urgent — high churn, sole owner, heavily coupled
high> 0.6Should be addressed soon
medium> 0.3Monitor — watch for growth
low≤ 0.3Acceptable
Git history is required for Risk, Ownership, and bus factor data. Run ctxloom index --with-git to enable the full risk overlay before launching the dashboard.
Reference

Language Support

LanguageImport GraphSymbol IndexSkeletonization
TypeScript / JavaScriptFull AST
PythonRelative imports
Rustmod resolution
Gogo.mod module-path + package fan-out
JavaDot-to-slash
C#Namespace resolution
RubyRelative paths
KotlinPackage imports
SwiftModule imports
PHPPSR-4 + require_once
DartRelative imports
Vue SFCScript block
Jupyter NotebookPython cell imports
C / C++Local #include
Scalasbt + flat package layouts
Luarequire + init.lua
Elixiralias/import → lib/<snake_case>.ex
Zig@import("./*.zig") + path guards
Internals

Architecture (internals)

How ctxloom itself is built — entry point, tool registry, context engine, file watcher, persistence. For contributors and the curious.

Looking for the lint feature? The Import Boundary Rules section is about enforcing rules on yourcodebase — that's a separate product feature, not ctxloom's own architecture.
System Overview
Entry Point

MCP Interface

Stdio transport

API Layer

34 Tools — ToolRegistry

Search & ContextGraph IntelligenceCode NavigationReview & ExportUtilities
Context Engine

Dependency

Graph

VectorDB

LanceDB

Skeletonizer

tree-sitter

Sync Layer

File Watcher

chokidar · 200ms debounce · incremental re-index

Persistence

Snapshot Manager

atomic writes · crash-safe · local filesystem

How search works

  1. 1
    EmbedQuery embedded with sentence-transformers/all-MiniLM-L6-v2 (local, 384-dim)
  2. 2
    Vector searchANN query against LanceDB
  3. 3
    Graph expansionResults expanded via import graph (importers/imports get score boost)
  4. 4
    SkeletonizeDependency files reduced to signature-only views (~92% token reduction)
Performance

Token Reduction Benchmarks

Measured on real open-source repos — not estimated.

v1.7.0 · External-oracle benchmark

Token reduction below is the full-source skeletonization bench (5 frameworks, 6,154 files). For the prediction-quality bench (F1, recall, graph reachability against a GitHub PR-diff oracle) — see the External-oracle benchmark on the home page.

RepositoryLanguageRaw tokensSkeleton tokensReduction
vercel/next.jsTypeScript~12.2M~584k95%
honojs/honoTypeScript~185k~30k84%
vitejs/viteTypeScript~459k~105k77%
withastro/astroTypeScript~805k~191k76%
nestjs/nestTypeScript~409k~177k57%
Weighted average · 6,154 files~14.1M~1.1M92%
Reproduce benchmarks
npm run bench:repos
Security

Security

  • Path traversal prevention (CWE-22), symlink-aware — all file inputs validated against project root
  • Shell injection prevention — execFileSync with argument arrays, no shell string interpolation
  • XML injection prevention — all user-controlled strings escaped before XML output
  • File size limits — files over 5 MB rejected and skipped by indexer
  • Input bounds — limit capped at 100, depth capped at 20 across all tools
  • Atomic snapshot writes — written to .tmp then renamed, prevents torn reads
  • Snapshot schema validation — validated before hydration, prevents prototype pollution
Configuration

Environment Variables

VariableDescriptionDefault
CTXLOOM_ROOTProject root directory to indexCurrent working directory
LOG_LEVELLogging verbosity: debug / info / warn / errorinfo
CTXLOOM_GRAMMAR_CDNCDN base URL for grammar downloads (air-gapped environments)Built-in
CTXLOOM_MAX_PROJECTSLRU cap on simultaneously-active project states (multi-project)5
CTXLOOM_DISABLE_MULTIPROJECTSet to 1 to revert to single-project behavior (project_root ignored)unset
CTXLOOM_TASK_TOOL_BUDGETPer-task tool-call ceiling. Over-budget calls auto-downgrade to skeleton/minimal mode.8
CTXLOOM_DISABLE_BUDGETSet to 1 to disable server-enforced response budgets (kill switch)unset
CTXLOOM_LEARNED_SUGGESTIONSSet to 1 to mine local telemetry for next_tool_suggestions (opt-in)unset
CTXLOOM_TELEMETRY_LEVELall (PostHog + Sentry) / error (Sentry only) / off (silent)all
CTXLOOM_NO_TELEMETRYSet to 1 to disable all telemetry (alias for telemetry_level=off)unset
CTXLOOM_TELEMETRY_DIRAbsolute path override for budget-event JSONL files~/.ctxloom/telemetry/
Advanced

Build from Source

bash
git clone https://github.com/kodiii/ctxloom.git
cd ctxloom
npm install
npm run build
ctxloom index
node dist/index.js
Reference

Troubleshooting

The handful of failure modes that account for ~all "Server disconnected", "Could not attach to MCP server ctxloom", and "graph is empty" reports we've seen.

MCP server disconnects immediately on every tool call

Symptom in your MCP client logs:

mcp-server-ctxloom.log
[ctxloom] Server transport closed unexpectedly, this is likely due to the
process exiting early. ... [error] Server disconnected.

Cause #1 — Inactive license. The CLI exits to stderr the moment a tool call arrives if no active license is found, which closes the stdio MCP channel.

check + fix
ctxloom status               # should show LICENSED or TRIALING
ctxloom trial                # 14-day free trial
# or
ctxloom activate <YOUR_KEY>  # if you already have a key

Cause #2 — CTXLOOM_ROOT not set, MCP client spawned ctxloom with cwd=/. Common with Claude Desktop and any client that doesn't inherit a project cwd. ctxloom then attempts to index the entire filesystem from /, which on macOS produces thousands of EMFILE: too many open files warnings and eventually crashes with ENFILE: file table overflow before the first tool call returns.

Always set CTXLOOM_ROOT in your MCP config's env block. "Auto-detected if not set" means "defaults to process.cwd()" — and that is / for most desktop MCP clients, not your project.

Fix the config:

claude_desktop_config.json (or your client's equivalent)
{
  "mcpServers": {
    "ctxloom": {
      "command": "ctxloom",
      "env": {
        "CTXLOOM_ROOT": "/absolute/path/to/your/project"
      }
    }
  }
}

After restart you should see "Project root","root":"/your/project" followed by "File watcher active" in the log — not thousands of /dev/* permission warnings.

Working across multiple repos in one session

Register each repo with a short alias, then pass project_root on each tool call:

one-time setup
ctxloom register /Users/me/work/api      --alias api
ctxloom register /Users/me/work/web      --alias web
ctxloom register /Users/me/work/mobile   --alias mobile
ctxloom repos                            # verify

Then in your AI tool, calls become:

from the assistant
ctx_search { project_root: "api", query: "rate limiter" }
ctx_blast_radius { project_root: "web", file: "src/auth.ts" }

Without an alias, project_root must be an absolute path. Aliases also unlock ctx_cross_repo_search.

Graph builds with 0 edges (especially on Python, Rust, or Java projects)

Symptom: ctxloom index reports a healthy file count but Graph built with 0 edges, and your AI tool says things like "structural blast-radius/coverage tracing isn't available". Most common on projects first indexed under an older ctxloom that pre-dated absolute import resolution for that language.

Root cause — stale snapshot. For speed, ctxloom indexreuses an existing graph snapshot when the file count is stable. The staleness check is file-count-based, not version-based, so an empty snapshot from an older binary can survive an upgrade and re-hydrate "successfully" — even though the import resolver that wrote it didn't know how to follow from src.api.auth import … style absolute imports.

Clear the snapshot and rebuild from scratch:

from the project root
rm -rf .ctxloom
ctxloom index
# expect: "Graph built with N edges" where N > 0

After the rebuild, .ctxloom/graph-snapshot.json will contain populated forwardEdges for each source file — and any subsequent AI session will pick up callers, blast radius, and impact analysis correctly. The .ctxloom/directory is machine-local; it's already in the default gitignore and safe to delete at any time.

Stale CLI install

If ctxloom --version shows 1.0.x or your logs report "serverInfo":{"version":"1.0.0"}, you're running a pre-multi-project build that lacks the no-default safety mode and the project_root parameter. Refresh:

bash
npm install -g ctxloom-pro@latest
ctxloom --version           # verify
ctxloom status
Changelog

Changelog

Live release history, rendered straight from CHANGELOG.md on the ctxloom main branch.

View the full live changelog

Auto-refreshes every hour. New releases on main appear here within 60 minutes — no website redeploy required.