Inspect Angular component trees, signals, dependency injection, and routes — at dev time, build time, or through a coding agent. Built with Devframe so the same tool runs as an embedded panel, standalone CLI, static report, MCP server, or Chrome DevTools extension.
- Component inspector — discover components, inputs, outputs, and source files
- Signal graph — visualize signal, computed, linkedSignal, effect nodes and their dependency edges (Angular 19+)
- DI inspector — browse the injector hierarchy (element and environment) with providers at each level (Angular 17+)
- Route inspector — list registered routes from source
- Build metadata — Angular version, TypeScript version, SSR status
- Agent-native — all inspectors exposed as MCP tools and resources
- Deep linking — URL hash navigates to a specific tab (
#tab=signals) - Page overlay — highlights components in the running app
npm install @santoshyadavdev/ng-devtools devframeFor MCP agent support, also install the optional peer:
npm install @devframes/agenticAdd the devframe middleware to your Express server:
// server.ts
import { initDevframe } from 'devframe/initiate'
import ngDevtools from '@santoshyadavdev/ng-devtools/devframe'
const devtools = initDevframe(ngDevtools, { base: '/__ng-devtools/' })
app.use(devtools.nodeMiddleware)Open http://localhost:4000/__ng-devtools/ to see the devtools UI.
# Dev server with live RPC
npx @santoshyadavdev/ng-devtools dev
# Static report (offline HTML)
npx @santoshyadavdev/ng-devtools build --outDir dist-report
# MCP server for coding agents
npx @santoshyadavdev/ng-devtools mcpClaude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"ng-devtools": {
"command": "npx",
"args": ["@santoshyadavdev/ng-devtools", "mcp"]
}
}
}VS Code — add to .vscode/mcp.json:
{
"servers": {
"ng-devtools": {
"command": "npx",
"args": ["@santoshyadavdev/ng-devtools", "mcp"]
}
}
}When embedded in Express, the MCP endpoint is also available over HTTP at /__ng-devtools/__mcp.
| Tool | Description |
|---|---|
ng-devtools:get-routes |
List Angular routes from source |
ng-devtools:get-components |
Discover components, inputs, outputs |
ng-devtools:build-meta |
Angular/TS versions, SSR status |
ng-devtools:highlight |
Highlight a component in the page |
ng-devtools:inspect-signals |
Signal graph for a component |
ng-devtools:inspect-providers |
DI providers and resolution path |
| Resource | Content |
|---|---|
ng-devtools:component-tree |
Live component hierarchy |
ng-devtools:signal-graph |
Signal dependency graph |
ng-devtools:injector-tree |
DI injector hierarchy |
Mount as a dock panel inside Vite DevTools:
// vite.config.ts
import { viteDevframeHub } from '@devframes/vite/hub'
import { createUi } from '@devframes/hub-ui'
import ngDevtools from '@santoshyadavdev/ng-devtools/devframe'
export default defineConfig({
plugins: [
viteDevframeHub({
devframes: [ngDevtools],
ui: createUi({ branding: { productName: 'Angular DevTools' } }),
}),
],
})See the Chrome Extension section below for how to package this as a Chrome extension.
The overlay runs inside the user's Angular page and collects live component, signal, and DI data:
import { initOverlay } from '@santoshyadavdev/ng-devtools/overlay'
const dispose = await initOverlay()# Install dependencies
pnpm install
# Dev server for the devtools UI (with live RPC)
pnpm devtools:dev
# Build the devtools UI SPA
pnpm devtools:build
# Build assets into the publishable package
pnpm devtools:build-pkg
# Run the Angular host app
pnpm startThe devtool ships as two npm packages:
| Package | Contents |
|---|---|
@santoshyadavdev/ng-devtools |
Node-side logic, RPC, CLI, overlay |
@santoshyadavdev/ng-devtools-assets |
Built SPA (served at runtime via CDN or local install) |
# Build assets, then publish both
pnpm devtools:publishKeep versions in sync — the tool references the assets package by exact version.
To distribute this as a Chrome DevTools extension, you need a thin Chrome extension shell that opens the devtools UI in a DevTools panel. The built SPA already works standalone — the extension just embeds it.
Create an extension/ directory:
extension/
manifest.json
devtools.html
devtools.js
panel.html
{
"manifest_version": 3,
"name": "Angular DevTools",
"version": "0.0.1",
"description": "Inspect Angular components, signals, DI, and routes.",
"devtools_page": "devtools.html",
"permissions": ["scripting"],
"host_permissions": ["<all_urls>"],
"icons": {
"128": "icon-128.png"
}
}<!-- devtools.html -->
<!doctype html>
<script src="devtools.js"></script>// devtools.js — creates the panel in Chrome DevTools
chrome.devtools.panels.create(
'Angular',
'icon-128.png',
'panel.html'
)This is where the built SPA loads. Copy the built assets (dist/devtools-ui/) into the extension and point panel.html at the SPA's index.html:
<!-- panel.html — the devtools SPA loads here -->
<!doctype html>
<html>
<head><meta charset="utf-8" /></head>
<body>
<iframe src="ui/index.html" style="width:100%;height:100vh;border:none;"></iframe>
</body>
</html># Build the devtools SPA
pnpm devtools:build
# Copy into the extension
mkdir -p extension/ui
cp -r dist/devtools-ui/* extension/ui/- Go to
chrome://extensions - Enable Developer mode
- Click Load unpacked → select the
extension/directory - Open DevTools on any Angular app → the Angular panel appears
- Zip the
extension/directory - Go to the Chrome Developer Dashboard
- Click New item → upload the zip
- Fill in the listing details and submit for review
The extension panel loads the SPA in static mode by default. To connect it to a live dev server for real-time RPC, the extension's content script or background service worker needs to detect the devframe's __connection.json on the inspected page and pass the connection to the panel. This is the same pattern the official Angular DevTools Chrome extension uses — a content script bridges the inspected page and the DevTools panel via chrome.runtime.connect.
MIT