SQLDesk

One place for everything you do with data.

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.

Get started View source

Apache 2.0 · Python + React · runs in Docker

See it

A dashboard that keeps itself up to date

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

Running in three commands

A published image, plus the Postgres and Redis it needs. Nothing to build.

bash
# 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.

Configuration

SQLDesk reads SQLDESK_* environment variables. Migrating an existing Redash install? Your REDASH_* variables still work as a fallback, so your .env keeps running untouched.

Keep your secret key

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.

No phone home

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

A query editor, and everything downstream of it

Analysts write SQL. Everyone else gets dashboards, alerts and links that keep working.

Query editor

Schema browser, autocomplete, query formatting, parameters and scheduled refresh. Fork a query, schedule it, publish it.

Dashboards

Drag visualizations into a grid, filter across them at once, and export a one-page report as a PDF or an image.

Alerts

Trigger on a query result and notify email, Slack, Microsoft Teams, PagerDuty, webhooks and seven more destinations.

Upload a file

Drop in a CSV or Parquet file and query it with SQL immediately, backed by DuckDB. No pipeline required.

Visualizations

Charts, tables, pivot tables, cohorts, funnels, maps, counters — all configured without code.

Permissions

Groups, per-data-source access, view-only roles and shareable public links with their own tokens.

Data sources

35+ databases, out of the box

Each one is a small plugin over the vendor's own driver, so connections behave the way the vendor intended.

PostgreSQLMySQLBigQuery SnowflakeDatabricksRedshift AthenaClickHouseDuckDB MongoDBElasticsearchSQL Server OracleTrinoPresto CassandraDruidSQLite Google SheetsPrometheusInfluxDB and more

Roadmap

Where this is going

The goal is one tool for the whole job — not another dashboard you bolt onto four other products.

New0.7

Kafka topics you can chart

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.

Shipped0.6

Your warehouse, answerable over MCP

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.

Shipped0.5

Less chrome, more chart

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.

Shipped0.4

Live dashboards and KPI tiles

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.

Next0.8

Notebooks, and knowing what a query costs

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.

NextPerformance

Push instead of poll

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

Boring where it counts

Backend

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.

Frontend

React and TypeScript, built with Webpack. Visualizations live in their own workspace package so charts can be developed and tested independently of the app.

Storage

Postgres holds queries, dashboards, users and cached results. Redis handles job queues, locks and schema caching. DuckDB backs file upload and local analytics.

Deployment

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.