Cards placed on a canvas, each a saved query, with filters that belong to the board.
A card is a saved query plus a way of drawing its answer. A board is a canvas of cards you place yourself.
The shape of the query decides which visualisations make sense, and you pick from those.
| Visualisation | Fits a query with |
|---|---|
| Single number | No group by and no bucket. One figure, with its delta. |
| Line or bar | A time bucket. One series, or one per group. |
| Ranked list | A group by and no bucket. Rows with a share of the total. |
| Table | Several group bys, or several aggregates side by side. |
| Event list | No aggregate. The rows themselves, newest first. |
| Note | A heading or a caveat. No query behind it. |
Every card carries a position and a size in pixels on a canvas of fixed logical width, snapped to a small grid. Width and height are both draggable, cards keep rendering live data while you move them, and settings open in a side drawer rather than inside the card. It is not a column layout: the point of placing a card yourself is that you can leave a gap, and a column system reflows a careful board the moment something above it changes height.
A project holds an ordered list of boards, each with its own layout, its own dates and its own permanent filters. A board filter applies to every card on it, and can be any condition a card could carry: a source, an operating system, a release channel, an attribute of your own. It belongs to the board rather than to the viewer, so it survives a reload, a link sent to a colleague, and the next person to open it. An empty filter means no constraint, never “nothing”.
The range is what the numbers are. The comparison is what “up 12%” means. Both are set independently, both can be rolling or pinned, and both show their resolved dates on screen, because a delta whose baseline is unstated is a number nobody can check. With no baseline, or a baseline of zero, no delta is shown at all.
The range is also what makes a board fast. The table is partitioned by time, so a window of a fortnight reads a fortnight of data and never touches the rest.