Connect to your data, write a query, turn it into a chart, put it on a dashboard other people actually use. Self-hosted, open source, and viewers are free — because there is nobody to charge you for them.
Apache 2.0 · Python + React · runs in Docker
See it
A live dashboard refreshing on the server every 30 seconds: a stat with its sparkline, a gauge, progress against target, a status grid, a formatted table and charts with goal lines. Nobody is pressing refresh.
Quick start
A published image, plus the Postgres and Redis it needs. Nothing to build.
# fill in the three secrets it asks for
$ cp .env.example .env
$ docker compose -f compose.prod.yaml run --rm server create_db
$ docker compose -f compose.prod.yaml up -d
→ http://localhost:5000
On macOS, port 5000 belongs to AirPlay Receiver and up fails
with “address already in use”. Set SQLDESK_PORT
and SQLDESK_HOST in .env to another port, or
turn AirPlay Receiver off under System Settings › General ›
AirDrop & Handoff.
Images are published to
ghcr.io/bot-netizen/sqldesk for amd64 and arm64. To build from
source instead, compose.yaml is the development setup —
make env && make compose_build && make create_database && make up.
SQLDesk reads SQLDESK_* environment variables. Migrating an existing
Redash install? Your REDASH_* variables still work as a fallback, so your
.env keeps running untouched.
Data-source passwords are encrypted with SQLDESK_SECRET_KEY.
Back it up and do not rotate it casually — changing it without
manage database reencrypt makes every stored credential unreadable.
SQLDesk sends nothing anywhere. Version checking is off unless you set
SQLDESK_VERSION_CHECK_URL to an endpoint you control, and no usage data
or account details leave your box.
What you get
Analysts write SQL. Everyone else gets dashboards, alerts and links that keep working.
Schema browser, autocomplete, query formatting, parameters and scheduled refresh. Fork a query, schedule it, publish it.
Drag visualizations into a grid, filter across them at once, and export a one-page report as a PDF or an image.
Trigger on a query result and notify email, Slack, Microsoft Teams, PagerDuty, webhooks and seven more destinations.
Drop in a CSV or Parquet file and query it with SQL immediately, backed by DuckDB. No pipeline required.
Charts, tables, pivot tables, cohorts, funnels, maps, counters — all configured without code.
Groups, per-data-source access, view-only roles and shareable public links with their own tokens.
Data sources
Each one is a small plugin over the vendor's own driver, so connections behave the way the vendor intended.
Roadmap
The goal is one tool for the whole job — not another dashboard you bolt onto four other products.
A cluster is a data source and its enabled topics are its tables, so a stream joins another stream, takes parameters, gets visualizations and goes on a dashboard — in the same editor, with Execute replaced by Start streaming. Nothing is stored: the window exists while somebody is watching. With it, dashboard folders that carry a stated meaning, scheduled subscriptions by email, OAuth for MCP clients, and an admin section that answers what is happening now. The Streams guide has the details.
An endpoint at /mcp with eight tools over a catalog built from your schema
and the SQL your team has already saved. It runs as the person whose API key it is, only reads, and
audits every request. Metrics are proposed from saved queries and agreed by a person before a model
sees them. The MCP guide has the details.
Textboxes you can write in, eight more chart types, an Admin section that says what is running and who asked for it, and alert emails that carry a picture of the dashboard.
Dashboards that update every 30 seconds without every viewer re-running the queries, plus a gauge, a stat with a trend line, progress bars, a status grid, table formatting and goal lines. The roadmap has the whole history.
Everything in SQLDesk today ends in one SELECT. A notebook is for the work that does not: cells in SQL and in Python, each reading the last one's result, saved and re-runnable. Beside it, the rule the rest of 0.8 is organised around — bytes scanned and an estimate of the work, shown as a number you can refuse, before the query runs rather than after the invoice arrives.
Server-sent events replacing the status polling loop, concurrency that does not cost a whole OS process per connection, and a frontend that no longer ships its entire bundle on first load.
Under the hood
Python 3.13, Flask and SQLAlchemy, with RQ workers running queries, schedules and alerts off the request path. The web server, workers and scheduler are separate processes.
React and TypeScript, built with Webpack. Visualizations live in their own workspace package so charts can be developed and tested independently of the app.
Postgres holds queries, dashboards, users and cached results. Redis handles job queues, locks and schema caching. DuckDB backs file upload and local analytics.
Docker Compose for a single box, or the Helm chart in charts/sqldesk for Kubernetes. No
managed service required and no license server to call.