← Changelog

Live dashboards

Send data and watch it live on dashboards you build, or one Plexus builds from your first data.

A live dashboard for a sample smallsat power system: battery voltage and current, solar array power, bus voltage and mode

First release: send data and chart it live

Create an API key, send a reading from a device, and watch it on a live chart. Every point you send is stored.

Why

Before you can fix a machine you have to see what it is doing. For most hardware teams that means a serial console, a CSV on someone's laptop, or a Grafana stack nobody has time to run. v1 is the shortest path from a device to a chart the whole team can open.

How it works

Open API Keys in the app, name a key, and create it. Copy it then: it is shown once. Your device sends readings to the Plexus gateway with that key, either through the Python SDK or as JSON over HTTP from anything that can make a request.

Each reading has a device name (the source_id), a metric name and a value. You don't set anything up first. The device appears on its first point, and the API Keys page tells you when data is arriving and links you to a dashboard for it. The device's Live tab charts each metric as points come in.

Using it

From Python:

from plexus import Plexus

px = Plexus(api_key="plx_...", source_id="pod-7")
px.send("battery.voltage", 12.4)

From anything else

Any language with an HTTP client can post points directly. Set class to "metric" for numbers and "event" for everything else.

curl -X POST https://gateway.plexus.company/ingest \
  -H "Content-Type: application/json" \
  -H "x-api-key: $PLEXUS_API_KEY" \
  -d '{"source_id": "pod-7", "points": [
        {"metric": "battery.voltage", "value": 12.4, "class": "metric"}
      ]}'

Every point is stored

Plexus keeps each point you send at full resolution. Nothing is sampled down on the way in, so a spike that lasted one reading is still there when you look back at it. How far back you can look depends on your plan: the Free plan keeps 7 days of history.

Dashboards

Build a dashboard from panels (line, area, bar, scatter, stat and table), then drag and resize them into the layout you want.

Panels

More panel types sit under More in the add-panel picker, including logs, video and a 3D model.

  • Line: metrics over time.
  • Area: time series with filled regions.
  • Bar: compare values across categories.
  • Scatter: plot one value against another.
  • Stat: one number at a glance, with its unit.
  • Table: raw data in rows and columns.

Using it

Press A on a dashboard, or click empty space on the grid, to add a panel. Pick the device and metrics, set a unit and colors, and it appears on the grid.

Drag panels by their handle and resize them from the corner. The time range at the top applies to every panel, from the last 10 seconds to the last 7 days, or a custom window. Save with Cmd+S. Delete a panel by mistake and Undo brings it back.

Chart annotations

Mark a moment or a stretch of time on a chart with a label and a note, so the next person looking knows what happened there.

How it works

Annotations belong to a device, not to one chart. Mark something on any chart for pod-7 and it shows on every chart that reads pod-7, on any dashboard. A mark made during a run is also listed on that run's page.

Using it

  • Click Annotate in the chart's bottom bar.
  • Click a point to mark a moment, or drag to mark a region.
  • Give it a label, pick one of six colors, and add notes if you like. Enter saves.
  • Hover a marker to read it. Click it to edit or delete.
  • The list button opens every annotation for the device in a side panel, filterable by points or regions.

Limits

Shared and public dashboard links show annotations but cannot add them.

Live stream and fleet query APIs

Subscribe to a device's live data over a WebSocket, query one metric across every device at once, and read how it all works in the docs.

Live streams

The Plexus Data API at api.plexus.company has three WebSocket streams per device: metrics, events and video. Open the socket, send your API key as the first frame within 10 seconds, and frames arrive as the gateway receives them. Filter the metrics stream with ?metrics= to get only the channels you need.

const ws = new WebSocket(
  "wss://api.plexus.company/v1/sources/rover-02/metrics/stream?metrics=battery.percent"
);
ws.onopen = () => ws.send(JSON.stringify({ type: "auth", api_key: "plx_..." }));
ws.onmessage = (e) => {
  const msg = JSON.parse(e.data);
  if (msg.type === "telemetry") {
    for (const pt of msg.points) console.log(pt.metric, pt.value, pt.timestamp);
  }
};

Fleet queries

GET /v1/fleet/metrics returns one metric for every device in your org in one call: one series per device, with avg, min, max and count per interval, and whether each device is online. Plexus picks the interval from the window, one minute at the smallest. GET /v1/fleet/health returns how many devices you have and how many are online.

curl "https://api.plexus.company/v1/fleet/metrics?metric=battery.percent&last=7d" \
  -H "x-api-key: $PLEXUS_API_KEY"

Docs

docs.plexus.company covers sending data, the Python SDK, and every endpoint of the read API: devices, metrics, events, fleet and live streams, with request and response examples and error codes.

Limits

  • Each live stream covers one device. To watch several, open one socket per device.
  • Fleet queries return at most 10,000 rows. If truncated is true, narrow the window.
  • Relative windows use m, h or d, like 30m, 1h or 7d.

Units and descriptions for signals

