Tablumo User Guide

Documented version: v1.23.0 · June 2026 · This guide is updated with every release.

Getting started

Tablumo runs entirely in your browser. Open it, drop a data file onto the page, and you're analyzing — there is nothing to install and no account to create. The first screen shows a single drop area; after your first import it shrinks to a compact + Add data button so the screen belongs to your data.

💡 No file at hand? Any CSV export works — a Salesforce report, a bank statement export, a web analytics download.

Everything you navigate with lives in the left sidebar. At the top, Tables lists every file you've imported — click one to switch to it, hover it for the × that closes it (with undo), or right-click it for more (see below). Below, Views switches between Data, Chart and Dashboard for the current table; your dashboard pages appear right underneath, one click away, and the Filters item shows and hides the filter panel (with a badge counting active filters). The bottom group holds Analyses, Feedback, What's new and the light/dark switch.

The slim top bar always shows where you are — table › view › page — and the autosave status sits in its corner. Need more room? Collapse the sidebar to a narrow icon rail with the panel button (in the sidebar or the top bar); every icon keeps working, and Tablumo remembers your choice next time.

Rename, export & close tables

The right-click menu on a sidebar table: Rename, Export as CSV, Close table
Right-click a table in the sidebar: rename it, export it, or close it — combined tables also offer Refresh.

Right-click any table in the sidebar's Tables list for the three things you do with a table as a whole:

Tip: a name that's empty or already used by another table is simply ignored — Tablumo keeps the old name rather than bothering you with an error.

⌘K command palette

The command palette open over a dashboard, matching columns as you type
Type a few letters — the palette matches tables, pages, columns and actions.

The fastest way around Tablumo isn't clicking at all. Press ⌘K (Mac) or Ctrl+K (Windows/Linux) — or click the Search box in the top bar — and type where you want to go:

Everything works from the keyboard: type to search, to move, Enter to run, Esc to close. Matching is forgiving — word starts count ("opp" finds sample_data_sales_opportunities), and so do parts of words.

💡 The palette only offers what makes sense right now: with no data loaded you'll see just the utility actions; the current table, view and page are marked "current".

Importing data

Supported formats

CSV, TSV and plain-text tables, plus Excel workbooks (.xlsx and .xls). You can drop a file anywhere in the window, use the Choose files button, or click + Add data in the sidebar. Several files at once are fine — each becomes its own table in the sidebar's Tables list.

What Tablumo figures out for you

Delimiters (comma, semicolon, tab, pipe), header rows and column types are detected across the whole file, not a sample — so a column that turns numeric after row 10,000 is still typed correctly. Each column header shows a type badge (text, number, date, time, true/false); hovering it shows how many empty values the column has.

Large files & the disk-backed engine

Tablumo keeps its data engine's database in private on-device browser storage (OPFS) and pages table data to disk, so a file's size is not capped by memory: big files stream to disk as they import, and filters, charts and dashboards query them from there. Everyday files stay fully in memory and are exactly as fast as ever — only genuinely big files (over 150 MB) take the disk route. The bottom of the sidebar shows which engine you got: Disk-backed engine, or In-memory engine if this browser has no private disk storage or another Tablumo tab is using it — everything still works there, just with the old memory ceiling. Nothing leaves your machine either way.

While a file imports, the status line shows its size ("Importing data.csv (936 MB)…"); files of 100 MB and up add a short note about what to expect, and after a few seconds an elapsed timer starts counting — a long import never looks frozen.

The import status while a 164 MB file loads: file size in the message, a note that data pages to disk beneath
Big files are honest about themselves: size in the status, what to expect underneath, and a running timer.

Two honest notes. Big tables survive reloads since v0.67: the on-disk database is the store, so after a reload they re-attach in about a second instead of re-importing — and since v0.68 they're included in saved analyses and .tablumo exports too (one stored copy, referenced — the honest trade is that a big file occupies disk twice: database plus original bytes). And working memory for any single operation is capped at about 1.5 GB so a giant sort can never crash the tab — an operation that truly needs more stops safely with a plain-language explanation, leaving your session and other tables untouched.

Excel specifics

Multi-sheet workbooks import as one table per sheet, named file · Sheet. Dates keep their time-of-day even when Excel's display format hides it. Empty sheets are skipped; formula cells contribute their computed value.

Combining tables

The Combine tables dialog with a suggested linking field and honest match counts
Tablumo suggests the linking field and shows exactly how the rows match — before anything is created.

Data often arrives in related files — opportunities in one export, the activities logged against them in another, linked by a shared ID. With two or more tables loaded, click Combine tables in the sidebar (or press ⌘K/Ctrl+K and type "join") to bring the columns of one table into another:

Before anything is created, Tablumo shows the honest numbers: how many rows find a match, what happens to the ones that don't, and exactly how many rows and columns the combined table will have — following the "Rows to keep" choice, so there are no surprises. If a row matches several rows in the other table, it appears once per match — and the dialog says so. When two tables share a column name, the brought-in one is renamed after its table, e.g. Owner (activities).

The combined table appears as a new table in the sidebar and behaves like any imported file: filter it, chart it, build dashboards on it, add ƒx columns, export it — and it's saved with your session and analyses. Your original tables stay untouched.

💡 Want to try it right away? Alongside the sales opportunities sample there's sample_data_opportunity_activities.csv — calls, emails, meetings and demos linked to their opportunities by Opportunity ID.

Refreshing a combined table

The right-click menu on a combined table with the Refresh combined table action
Right-click a combined table: Refresh re-runs the match against the originals as they are now.

