How it works

Runs, tags and the axis

Four ideas cover the whole model. Everything the app shows is derived from your pushes at read time.

The four words

  • Run: one entry of a push; a push carries up to 50.
  • Metric: one number, with a unit and a direction. Both are set the first time the metric is seen, and can be changed in project settings.
  • Tag: a coordinate. Tags identify the run, and they are what you filter, group and compare on.
  • Meta: provenance: commit, CI URL, runner. It never identifies anything.

The rule: if it identifies, it is a tag; if it must not, it is meta.

{ "tags": {"version": "v2.5.0", "platform": "linux-x64"}, "metrics": [{"name": "binary_size", "value": 2.14, "unit": "MB"}], "meta": {"commit": "9f2c1ab", "ci": "…/runs/812"}}identifies · filter · comparethe numbers, one pushprovenance, never identity

Tags are coordinates

Each tag key is a dimension, so a project's runs form a grid. A cell is one run, holding the metrics that push measured.

platform ↓v2.3v2.4v2.5linux-x64cortex-m7runbinary_size 1.98latency_ms 43.1runbinary_size 2.06latency_ms 42.1runbinary_size 2.14latency_ms 41.6runbinary_size 0.21peak_ram 62runbinary_size 0.22peak_ram 63runbinary_size 0.24peak_ram 71axis: version →

The axis is the one tag key the x-axis walks: version by default, chosen with the project and fixed once it has runs; its kind can change in project settings. Hold the other tags fixed and you have a series.

Axis kinds

The axis has a kind, chosen with the project, that decides how its values order. Every push's axis value must parse as that kind; an unparseable one, or a missing one (except text), is a 400.

  • version (default): 1 to 4 numeric parts (2, 1.2.3.4), optionally v-prefixed, with a -, + or . suffix.
  • number: ordered by value.
  • timestamp: an ISO 8601 date or datetime, or epoch milliseconds (13 digits).
  • text: any value, ordered by series time.

The axis key is fixed once the project has runs. A kind change re-parses every stored value at once, or is refused listing the offending values. A project with more than 50,000 stored runs, deleted ones included, can't change kind from settings; ask us and we run it for you.

Filter or axis is up to the query

No tag is a “filter tag” or an “axis tag”. The same grid gives a trend or a comparison depending on which key you walk.

platform ↓v2.3v2.4v2.5linux-x64cortex-m7runbinary_size 1.98latency_ms 43.1runbinary_size 2.06latency_ms 42.1runbinary_size 2.14latency_ms 41.6runbinary_size 0.21peak_ram 62runbinary_size 0.22peak_ram 63runbinary_size 0.24peak_ram 71row → trendfilter platform=linux-x64 · axis versioncolumn → comparisonfilter version=v2.5 · axis platform

Two modes

A project is versioned or time_series. The mode is fixed once the project has runs.

versionedthe tag set is the identityversion=v2.5pushpush again → replacedtime_seriesthe timestamp joins the identitypush again → appended

Dashboards

  • A project opens on its default dashboard: an ordered list of widgets, each a stored query. Without one, writers get suggested widgets. Project dashboards are shared with the team; private ones belong to you alone.
  • The metric page is the widget editor: Add to dashboard, Save or Save as new.
  • Explore is the unsaved filter grid over every metric. Each filter lists its top 25 values with run counts, and a search for the rest.
  • A project dashboard can have share links: its widgets, read-only, without sign-in, with an optional password and expiry, revocable at any time.

Deleting

Delete a run, every run matching a filter on Explore, or a metric. A later push with the same identity, or the same metric name, brings it back. A tag value no remaining run carries leaves the filters.

Three layouts

ProjectTagsNote
Firmwareversion × board × buildone project per product
Monorepoversion × component × platformone project per repo
Nightly benchmarksmodel × devicetime_series, commit in meta

More shapes in the FAQ.