SQLDesk is a fork of Redash rebuilt a layer at a time. Each release has a single theme, and the theme is the point — a release that does a little of everything is a release nobody can describe. This is the whole history and the one thing coming next.
Newest first. Each one is a sentence because each one was a single decision.
A place to do work a single SELECT cannot: steps that build on each other, in SQL and in Python, saved and re-run.
Kafka topics you can query and chart like anything else, dashboard folders with a stated meaning, and an admin section that answers what is happening now.
A tool server over your warehouse, a catalog built from your own query history, and an audit of everything it was asked.
Less chrome, more chart. Filters left their band, textboxes became somewhere to write, and one result stopped being fetched once per widget.
Dashboards you watch rather than read. The server refreshes them, once for everyone looking, and only while somebody is looking.
Redash 25, with 35+ data sources, the query editor, alerts and the permission model already in it. None of that was rewritten; it was built on.
October 2026. Data that arrives while you are looking at it, and somewhere to put the dashboards that matter.
An administrator adds a cluster; whoever manages topics chooses which of them may be queried. A topic becomes a table you can join to another topic, chart, parameterise and put on a dashboard — the same editor as every other query, with Execute replaced by Start streaming. Nothing is stored: the window exists while somebody is watching it, and a stream nobody is watching stops costing anything within minutes.
A folder carries a stated meaning, not just a name. A locked one is an administrator's to change and read-only for everybody else, including the dashboard's own author — which is what makes “business KPIs” a claim rather than a label.
A dashboard arrives by email on a schedule, as a picture in the body and a one-page PDF attached, with one-click unsubscribe.
A client opens a browser, the person signs in the way they always do, and it gets a token that expires and can be revoked — instead of an API key living in a config file outside your identity provider.
Streams, the catalog, live dashboards and keeping uploads are each granted to a group. Not everybody, and not only administrators — the person who knows what a table is for is rarely the person who runs the cluster.
Uploaded files expire on a clock people can see and stop, their owner is warned a day before, and nothing is deleted that nobody was warned about. Admin → Storage says what is being held and what happens to it when.
Headroom, what is running and who asked for it, the queues, storage, streams, overdue schedules — seven pages, each saying what it is for. Any running query can be stopped from here, and stopping one is recorded.
931 → 525 KB gzipped before anything draws, held there by a budget CI enforces. Server memory 273 → 175 MB, by importing a data source's SDK when it is used rather than at startup.
Streams, MCP, uploads and the alert-screenshot renderer are each off until asked for. A default install is five deployments and one volume, and the published image does not grow for a feature you never switch on.
Streams guide → · Dashboards and folders → · What to switch on →
A tool server over your warehouse, and an audit of what it was asked.
/mcp, with every request recorded under Admin → MCP
Built
Never the question somebody put to their client, and never the SQL that came
back — only the calls.check_sql
BuiltThe two releases that made a dashboard worth leaving on a screen.
Everything in SQLDesk today ends in one SELECT. A notebook is for the work that does not: pull this, join it to that, reshape it, look, then write the result somewhere. People do it in Jupyter today and the warehouse never hears about it — so the lineage, the permissions and the scheduling all stop at the edge of somebody's laptop.
Shape still being decided, which is the honest state of it. What is settled is the rest of 0.8, and all of it points the same way: you should know what a thing costs before it runs.
Cells in SQL and in Python, each one reading the last one's result, saved and re-runnable, with the output of any cell available as a visualization or a dashboard widget. The parts SQLDesk already has — data source permissions, parameters, the scheduler, the result store — are most of what a notebook needs; what it adds is the chain.
Bytes scanned and an estimate of the work, from the engine's own planner, shown as a number a person can refuse. MCP already refuses past a ceiling; this makes the ceiling something you can see rather than something you discover by hitting it.
An agent that is exploring should not quietly run a 4 TB scan because it seemed like a reasonable next step. Past a threshold the tool comes back with the estimate and waits for a person to say yes.
Every execution is already recorded; nothing reads it as “what has this person been doing”. With it: who has been expensive this month, not just this hour.
One person can queue fifty queries against the warehouse everybody shares. And when a warehouse is in trouble you want to stop sending it work without deleting the data source.
StatsD is what SQLDesk emits today, which is the wrong shape for most clusters now. Queue depth, worker saturation and connection-pool use are the three that matter.
Designed in 0.7 and deliberately deferred. A measure that has been agreed and used belongs in a semantic layer other tools can read, not only in SQLDesk's.
Nothing costs anything until somebody uses it. Streams, MCP, uploads and the renderer are already off until asked for; the next step is that a query says what it will cost before it runs, rather than after the invoice arrives.