A combined table is built at a moment in time — but Tablumo remembers how it was built. When one of the originals changes (you add a ƒx column to it, or refresh it if it's a combine itself), right-click the combined table in the sidebar and choose Refresh combined table. The match re-runs against the originals as they are now, and the result replaces the old data in place:

After a refresh, a short confirmation reports the new row count, and the refreshed data is what reloads and saved analyses restore from then on.

Comparing two versions of a table

The Compare tables dialog showing the suggested key column and honest pre-create counts: added, removed, changed rows and numeric net deltas
Honest counts before anything is created: added, removed, changed — and the net delta per numeric column.

Two exports of the same data — yesterday's pipeline and today's? Click Compare tables in the sidebar (or via ⌘K) and pick the two versions. Tablumo suggests the key column that identifies the same row in both files (it must be unique and non-blank in both — unusable keys are refused with the exact counts that disqualify them) and then shows you, before anything is created: how many rows were added, removed, changed and untouched, which columns changed most, and the net delta of every numeric column ("Amount +2.3M"). All exact database counts, never samples.

Create the comparison and you get a regular table of the differences: a Change column (added / removed / changed), a What changed column naming the edited fields, the old value next to the new one ("Close Date (was)"), and a signed (net change) column per numeric field whose sum is exactly the net delta — so you can chart "where did the pipeline move?" by any dimension, filter to "Stage changed", drill into rows, export. Your two originals stay untouched.

The differences table also reads like a diff: changed cells show the old value struck through with an arrow to the new one, numeric moves tint green when up and red when down, and the Change column wears Added / Removed / Changed badges — click one (or its chip above the table) to filter to just that kind of change. The "(was)" columns fold away by default to keep the table readable; the column count stays honest ("7 of 9 columns") and one toggle brings them back. All of this is display only — exports and charts see the same plain table as before.

A differences table rendered diff-style: Changed badges in the Change column, in-cell old to new values, and Added/Removed/Changed filter chips above the grid
The differences table reads like a diff — badges, in-cell old → new, and one-click change-kind chips.

Snapshot series — many versions of the same data

The sidebar showing a snapshot series: versions nested under their base table, each with its date
Versions nest under the original in the sidebar, each carrying its date.

If you get the same export every day, you don't have to manage the versions yourself. Drop the new file while the old one is open and — when the columns match — Tablumo offers to keep it as a new version of that data. Say yes and it nests under the original in the sidebar with its date; say no and it stays an ordinary separate table. Versions are ordinary tables — filter them, chart them, export them — the series is just organization.

The date is taken from the file itself, honestly: a date in the filename wins (sales_2026-06-11.csv, 20260611, 11.06.2026), then the file's last-modified time, then plain import time — and the offer tells you which it used. Ambiguous filenames like 03-04-2026 are never guessed at. Wrong guess? Fix it right in the offer ("Change date") before accepting, or any time later via right-click → Change date… on the version. Versions always sort by date, so dropping yesterday's forgotten export after today's files it in the right place.

Comparing is two clicks: right-click a version → "Compare with previous version" (or the original → "Compare two newest versions") and the Compare dialog opens prefilled — the key column you confirmed last time is remembered for the series. With three or more versions, the menu also offers "Compare with…": pick any other version and the pair opens in date order — Monday vs Thursday, no manual picking.

The Versions to keep dialog listing the original and two dated versions with exact row counts and file sizes, the oldest struck through as will-close-now
"Versions to keep…" — honest sizes, and exactly what closes, before anything happens.

A series with many versions doesn't crowd the sidebar: click the small arrow on the original table's row to fold the timeline behind an honest "N versions" badge, click again to bring it back. A freshly accepted snapshot auto-expands its timeline so it never lands out of sight, and your folded choices are remembered. And a series doesn't have to grow forever: right-click the original → "Versions to keep…" caps it. The dialog lists every version with its date, exact row count and — when Tablumo knows it — the original file's size ("50,000 rows · 13.5 MB"), and strikes through exactly which versions the chosen limit would close right now, before anything happens. From then on a new arrival closes the oldest version automatically, with the usual Undo. Closing is not deleting: files on your computer are never touched, and re-importing a file brings that version straight back. Automatic hot-folder import is on the roadmap.

The data grid

The data grid with typed columns and the filter sidebar
The Data view: typed columns, sortable headers, filter sidebar.

The Data view shows the first 100 rows of the current table with exact total counts in the meta bar. Click a column header to sort ascending, again for descending, a third time to switch sorting off. Shift-click adds secondary sort columns — numbered badges show the priority. Sorting happens on the full table by real value (numbers as numbers, dates as dates), with empty values always last.

Arrange columns your way: drag a column header sideways to move it — a highlighted edge shows where it will land. Hover a header and click the small to hide a column, or open the Columns button in the meta bar to tick and untick columns in bulk ("show all" and "reset" undo everything). Hiding is purely visual: filters, charts and CSV exports still see every column, and the meta bar reads e.g. "21 of 23 columns" so nothing disappears silently. Your arrangement is remembered per table.

Resize columns: every header has a slim handle on its right edge — it lights up when you hover. Drag it to make the column exactly as wide as you like; the rest of the table keeps its layout instead of reshuffling. Double-click the handle to auto-fit the column to its visible content, header included. Long values simply trail off with an ellipsis (hover a cell to read the full value), and widths are remembered together with order and hiding — per table, per drill-down, per dashboard table tile.

Tip: hiding a column never deletes anything — it just tidies the view. The last visible column can't be hidden, so you can't end up with an empty grid.

Hide rows you don't want counted: the grid's left edge has a tick column — tick a few rows (Shift-click ticks the whole range, the header tick takes the page) and click Hide N selected rows. The rows disappear from everything: counts, charts, dashboards, exports, even AI answers. It's a mask, never a delete — an honest "N rows hidden" pill appears next to the row count with view (see exactly the hidden rows) and restore (one click brings them all back), and the mask survives reloads.

Tables close via the × that appears when you hover them in the sidebar — an Undo snackbar gives you eight seconds to change your mind.

Right-click menu

The right-click menu on a grid cell: Filter to this value, Exclude this value, Copy value
Right-click a cell: filter to it, exclude it, or copy it.

Right-click anywhere on the grid for the actions that make sense at that spot. On a cell: Filter to this value keeps only matching rows, Exclude this value hides those rows, and Copy value puts the cell text on your clipboard. It works on every column type — even on an empty (null) cell.

On a column header: sort ascending or descending (the direction already active is greyed out), clear sorting, Filter on this column… (opens the sidebar with the right control added), Group by this column (see below), Auto-fit column width (and Reset column width once you’ve set one), hide the column, or start a new ƒx calculated column. Date column headers additionally offer Display date by… (see below).

Excluding shows up as a chip like "Stage ≠ Negotiation" — right-click more values to exclude them too. The sidebar lists everything you excluded struck through; untick a value to bring its rows back.

Keyboard: focus a column header with Tab, press Shift+F10 to open its menu, move with the arrow keys, pick with Enter, close with Esc. Inside text boxes your browser's own right-click menu stays available, as does the native menu on selected text.

Dates by month, quarter, year — in any table

Raw timestamps are precise but hard to scan. Right-click a date column's header and choose Display date by: Year, Half-year, Quarter, Month, Week or Day. The column then shows clean period labels — "Jun 2026", "2026 Q2" — while sorting stays truly chronological, and a small badge on the header reminds you a display unit is active (pick Exact date to go back). It's display-only: filters, charts and CSV exports keep working on the real dates.

With a display unit active, right-clicking a cell offers Filter to this period and Exclude this period — the same honest date-range filters the charts write, shown as ordinary chips. The setting is remembered per place, like column widths: the Data view, each drill-down and each dashboard table tile keep their own.

Show a column as currency

Numbers that are money should look like money. Right-click a numeric column's header and choose Format as currency…: pick one of 16 common currencies and the column renders as €1,234.50 or CHF 99.90 — with each currency's real rules, so yen shows no decimals (¥1,500). A coins badge on the header (plus "· EUR") reminds you the column is dressed up; Plain number puts it back.

If your data carries the currency per row — a column with codes like "EUR" and "USD" — choose Code from a column… instead and each row formats with its own currency. Codes Tablumo doesn't recognize still format honestly ("XDR 42.00"), and messy values simply fall back to the plain number for that row.

Like date display units, this is display-only: filters, sorts, charts and CSV exports keep the raw numbers, hovering a cell shows the original value, and the setting is remembered per table — in drill-downs and dashboard table tiles too.

Group by a column — a summary without leaving the grid

Right-click any column header and pick Group by this column: the grid becomes a live summary with one row per value and a count of rows per group. A bar above the table shows what's grouped: add a second or third level with + Add column, switch the measure between Count, Sum and Average of any numeric column, remove a level with its chip's ✕, or click Back to all rows to return — nothing is ever changed in your data.

Date columns group by their display unit (months, quarters, years — set it first via Display date by). Click a group row to see exactly those rows: Tablumo writes an ordinary filter chip for the group, so the path back is the same ✕ as for any filter. The grouping is remembered per table and survives reloads. Currency columns format their Sum/Average/Min/Max as money here too, with the same per-group honesty as summary tiles.

A bold Total row stays pinned at the bottom: the same measures computed by the database across all rows in view — correct even past the 500-group display cut, with Average, Min and Max looking at the rows themselves, never an average of averages (hover it for the explanation). Right-click any group row for View these rows — the same drill-down a chart click opens, with the exact rows behind that group ("Jun 2026" opens precisely that month) — or right-click the Total row for View all rows in view.

Grouping by two or more columns? Sort by the first one and a subtotal row closes out each of its blocks — "Germany total" under all the Germany rows — alongside the grand Total. Subtotals do honest math: every underlying row of the block counts (including sub-groups past the display limit; Average, Min and Max look at the rows, never at the rows above). Not in that sort? The Σ Subtotals button in the table's header bar gets you there in one click. Subtotal rows click to filter and right-click to drill, scoped to that block. This works on dashboard summary tiles and in the grid's group mode alike.

The totals footer

Below the plain Data grid, every numeric column shows its Sum in a pinned footer row — computed over all rows in view with your filters applied, never just the 100 previewed rows, so it always agrees with what a chart or summary of the same view would say. Columns you show as currency total as money (hover for the raw number; with per-row codes the symbol appears only when every row in view shares one currency). The footer also appears in every drill-down, so "what do these rows add up to?" answers itself. It steps aside when there's nothing to sum or only one row.

Sum is only the default: right-click any footer value to switch that column to Average, Min, Max or Count distinct — average deal size next to total revenue, in one footer. Switched cells wear a small tag ("avg 1,234") so a non-sum is never mistaken for one, money stays money for Average/Min/Max (a count never wears a currency symbol), and your choice is remembered per column, like widths.

Filtering

Click Filters in the sidebar to open the filter panel and add a filter on any column. The control matches the column type: checklists with search for categories, min–max fields for numbers, from–to pickers for dates, and a contains-search for free text. All filters combine, and every view — grid, charts, dashboards — updates live with an exact "X of Y rows match" count.

Every active filter also appears as a chip above the view in plain words ("Region: EMEA, APAC", "Amount ≥ 50,000") — the chips bar sits on the right side of the page, above the data. Click a chip's to remove that filter, click its label to edit it in the sidebar, or Clear all to start fresh — the chips stay visible even when the sidebar is hidden. On a column you show as currency, range chips read as money — "Amount ≥ €50,000" — with the digits exactly as you typed them.

Filters can say "not". A value-list filter flips between is and is not with the dropdown at the top of its card — your ticked values carry over, so "Stage is Closed Won" becomes "Stage is not Closed Won" in one click. Text filters offer contains and does not contain. Both keep rows with empty values honestly: a blank merchant doesn't "contain Hilton", so it stays when you exclude Hilton — plain SQL would silently drop it. And the + Add filter… list offers every column, including ones already filtered (labeled "(another)"), so one column can carry two different conditions at once.

Match all — or match any — or your own logic. With two or more chips, every connector between chips is a button: click one to flip just that AND↔OR and build things like (Region AND Amount) OR Stage chip by chip — AND binds tighter, and parentheses appear around the AND groups whenever you mix, so the grouping is visible, not implied. A chip's right-click menu stays honest in either mode: members of an AND group show the rows they remove, a chip alone on its OR branch shows the rows only it adds.

For anything the connector buttons can't say, click Logic… on the chips bar (it appears from two chips up): a Salesforce-style editor where the chips are numbered and you state the combination — "1 AND (2 OR 3)", any nesting. A live row count previews the result while you edit, plain-words validation explains anything broken (an invalid expression can never reach the view), and Apply stays disabled until the expression is sound. You don't have to type: click a numbered filter row to insert it, use the AND / OR / ( / ) buttons to build the rest, and the button takes the last token back out — whole tokens at a time, spacing tidied for you. Active logic shows as a pill on the bar (click it to edit, ✕ to return to the connector buttons), chips wear their numbers, and charts, dashboards, exports and the AI assistant all follow the same expression. Adding a filter joins with AND; removing one renumbers the rest automatically.

The custom filter logic editor: numbered filter rows, AND/OR/parenthesis and backspace buttons, the expression input with (1 OR 2) AND 3, and a live row-count preview above the Apply button
The logic editor — click-build "(1 OR 2) AND 3" from the buttons alone, with a live row count before anything applies.

Right-click a chip to ask it what it's doing: View kept rows opens exactly the rows that chip keeps in the view, View removed rows opens exactly the rows it's hiding right now — the same sortable, exportable drill-down a chart click opens, with the true database count in the header. Kept and removed always add up to the rows passing your other filters (rows with empty values count as removed — honestly), so "what am I excluding?" is one click to answer and one more to verify — and since v0.91 the menu shows both counts inline ("View removed rows (27,588)") the moment it opens, so often the number is answered before any click at all. The menu also offers Edit in sidebar… and Remove filter.

The min–max boxes on a number filter hint with your data's actual bounds before you type ("min 100 – max 9,995"), and on currency columns the hints read as money — "min €1.2K", "max €9.9M". Hover either box for the exact smallest or largest value, so you can set a precise bound without hunting for it first.

Charts

The chart view with smart defaults
The Chart view opens pre-configured with a meaningful grouping and measure.

The Chart view turns the current table into a bar, line, area, pie, scatter, histogram, heatmap or box plot chart. New charts configure themselves with a sensible grouping and measure — change anything via the controls: group-by column, aggregation (sum, average, min, max, count, count distinct), measure, and a Top-N limit.

Tip: every dropdown in Tablumo understands the keyboard — open one and just start typing a column's name ("am…" jumps to Amount), or use the arrow keys and Enter. The current choice always shows a check mark.

Working with dates

When the X column is a date, a Dates by selector rolls the data up by year, half-year, quarter, month, week or day — labeled naturally ("2026 Q2", "Jun 2026") and always showing every period, so a quiet recent month can't silently disappear.

Area & histogram charts

A histogram of deal amounts; the tooltip on a bar shows its range, row count and share of rows in view
A histogram of Amount — hover a bar for its range, row count and share of the rows in view.

Area charts work everywhere line charts do — same date roll-ups, reference lines, drill-downs and sweeps. With a Split by column the areas stack, so the top edge reads as the per-category total. Area is available on dashboard tiles too ("Show as → Charts ▸ Area").

Histograms show how a numeric column is distributed. Pick the column and roughly how many bins (~10 to ~50) — Tablumo snaps the bin edges to clean round numbers so the axis reads "250 – 500", never "13.7 – 27.4", and a note tells you exactly what you got (e.g. "20 bins of 50"). Your global filters apply, and the bins recompute under them.

Each bar is a doorway, like everywhere in Tablumo: hover it for the range, the exact row count and what share of the rows in view it holds ("1,234 rows · 12.4% of rows in view" — never rounded to a misleading 0% or 100%); click it to open exactly the rows in that range; drag across several bins to combine them into one range. Right-click offers the same View-these-rows and PNG export as other charts.

The rows dialog opened by a histogram sweep, titled with the swept range and offering a Filter to this range button
Sweep bins, see the rows — and turn the range into a filter chip with one click.

The rows dialog a sweep opens carries a "Filter to this range" button: one click turns the swept range into an ordinary filter chip the whole app follows. Histogram bins exclude their upper edge, and the chip says so honestly — it reads "Amount: 100 – <200" and keeps exactly the dialog's rows (a sweep reaching the last bin keeps its top edge, like the histogram itself). Edit the bound in the sidebar later and it becomes a normal inclusive filter.

Histograms work as dashboard tiles too (Show as → Charts ▸ Histogram, with Column and Bins controls). Clicking a bin cross-filters the rest of the page to exactly that value range — the chip reads "Amount: 0 – 50" and every other tile shows precisely those rows; Shift-click adds bins, dragging sweeps a wider range, and right-click drills into the rows behind a bin.

Heatmaps

A heatmap puts two categories on a grid — say Region across, Stage down — and colors each cell by the measure: darker means more, no legend study required. Small matrices print the value inside each cell (the text picks black or white for contrast automatically); larger ones rely on the tooltip. Combinations with no data stay blank — absence isn't a zero, and Tablumo won't paint one.

Cells are doorways too: click one to open exactly its rows (both categories applied), or right-click to filter or exclude by that combination. The X axis groups like bar charts do (Top-N, date roll-ups); rows are capped at the top 20 with an honest note when more exist.

Box plots

A box plot shows how a number spreads within each category — where a bar chart says "Sales in EMEA total 4M", a box plot says "half the EMEA deals sit between 20K and 80K". Pick a category for the X axis and a numeric Values column: each box spans the middle half of that group's values (the quartiles), the bold bar marks the median, and the whiskers reach the true minimum and maximum. Everything is computed by the database over all rows in view — never a sample — and a note under the chart explains the parts the first time you need it.

The usual doorways apply: hover a box for its five numbers (as exact money on currency columns) and an honest count of the values inside; click it to open exactly that group's rows; drag across several to see them together; right-click to filter or exclude the group. Categories order by median, biggest first, so the highest-typical group reads first; date roll-ups stay chronological.

Currency on charts

A column you formatted as currency keeps its symbol when charted: the value axis reads €1.2M, tooltips show the exact €1,234,567.89 (with the currency's own decimal rules — yen shows whole units), KPI tiles display money as money, heatmap cells and scatter axes follow suit — in the Chart view and on every dashboard tile. ƒx conversion columns bring their currency along automatically.

💡 Honest edges: counts are never money, and a column whose currency comes per row from a code column charts as plain numbers — one aggregated bar can't honestly wear sixteen different symbols. Everything stays display-only: filters, exports and the data itself keep the raw numbers.

Reference lines & goal lines

To judge bars against a benchmark, use the Ref. lines control in the chart toolbar (bar, line and area charts). Toggle Average, Median, Minimum or Maximum — in any combination — and dashed lines draw across the chart, each labeled with its value ("Avg 2.75B"). The menu stays open while you mix and match, and the button summarizes what's on ("Avg, Max").

The statistics are honest about what you see: they're computed over exactly the points the chart shows — after filters and Top-N. On a stacked (split) bar chart the lines reference the stack totals; on a multi-line chart they span every plotted point. The bars underneath stay fully clickable for drill-downs.

On dashboard tiles too: bar, line and area tiles have the same Ref. lines control in their settings row. The lines recompute live as filters and cross-filter clicks change what the tile shows, and they're saved with the board. Currency measures label their lines as money ("Avg €1.5M").

Tooltips read the distance: with lines on, hovering a bar or point adds one muted line per statistic — "vs Avg 1.2M: +12%" — computed over exactly the values the line is drawn from, so tooltip and line always agree.

Goal lines: the same menu has a Goal box. Type a target — plain numbers, "1,500.25", or shorthand like 50k / 1.2m — and press Enter: a solid, bold-labeled line draws at your target, visually distinct from the dashed statistics, and tooltips add "vs Goal 50K: −10%". If the goal sits beyond your data, the axis stretches so the line (and the gap to it) stays visible. Clear the box and press Enter to remove it. On tiles the goal is saved with the board.

💡 More statistics (percentiles, trend lines) can join the same menu later. In the Chart view the lines are a working aid and reset next session; on dashboard tiles they persist.

Splitting by a second column

Bar and line charts can Split by a second category: bars stack, lines fan out into one per value, and a legend appears. The top 12 series are shown, with an explicit note when more exist. Clicking a segment targets exactly that combination — e.g. "New Business in AMER".

Scatter plots

Pick numeric X and Y columns and optionally a Color by category. Large tables are sampled fairly (the note below the chart tells you when), with filters applied before sampling so the picture is never biased.

The rows dialog opened by a scatter box, titled with both axis ranges and offering a Filter to this box button
Box a cluster, see its rows — "Filter to this box" turns it into two ordinary filter chips.

Draw a box around any cluster of points and the rows inside it open instantly. The dialog's "Filter to this box" button converts the box into two ordinary range filter chips (X between, Y between) — every view follows, each bound edits or removes like any filter, and drawing a new box replaces the old bounds instead of stacking contradictions.

Dashboards

A dashboard page with chart tiles
A dashboard page — click any bar or slice and the other tiles filter to match.

The Dashboard view holds boards of tiles: charts, big-number KPIs and row tables. Add tiles with + Add chart / + Add number / + Add table / + Add summary, configure each via its settings button, drag tiles by the grip handle and resize from the corner. Boards are organized into named pages — add, rename (double-click the tab), duplicate or delete pages (with undo) from the tab strip; each page also appears in the sidebar under Dashboard for one-click switching.

Cross-filtering

Click a bar, slice or point and every other tile filters to match, while the clicked chart highlights your selection. The click rules work like PowerPoint: plain click selects just that value, Shift/Ctrl-click adds or removes values, clicking the lone selected value clears it. Drag across several bars to box-select all of them at once. Selections appear as removable chips; View rows opens the raw rows behind the current combination.

Scatter tiles box-select too: drag a rectangle across a scatter and every other tile filters to exactly the points inside it, shown as one honest range chip per axis. The scatter keeps all of its points and draws your box as a dashed outline, so you can always draw a bigger one — a fresh box replaces the previous selection. Right-click the boxed scatter and pick "Show boxed rows as a table": a details table appears directly below it, pre-named after your axes, live-following every box you draw and honestly returning to all rows when the selection clears.

KPI tiles

Number tiles show one big aggregate — total, average, count and more — formatted compactly (2.3M) with the exact value in the tooltip. Currency measures show as money: €4.57M, exact value on hover. They react to every filter and click, and while filtered they keep the unfiltered baseline visible underneath, so a number is never quietly out of context.

KPI goals

Give a number tile a target: open its settings and type a value into Goal — "80", "1,500.25" or "1.5m" all work. A slim progress bar appears under the big number with an honest readout like "82% of 50K goal". The bar caps at full, but the percent doesn't — beat the goal and it says "128%". Currency measures read as money ("82% of €50K goal"), and the progress follows every filter and cross-filter click live. It's the same saved target as a chart goal line, so switching a tile between bar and KPI carries it along. The bar stays a neutral color on purpose: whether beating a goal is good depends on the metric — sales, yes; costs, no.

Table tiles

A dashboard with a Rows tile showing the rows behind a clicked bar, with an honest filtered count
A table tile following a click on the bar chart — with the honest "of 50,000 rows (filtered)" count.

+ Add table puts the actual rows on the board, next to your charts. The table follows everything on the page: global filters apply, and clicking a bar or slice (or sweeping a box) instantly narrows the rows to that selection, with an exact "x of y rows (filtered)" count on top. Clear the selection and the full table is back.

Each table tile has its own column settings — the same controls as the Data view and drill-downs: drag a header sideways to reorder, hover it and click the to hide, or use the Columns button. Click a header to sort (Shift-click for a multi-column sort). One tile can show five focused columns while another shows everything — neither touches the Data view, and it all persists with the page. The tile's CSV button exports all matching rows with the page's filters and clicks applied, not just the 100 shown.

Tip: also reachable as "Add table to dashboard" in the ⌘K palette.

Grouped table tiles

A grouped summary tile showing sum of Amount and row counts by Region and Stage, with its configuration row open
A summary tile grouped by Region, then Stage — with Sum of Amount and a row count per group.

+ Add summary puts a grouped, pivot-style table on the board: one row per group, with value columns computed per group. It starts meaningful immediately — Tablumo picks a readable grouping and a summable measure — and everything is changeable via the tile's settings button: Group by up to three columns ("Group by Region, then Stage"), and up to five Value columns with Sum, Average, Min, Max, Count or Count distinct. Date columns roll up just like charts do (month by default; switch to year, quarter, week or day). Any plain table tile can switch into grouped mode the same way — set "Group by" back to None (raw rows) to return.

The summary is a full citizen of cross-filtering, in both directions. Click a row to filter every other tile to that group — the usual PowerPoint rules apply (Shift-click adds more groups, clicking the row again clears it) — and clicks on other charts narrow the summary, with an honest "x groups (filtered)" count on top. When a selection elsewhere targets the summary’s own group columns, the matching rows highlight instead of disappearing, exactly like a chart highlights its bars.

Money shows as money: Sum, Average, Min or Max of a currency column formats like €1,234,567.89 (hover for the raw number; counts never format). Even per-row code columns work group by group: an all-EUR group reads €30.00, a mixed group honestly stays plain. Click a column header to sort — group columns sort A→Z (dates chronologically), value columns biggest-first. The tile’s CSV button exports all groups (not just the 500 shown) with proper column names like "Region, Stage, Sum of Amount", filters and clicks applied.

A bold Total row pins to the bottom whenever there's more than one group — computed by the database across all rows the tile sees (filters and clicks applied), so it stays correct past the 500-group display cut; Average, Min and Max look at the rows themselves, never an average of averages. Right-click any group row for View these rows (the exact raw rows behind that line, date roll-ups included) plus the row's click action under its honest name — and right-click the Total row for View all rows in view.

Tip: "Add summary table to dashboard" in the ⌘K palette does the same in two keystrokes. Group columns, values and sort all persist — across reloads, saved analyses and page duplication.

Tile right-click menu

The right-click menu on a dashboard tile: Rename, Duplicate, View rows, Remove
Right-click a tile's header for the common moves.

Right-click any tile's header — works on charts, numbers, tables and summaries alike. Rename opens the same inline editor as the pencil button. Duplicate clones the tile onto the same page, keeping everything: the custom name, chart setup, a table's column arrangement and sorting, a summary's group-by — the copy lands below the existing tiles and is independent from then on. Duplicating is the quick way to make variants: copy "Sum of Amount by Region", switch the copy's measure to Average, done.

View rows answers "what is this tile actually showing?" — it opens the drill-down with exactly the rows that tile sees right now: the page's filters plus the clicks on the other charts, with the honest filtered count and its own CSV export. Remove (shown in red) deletes the tile, labeled by what it removes — "Remove summary", "Remove chart".

Show as switches what the tile is: Number (KPI) and Table (rows) sit at the top level, and all chart types live in a tidy Charts ▸ flyout — the current choice is check-marked, and the whole menu works with the keyboard ( opens the flyout, comes back).

Keyboard: Tab to a button in the tile's header, press Shift+F10, move with the arrows, pick with Enter. While renaming, your browser's own right-click menu stays available in the text field.

Right-click on bars & slices

The right-click menu on a chart bar, headed by the clicked value: Filter dashboard to this, View these rows, Export chart as PNG
Right-click a bar — the menu knows which value you hit.

The menu also works on the data itself. Right-click any bar, pie slice or line point on a dashboard chart and it opens headed by the value you hit — "Stage: Negotiation" — so you always know what you're acting on. Filter dashboard to this does exactly what clicking the bar does: every other tile narrows to that value, shown as a removable chip above the board. View these rows opens the drill-down with precisely the rows behind that bar — the page's filters and the clicks on other charts included. Export chart as PNG saves the whole chart as a crisp image.

The right-click menu on a month bar in the Chart view, with a Close Date ∉ Jun 2026 chip above the chart and the filter panel listing the hidden period
In the Chart view, the menu can keep or hide the value you hit — months and quarters included.

The same menu is available in the Chart view, where Filter to this value turns the bar you hit into a real filter — the same one the grid's right-click writes: it appears as a chip above every view, is editable in the filter panel, and applies to the grid, charts, dashboards and exports alike. It's date-smart: on a month, quarter or year axis, filtering to "Jun 2026" writes a date-range filter covering exactly that month, which you can then widen or narrow like any other date filter. View these rows and Export chart as PNG are there too. Its sibling Exclude this value hides those rows instead — one click answers "everything except Closed Lost". The chip reads "Stage ≠ Closed Lost", more excluded values accumulate into the same chip as you click, and the filter stays editable in the filter panel like any other. Excluding works on date axes too: hide a whole month, quarter, year, week or day — the chip reads "Close Date ∉ Jun 2026", more periods accumulate as you click, and the filter panel lists every hidden period by name (hover shows the exact dates; untick one to bring it back). It composes with your other date filters — a Q2 range plus "∉ Jun 2026" means exactly "Q2 except June" — and rows with no date are never silently caught: hide those with the (no date) bucket’s own exclude.

On a chart split by a second column, the menu knows both values — right-clicking a segment reads "Close Date: Jun 2026 · Region: EMEA", drills into exactly that combination, and Filter to these values applies both filters at once. Date axes drill by the same month, quarter or year roll-up the chart shows, so the row count always matches the bar.

The menu appears only on actual data. Empty chart areas, axes and labels keep your browser's own right-click menu — and on scatter plots, drag a box around points instead (a single sampled point isn't a group).
While a menu is open, the hover tooltip politely stays out of the way — it can’t pop up over the menu — and comes back the moment the menu closes.

Renaming tiles

Every tile starts with an automatic name like "Sum of Amount by Region" — and you can change it. Double-click a tile's title (on a KPI tile, the label under the number works too), or click the tile's pencil button, type the name your team actually uses — "Total pipeline", "Win rate by region" — and press Enter. Esc cancels.

Tip: clear the field to go back to the automatic name — it keeps updating by itself when you reconfigure the chart. On KPI tiles, hovering always reveals the real calculation behind a custom label, so a friendly name never hides the math.

Drilling down

Numbers are only trustworthy if you can see behind them. In the Chart view, click any bar, slice or point to open the exact raw rows it represents — with a precise count, sortable columns and CSV export. Sweep across several bars to drill into all of them at once; on a scatter plot, drag a rectangle to inspect exactly the points inside it. Esc closes the panel with nothing lost. When the rows came from a scatter box or a histogram sweep, the dialog also offers "Filter to this box / range" — one click turns what you drew into ordinary filter chips.

A drill-down showing the rows behind a clicked bar, with the Columns picker open and two columns hidden
Every drill-down has its own column settings — here with two columns hidden.

Choosing the columns a drill-down shows

Drill-down tables have the same column controls as the Data view: drag a header sideways to reorder, hover a header and click the to hide it, or open the Columns button to tick and untick in bulk ("show all" and "reset" undo everything). The arrangement is remembered per place — the Chart view keeps one per table, and each dashboard page keeps its own for View rows — so a focused pipeline page can show five columns while your other pages and the Data view keep showing everything.

Tip: hiding columns in a drill-down is display-only. The CSV button still exports every column of the matching rows, and your arrangement survives reloads and saved analyses.

The right-click menus work inside drill-downs too: sort, filter, exclude or hide straight from a column header or cell in the "View rows" window — same menu, same chips, same undo as in the Data view.

Calculated columns

Click ƒx New column in the Data view to create a column from an expression — arithmetic like revenue / quantity, conditions like CASE WHEN margin > 0.3 THEN 'high' ELSE 'low' END, or date functions like year(close_date). The dialog previews the first computed values live as you type and explains problems in plain language. The result is a real column: sort it, filter it, chart it, export it. Formulas survive reloads and can be removed from the same dialog — or edited in place (see below).

Describe it in plain language (AI)

With the AI assistant turned on, the ƒx dialog gains a describe-it box: type the rule in plain words — "amount in EUR when the currency is USD, at rate 0.92, otherwise the original amount" — and the model writes one formula. Nothing opaque happens: the formula lands visible and editable in the ordinary formula box, the same live preview validates it against your real data, and only your Add column click creates anything. Rules that would require inventing data ("find each company's revenue") are honestly declined instead of guessed. With the AI toggle off, the dialog is exactly as it always was.

Group values into buckets

Messy category data — "West Germany", "Germany (Berlin)", "DE" — cleans up without formulas: right-click a text column's header → "Group values…". The dialog lists the column's distinct values with row counts; tick the ones that belong together, name the bucket ("Germany"), and repeat for the next group. The result is an ordinary calculated column ("Country (grouped)") — filter it, chart it, group by it, export it. Values you didn't group keep their original text (or take the label "Other", your choice), and empty values honestly stay empty unless you explicitly group them.

Editing a formula

Got the formula almost right? Right-click the ƒx column's header and choose Edit formula… — the dialog opens pre-filled with the column's name and formula, live preview and all. Rename it, rewrite the formula, or both; Save changes replaces the values in place. The column keeps its position, width and settings, and filters and sorts on it follow a rename. If the new formula turns a number column into text, filters that no longer make sense are removed honestly rather than left broken.

No dead ends: if the new formula fails on your real data, the original column comes back untouched and the dialog tells you what went wrong. The ƒx dialog's list of existing calculated columns has a small edit button per column too, and Create a new column instead backs out of edit mode without closing anything.

Currency conversion

To convert money between currencies, open Currency conversion inside the ƒx dialog: choose the column to convert (say, Amount), the target currency (USD, EUR, GBP, JPY, CHF and more) and type your exchange rate — then hit Use this formula. Tablumo writes the formula, names the column for you ("Amount (EUR)") and rounds to the currency's customary decimals (yen gets none). You can still edit anything before adding.

The converted column shows up as real money in the grid — €1,234.50, CHF 99.90 — marked with a coins badge in its header, and since v0.69 its symbol carries onto chart axes, tooltips and KPI tiles too. Hover any value to see the unformatted number. Under the hood the column stays numeric, so charts, KPIs, filters and CSV export all work on the actual values, not on text.

The ƒx dialog with the currency conversion template open
The currency template writes the conversion formula for you — you provide the rate.
💡 You enter the exchange rate yourself — Tablumo never fetches rates online, in keeping with its local-first promise. Don't want the money formatting? Remove the currency tag (×) before adding, and the result is a plain number.

Exporting

CSV on the data grid and in every drill-down downloads all matching rows — current filters and sort applied, no row cap, correctly quoted. File names say what they contain ("sales_filtered_2026-06-11.csv"). PNG in the Chart view saves the current chart as a high-resolution image on a solid background, ready for a slide or an email.

Sessions & autosave

Tablumo autosaves continuously to your own device — there is no save button. Close the tab, restart the browser, come back tomorrow: your tables, filters, sorts, charts and all dashboard pages restore exactly as you left them (a brief "Restoring your last session…" bar shows progress). Closing a table frees its storage after the undo window passes.

Big tables survive reloads too (v0.67): tables above 150 MB live in Tablumo's on-disk database and re-attach after a reload in about a second — no re-import, calculated columns included. When big data lands on disk, Tablumo asks the browser to protect that storage from eviction and reports honestly (in the engine status hover) whether it agreed; if the browser ever did clear storage while Tablumo was closed, you get a plain note naming what was lost — and where a stored copy exists, the table is rebuilt from it automatically.

💡 Sessions live in this browser on this device. Clearing the browser's site data clears the session too. To move work between machines, save it as an analysis and export a .tablumo file.

Updates & the stable channel

Tablumo ships new versions continuously — but it never pulls the rug out. On the stable channel, a new release shows a small popup bottom-left: "New version available (v0.64.0)! Reload?" with the new version's headline, so you know what you'd get. Reload now applies it — your tables, filters and dashboards come back exactly as they were. Not now parks a highlighted Relaunch to update button at the bottom of the sidebar, which waits as long as you like: Tablumo never reloads on its own, and a dismissed version never pops up again.

Saved analyses

Autosave keeps the one workspace you're in — saved analyses let you keep many. Click Analyses at the bottom of the sidebar, type a name ("Q3 pipeline review"), and hit Save analysis. Tablumo snapshots everything: the data itself, filters, sorts, dashboard pages, calculated columns and column layout. The copy is fully self-contained, so whatever you do in your workspace afterwards can't change it.

The same panel lists your library, newest first. Open brings a saved analysis back exactly as saved — if a workspace is currently open, Tablumo asks before replacing it (save the current one first if you want to keep it). Double-click a name (or click the pencil) to rename it, the copy button duplicates an analysis — handy for "same dashboards, next quarter" — and × deletes with a one-click Undo right there in the panel. The top bar always tells the truth about what you have open: deleting the analysis you're working in resets its label to Unsaved analysis (your loaded data stays put), renaming it updates the label immediately, and undoing the deletion brings the name back.

💡 Saving under a name that already exists overwrites that analysis — the save button changes to "Overwrite" so you always know before you click. Your live workspace keeps autosaving separately the whole time.

Save & open from the top bar

Once an analysis has a name, the everyday loop never needs the panel again. The top bar (top left, next to the sidebar toggle) always shows which analysis you're working in — or Unsaved analysis until you name one. Right beside it: the save button re-saves under the current name in one click and flashes a green check when done, and the open button takes you straight to your library.

A small dot next to the analysis name means your workspace has changed since the last save. It's honest about it: Tablumo compares your live workspace against the saved copy — so the dot survives a reload if you really do have unsaved work, and it disappears again if you undo your way back to the saved state.

💡 No name yet? Clicking save simply opens the Analyses home so you can pick one — naming is a one-time step.

Folders

The Analyses home with folders
The Analyses home: folders at the top, analyses below — drag any analysis onto a folder to move it.

As your library grows, organize it: click New folder, type a name, Enter. Folder rows appear above your analyses, each showing how many analyses it holds (including everything in its subfolders). Click a folder to open it — the breadcrumb at the top (All › Sales › Q3) always shows where you are, and clicking any part of it takes you back. Create folders inside folders for as much structure as you like.

To move an analysis, just drag it onto a folder — or onto a breadcrumb segment to move it up. Saving while you're inside a folder files the new analysis right there; overwriting an existing analysis keeps it wherever it already lives, and duplicates land next to their original. Folders rename like analyses do (the pencil button).

💡 Deleting a folder (×) never deletes analyses: everything inside moves up to the parent folder, and ↩ Undo puts the folder back exactly as it was.

Move analyses between machines (.tablumo files)

A saved analysis doesn't have to stay in this browser. The download button on any analysis row exports it as a single .tablumo file — your data, filters, dashboards, calculated columns and table names, all in one self-contained file. Since v0.68 that includes big tables: a multi-hundred-megabyte table travels inside the .tablumo like everything else (in your library it's stored once and referenced, so saving big analyses stays instant and lean). Put the file on a USB stick, a network drive, or just in a folder you back up.

