writing-vite-devtools-integrations
Creates devtools integrations for Vite using @vitejs/devtools-kit. Use when building Vite plugins with devtools panels, RPC functions, dock entries, shared state, or any devtools-related functionality. Applies to files importing from @vitejs/devtools-kit or containing devtools.setup hooks in Vite plugins.
Install
mkdir -p .claude/skills/writing-vite-devtools-integrations && curl -L -o skill.zip "https://mcp.directory/api/skills/download/4720" && unzip -o skill.zip -d .claude/skills/writing-vite-devtools-integrations && rm skill.zipInstalls to .claude/skills/writing-vite-devtools-integrations
About this skill
Vite DevTools Kit
Build custom developer tools that integrate with Vite DevTools using @vitejs/devtools-kit.
Core Concepts
A DevTools plugin extends a Vite plugin with a devtools.setup(ctx) hook. The context provides:
| Property | Purpose |
|---|---|
ctx.docks | Register dock entries (iframe, action, custom-render, launcher, json-render) |
ctx.views | Host static files for UI |
ctx.rpc | Register RPC functions, broadcast to clients |
ctx.rpc.sharedState | Synchronized server-client state |
ctx.logs | Emit structured log entries and toast notifications |
ctx.terminals | Spawn and manage child processes with streaming terminal output |
ctx.createJsonRenderer | Create server-side JSON render specs for zero-client-code UIs |
ctx.commands | Register executable commands with keyboard shortcuts and palette visibility |
ctx.viteConfig | Resolved Vite configuration |
ctx.viteServer | Dev server instance (dev mode only) |
ctx.mode | 'dev' or 'build' |
Quick Start: Minimal Plugin
/// <reference types="@vitejs/devtools-kit" />
import type { Plugin } from 'vite'
export default function myPlugin(): Plugin {
return {
name: 'my-plugin',
devtools: {
setup(ctx) {
ctx.docks.register({
id: 'my-plugin',
title: 'My Plugin',
icon: 'ph:puzzle-piece-duotone',
type: 'iframe',
url: 'https://example.com/devtools',
})
},
},
}
}
Quick Start: Full Integration
/// <reference types="@vitejs/devtools-kit" />
import type { Plugin } from 'vite'
import { fileURLToPath } from 'node:url'
import { defineRpcFunction } from '@vitejs/devtools-kit'
export default function myAnalyzer(): Plugin {
const data = new Map<string, { size: number }>()
return {
name: 'my-analyzer',
// Collect data in Vite hooks
transform(code, id) {
data.set(id, { size: code.length })
},
devtools: {
setup(ctx) {
// 1. Host static UI
const clientPath = fileURLToPath(
new URL('../dist/client', import.meta.url)
)
ctx.views.hostStatic('/.my-analyzer/', clientPath)
// 2. Register dock entry
ctx.docks.register({
id: 'my-analyzer',
title: 'Analyzer',
icon: 'ph:chart-bar-duotone',
type: 'iframe',
url: '/.my-analyzer/',
})
// 3. Register RPC function
ctx.rpc.register(
defineRpcFunction({
name: 'my-analyzer:get-data',
type: 'query',
setup: () => ({
handler: async () => Array.from(data.entries()),
}),
})
)
},
},
}
}
Namespacing Convention
CRITICAL: Always prefix RPC functions, shared state keys, dock IDs, and command IDs with your plugin name:
// Good - namespaced
'my-plugin:get-modules'
'my-plugin:state'
'my-plugin:clear-cache' // command ID
// Bad - may conflict
'get-modules'
'state'
Dock Entry Types
| Type | Use Case |
|---|---|
iframe | Full UI panels, dashboards (most common) |
json-render | Server-side JSON specs — zero client code needed |
action | Buttons that trigger client-side scripts (inspectors, toggles) |
custom-render | Direct DOM access in panel (framework mounting) |
launcher | Actionable setup cards for initialization tasks |
Iframe Entry
ctx.docks.register({
id: 'my-plugin',
title: 'My Plugin',
icon: 'ph:house-duotone',
type: 'iframe',
url: '/.my-plugin/',
})
Action Entry
ctx.docks.register({
id: 'my-inspector',
title: 'Inspector',
icon: 'ph:cursor-duotone',
type: 'action',
action: {
importFrom: 'my-plugin/devtools-action',
importName: 'default',
},
})
Custom Render Entry
ctx.docks.register({
id: 'my-custom',
title: 'Custom View',
icon: 'ph:code-duotone',
type: 'custom-render',
renderer: {
importFrom: 'my-plugin/devtools-renderer',
importName: 'default',
},
})
JSON Render Entry
Build UIs entirely from server-side TypeScript — no client code needed:
const ui = ctx.createJsonRenderer({
root: 'root',
elements: {
root: {
type: 'Stack',
props: { direction: 'vertical', gap: 12 },
children: ['heading', 'info'],
},
heading: {
type: 'Text',
props: { content: 'Hello from JSON!', variant: 'heading' },
},
info: {
type: 'KeyValueTable',
props: {
entries: [
{ key: 'Version', value: '1.0.0' },
{ key: 'Status', value: 'Running' },
],
},
},
},
})
ctx.docks.register({
id: 'my-panel',
title: 'My Panel',
icon: 'ph:chart-bar-duotone',
type: 'json-render',
ui,
})
Launcher Entry
const entry = ctx.docks.register({
id: 'my-setup',
title: 'My Setup',
icon: 'ph:rocket-launch-duotone',
type: 'launcher',
launcher: {
title: 'Initialize My Plugin',
description: 'Run initial setup before using the plugin',
buttonStart: 'Start Setup',
buttonLoading: 'Setting up...',
onLaunch: async () => {
// Run initialization logic
},
},
})
Terminals & Subprocesses
Spawn and manage child processes with streaming terminal output:
const session = await ctx.terminals.startChildProcess(
{
command: 'vite',
args: ['build', '--watch'],
cwd: process.cwd(),
},
{
id: 'my-plugin:build-watcher',
title: 'Build Watcher',
icon: 'ph:terminal-duotone',
},
)
// Lifecycle controls
await session.terminate()
await session.restart()
A common pattern is combining with launcher docks — see Terminals Patterns.
Commands & Command Palette
Register executable commands discoverable via Mod+K palette:
import { defineCommand } from '@vitejs/devtools-kit'
ctx.commands.register(defineCommand({
id: 'my-plugin:clear-cache',
title: 'Clear Build Cache',
icon: 'ph:trash-duotone',
keybindings: [{ key: 'Mod+Shift+C' }],
when: 'clientType == embedded',
handler: async () => { /* ... */ },
}))
Commands support sub-commands (two-level hierarchy), conditional visibility via when clauses, and user-customizable keyboard shortcuts.
See Commands Patterns and When Clauses for full details.
Logs & Notifications
Plugins can emit structured log entries from both server and client contexts. Logs appear in the built-in Logs panel and can optionally show as toast notifications.
Fire-and-Forget
// No await needed
context.logs.add({
message: 'Plugin initialized',
level: 'info',
})
With Handle
const handle = await context.logs.add({
id: 'my-build',
message: 'Building...',
level: 'info',
status: 'loading',
})
// Update later
await handle.update({
message: 'Build complete',
level: 'success',
status: 'idle',
})
// Or dismiss
await handle.dismiss()
Key Fields
| Field | Type | Description |
|---|---|---|
message | string | Short title (required) |
level | 'info' | 'warn' | 'error' | 'success' | 'debug' | Severity (required) |
description | string | Detailed description |
notify | boolean | Show as toast notification |
filePosition | { file, line?, column? } | Source file location (clickable) |
elementPosition | { selector?, boundingBox?, description? } | DOM element position |
id | string | Explicit id for deduplication |
status | 'loading' | 'idle' | Shows spinner when loading |
category | string | Grouping (e.g., 'a11y', 'lint') |
labels | string[] | Tags for filtering |
autoDismiss | number | Toast auto-dismiss time in ms (default: 5000) |
autoDelete | number | Auto-delete time in ms |
The from field is automatically set to 'server' or 'browser'.
Deduplication
Re-adding with the same id updates the existing entry instead of creating a duplicate:
context.logs.add({ id: 'my-scan', message: 'Scanning...', level: 'info', status: 'loading' })
context.logs.add({ id: 'my-scan', message: 'Scan complete', level: 'success', status: 'idle' })
RPC Functions
Server-Side Definition
import { defineRpcFunction } from '@vitejs/devtools-kit'
const getModules = defineRpcFunction({
name: 'my-plugin:get-modules',
type: 'query', // 'query' | 'action' | 'static'
setup: ctx => ({
handler: async (filter?: string) => {
// ctx has full DevToolsNodeContext
return modules.filter(m => !filter || m.includes(filter))
},
}),
})
// Register in setup
ctx.rpc.register(getModules)
Client-Side Call (iframe)
import { getDevToolsRpcClient } from '@vitejs/devtools-kit/client'
const rpc = await getDevToolsRpcClient()
const modules = await rpc.call('my-plugin:get-modules', 'src/')
Client-Side Call (action/renderer script)
import type { DevToolsClientScriptContext } from '@vitejs/devtools-kit/client'
export default function setup(ctx: DevToolsClientScriptContext) {
ctx.current.events.on('entry:activated', async () => {
const data = await ctx.current.rpc.call('my-plugin:get-data')
})
}
Client Context
The global client context (DevToolsClientContext) provides access to the RPC client and is set automatically when DevTools initializes (embedded or standalone). Use getDevToolsClientContext() to access it from anywhere on the client side:
import { getDevToolsClientContext } from '@vitejs/devtools-kit/client'
const ctx = getDevToolsClientContext()
if (ctx) {
const modules = await ctx.rpc.call('my-plugin:get-modules')
}
Broadcasting to Clients
// Server broadcasts to all clients
ctx.rpc.broadcast({
method: 'my-plugin:on-update',
args: [{ changedFile: '/src/main.ts' }],
})
Type Safety
Extend the DevToo
Content truncated.
You might also like
flutter-development
aj-geddes
Build beautiful cross-platform mobile apps with Flutter and Dart. Covers widgets, state management with Provider/BLoC, navigation, API integration, and material design.
drawio-diagrams-enhanced
jgtolentino
Create professional draw.io (diagrams.net) diagrams in XML format (.drawio files) with integrated PMP/PMBOK methodologies, extensive visual asset libraries, and industry-standard professional templates. Use this skill when users ask to create flowcharts, swimlane diagrams, cross-functional flowcharts, org charts, network diagrams, UML diagrams, BPMN, project management diagrams (WBS, Gantt, PERT, RACI), risk matrices, stakeholder maps, or any other visual diagram in draw.io format. This skill includes access to custom shape libraries for icons, clipart, and professional symbols.
ui-ux-pro-max
nextlevelbuilder
"UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 8 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient."
godot
bfollington
This skill should be used when working on Godot Engine projects. It provides specialized knowledge of Godot's file formats (.gd, .tscn, .tres), architecture patterns (component-based, signal-driven, resource-based), common pitfalls, validation tools, code templates, and CLI workflows. The `godot` command is available for running the game, validating scripts, importing resources, and exporting builds. Use this skill for tasks involving Godot game development, debugging scene/resource files, implementing game systems, or creating new Godot components.
nano-banana-pro
garg-aayush
Generate and edit images using Google's Nano Banana Pro (Gemini 3 Pro Image) API. Use when the user asks to generate, create, edit, modify, change, alter, or update images. Also use when user references an existing image file and asks to modify it in any way (e.g., "modify this image", "change the background", "replace X with Y"). Supports both text-to-image generation and image-to-image editing with configurable resolution (1K default, 2K, or 4K for high resolution). DO NOT read the image file first - use this skill directly with the --input-image parameter.
fastapi-templates
wshobson
Create production-ready FastAPI projects with async patterns, dependency injection, and comprehensive error handling. Use when building new FastAPI applications or setting up backend API projects.
Related MCP Servers
Browse all serversUse Chrome DevTools for web site test speed, debugging, and performance analysis. The essential chrome developer tools f
Control Chrome remotely, capture screenshots, and monitor network traffic using Chrome Tools with seamless remote access
Placid Image Generator creates dynamic images from templates using Placid's API—ideal for social media posts and marketi
Learning Hour Generator creates 60-minute technical practice sessions for dev teams using GitHub analysis and the 4C Lea
Bridge AI assistants with APIs and integration easily using Superface, the platform for risk management API integration
MusicMCP.AI — AI music generator that creates songs and musical content within conversations using advanced music-genera
Stay ahead of the MCP ecosystem
Get weekly updates on new skills and servers.