User Guide

How to use the Snapline Hub web interface: dashboard, run history, uploads, run detail, and diff inspection.

Navigation

The sidebar is organized into clear sections:

PagePathPurpose
Dashboard/Pass rate, recent runs, projects and tags overview
Test runs/reportsFull history with search, quick filters, and advanced filters
Import report/uploadUpload JSON manually with optional project and tags
Run detail/reports/:idSuite drill-down, step results, and diff viewer

Dashboard

The dashboard shows aggregate metrics across all stored reports:

The Projects & tags section lists groupings from pushed metadata. Click any chip to open the test runs page with that filter applied.

Recent runs shows the latest reports with project, tags, framework, and result badges. Use View all for the full filterable list.

Test runs — search and filters

The test runs page is designed for finding specific reports quickly without bias toward any single filter.

Search bar

Search across label, project, framework, and tags. Input is debounced (300ms) so typing does not trigger excessive API calls.

Quick filters

One-click presets at the top:

PresetEffect
All runsClear filters
Node.jsTag filter: node
PythonTag filter: python
Failed onlyRuns with at least one failed suite
Last 7 / 30 daysDate range from today backward

Active filter chips

When filters are applied, chips appear below the search bar showing exactly what is active. Click a chip to remove that filter, or use Clear all.

Advanced filters

Expand Advanced filters for project, framework, status, date range, and tag selection. When multiple tags are selected, choose:

Columns

ColumnSource
Runlabel or truncated ID
Projectproject metadata from push/upload
Tagstags[] — click a tag to filter
Frameworkreport.framework
Passed / failedsummary.passed / summary.failed
DategeneratedAt

Import report

Upload a TestRunReport JSON file when you are not pushing programmatically. Optionally set project and tags before upload — they are stored as searchable metadata.

Accepted format

The file must be a valid TestRunReport JSON object. Minimum required fields:

{
  "generatedAt": "2026-07-07T10:00:00.000Z",
  "framework": "@vaagatech/snapline-engine",
  "summary": { "total": 1, "passed": 1, "failed": 0 },
  "suites": [
    {
      "name": "My suite",
      "passed": true,
      "results": [{ "step": "api", "passed": true }]
    }
  ]
}

How to upload

  1. Drag a .json file onto the drop zone, or click to open a file picker
  2. Hub parses and validates the JSON
  3. On success, the label defaults to the filename (without .json)
  4. You are redirected to the run detail page

Common upload errors

ErrorCauseFix
Invalid JSONFile is not valid JSONValidate with jq . file.json
Invalid TestRunReportMissing generatedAt, framework, summary, or suitesEnsure file was produced by writeTestReport with format: 'json'
HTML file uploadedUploaded .html report instead of JSONUse REPORT_FORMAT=json or convert is not supported — regenerate as JSON

Run Detail

Each stored report has a unique UUID. The detail page shows:

Header

Summary cards

Total suites, passed count, failed count, and duration (summary.durationMs).

Environment

If the report includes an environment object (set via buildReport meta), each key-value pair is displayed — e.g. baseUrl, reportFormat, suiteName, CI build IDs you add yourself.

Failures section

When any step failed, a highlighted Failures section appears at the top listing every failed step across all suites, with full diff blocks. This lets you diagnose issues without expanding each suite manually.

Suites

Each suite is a collapsible card:

Failed suites are expanded by default. Passed suites are collapsed. Click the header to toggle.

Understanding step results

Each step in a suite maps to a TestStepResult:

FieldMeaning
stepStep or case identifier — e.g. auth, api, 01-pass-customer-account
passedWhether this step succeeded
messageHuman-readable outcome (optional)
diffStructured mismatch on failure (see below)
processedLive data after Snapline transforms (optional)
source / targetCross-system comparison sides (DB↔API, etc.)

Fixture case semantics

For runApiFixtureCases / run_snapline_fixture_cases:

Diff viewer

When a step fails, Hub renders the Snapline DiffResult:

{
  "path": "segment",
  "actual": "premium",
  "expected": "standard",
  "message": "Value mismatch"
}
Note: Snapline returns the first mismatch only, not a full diff tree. For row-level warehouse comparisons, see per-table step messages and optional JSONL stream reports in Snapline docs.

Labels

Labels help identify runs in the UI. Set them when pushing:

// Node.js
await pushTestReportToHub(report, { hubUrl: '...', label: 'CI build #4821' });

// Python
push_test_report_to_hub(report, hub_url='...', label='CI build #4821')

// Env
SNAPLINE_HUB_LABEL="nightly-$(date +%Y%m%d)" SNAPLINE_HUB_URL=... npm run demo

When uploading, the filename (without extension) becomes the label.

Deleting reports

On the run detail page, click Delete and confirm. This removes the report from SQLite permanently. There is no undo.

API equivalent: DELETE /api/reports/:id — see API Reference.