To bring one back, click Import analysis at the top of the Analyses home and pick the file — older exports with the legacy .lens extension open the same way, so nothing saved before the rename is left behind. It works on any machine running Tablumo — or on this one, after clearing your browser. The import is always added to your library, into the folder you're currently viewing: if the name is already taken you get "… (imported)", and nothing existing is ever overwritten. Open it like any other analysis and everything is back, down to renamed tables and the exact dashboard layout.

💡 Tablumo checks the file before importing: a damaged or incomplete .tablumo file is refused with a plain explanation — never half-imported. And as always, the file goes only where you put it; no server is involved.
💡 This is also the backup story: export your important analyses now and then, and your browser profile is no longer the only place they live.

Appearance

Tablumo in the light theme
The same dashboard in the light theme — one click on the top-bar switch.

As of v0.32.0 Tablumo wears the stock shadcn/ui zinc theme — the same design language as ui.shadcn.com — in both modes, set in the Inter typeface. The font ships inside the app, so nothing is fetched from the network and Tablumo keeps working offline. In light mode the page is a soft zinc gray with white cards on top; in dark mode, deep zinc surfaces with subtly lighter cards. Charts follow along with a matching palette: deep blue, green, orange, purple and pink in dark mode; terracotta, teal, slate and sand in light mode. The redesign is complete as of v0.37.0: zinc theme, Inter, sidebar navigation, the ⌘K command palette — and now the structural details too. Dashboard tiles and filter cards are real shadcn Cards (the stock surface, border and shadow), KPI tiles use the classic stat-card layout (muted label on top, big number below), and every glyph in the interface is a crisp vector icon — no emoji anywhere. Everything works the same — it just looks the way modern tools do.

