codegraph
A fast, reliable, and flexible graph database optimized for storing and querying code relationships.
Mission
codegraph provides a fast, reliable, and flexible graph database optimized for storing and querying code relationships, enabling tool builders to focus on analysis logic rather than infrastructure.
Core Principles
๐ Parser Agnostic
"Bring your own parser, we'll handle the graph."
codegraph does NOT include built-in language parsers. You integrate your own parsers (tree-sitter, syn, swc, etc.), and we provide the storage and query infrastructure.
โก Performance First
"Sub-100ms queries or it didn't happen."
- Single node lookup: <1ms
- Neighbor query: <10ms
- Graph traversal (depth=5): <50ms
- 100K node graphs are practical
๐งช Test-Driven Development
"If it's not tested, it's broken."
- 115 tests with comprehensive coverage (39 lib + 70 integration/unit + 6 doctests)
- Every public API is tested
- Benchmarks ensure performance targets
- 85% test coverage (983/1158 lines)
๐ช Zero Magic
"Explicit over implicit, always."
- No global state
- No automatic file scanning
- No convention-over-configuration
- Explicit error handling (no panics in library code)
- No unsafe code
๐พ Persistence is Primary
"Graphs outlive processes."
- RocksDB backend for production
- Crash-safe with write-ahead logging
- Atomic batch operations
- Memory backend for testing only
Quick Start
Add to your Cargo.toml:
[]
= "0.1"
Basic Usage
use ;
use Path;
// Create a persistent graph
let mut graph = open?;
// Add a file node (explicit, no magic)
let file_id = graph.add_file?;
// Add a function node
let mut func_node = new;
func_node.set_property;
func_node.set_property;
let func_id = graph.add_node?;
// Create a relationship (file contains function)
let edge = new;
graph.add_edge?;
// Query the graph
let neighbors = graph.get_neighbors?;
println!;
Parser Integration Example
// Example with tree-sitter (you provide the parser)
use ;
extern "C"
let mut parser = new;
parser.set_language.unwrap;
let source_code = read_to_string?;
let tree = parser.parse.unwrap;
// You extract entities from the AST
// codegraph stores the relationships
let mut graph = open?;
let file_id = graph.add_file?;
// Walk the tree and add nodes/edges as you see fit
Architecture
codegraph is organized in clear layers:
User Tools (parsers, analysis)
โ
Code Helpers (convenience API)
โ
Query Builder (fluent interface)
โ
Core Graph (nodes, edges, algorithms)
โ
Storage Backend (RocksDB, memory)
Each layer:
- Has well-defined boundaries
- Can be tested independently
- Doesn't leak abstractions
- Has minimal dependencies on upper layers
Features
- Persistent Storage: Production-ready RocksDB backend
- Type-Safe API: Rust's type system prevents common errors
- Schema-less Properties: Flexible JSON properties on nodes and edges
- Efficient Queries: O(1) neighbor lookups with adjacency indexing
- Explicit Operations: No hidden behavior or magical conventions
- Comprehensive Tests: 85% test coverage (983/1158 lines)
- Zero Unsafe Code: Memory-safe by default
What We Are (and Aren't)
We Are โ
- A graph database optimized for code relationships
- A storage layer for tool builders
- Language-agnostic
- Production-ready
We Are Not โ
- A parser (no AST extraction)
- A semantic analyzer (no type inference)
- An IDE integration (no LSP server)
- A complete framework (you build the analysis logic)
Performance Targets
| Operation | Target | Actual |
|---|---|---|
| Node lookup | <1ms | โ ~7ns (1000x better!) |
| Neighbor query | <10ms | โ ~410ns - 40ยตs |
| BFS traversal (depth=5) | <50ms | โ ~5ms |
| Batch insert (10K nodes) | <500ms | โ ~7ms |
| 100K node + 500K edge load | <5s | โ ~3.3s |
Development
Build
Test
Documentation
Code Quality
# Format code
# Lint with clippy
# Check test coverage
# Run all CI checks locally (recommended before pushing)
Examples
See the examples/ directory for complete examples:
basic_usage.rs- Creating and querying a simple graphcall_graph.rs- Function call analysis with syn integrationdependency_tree.rs- File dependency and circular dependency analysisimpact_analysis.rs- Complex query patterns for impact analysisvisualize.rs- Exporting graphs to DOT, JSON, CSV, and RDF formats
API Overview
Core Operations
// Node operations
let node_id = graph.add_node?;
let node = graph.get_node?;
graph.delete_node?;
// Edge operations
let edge_id = graph.add_edge?;
let neighbors = graph.get_neighbors?;
// Batch operations
graph.add_nodes_batch?;
graph.add_edges_batch?;
Helper Functions
use helpers;
// Code-specific operations
let file_id = add_file?;
let func_id = add_function?;
add_call?;
// Relationship queries
let callers = get_callers?;
let deps = get_file_dependencies?;
Query Builder
// Fluent query interface
let results = graph.query
.node_type
.in_file
.property
.name_contains
.execute?;
Graph Algorithms
// Transitive analysis
let all_deps = transitive_dependencies?;
let all_dependents = transitive_dependents?;
// Call chains
let paths = call_chain?;
// Circular dependencies
let cycles = circular_deps?;
Export Formats
use export;
// Graphviz DOT
export_dot?;
// D3.js JSON
export_json?;
// CSV (nodes and edges)
export_csv_nodes?;
export_csv_edges?;
// RDF N-Triples
export_triples?;
Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
Before contributing, please:
- Follow TDD methodology
- Ensure all tests pass
- Run
cargo fmtandcargo clippy
License
codegraph is licensed under the Apache License 2.0, which means:
โ You can:
- Use in commercial products
- Modify and distribute
- Use in proprietary software
โ You must:
- Include a copy of the license
- Disclose significant changes (in a CHANGES file)
- Include the patent grant notice
โ You can't:
- Hold us liable
- Claim we endorse your product
This is a truly open license. There's no "gotcha" later where we switch to GPL or a commercial model. Apache-2.0 is forever.
Code of Conduct
This project adheres to the Rust Code of Conduct. See CODE_OF_CONDUCT.md.
Versioning
This project follows Semantic Versioning:
- v0.x: API may change between minor versions (with deprecation warnings)
- v1.0+: Stability guaranteed, breaking changes only in major versions
Current version: 0.1.1 (Initial release + formatting fixes)
Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Roadmap
v0.2-0.5 (Near-term)
- Query language improvements
- More export formats (GraphML, Cypher)
- Performance optimizations
- First-party parser helper crates
v0.6-0.9 (Medium-term)
- Incremental updates
- Change tracking
- Statistics and metrics API
- CLI tool
v1.0+ (Long-term)
- Schema validation
- Full-text search integration
- Compression options
- Distributed graphs (maybe)
Acknowledgments
This project draws inspiration from:
- Rust Language governance model
- SQLite's reliability principles
- Redis project philosophy
- Kubernetes governance structure
Built with โค๏ธ in Rust