LocalMode
DevTools

Panels

Reference for each DevTools bridge data domain.

Data Domains Reference

DevToolsWidget was removed in v3.0.0

The prebuilt widget and its @localmode/devtools/widget subpath were removed in v3.0.0. Surface these same six data domains in your own UI with the React hooks (@localmode/devtools/react: useDevToolsQueueStats, useDevToolsEvents, and friends), or install the copy-owned ui/devtools family primitives and the composed ui/blocks/devtools-drawer (which reproduces these six tabs). Each domain below maps 1:1 to a hook and to a ui/devtools primitive.

The bridge collects six data domains, surfaced as the six tabs of ui/blocks/devtools-drawer. Updates are instant — hooks subscribe to the bridge directly, with no polling delay.

Models

Shows all loaded models with their status, load times, and last used timestamps. Data comes from embedding and model load events captured by globalEventBus.

ColumnDescription
Model IDThe model identifier (e.g., Xenova/bge-small-en-v1.5)
Statusloaded (green) or error (red)
Load TimeHow long the model took to load (ms)
Last UsedWhen the model was last invoked

VectorDB

Displays aggregated statistics per collection. Data comes from globalEventBus events: add, addMany, search, delete, clear.

ColumnDescription
CollectionVectorDB collection name
AddsTotal add operations
SearchesTotal search operations
DeletesTotal delete operations
Avg SearchAverage search duration (ms)
Last ActivityTimestamp of last operation

Queue

Live inference queue metrics. Register queues with registerQueue() to see them here. Data comes from queue.on('stats') in createInferenceQueue().

import { createInferenceQueue } from '@localmode/core';
import { registerQueue } from '@localmode/devtools';

const queue = createInferenceQueue({ concurrency: 1 });
const unsubscribe = registerQueue('embedding', queue);
ColumnDescription
QueueQueue name
PendingTasks waiting (highlighted when > 0)
ActiveTasks currently running (highlighted when > 0)
CompletedTotal completed tasks
FailedTotal failed tasks
Avg LatencyAverage task duration (ms)

Pipeline

Step execution status with progress tracking. Use createDevToolsProgressCallback() to connect a pipeline:

import { createPipeline } from '@localmode/core';
import { createDevToolsProgressCallback } from '@localmode/devtools';

const pipeline = createPipeline('rag-ingest')
  .step('chunk', chunkFn)
  .step('embed', embedFn)
  .build();

await pipeline.run(input, {
  onProgress: createDevToolsProgressCallback('rag-ingest'),
});

Each pipeline shows: name, status (running/completed/idle), current step, progress bar, and total duration.

Events

Live scrolling stream of all events captured by globalEventBus. Events are displayed newest-first with:

  • Timestamp — When the event occurred
  • Type — Event type (e.g., vectordb:search, embedding:complete)
  • Data — JSON summary of the event payload

Use the filter input to narrow events by type substring (e.g., type "search" to see only search events).

Device

One-time snapshot of browser capabilities from detectCapabilities(). Displays:

  • Browser & Device — Browser name/version, OS, device type, hardware (cores, memory, GPU)
  • Features — Checklist with green checkmark or red X for each feature: WebGPU, WASM, SIMD, Threads, IndexedDB, OPFS, Web Workers, SharedArrayBuffer, Cross-Origin Isolation, Service Worker, BroadcastChannel, Web Locks, Chrome AI, Summarizer API, Translator API

On this page