Stop wasting tokens on grep/find/glob. Give your AI agent fast, structured code intelligence.
- Instant answers - Pre-computed aggregates mean no waiting for grep/find/glob to finish or tokens wasted on file reads
- Understand relationships - See what depends on what without reading import statements or parsing code
- Find issues fast - Detect circular dependencies, coupling, and complexity hotspots with pre-indexed data
- Track usage - Know where every symbol is used across your codebase in milliseconds, not minutes
- Language-agnostic - Works with any SCIP-compatible indexer (TypeScript, Java, Rust, Python, etc.)
- Binary users: No dependencies - standalone executable
- From source: Bun 1.0+ required
- SCIP indexer: Language-specific (e.g., scip-typescript for TS/JS)
- Supported OS: macOS, Linux, Windows
- Disk space: ~5-50MB for index (varies by codebase size)
Download the latest binary for your platform from the releases page:
# macOS (ARM64)
curl -L https://github.com/butttons/dora/releases/latest/download/dora-darwin-arm64 -o dora
chmod +x dora
sudo mv dora /usr/local/bin/
# macOS (Intel)
curl -L https://github.com/butttons/dora/releases/latest/download/dora-darwin-x64 -o dora
chmod +x dora
sudo mv dora /usr/local/bin/
# Linux
curl -L https://github.com/butttons/dora/releases/latest/download/dora-linux-x64 -o dora
chmod +x dora
sudo mv dora /usr/local/bin/
# Windows
# Download dora-windows-x64.exe and add to PATH# Install Bun (if not already installed)
curl -fsSL https://bun.sh/install | bash
# Clone the repository
git clone https://github.com/butttons/dora.git
cd dora
# Install dependencies
bun install
# Build the binary
bun run build
# The binary will be at dist/dora
# Move it to your PATH
sudo mv dist/dora /usr/local/bin/You'll need a SCIP indexer for your language. For TypeScript/JavaScript:
# Install scip-typescript globally
npm install -g @sourcegraph/scip-typescript
# Verify installation
scip-typescript --helpFor other languages, see SCIP Indexers.
→ See AGENTS.md for complete integration guides for:
- Claude Code - Skills, hooks, auto-indexing
- OpenCode - Agent system integration
- Cursor - Custom commands and rules
- Windsurf - Skills, AGENTS.md, and rules
- Other AI agents - Generic integration using SKILL.md and SNIPPET.md
Quick start for any agent:
dora init && dora index # Initialize and index your codebase
dora status # Verify index is ready
dora map # See codebase overviewdora integrates with Claude Code via settings and optional skill configuration. Just add these files to your project:
1. Add to .claude/settings.json (enables auto-indexing and permissions):
{
"permissions": {
"allow": ["Bash(dora:*)", "Skill(dora)"]
},
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "dora status 2>/dev/null && (dora index > /tmp/dora-index.log 2>&1 &) || echo 'dora not initialized. Run: dora init && dora index'"
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "(dora index > /tmp/dora-index.log 2>&1 &) || true"
}
]
}
]
}
}2. (Optional) Add the dora skill at .claude/skills/dora/SKILL.md:
After running dora init, create a symlink:
mkdir -p .claude/skills/dora
ln -s ../../../.dora/docs/SKILL.md .claude/skills/dora/SKILL.mdThis enables the /dora command in Claude Code. View the skill file.
3. Add to CLAUDE.md (after running dora init):
cat .dora/docs/SNIPPET.md >> CLAUDE.mdThis gives Claude quick access to dora commands and guidance on when to use dora for code exploration. The snippet includes command reference and best practices.
4. Initialize dora:
dora init
dora indexWhat this gives you:
- Auto-indexing after each Claude turn
- Pre-approved permissions (no prompts for dora commands)
- Session startup checks
- CLAUDE.md context for better code exploration
Troubleshooting:
- Index not updating? Check
/tmp/dora-index.logfor errors - dora not found? Ensure dora is in PATH:
which dora
dora can run as an MCP (Model Context Protocol) server.
# Start MCP server (runs in foreground)
dora mcpAdd the MCP server with one command:
claude mcp add --transport stdio dora -- dora mcpAdd to your MCP client configuration:
{
"mcpServers": {
"dora": {
"type": "stdio",
"command": "dora",
"args": ["mcp"]
}
}
}All dora commands are available as MCP tools:
dora_status- Check index healthdora_map- Get codebase overviewdora_symbol- Search for symbolsdora_file- Analyze files with dependenciesdora_deps/dora_rdeps- Explore dependencies- And all other dora commands
dora initThis creates a .dora/ directory with a default config.
Edit .dora/config.json to configure your SCIP indexer:
For TypeScript/JavaScript:
{
"commands": {
"index": "scip-typescript index --output .dora/index.scip"
}
}For Rust:
{
"commands": {
"index": "rust-analyzer scip . --output .dora/index.scip"
}
}# If commands are configured:
dora index
# Or manually:
scip-typescript index --output .dora/index.scip# Check index status
dora status
# Get codebase overview
dora map
# Find a symbol
dora symbol Logger# Find a class definition
dora symbol AuthService
# Explore the file
dora file src/auth/service.ts
# See what depends on it
dora rdeps src/auth/service.ts --depth 2
# Check for circular dependencies
dora cyclesNew to dora? The cookbook has recipes with real examples:
# Start here - complete walkthrough
dora cookbook show quickstart
# Find class methods
dora cookbook show methods
# Track symbol references
dora cookbook show references
# Find exported APIs
dora cookbook show exportsAll recipes include tested SQL patterns from real codebases.
dora init # Initialize in repo
dora index # Index codebase
dora status # Show index health
dora map # High-level statisticsdora ls [directory] # List files in directory with metadata
dora symbol <query> # Find symbols by name
dora file <path> # File info with dependencies
dora refs <symbol> # Find all references
dora deps <path> --depth 2 # Show dependencies
dora rdeps <path> --depth 2 # Show dependents
dora adventure <from> <to> # Find shortest pathdora docs # List all documentation files
dora docs --type md # Filter by document type
dora docs search <query> # Search documentation content
dora docs show <path> # Show document detailsdora cycles # Find bidirectional dependencies
dora coupling --threshold 5 # Find tightly coupled files
dora complexity --sort complexity # High-impact files
dora treasure --limit 20 # Most referenced files
dora lost --limit 50 # Potentially dead code
dora leaves --max-dependents 3 # Leaf nodesdora schema # Show database schema
dora cookbook show [recipe] # Show query pattern examples
dora query "<sql>" # Execute raw SQL (read-only)
dora changes <ref> # Changed/impacted files
dora exports <path|package> # List exports
dora imports <path> # Show imports
dora graph <path> # Dependency graphQuick reference for all commands with common flags:
| Command | Description | Common Flags |
|---|---|---|
dora init |
Initialize dora in repository | - |
dora index |
Build/update index | --full, --skip-scip, --ignore <pattern> |
dora status |
Check index status | - |
dora map |
High-level statistics | - |
| Command | Description | Common Flags |
|---|---|---|
dora ls [directory] |
List files in directory | --limit N, --sort <field> |
dora file <path> |
Analyze file with dependencies | - |
dora symbol <query> |
Search for symbols | --kind <type>, --limit N |
dora refs <symbol> |
Find all references | - |
dora deps <path> |
Show dependencies | --depth N (default: 1) |
dora rdeps <path> |
Show reverse dependencies | --depth N (default: 1) |
dora adventure <from> <to> |
Find dependency path | - |
| Command | Description | Common Flags |
|---|---|---|
dora docs |
List all documentation files | --type <type> (md, txt) |
dora docs search <query> |
Search documentation content | --limit N (default: 20) |
dora docs show <path> |
Show document metadata | --content (include full content) |
| Command | Description | Common Flags |
|---|---|---|
dora cycles |
Find bidirectional dependencies | --limit N (default: 50) |
dora coupling |
Find tightly coupled files | --threshold N (default: 5) |
dora complexity |
Show complexity metrics | --sort <metric> |
dora treasure |
Most referenced files | --limit N (default: 10) |
dora lost |
Find unused symbols | --limit N (default: 50) |
dora leaves |
Find leaf nodes | --max-dependents N |
| Command | Description | Common Flags |
|---|---|---|
dora schema |
Show database schema | - |
dora cookbook show [recipe] |
Query pattern cookbook | quickstart, methods, refs, exports |
dora query "<sql>" |
Execute raw SQL (read-only) | - |
dora changes <ref> |
Git impact analysis | - |
dora exports <target> |
List exported symbols | - |
dora imports <path> |
Show file imports | - |
dora graph <path> |
Dependency graph | --depth N, --direction |
- scip-typescript: TypeScript, JavaScript
- scip-java: Java, Scala, Kotlin
- rust-analyzer: Rust
- scip-clang: C++, C
- scip-ruby: Ruby
- scip-python: Python
- scip-dotnet: C#, Visual Basic
- scip-dart: Dart
- scip-php: PHP
All commands output valid JSON to stdout. Errors go to stderr with exit code 1.
For debug logging, testing, building, and development instructions, see CONTRIBUTING.md.
| Issue | Solution |
|---|---|
| Database not found | Run dora index to create the database |
| File not in index | Check if file is in .gitignore, run dora index |
| Stale results | Run dora index to rebuild |
| Slow queries | Use --depth 1 when possible, reduce --limit |
| Symbol not found | Ensure index is up to date: dora status, then dora index |
| dora command not found | Ensure dora is in PATH: which dora, reinstall if needed |
Claude Code index not updating:
- Check
/tmp/dora-index.logfor errors - Verify dora is in PATH:
which dora - Test manually:
dora index - Ensure
dora indexis in theallowpermissions list in.claude/settings.json
Stop hook not firing:
- Verify
.claude/settings.jsonsyntax is correct (valid JSON) - Check that the hook runs by viewing verbose logs
- Try manually running the hook command
Want to see indexing progress:
- Edit
.claude/settings.jsonStop hook - Change command to:
"DEBUG=dora:* dora index 2>&1 || true"(removes background&) - You'll see progress after each turn, but will wait 15-30s
Index takes too long:
- Run SCIP indexer separately if it supports caching
- Use background indexing mode in Claude Code integration
- Check if your SCIP indexer can be optimized
Queries are slow:
- Use
--depth 1instead of deep traversals - Reduce
--limitfor large result sets - Ensure database indexes are created (automatic)
- Run
dora indexif database is corrupted
Contributions are welcome! For development setup, testing, building binaries, and code style guidelines, see CONTRIBUTING.md.
Quick start:
- Fork the repository
- Create a feature branch
- Make your changes with tests (
bun test) - Submit a pull request
For detailed architecture and development guidelines, see CLAUDE.md.
MIT
- AI Agent Integration: AGENTS.md - Integration guides for Claude Code, OpenCode, Cursor, Windsurf
- GitHub: https://github.com/butttons/dora
- SCIP Protocol: https://github.com/sourcegraph/scip
- Claude Code: https://claude.ai/code