💡 Dialogs understand the keyboard: Esc closes any dialog. If you're in the middle of typing in a field — say an ƒx formula — the first Esc only leaves the field, so a stray key press never discards your work; press Esc again to close.

The theme switch at the bottom of the sidebar ("Light mode" / "Dark mode") flips the entire app — including every chart — between light and dark. On first visit Tablumo follows your operating system; once you choose explicitly, that choice sticks. What's new next to it opens the changelog — every release shows exactly when it was published, in your local time, and Show full history reaches back to the very first version — and Feedback sends a suggestion straight into development, optionally with the exact screen context attached.

The AI assistant (optional)

The AI assistant settings dialog with the toggle, masked key and transparency panel
The settings dialog shows the exact payload a request will send — before you ever turn the assistant on.

Tablumo can use Claude to help with your analysis — but only if you ask it to. The assistant is off by default: while it's off, no AI interface exists, no AI code loads, and nothing is ever sent anywhere. Turn it on under AI assistant in the sidebar by pasting your own Anthropic API key — the key is stored only in this browser (masked on screen, never written into saved analyses or .tablumo files), and requests go directly from your browser to Anthropic. There is no middleman server, because Tablumo has no server.

You see what it sees: the settings dialog shows the exact payload any request will include — column names and types, summary statistics, and the first N sample rows, where you choose N (zero means schema only). Never your full dataset.

