[--json]` | Tokens per query: compact output vs full chunks vs reading the files whole |
| `void stats [--project ] [--days ] [--json]` | Token savings statistics |
| `void claudeignore [--dry-run] [--force]` | Generate `.claudeignore` optimized for tech stack |
**Flags:** `--wsl` (WSL paths), `--daemon` (connect to daemon), `--compare` (compare snapshots), `--cross-project` (inter-project deps), `--label ` (tag snapshot)
### MCP-only tools (Claude Desktop / Claude Code / OpenCode)
These aren't CLI commands — they're exposed by `void-stack-mcp`:
| Tool | Description |
|------|-------------|
| `get_chunk` | Expand a compact search hit: lines `line_start..=line_end` of a file |
| `watch_project` / `unwatch_project` | Auto re-index on file changes (~500 ms debounce) |
| `install_index_hook` | Install a `post-commit` hook that re-indexes changed files |
| `build_structural_graph` | Tree-sitter call graph across 14 languages — Rust, Python, JS, TS, Go, Dart, Java, PHP, C, C++, Elixir, C#, Swift, GDScript + MQL4/MQL5 (`--features structural`) |
| `get_impact_radius` | Blast-radius BFS — who/what is affected by changes to a file |
| `query_graph` | Callers / callees / tests / fuzzy-search over the structural graph |
| `full_analysis` | Combined audit + architecture + semantic hot-spots in one report (quick/standard/deep) |
| `manage_suppressions` | List / add / remove audit suppression rules without editing files manually |
| `setup_project` | One-click onboarding: register + generate ignores + index + audit + analyze |
> Structural analysis inspired by [code-review-graph](https://github.com/tirth8205/code-review-graph) (MIT).
## TUI Dashboard
```bash
void-tui # All projects
void-tui my-project # Specific project
void-tui --daemon # Via daemon
```
| Key | Action |
|-----|--------|
| `a` | Start all services |
| `s` | Start selected service |
| `k` | Stop selected service |
| `K` | Stop all |
| `1`-`5` | Switch tab (Services/Analysis/Security/Debt/Space) |
| `R` | Run action (analyze, audit, scan) on current tab |
| `j`/`↓` | Navigate down |
| `l` | Toggle log panel |
| `Tab` | Switch panel |
| `r` | Refresh status |
| `L` | Toggle language (ES/EN) |
| `?` | Help |
| `q` | Quit (stops services) |
**i18n:** Spanish (default) and English. Press `L` to toggle.
**Tabs:** Services (manage/monitor), Analysis (architecture pattern, layers, anti-patterns, complexity + coverage cross-ref), Security (risk score, vulnerability findings), Debt (TODO/FIXME/HACK markers), Space (project + global disk usage)
## Desktop (Tauri)
Desktop app with a four-zone shell (topbar + rail), a ⌘K command palette, and a project intelligence pulse line. Panels are grouped into **Run** (services, logs, docker), **Intelligence** (search, review, tests, dead code, analysis, security, debt), **Map** (graph, diagrams, stats) and **Project** (deps, docs, space).
- **Topbar**: Project picker with inline rename/move (preserves indexes) and quick-add, ⌘K command palette (services + actions + semantic-search fallback), index/graph freshness vitals (click to rebuild the graph), language toggle (ES/EN)
- **Pulse line**: One-line project intelligence — review findings, suggested/uncovered tests, dead-code count, audit risk — fetched in parallel and cached per project
- **Services**: Card grid with status dot, lang badge, port link (opens in browser), uptime, last log line, start/stop and remove; ghost "add service" card
- **Logs**: Structured viewer (level filters, search, follow mode, wrap/raw toggles, "impact" on error lines with a detected path) plus a collapsible drawer under the service grid
- **Search**: Semantic search, GraphRAG (semantic + structural call-graph) and cross-project GraphRAG from the UI; results open in your editor at the line
- **Graph**: In-app interactive dependency-graph viewer (Cytoscape) — node size by importance, neighborhood highlight, layout switcher, color-by layer/community; click a file to open it in VS Code / Cursor / Windsurf
- **Diagrams**: Mermaid + native Draw.io XML rendering (custom SVG renderer with DOMPurify) for architecture, API routes, DB models
- **Analysis / Security / Debt**: Architecture patterns, anti-patterns, complexity, coverage; risk score, vulnerability/secret findings; metric snapshots with trend comparison
- **Docs / Disk Space / Docker**: Markdown docs; scan + clean caches; parse/generate Docker artifacts and detect Terraform/Kubernetes/Helm
- **UX**: Geist + JetBrains Mono typography, focus-visible rings, reduced-motion support, educational tooltips, copy buttons
## MCP Server (AI Integration)
Lets Claude Desktop, Claude Code, or OpenCode manage your projects directly.
**Windows** — Add to `%APPDATA%\Claude\claude_desktop_config.json`:
```json
{
"mcpServers": {
"void-stack": {
"command": "void-stack-mcp.exe"
}
}
}
```
**macOS** — Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"void-stack": {
"command": "/Users/YOUR_USERNAME/.cargo/bin/void-stack-mcp"
}
}
}
```
**Linux** — Add to `~/.config/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"void-stack": {
"command": "void-stack-mcp"
}
}
}
```
**OpenCode** (free models — no API key required) — Add to `~/.config/opencode/opencode.json`:
```json
{
"mcp": {
"void-stack": {
"type": "local",
"command": ["void-stack-mcp"],
"enabled": true
}
}
}
```
> On macOS use the full path: `["~/.cargo/bin/void-stack-mcp"]`
> **OpenCode advantage:** Works with free models (MiniMax, Qwen, DeepSeek) — zero API cost, full void-stack MCP integration.
> **macOS note:** Claude Desktop and OpenCode launch with a minimal PATH that doesn't include `~/.cargo/bin`. Use the **full absolute path** to the binary. Run `which void-stack-mcp` in Terminal to get it. Also remove the quarantine flag or macOS will silently block the binary:
> ```bash
> xattr -d com.apple.quarantine ~/.cargo/bin/void-stack-mcp
> ```
### Remote clients: streamable HTTP (`--http`)
Every config above spawns the server over **stdio** — one process per client,
on the same machine. `--http` serves the *same* tools over MCP streamable
HTTP instead, so clients on another machine (or inside WSL) share one server
and one project registry:
```bash
void-stack-mcp --http 127.0.0.1:7400 # localhost only
void-stack-mcp --http 7400 # same thing, bare port = loopback
void-stack-mcp --http 0.0.0.0:7400 # reachable from your tailnet/LAN
```
Register it from any MCP client that speaks HTTP — both `/` and `/mcp` work:
```bash
claude mcp add --transport http void-stack http://localhost:7400
```
Typical use: run the server on Windows and consume it from WSL (with
`networkingMode=mirrored`, `localhost` crosses over) or from another machine
over Tailscale — the tools keep reading the registry of the host they run on,
so all clients see the same projects.
> **No authentication.** The HTTP transport has none by design: whoever can
> reach the port gets full access to your projects. Keep it on loopback or a
> tailnet — the server logs a warning at startup when the bind address is
> neither loopback nor a Tailscale range (`100.64.0.0/10`,
> `fd7a:115c:a1e0::/48`). Don't expose it to the open internet; put Tailscale
> (or an authenticating reverse proxy) in front of it.
>
> One process serves stdio **or** HTTP, not both. Run a second process if you
> want both at once.
### Fewer tools, fewer tokens (`--tools`)
Every client receives the definition of every tool in its context: all 75
are 55,147 characters per session. Expose only what a client needs with a
profile, a comma-separated list of tool names, or both — `--tools context`
cuts tool definitions per session by 64 % (55,147 → 20,025 characters):
```bash
void-stack-mcp --tools context # 20 code-context tools, 20,025 characters
void-stack-mcp --tools devops,get_chunk # services + one extra tool
VOID_STACK_MCP_TOOLS=review void-stack-mcp
```
Profiles: `context` (map, entry points, search, graph, contracts, docs),
`devops` (projects, services, logs, dependencies, Docker), `review` (audit,
analysis, debt, diff review, board). Default and `full`: every tool.
In a client config, pass the profile in `args`:
```json
{
"mcpServers": {
"void-stack": {
"command": "void-stack-mcp",
"args": ["--tools", "context"]
}
}
}
```
**Available tools (75):** `list_projects`, `project_status`, `start_project`, `stop_project`, `start_service`, `stop_service`, `get_logs`, `add_project`, `read_project_docs`, `read_all_docs`, `read_project_file`, `list_project_files`, `generate_diagram`, `check_dependencies`, `analyze_project`, `audit_project`, `remove_project`, `update_project`, `scan_directory`, `add_service`, `update_service`, `remove_service`, `save_debt_snapshot`, `list_debt_snapshots`, `compare_debt`, `analyze_cross_project`, `scan_project_space`, `scan_global_space`, `docker_analyze`, `docker_generate`, `suggest_refactoring`, `generate_claudeignore`, `get_token_stats`, `index_project_codebase`, `semantic_search`, `get_chunk`, `project_map`, `list_entrypoints`, `get_index_stats`, `watch_project`, `unwatch_project`, `install_index_hook`, `build_structural_graph`, `get_impact_radius`, `query_graph`, `generate_voidignore`, `cluster_project_index`, `get_cluster_stats`, `get_communities`, `graph_rag_search`, `find_dead_code`, `review_diff`, `check_env`, `check_contracts`, `suggest_commit_message`, `session_handoff`, `daily_briefing`, `doctor`, `session_context`, `board_list`, `board_add_task`, `board_move_task`, `sync_todos`, `board_archive_done`, `board_history`, `board_timeline`, `commit_detail`, `board_link_task`, `suggest_tests_for_diff`, `get_api_contracts`, `graph_rag_search_cross`, `generate_graph_html`, `full_analysis`, `manage_suppressions`, `setup_project`
## Dependency Detection
| Detector | Checks |
|----------|--------|
| Python | Binary, version, venv, `pip check` |
| Node | Binary, `node_modules` freshness |
| CUDA | `nvidia-smi`, driver, GPU, VRAM, PyTorch |
| Ollama | Binary, API health, downloaded models |
| Docker | Binary, daemon status, compose |
| Rust | `rustc` and `cargo` versions |
| Go | `go version`, `go.mod` presence |
| Flutter | `flutter --version`, `dart --version`, `pubspec.yaml` |
| .env | Compares `.env` vs `.env.example` |
## Code Analysis
```bash
void analyze my-app -o analysis.md
void analyze my-app --compare --label v2.0
void analyze my-app --cross-project
void analyze my-app --best-practices
void analyze my-app --bp-only # Only linters, skip architecture
```
- **Patterns** — MVC, Layered, Clean/Hexagonal with confidence
- **Anti-patterns** — God Class, Circular Dependencies, Fat Controllers, Excessive Coupling
- **Cyclomatic complexity** — Per-function (Python, JS/TS, Go, Dart, Rust)
- **Coverage** — LCOV, Cobertura, Istanbul, Go cover profiles
- **Graphs** — Mermaid diagrams of module relationships
- **Trends** — Historical snapshots with comparison
## Diagrams
```bash
void diagram my-app # Draw.io (default)
void diagram my-app -f mermaid # Mermaid markdown
```
Detects: service architecture, external services (by URL extraction from source code and .env), internal service-to-service calls (localhost cross-referencing by port), API routes with Swagger/OpenAPI enrichment (FastAPI, Flask, Express, gRPC/Protobuf), internal vs public API separation, DB models (SQLAlchemy, Django, Prisma, Sequelize, GORM, Drift, Protobuf messages), Rust crate relationships.
## Architecture
```
void-stack/
├── crates/
│ ├── void-stack-core/ # Core library: models, config, runners, detectors, analyzers
│ ├── void-stack-proto/ # Protobuf definitions + gRPC client
│ ├── void-stack-daemon/ # Daemon with gRPC server (tonic)
│ ├── void-stack-tui/ # Terminal dashboard (ratatui)
│ ├── void-stack-mcp/ # MCP server for AI assistants
│ ├── void-stack-desktop/ # Tauri v2 app (React + TypeScript)
│ └── void-stack-cli/ # CLI interface (clap)
├── example-void-stack.toml
└── CHANGELOG.md
```
## Configuration
### `void-stack.toml` (per project)
```toml
name = "my-fullstack-app"
description = "Full stack app"
project_type = "node"
[hooks]
install_deps = true
[[services]]
name = "backend-api"
command = "npm run dev"
target = "wsl"
working_dir = "./backend"
[[services]]
name = "web-frontend"
command = "npm run dev"
target = "windows"
working_dir = "./frontend"
[[services]]
name = "database"
command = "docker compose up postgres redis"
target = "docker"
[[services]]
name = "cache"
command = "redis:7-alpine"
target = "docker"
[services.docker]
ports = ["6379:6379"]
```
### Global config
All projects are stored in a platform-specific location:
- **Windows:** `%LOCALAPPDATA%\void-stack\config.toml`
- **macOS:** `~/Library/Application Support/void-stack/config.toml`
- **Linux:** `~/.config/void-stack/config.toml`
Each service has an absolute `working_dir`, supporting monorepos and distributed layouts.
## Security
- `.env` is read for **variable names only** — values are never stored or displayed
- Sensitive files (`.env`, `credentials.json`, private keys, `secrets.*`) blocked from analysis and MCP
- Centralized deny-list in `security.rs` covers all file-reading paths
## License
This project is licensed under the [Apache License 2.0](LICENSE). See the LICENSE file for details.