Boards and cards

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.

How an answer is drawn

The shape of the query decides which visualisations make sense, and you pick from those.

VisualisationFits a query with
Single numberNo group by and no bucket. One figure, with its delta.
Line or barA time bucket. One series, or one per group.
Ranked listA group by and no bucket. Rows with a share of the total.
TableSeveral group bys, or several aggregates side by side.
Event listNo aggregate. The rows themselves, newest first.
NoteA heading or a caveat. No query behind it.

Cards are placed, not flowed

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.

There is no Save button. Every edit is saved as it is made. With drag-to-place there is no natural moment to press Save.

Many boards, one project

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 and the comparison are separate

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.