The first skill is filtering by asking: with the assistant on, the filter sidebar gains a ✨ box. Type "open EMEA deals above 100k" and the answer comes back as ordinary filter chips — validated against your real columns, each one visible and removable like any filter you'd add by hand. Nothing is applied silently, and every number you read in Tablumo is still computed by the local database, never by the model. Nothing is applied silently.

The assistant can also build dashboards. On the Dashboard view, the ✨ Build with AI button opens a dialog with two modes. In Describe mode you write what you want — "a sales overview with win rate by region and a monthly trend" — and the model returns a plan in Tablumo's own dashboard format, validated against your real columns before anything exists. In Guided mode the model writes up to five multiple-choice questions about your actual data (audience? focus? time grain?), each with a free-text "Other…" escape; your answers drive the same pipeline. Either way you see a readable plan preview first, the build is applied as ordinary named pages you can edit like any others, and Undo removes exactly the pages it added — one click, nothing else touched.

After a build is applied, a Refine last build tab takes change requests in plain words — "make page 2 monthly", "add a win-rate KPI" — and shows a readable diff of what would change (added / removed / changed, per tile) before anything moves. Update build swaps the AI's pages in one step and re-arms the undo; pages you built yourself are never touched.

You also see what it costs. Before any dashboard request, the dialog shows a live estimate — roughly how many tokens your request will send and an honest dollar range for the answer. Every reply reports the exact tokens the API billed and their ≈cost, and a running per-browser tally sits in the dialog and in AI settings (with a reset button). The figures are list-price estimates checked against Anthropic's published prices; your Anthropic console remains the authoritative bill.

