Skip to main content

How to Connect to the LiveDoc Viewer

This guide shows you how to send test results to the LiveDoc Viewer web UI for real-time visualization. By the end, you'll see your features, scenarios, and steps in an interactive browser dashboard as tests execute.

Prerequisites
  • A working LiveDoc Vitest setup (imports or globals)
  • @swedevtools/livedoc-viewer installed (globally or locally)

Overview

The LiveDoc Viewer is a web application that visualizes your test results in real time. LiveDocSpecReporter automatically discovers a running viewer and publishes results — no extra configuration needed. For explicit control, you can use LiveDocViewerReporter as a post-reporter. The viewer renders your Gherkin features as an interactive, navigable tree.

Step 1: Install the Viewer

npm install -g @swedevtools/livedoc-viewer

Or add it as a dev dependency:

npm install -D @swedevtools/livedoc-viewer

Step 2: Start the Viewer

livedoc-viewer

The viewer opens at http://localhost:3100 and waits for incoming test results.

tip

In the LiveDoc monorepo, use the convenience script instead:

./scripts/start-viewer.ps1 -KillStale

Step 3: Configure the Reporter (Auto-Discovery)

The simplest approach is just LiveDocSpecReporter — it automatically discovers a running viewer on your machine. No extra reporter needed:

// vitest.config.ts
import { defineConfig } from 'vitest/config';
import { LiveDocSpecReporter } from '@swedevtools/livedoc-vitest/reporter';

export default defineConfig({
test: {
reporters: [
new LiveDocSpecReporter({ detailLevel: 'spec+summary+headers' }),
// Auto-discovers a running LiveDoc server automatically
],
},
});

If no viewer is running, the reporter silently continues with console-only output — your tests still run normally.

Step 4: Run Your Tests

npx vitest run

Results appear in the viewer automatically. If running in watch mode (npx vitest), the viewer updates on every test re-run.

Complete Example

// vitest.config.ts
import { defineConfig } from 'vitest/config';
import { LiveDocSpecReporter } from '@swedevtools/livedoc-vitest/reporter';

export default defineConfig({
test: {
globals: true,
include: ['**/*.Spec.ts'],
reporters: [
new LiveDocSpecReporter({ detailLevel: 'spec+summary+headers' }),
],
},
});
// tests/ShoppingCart.Spec.ts
import {
feature, scenario, given, when, Then as then,
} from '@swedevtools/livedoc-vitest';

feature(`Shopping Cart @checkout
Core cart operations displayed in the viewer.
`, () => {

scenario("Add item to cart", () => {
given("an empty cart", () => { /* setup */ });
when("the user adds 'Widget' to the cart", (ctx) => {
const item = ctx.step.values[0];
// add item
});
then("the cart contains '1' item", (ctx) => {
const count = ctx.step.values[0];
// assert
});
});
});

Run tests and open http://localhost:3100 to see the results tree.

Common Variations

Explicit Configuration

Specify the viewer URL and project metadata directly using LiveDocViewerReporter as a post reporter:

import {
LiveDocSpecReporter,
LiveDocViewerReporter,
} from '@swedevtools/livedoc-vitest/reporter';

export default defineConfig({
test: {
reporters: [
new LiveDocSpecReporter({
detailLevel: 'spec+summary+headers',
postReporters: [
new LiveDocViewerReporter({
server: 'http://localhost:3100',
project: 'my-project',
environment: 'local',
}),
],
}),
],
},
});

Viewer Reporter Options

OptionDefaultDescription
server'http://localhost:3100'Viewer server URL
project'default'Project name for grouping results
environment'local'Environment label (e.g., 'ci', 'staging')
timeout5000HTTP request timeout in milliseconds
silenttrueFail silently if the viewer is unavailable

Multiple Reporters Together

Combine console output, JSON export, and viewer integration:

import {
LiveDocSpecReporter,
JsonReporter,
LiveDocViewerReporter,
} from '@swedevtools/livedoc-vitest/reporter';

export default defineConfig({
test: {
reporters: [
new LiveDocSpecReporter({
detailLevel: 'spec+summary+headers',
postReporters: [
new JsonReporter(),
new LiveDocViewerReporter({ server: 'http://localhost:3100' }),
],
'json-output': './test-results/results.json',
}),
],
},
});

VS Code Compatibility

The VS Code Vitest extension can conflict with custom reporters. Detect the environment and fall back:

const isVSCodeVitest = !!(
process.env.VITEST_VSCODE ||
process.env.VSCODE_PID ||
process.env.VSCODE_IPC_HOOK
);

export default defineConfig({
test: {
reporters: isVSCodeVitest
? undefined
: [
new LiveDocSpecReporter({ detailLevel: 'spec+summary+headers' }),
],
},
});

Troubleshooting

ProblemCauseSolution
Viewer shows no resultsReporter not configured or server not discoveredAdd LiveDocSpecReporter to config — it auto-discovers a running server
Connection refusedViewer not runningStart the viewer with livedoc-viewer before running tests
Results don't update in watch modeStale viewer sessionRefresh the browser or restart the viewer
Port conflict on 3100Another process using the portUse ./scripts/start-viewer.ps1 -KillStale or change the viewer port
No output in VS CodeCustom reporter conflictsUse the VS Code environment detection pattern above
Want explicit controlAuto-discovery not desiredUse LiveDocViewerReporter as a post-reporter with explicit server URL