devuiGuideDemosAPIGitHub

Chrome extension

devui's Chrome extension puts devui on any page that draws with WebGL2 or WebGPU, with no change to the page's code: someone else's demo, a deployed site, or your own app before you've added devui. It runs before the page's own scripts, so every context and device the page makes has a frame scope and capture from its first call.

Installing it

Build it from a checkout of devui, then load it into Chrome:

npm run build:extension
  1. Open chrome://extensions and turn on Developer mode.
  2. Load unpacked, and choose the dist-extension folder.
  3. Pin devui to the toolbar from the puzzle-piece menu.

After a rebuild, press the reload button on devui's card in chrome://extensions.

Or take it built: each push to main keeps the extension with its Release build run on GitHub (the run's devui-chrome-extension artifact, for 90 days). Unzip it and load that folder. Every build is the same extension to Chrome (one ID, wherever it's unpacked), so a newer one loaded over the old keeps the sites you switched on and what devui saved for them. (Don't remove the old one first: that deletes what it kept.) The popup says which build it is: its version, the commit and when.

Switching it on for a site

devui runs nowhere until you switch it on for a site. Click its toolbar button and turn the switch on. Chrome reloads the tab, so devui is there before the page's first script.

Switch it off and the tab reloads without devui.

What it shows

The panel is devui's own, in the page as an app's is. Each WebGL2 or WebGL1 context and WebGPU device the page draws with gets a frame scope (WebGL1's as the frame scope has it: no GPU time, and a capture without pictures), in the Frame folder: its frame scope, metrics, time plot and targets. A page with several shows one at a time: the select at the start of the scope's bar picks which, and the choice is kept for the site (its origin). capture in the scope, the popup's Capture frame, or the palette's commands take a frame capture.

The popup

For the tab it's over: the site's switch, what devui found (each context and device that drew, three.js's revision), and Show panel (or Hide panel) and Capture frame. Alt+Shift+D shows or hides the panel; change it at chrome://extensions/shortcuts. The button's badge says on where devui runs.

The page's keys stay its own: the extension's panel has no H to toggle it or ` to compare, and / (search) and ? (shortcuts) work only while you're working in the panel.

What it keeps

What you'd change in the panel is kept per origin (https://example.com, a port its own: finer than the sites you switch on, each a host's every port and both schemes), once for all its pages, in the extension's own storage, and read back on the next load: the panel's place, open folders and windows, a hidden panel, the views' settings, the context picked. A demo in a frame keeps its own, apart from its site's pages. Two tabs of an origin each keep what they change apart (the context picked, say), but the panel's layout, its values and its presets are each kept whole: the last tab to change one keeps its own. The page's own localStorage is left as the page made it. An origin keeps at most about a megabyte, and only devui's own keys: a page can't fill the extension's storage.

AI agents

The agent tools are in the page, as in an app: await __devui.call('capture_frame'). An agent that drives a browser (Chrome DevTools MCP, Playwright MCP, Claude in Chrome) calls them through it. On a page with several contexts, capture_frame takes the one drawing. A page that draws on demand (a map, a model viewer at rest) draws nothing to capture until it's moved: capture_frame { when: 'work' }, then interact.

Limits