Give each signal a unit, a readable label and a note about what it measures. The notes live with the device, so everyone reads the same meaning.

How it works

Each signal on a device can carry a label, a unit, a description, tags, a default rollup (avg, sum, min, max or last) and a type such as measurement, status or location. Values are stored per device and per signal, so pod-7's temp and rover-02's temp can mean different things.

Using it

Chart panels have their own unit setting in the panel's display options. Auto-built dashboards fill it in for common names: % for *_pct, V for voltage, °C for temperature, ms for latency.

  • Open a device, go to its Data tab, and click a signal to open its details sheet.
  • Fill in what you know. Placeholders suggest the shape, like "V, °C, %" for the unit.
  • Click Suggest to have Plexus propose a label, unit, type and description from the signal names and a few sample values. Keep what is right and change the rest.

Starter dashboard from your first data

Send your first reading and Plexus builds a starter dashboard from the signals it sees, then opens it for you.

How it works

While your org is empty, the Home page shows how to send a first reading and checks every few seconds. When a device appears, Plexus builds a dashboard from the metric names it reports and takes you there.

The layout is plain rules, not AI. Signals that read well as a single number become stat tiles across the top, up to four, with a unit picked from the name: % for *_pct, V for voltage, °C for temperature, ms for latency, s for uptime. Signals whose trend matters, like temperature, memory and latency, get line charts below. If nothing looks like a headline number, you get line charts only. The dashboard stops at 14 panels.

If you connected a database instead of a device, the starter dashboard is built from its tables.

Preview, then keep

Every device page shows the same layout live, built from what that device sends right now. Nothing is saved until you click Save as dashboard. That makes it easy to look at a new device before you decide it deserves a dashboard.

Zoom charts down to 10 ms

Charts zoom from 90 days down to 10 milliseconds, and a one-sample spike stays visible at every level. Click a chart to pin a time and every panel reads its value there.

How it works

For raw data, charts thin points per pixel. Each pixel column keeps its first, last, lowest and highest point, so the vertical extent drawn in every column is exactly the extent of the data underneath. A single-sample spike survives at any width.

Zoomed out far enough to read summarized data, charts draw each bucket's min and max, not just its average. Windows under an hour are served raw, so there is real per-sample data all the way down to the 10 ms floor.

Using it

  • Ctrl or Cmd plus scroll zooms around the cursor. A trackpad pinch works too. Plain scrolling still scrolls the page.
  • Drag to pan. Shift-drag to zoom to a selection.
  • Double-click, or press Escape while hovering, to go back to where you started.
  • Click a chart to pin a time. Every time chart on the dashboard draws a line at that instant and shows each series' value there. Hover elsewhere to see the time difference from the pin. Click the pin again to clear it.
  • Drag a metric from the signal rail onto a chart to add it, or onto empty space to start a new panel.

3D model panel

Drop your own model into a 3D panel, bind its attitude to your data, and it turns as the vehicle did. Scrub any chart and the model replays that moment.

How it works

The panel loads GLB, GLTF, STL or OBJ files. You bind attitude in one of two ways:

  • Pitch, roll and yaw in degrees, applied heading first (YXZ order).
  • A quaternion as four channels, W, X, Y and Z. When all four are bound, they take priority over pitch, roll and yaw.

Replay with the time cursor

The panel shares the dashboard's time cursor. Hover any chart and the model jumps to the nearest sample at that time. Pin a time and it stays there. With no cursor, it shows the latest value live.

So you can find the spike on a chart, hover it, and see the attitude at that instant.

Using it

Add a panel and choose 3D model. Pick Custom and drop your file, or paste a public URL. If you have no CAD file yet, pick a built-in shape: cylinder, pod, box or cone.

To bind attitude, drag a metric from the signal rail onto the panel and choose which slot it drives, or set the slots in the panel settings. Hover a part of the model to see its name. The settings list the model's parts so you can hide ones you do not need.

Limits

Files can be up to 50 MB. A dropped file is saved with the dashboard, so a smaller model loads faster for everyone who opens it.

Device events and activity log

Everything your devices send that isn't a number now has its own page at /events. What people did in Plexus lives separately at /activity.

Device events

Faults, state changes and log lines are events. Send one from Python with a name and a body:

from plexus import Plexus

px = Plexus(source_id="rover-02")
px.event("log", {"level": "error", "msg": "IMU read timed out", "code": 42})

Reading them

/events lists every event across your devices, newest first. Filter by device, by severity and by time range from 15 minutes to 30 days, or search the text. Click a row to open the full body in a side panel. Use j and k to move through the list.

Plexus reads severity from a level field such as level or severity, and understands common spellings like WARN, warning and fatal. Anything it doesn't recognise shows as info.

Activity

/activity is the record of what happened in the product: a device added, a dashboard created, an alert changed, an API key revoked, a command sent. Each row shows who did it and when. Filter by category, severity and time, or search.

Limits

Events are kept 90 days by default. Events and activity are part of the Founding 50.