Every module. One workspace. No add-on tax.
The full inventory — the ten core modules in depth, plus metrics, catalog, hosts, status pages, alerting, contacts, sequences, and forms. What each does, and how they connect.
If SELECT reaches it, DataRunner connects to it.
Fifteen native drivers, not a JDBC shim. Credentials live encrypted on the server and never come back to the browser in plaintext — not even to repopulate a form. SSL and SSH tunnels are configured per connection, so a bastion-only Postgres looks the same in the UI as a public BigQuery.
Read-only by design. Write statements are rejected at the workbench layer, not just by convention.
Live schema browser
Tables, columns, types, row counts, indexes — fetched on every successful connection test, cached for the session.
SSL + SSH tunnel
Bring your own cert or upload a private key. Bastion hops are a checkbox, not a separate proxy you have to run.
Health monitoring
Latency probe per minute. When a connection goes red, anything that depends on it gets a flag in the UI before it fails a run.
Schema snapshots
Pin a point-in-time snapshot. Useful when an upstream team breaks a column and you need to prove what the contract was.
- Drivers
- 15+ native
- Transport
- TLS, SSH tunnel
- Health check
- every 60s
- Schema cache
- live, per test
Connections
6
Healthy
5
Avg latency
24ms
The editor you already know, wired to your real schema.
We did not build our own editor — Monaco does the heavy lifting, which means your muscle memory works on day one. The interesting parts are what we put around it.
Schema-aware autocomplete
Completion pulls from whichever connection the active tab is bound to. Switch the dropdown and the suggestion list reloads silently.
Multi-tab state
Every tab keeps its own connection, parameters, and result. Survives a refresh.
Parameterized queries
Default values in the workbench, overrides per schedule or per watch run.
Live preview
Table or chart. Export the preview straight to CSV/Excel without scheduling anything.
SELECT
date_trunc('week', created_at) AS week,
COUNT(*) AS orders,
SUM(total_cents)/100.0 AS revenue_usd
FROM orders
WHERE status = 'fulfilled'
AND created_at >= now() - INTERVAL '90 days'
GROUP BY 1 ORDER BY 1 DESC;The best SQL editor for DataRunner is the editor you’re already using everywhere else.
Cron, with delivery, history, and someone to blame.
A schedule is a query + a cron expression + at least one channel. DataRunner runs it on the dot, captures the result, formats it, ships it, and writes the whole exchange to a history row you can drill into weeks later.
*/15 * * * *Every 15 minutes0 9 * * 1Monday · 09:000 9 1 * *1st of month · 09:000 9 * * 1-5Weekdays · 09:00@hourlyEvery hour, on the hour0 0 1 1 *New Year · midnightFull POSIX syntax
From */1 to "first Monday of the month at 09:00". Visual builder available, but you can paste raw expressions.
CSV / XLSX / PDF
CSV with configurable delimiter. Multi-sheet workbooks. Paginated PDF with header/footer slots.
Parallel fan-out
Email + Slack + S3 + webhook in one shot. One failure does not block the others.
Per-run history
Trigger, duration, row count, per-channel delivery receipt, downloadable output.
When polling is the honest answer.
Triggers are great until you do not control the database. Watches are the pragmatic alternative — a SELECT that runs on an interval, with per-row dedup so the same record never fires twice.
- Needs a replication slot or write role
- Needs a long-running consumer
- Breaks when the schema does
- Best for high-volume event streams
- Just SELECT permission
- Same engine as scheduled reports
- Survives schema changes
- Best for "tell me when X happens"
If your watch returns 200 rows in one poll, you get one notification with 200 rows attached — not 200 emails.
Four channels. One report. Configured once.
Every report can fan out to email, Slack, S3, and a webhook in the same run. Templates accept the same {{params}} as the query, so the recipient list, subject line, and S3 path can all be derived from the row data.
CSV, Excel, PDF, or an inline summary in the body.
File attachment with templated message body.
Any S3-compatible bucket with cron variables.
Structured payload to any HTTP endpoint.
We deliberately do not support SMS. The cost model is different enough that we would rather not ship a half-built version.
Everything that ran. Why it ran. Who set it up.
One unified log across schedules, watches, monitors, campaigns, and manual runs. The log is append-only and exportable — auditors get a CSV, you get to go back to building.
Unified execution log
Trigger-type labels make it obvious whether a row was scheduled, watch-fired, or kicked off by a person.
Drill-down
Query text, bound parameters, the actual result preview, and the per-channel delivery receipt — all one click from the log row.
Configuration audit
Connection added, schedule edited, member promoted — every change logged with actor, timestamp, and a JSON diff.
CSV export
Filtered history exports respect the active filters. Hand the file to compliance and move on.
- Retention
- 90d / 2y
- Storage
- append-only
- Export
- CSV
- Diff
- before/after JSON
RBAC that doesn’t require a six-week rollout.
Owner, Admin, Editor, Viewer out of the box — enough for most teams to ship the same afternoon they sign up. When that gets crowded, define custom roles per workspace and pick exactly which actions each role can take.
Workspaces
Separate environments per team or per customer. Each workspace has its own connections, reports, billing, and audit trail.
SAML 2.0 SSO
Just-in-time provisioning. Group-claims map to default roles. Enforce per workspace.
Custom roles
Granular permission grid. Lets SecOps say yes to the data team without breaking compliance.
Scoped API keys
Per-workspace, with expiry dates and one-click revoke. Trigger any report from your CI runner.
Mark a column as PII at the connection layer. It gets redacted from previews, exports, and history — even for editors.
Four things DataRunner is not.
Every tool has an opposite of its strength. Here is ours, in plain English. If you came looking for one of these, stop here and save yourself the disappointment.
We render charts on dashboards, but if you need pivot tables, drill-paths, and a semantic layer, you want Metabase or Looker.
We read from your databases; we do not move data between them. Fivetran and dbt live in a different drawer.
Watches and monitors batch. If you need 10k events per second, this is the wrong layer.
The workbench rejects DML and DDL on purpose. We are a reporting surface, not a database client.
Uptime checks that match the rest of your stack.
We did not set out to compete with Pingdom. We added monitors because most of our users already had a synthetic-checks spreadsheet on the side, and the incident timeline belongs in the same audit log as the rest of their pipeline.
Three probe methods
HEAD for the lightweight check, GET when you need the body, POST for endpoints that reject everything else.
Strict status validation
You declare the expected code. A surprise 302 counts as down, because surprise 302s usually are.
Consecutive threshold
Tune N to suppress the blip-of-the-day without losing real outages. Default is 2.
Incident lifecycle
Auto-open at threshold, auto-close on recovery, duration captured. Resolved manually if you need to override.
- Min interval
- 30s
- Methods
- GET / HEAD / POST
- Threshold
- N fails
- Incident
- auto open/close
Send the email. Track the recipients. Move on.
Built for the kind of campaign you actually send — a product update, a renewal notice, an outage post-mortem. Broadcast lists are the same primitive used by scheduled reports.
Three campaign types
Same engine, different labels. The tag drives the default unsubscribe footer and the suppression rules.
Broadcast list targeting
Multiple lists per campaign, deduped at send. No recipient gets two copies because they are in both lists.
Template reuse
Pull from the same template library as reports. Or compose inline — versioned regardless.
Per-recipient log
Address, platform, status, timestamp, error string. The same shape as report delivery receipts.
For the screen on the wall, not the executive deck.
Dashboards are deliberately simple — KPI, line/bar/pie chart, and data table. If you need a BI tool, use one. If you need a live view of three numbers next to a chart of yesterday's orders, this is for you.
Grid layout
Resize and reorder. Layouts save per user, so the night-shift dashboard does not have to match the day-shift one.
KPI widgets
Big number, sparkline, delta vs. previous period, color thresholds. The thing the screen is for.
Charts
Line, bar, pie. Source any saved query. Axis config that does not require a docs trip.
Auto-refresh
Configurable per dashboard. Default 60s, which is the right answer for TV-on-the-wall use cases.
Eight more modules in the same workspace
Beyond the ten above, DataRunner ships a full data, monitoring, and outreach surface — no add-ons, no separate tools.
A semantic layer: one canonical, parameterizable SQL definition per number, shared across every dashboard.
Searchable inventory of every introspected table and column, annotated with descriptions and tags.
A lightweight push agent streams CPU, memory, disk and network from Linux and Windows boxes.
Public uptime pages assembled from your monitors — component status and incident history at a clean URL.
Routes with escalation tiers, on-call rotations, and maintenance windows that silence planned work.
Audience and broadcast lists with double opt-in, suppression, and one-click unsubscribe at send time.
Automated multi-step email drips — email, wait, condition, webhook — triggered by contact events.
Embeddable signup forms with Turnstile/hCaptcha that feed straight into a broadcast list.
Read the matrix, then run the thing.
Specs only go so far. Connect a database, write the first query, and watch a report show up in your inbox before lunch.