A dashboard is a grid of widgets, each reading from one data model. Widgets recompute as new records arrive, so a dashboard left open on a wall stays current without anyone refreshing it.
Dashboards in the sidebar lists what you have, with a Visibility filter for Public and Private. Create Dashboard starts a new one, named Untitled dashboard until you rename it. Building dashboards is desktop only.
View mode and edit mode
A dashboard opens in view mode, where the topbar has Share, Edit, and Delete. Press Edit and it swaps for Add widget, Auto layout, Discard, and the save button.
Every change you make in edit mode is buffered in the browser. Nothing is written, and nobody else sees anything, until you press Save changes — at which point the whole set of additions, edits, moves, and removals commits together. The button reads Saved and greys out when there is nothing pending, which is also your unsaved-changes indicator. Discard throws the buffer away after confirming.
If someone else saved the same dashboard while you were editing, a bar appears — This dashboard was updated by someone else. — with Reload.
Auto layout packs the widgets upward, removing gaps and resolving overlaps.
Adding widgets
Add widget does not place anything yet. It opens the inspector on a blank widget, where the Shape section is the type picker; choosing a type is what commits the widget to the grid. Until then the inspector says Choose a widget type to add it to the dashboard.
There is a second, faster route. Press Cmd/Ctrl + K and search across two
sections: Widget Types, which are the ten built-in types, and
Your Library, which is your saved reusable widgets.
Each widget card has a kebab menu with Configure and Remove.
Widget types
| Type | What it shows |
|---|---|
| Stat Card | Single metric display |
| Line Chart | Time-series visualization |
| Bar Chart | Categorical comparison |
| Pie Chart | Proportional breakdown |
| U.S. Map | State-level choropleth |
| Heatmap | Hour × day-of-week activity |
| Table | Display data in rows and columns |
| Pivot Table | Rows × columns crosstab |
| Activity Feed | Live chronological record stream |
| Text | Markdown notes & annotations |
The Shape section groups them as Charts, Tables, Feed, and Layout, using short labels — Stat, Line, Bar, Map, Pie, Heatmap, Table, Pivot, Activity, Text.
Switching type on an existing widget clears its field selections, and warns you before it does.
Configuring a widget
The inspector's sections change with the type, but the order is always the same: Shape, then Data, then any type-specific field pickers, then Format.
Data is where you pick the data model. Everything below it stays empty until you do — Select a data model to configure field encoding.
Then you tell the widget which field to bucket by and which to measure. Bar charts ask for Group by, pie charts for Name field, maps for State field, heatmaps and time-series lines for a Time field, tables for their Columns, activity feeds for a Title field, and pivots for both Rows and Columns. Line charts can plot against time, a numeric X field, or a category, chosen with the X axis toggle.
Aggregation is how many records become one number:
| Group | Aggregations |
|---|---|
| Basic | Count, Distinct count, Sum, Average, Min, Max |
| Distribution | Median, Percentile, Std deviation, Variance |
| Time-based | First, Last, and Latest on stat cards |
Aggregations that need a number are hidden when the selected field does not hold one, with a note saying which kind of values it holds instead. Percentile asks for the percentile you want; First and Last ask which timestamp to Order by.
Format holds the presentation knobs: Max buckets and Sort on grouped charts, Max points on time series, Pagination and Max rows on tables, Decimals and Suffix on stat cards, Max items on activity feeds. Stat cards can also show Compare to previous period — a percentage delta against the preceding equal-length window, which needs a dashboard time range to have something to compare to — and a Show trend sparkline mini chart.
The save button stays disabled while any widget is incomplete, and a bar names the offending widget and the reason, with Open to jump to it. The reasons are short and specific: Pick a data model, Add at least one column, Select a Value field, and so on.
Live updates
In view mode the topbar carries a toggle that reads either Live, with a green pulsing dot, or Paused. Live is the default: new records stream in and the widgets recompute in place. Pausing freezes the data where it is, and resuming re-anchors any relative time window to now and pulls a fresh frame.
The toggle is hidden in edit mode, because edit mode is about the layout rather than the data.
Time ranges
One picker in the dashboard header governs every widget. There is no per-widget time range.
| Preset | Window |
|---|---|
| All time | Everything, unfiltered |
| Last 1 hour, Last 24 hours, Last 7 days, Last 30 days | Rolling windows counted back from now |
| Today, Yesterday | Calendar days |
| This week, This month, Last month | Calendar weeks and months |
| This quarter, Last quarter | Calendar quarters |
| This year, Last year | Calendar years |
| Custom… | Two From / To inputs and an Apply button |
The range filters by each record's observed time — when the thing happened, not when Hodoflow stored it.
In view mode the picker changes what you are looking at, and mirrors itself into the URL, so a link you copy carries the range with it. In edit mode it is labelled Default: and sets the dashboard's saved default instead. The saved default covers All time, the four rolling windows, and a custom window; the calendar presets apply to the view in front of you rather than persisting as the default.
Calendar presets resolve against your profile timezone. Rolling windows do not depend on a timezone at all.
The widget library
Dashboards → Widget Library holds standalone widgets that are not tied to one dashboard. Its list shows each widget's Type, Data model, how many dashboards it is Used on, and when it was Updated.
New widget opens a full-page builder with the same inspector plus a live
preview and a Preview time range that is never saved. Its topbar has
Save, Discard, and Delete, and an unsaved badge while there are
pending changes. A library widget cannot be deleted while it is attached to a
dashboard.
Library widgets are created here, not promoted from a dashboard. To put one on a
dashboard, use the Cmd/Ctrl + K palette's Your Library section.
Two behaviours are worth knowing before you rely on them. Remove on a library widget detaches it from that dashboard and leaves the library copy alone. But editing a library widget's fields or configuration from a dashboard's inspector writes through to the library copy, and therefore to every other dashboard using it.
Sharing
Share opens Dashboard settings. Turn on Public embedding — Allow this dashboard to be embedded externally — and Hodoflow mints a share token and shows an Embed snippet with Copy snippet and Regenerate token beneath it. The header button then reads Shared.
Sharing is embed-only. There is no public dashboard page to link to; the token works through the embed element and nowhere else, and the token itself is only ever shown inside the snippet. Anyone holding it can render the dashboard without signing in, so treat it as a secret.
Regenerate token breaks every existing embed immediately. Turning Public embedding back off is how you revoke access altogether.
Embeds covers the snippet, the attributes it accepts, and theming it to match the page it sits in.