Build with AI after import

With the assistant set up, every fresh import greets you with a simple choice: Create from scratch — the grid and views exactly as always — or ✨ Create with AI, which jumps straight into the guided interview and builds a first dashboard from your answers. The banner never blocks anything (✕, Esc or "Create from scratch" all dismiss it), appears once per new table, and never again — not after a dismissal, not after a reload. If the assistant is off, the AI option says so plainly and explains what enabling it means instead of pretending to work.

Ask your data — the chat dock

The chat dock applying a filter from a plain-language instruction, with the ✓ Applied line and Undo button
An instruction becomes a real, undoable change — with an honest record of what happened.

With the assistant on, an "Ask your data" pill sits in the bottom-right corner whenever a table is open. Ask in plain words — "total Amount by Region", "top 5 stages by deal count" — and the answer appears right there as a small table. The honesty rule is absolute: the model never states a number. It only chooses what to compute, the local database computes it, and every answer carries a "Computed by DuckDB: …" line saying exactly what ran, plus the exact cost of the exchange. Follow-ups work ("now only EMEA", "same but by quarter"), per table.

Since Tablumo 1.0 the chat also takes instructions: "filter everything to EMEA", "add a win-rate KPI", "turn that bar into a monthly line", "new page comparing regions", "go to page 2". The change is applied right on your board — validated against your real columns, pages and tiles first — and the exchange shows an honest "✓ Applied" line with a one-click Undo that restores exactly the state the action replaced. Computed answers offer "+ Add as tile", turning the answer into a dashboard tile without another AI call. And every exchange carries a small "What Tablumo told the model about your view" disclosure — click it to see the exact one-line state summary that was sent with your question.

The privacy rules never bend: the model sees column names, types, statistics and your chosen sample size (down to zero rows) — never the dataset, and every number on every tile is computed by the local database.

Privacy

Everything happens locally: the import, the database engine, the charts, the autosave. Tablumo has no server — your files are never uploaded anywhere, and the tool works with the network unplugged. The disk-backed engine's storage (OPFS) is the browser's origin-private file system: on your device, invisible to other sites, cleared with the browser's site data. What you analyze is nobody's business but yours.

The optional AI assistant keeps this promise: off by default (off = nothing runs, nothing sent), your own key stored only in this browser, direct browser-to-Anthropic calls with no server in between, and only schema, statistics and a sample size you control — never the full dataset.

Current limitations