Show HN: N3MO – Deterministic code intelligence via AST parsing, no embeddings N3MO, a deterministic code intelligence tool that parses source code ASTs into a queryable knowledge graph without embeddings or LLM calls, launched on Hacker News. It enables transitive dependency mapping, blast radius analysis, and AI agent integration via MCP, targeting engineering teams to reduce regression risks and accelerate onboarding. The tool is licensed under PolyForm Noncommercial 1.0.0 with commercial licenses available. A structural code intelligence layer that transforms source code into a queryable knowledge graph for search, impact analysis, and AI-powered development. Parse once. Query forever. Know exactly what breaks before it does. πŸ“œ Licensed under PolyForm Noncommercial 1.0.0 β€” Source available for noncommercial use. β€’ Need commercial use? Get a commercial license β†’ -license What is N3MO -what-is-n3mo β€’ Benchmarks -benchmarks β€’ Architecture -architecture β€’ Installation -installation β€’ MCP -model-context-protocol-mcp β€’ Usage -usage β€’ Roadmap -roadmap N3MO is a symbol-centric code intelligence layer. Instead of scanning raw text, it parses your source code's ASTs, maps call graphs, and models dependencies in a queryable relational database β€” deterministically, with zero LLM calls at index time . For engineering leaders and teams, N3MO acts as a structural insurance policy for your codebases. πŸ›‘οΈ Eliminate Regression Risks β€” Utility functions are rarely refactored because developers fear unknown side effects. N3MO maps the transitive blast radius of any symbol to arbitrary depth, showing you exactly what will break before you make the edit. 🏎️ Rapid Developer Onboarding β€” Instead of senior engineers spending hours explaining codebase flow to new hires, developers run one command to visualize complex call chains and parent-child dependencies interactively. πŸ€– AI-Agent Ready Infrastructure β€” Modern LLM agents Cursor, Claude Desktop are limited by context windows and text search. N3MO's native MCP server lets agents query the actual code graph, enabling fast, hallucination-free refactoring. ⚑ No Embeddings, No Drift β€” N3MO is pure static analysis: Tree-sitter AST parsing into PostgreSQL. There's no vector index to keep in sync, no embedding cost per repo, and no semantic-similarity guesswork β€” every edge in the graph is an exact, verifiable relationship. | Capability | Grep / Text Search | IDE "Find References" | N3MO Code Graph | |---|---|---|---| Analysis Basis | Substring matching | AST-based, direct refs only | Relational knowledge graph | Transitive Traversal | ❌ None | ❌ Manual, one level at a time | ⚑ Instant to arbitrary depth | Blast Radius Mapping | ❌ None | ❌ Flat search-result list | 🎨 Interactive visual orbit map | CI/CD Integration | ❌ None | ❌ Bound to IDE runtime | βš™οΈ Dockerized CLI + CTE queries | AI Agent Integration | ❌ Injected file chunks | πŸ€– Native MCP server | | Language Coverage | βœ… Any text file | βœ… 27 Tree-sitter grammars | | Indexing Method | N/A | N/A | βœ… Deterministic AST parse β€” no embeddings, no LLM calls | | Developer: "Where does 'login' appear?" Tool: grep -r "login" . Result: 647 matches across 89 files ...now what? | Developer: "What breaks if I change login?" Tool: n3mo impact "login" Result: 3 direct callers β†’ 5 ripple effects Full blast radius in < 50ms | N3MO doesn't find text β€” it understands structure.It traces the actual call graph, not string matches. Questions N3MO answers instantly: | Question | How | | |---|---|---| | πŸ”Ž | What functions and classes exist in this repo? | Full symbol index across 27 languages | | 🎯 | Where is this symbol used β€” directly and transitively? | Recursive CTE traversal to arbitrary depth | | πŸ’₯ | What is the blast radius of changing this function? | Interactive orbit map with depth slider | | πŸ•ΈοΈ | How do these components actually connect? | Call graph + parent-child hierarchy | | πŸ€– | Can my AI agent understand this codebase structurally? | Native MCP server for Cursor / Claude | All benchmarks measured on Intel i5-13450HX, 24 GB RAM, NVMe SSD . Django is the primary benchmark target: 3,021 files , ~43K symbols , ~181K calls . Django Index Time minutes ═══════════════════════════════════════════════════════════════ v0.3 Baseline β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ 23 min 1Γ— SPLIT PART Fix β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ 11 min 2Γ— Batch Inserts β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ 5 min 4.6Γ— + Multiprocessing β–ˆβ–ˆβ–ˆβ–ˆ 2.5 min 9Γ— πŸš€ ═══════════════════════════════════════════════════════════════ | Optimization | Index Time | Speedup | What Changed | |---|---|---|---| | v0.3 baseline | 23 min | 1Γ— | Per-symbol DB inserts, naive call resolution | | + SPLIT PART query fix | 11 min | 2Γ— | Eliminated redundant string splitting in call resolution | | + Batch inserts | 5 min | 4.6Γ— | Symbols, imports, and calls batched per file 1 transaction | | + Multiprocessing | ~2.5 min | ~9Γ— | ProcessPoolExecutor distributes AST parsing across cores | βœ… All results are real measurements on the Django repository. Multiprocessing gains scale with core count. Tested on TensorFlow β€” a 36,000-file, multi-language C++/Python monorepo. | Metric | Result | |---|---| Repo size total files | ~36,000 | Files processed & indexed | 14,611 after filtering tests, configs, and non-source files | Total symbols extracted | 79,523 | Total call edges extracted | 480,851 | Full index time cold start | 14.06 minutes | Peak memory Docker container | 185 MB RAM | CPU utilization | ~5% | N3MO scales from a 3K-file pure-Python repo Django to a 36K-file multi-language enterprise monorepo TensorFlow β€” roughly a 5Γ— larger indexing job at near-linear throughput, without significant resource overhead. Symbol/edge-per-file and incremental warm re-index numbers for TensorFlow are being finalized in the full benchmark report. Tested on ScanCode Toolkit β€” ~600K lines of Python. | Metric | Result | |---|---| Lines of code | ~600,000 | Full index time | ~3 minutes | Processing mode | Single-threaded v0.3 | N3MO uses SHA-256 file hashing to skip unchanged files on subsequent runs. | Scenario | Time | Notes | |---|---|---| Full index first run | Baseline | All files parsed and inserted | No changes re-run | < 1 second | Hash comparison only, zero DB writes | 1 file modified | < 2 seconds | Only the changed file is re-parsed and upserted | These results are from the built-in benchmark script on a 20-file synthetic repository. Real-world incremental performance is proportional to the number of changed files, not the total repository size. Impact analysis uses PostgreSQL recursive CTEs with cycle guards. Query times are independent of repository size β€” they depend only on the size of the result subgraph. | Query Type | Typical Latency | |---|---| | Direct callers of a symbol | < 10 ms | | Full blast radius depth ≀ 5 | < 50 ms | | Complete graph traversal | < 200 ms | python benchmarks/benchmark indexing.py N3MO builds a symbol-centric knowledge graph stored in PostgreSQL: php graph TD A "πŸ“„ Source Code" -- |Tree-sitter| B "🌳 AST Parser" B -- C "πŸ” Symbol Extractor" D "πŸ”„ Git Hooks" -- |post-commit| A C -- E "πŸ—„οΈ PostgreSQL