See what depends on what.
TraceDeck is a dependency explorer and change-impact analyzer for JavaScript, TypeScript, and mixed-language repositories. Know what might break before you change it.
Analysis stays on this device. No account required to use the app.
No telemetry, no sync, no uploads. The Electron session cancels every outbound request that is not a local file.
No CDNs, no model APIs, no grammar downloads. Everything the analysis needs ships in the application.
The same repository produces the same graph, the same findings, and the same scores. Every number is arithmetic you can trace.
Every view, in one place.
Seven workspaces, each with its evidence attached. Pick one — no scrolling required.
Graph & impact
Select any file or symbol and the inspector shows its dependents, its dependencies, and a change impact score built from six weighted factors — each one shown, so you can see how the number was reached.
- Blast radius walks reverse edges breadth-first and explains the shortest path to each affected file.
- Filters for focus neighbourhood, folder prefix, node type and edge type, including hiding type-only edges.
- Call-graph slice restricts the canvas to
calledges and symbol nodes. - Saved views, collapse barrels, minimap, PNG and SVG export.
- Soft and hard node limits (1,500 / 5,000) keep interaction responsive.
Change Review
Compare the working tree against HEAD without modifying Git state. TraceDeck extracts normalized snapshots from both sides, compares structural evidence, and computes possible impact along the graph.
- Paginated evidence: files, edges, findings, violations, cycles, reachable exports, affected files, candidate tests.
- Freshness model —
current,stale,incompatible. - Drill down from any row into the graph overlay, source diff, finding, or rule.
- Export as Markdown from the app, or text, JSON, Markdown and HTML from the CLI.
Findings
Ten finding types, each saying where it came from and what it does not know. Dismissals are keyed by a content fingerprint rather than a line number, so editing above a finding does not resurrect a dismissal.
- Cycles from Tarjan's SCC, iterative — no stack overflow on deep chains.
- Unused exports are candidates, never confirmed dead code.
- Type errors come from the TypeScript compiler itself, opt-in.
- Architecture violations are the tenth type, declared as glob rules.
getPreEmitDiagnostics. Opt-in, needs a tsconfig, and the only check that proves code is broken.
ERROR nodes, across every inventoried text file.
Dashboard & Explorer
One screen for the whole repository, and one for every file in it.
- Dashboard: counts for files, symbols and edges, every finding type at a glance, working-tree impact against HEAD, dependency licences, and files ranked by change impact score.
- Explorer: the full filesystem inventory, not just graph sources — kind filters, exported-only, recents, and project text search.
Metrics & architecture
Structural measurements, and the boundaries you decide to enforce.
- Metrics: fan-in/fan-out per folder, Martin instability and abstractness, cyclomatic complexity, nesting depth, simplified LCOM, and a 90-day git churn heatmap.
- Architecture: glob rules with exception patterns and severity, built-in packs (layered, client-server, no-tests-from-src), a forbidden-import matrix, and a layer diagram.
- Bars are counts, not grades.
Editor & Git
Enough editor to fix what you found. Not an IDE, and not a Git client.
Editor
- Monaco, with the TypeScript semantic checker off on purpose.
- Explicit unlock, no auto-save.
Ctrl/Cmd+S saves only while unlocked. - Atomic save: temp file, then rename. UTF-8 only, hash-checked.
- Gutter markers for conflicts, syntax, type and unresolved findings, todos and complexity.
F8cycles findings in the file. - Indent from EditorConfig; format with the project's Prettier if present.
Git — local, read-only
- Shells out locally for read-only helpers. Never writes to your Git state.
- Working-tree changes against
HEAD. - Unified diff, blame, co-change, recent renames, 90-day churn.
- Opens your system mergetool.
- Dashboard git-impact card: changed paths plus dependents and candidate tests.
Reports & themes
Export what you found to a location you pick, and read it in whichever theme suits you.
- Markdown, JSON, or one standalone HTML file with no scripts, no external assets, no fonts and no images.
- Scope a report to the project, a file or symbol, or a single finding type.
- Four themes: TraceDeck Dark, Cursor Dark, VS Code Dark, VS Code Light.
- Hovering a graph node does nothing, on purpose — highlighting is bound to click, to avoid a photosensitivity hazard from full-canvas flashing.
The same analysis, headless.
Run a scan in CI or from a script. Results go to <root>/.tracedeck/cli.sqlite,
and --fail-on returns a non-zero exit code when a listed finding type matches.
- SARIF output for CI integration.
- Baseline support — ignore known fingerprints, or write a new baseline.
- Change Review from the CLI, in text, JSON, Markdown or HTML.
npm run scan -- [path] [--full] \
[--fail-on type,type] \
[--format text|json|sarif] \
[--baseline file] [--write-baseline]
npm run scan -- [path] --review \
[--review-format text|json|markdown|html] \
[--review-output file] \
[--review-traversal-depth 1-25]
The analysis has nowhere to send your code.
This is not a policy promise. It is how the application is built.
| Control | How it is enforced |
|---|---|
| Outbound network | The Electron session cancels every outbound request that is not a local file or the Vite dev server. |
| Content-Security-Policy | Restricts connect-src, script-src and frame-src. |
| Renderer capabilities | No Node.js, no filesystem, no database access. It can only call an explicit allowlist of IPC channels. |
| Electron hardening | contextIsolation: true, nodeIntegration: false, sandbox: true, webviewTag: false. |
| Telemetry | None. No analytics, crash reporting, update check, or sync. |
| Database location | The OS application-data directory — not inside your repository. |
| Source writes | Only on explicit save of a file you have unlocked. |
| Report writes | Only to a location you pick in a native save dialog. |
This page follows the same stance: no tracking scripts, no analytics, no cookies, and no externally hosted fonts or assets.
Two parsers, one graph.
| Parser | Extensions |
|---|---|
| TypeScript Compiler API |
.ts .tsx .mts .cts .js .jsx .mjs .cjs, plus <script> in .vue .svelte .astro |
| tree-sitter | .html .htm .css .scss .sass .less .py .go .rs, plus Vue, Svelte and Astro template and style regions |
Package-root rewrites for Go (go.mod), Python
(pyproject.toml / setup.cfg) and Rust
(Cargo.toml).
What TraceDeck cannot tell you.
Static analysis only. It cannot find runtime errors, and it never runs your code.
No style analysis, beyond optionally formatting the open buffer with your project's Prettier. No language server, no IntelliSense, and no go-to-definition across a project.
Change-impact scores are a weighted sum over the dependency graph. They are not calibrated against incident data, and not a judgement about code quality.
Computed dynamic imports such as import(`./mods/${name}`) have no statically knowable target. Namespace imports consume a module's whole surface, so individual symbol usage is unknown.
Python, Go, Rust, HTML, CSS and Sass contribute import-like edges to the graph, but have no unused-export surface.
Call edges come from conservative extraction. This is not a points-to analysis or class hierarchy analysis.
Because the app makes no network requests, it cannot fetch a vulnerability database or rank findings against any external source.