The feature surface · eighteen modules

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.

01/ 10·Connections

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.

PostgreSQL
PostgreSQL
MySQL
MySQL
SQL Server
SQL Server
BigQuery
BigQuery
Snowflake
Snowflake
Redshift
Redshift
ClickHouse
ClickHouse
DuckDB
DuckDB
SQLite
SQLite
Oracle
Oracle
MariaDB
MariaDB
CockroachDB
CockroachDB
Databricks
Databricks
Presto
Presto
Trino
Trino
Read-only by design. Write statements are rejected at the workbench layer, not just by convention.
The contract

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
Search…⌘ K
prodJD
Connections
6 connections · 5 healthy

Connections

6

Healthy

5

Avg latency

24ms

All6Latency1Healthy5
PostgreSQL
analytics-prod
db.acme.io
connected
Latency8ms
BigQuery
warehouse-bq
bigquery.io
connected
Latency64ms
MySQL
orders-mysql
orders.local
connected
Latency12ms
PostgreSQL
reporting-replica
replica.acme
connected
Latency11ms
02/ 10·Workbench

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.

Search…⌘ K
prodJD
weekly-revenuePostgreSQLanalytics-proddone
weekly-revenue.sql+
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;
12,847 rows · 482mscached 5m
CSVXLSXJSONSQL
weekordersrevenue_usd
2026-05-252,431$184,228.40
2026-05-182,109$162,041.18
2026-05-111,884$148,772.93
2026-04-271,609$124,318.45
The best SQL editor for DataRunner is the editor you’re already using everywhere else.
The bet
03/ 10·Schedules

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.

Search…⌘ K
prodJD
Schedules
9 active · next run in 14 minutes
Hourly2Daily3Weekly2Monthly1Paused1
ReportCronChannelsNext runStatus
Weekly revenue0 9 * * 1Mon 09:00scheduled
Daily ops report0 8 * * *Tomorrow 08:00scheduled
Order anomalies*/15 * * * *in 4 minrunning
Monthly NPS0 9 1 * *Jul 1 09:00scheduled
Hourly inventory0 * * * *in 47 minretry 1/3
Cron typology
*/15 * * * *Every 15 minutes
0 9 * * 1Monday · 09:00
0 9 1 * *1st of month · 09:00
0 9 * * 1-5Weekdays · 09:00
@hourlyEvery hour, on the hour
0 0 1 1 *New Year · midnight

Full 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.

04/ 10·Watches

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.

The other path
Change Data Capture
  • Needs a replication slot or write role
  • Needs a long-running consumer
  • Breaks when the schema does
  • Best for high-volume event streams
Our path
Polling watches
  • Just SELECT permission
  • Same engine as scheduled reports
  • Survives schema changes
  • Best for "tell me when X happens"
Search…⌘ K
prodJD
Watches
4 active · 3 fired in the last hour
new-orders
every 60s·last fired 2 min ago
47/24hfiring
failed-payments
every 120s·last fired 11 min ago
3/24hfiring
low-inventory
every 5m·last fired 38 min ago
12/24harmed
support-tickets-p1
every 60s·last fired 4 min ago
8/24harmed
If your watch returns 200 rows in one poll, you get one notification with 200 rows attached — not 200 emails.
The promise
05/ 10·Delivery

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.

Email
SMTP · transactional API · 20MB attach

CSV, Excel, PDF, or an inline summary in the body.

Slack
Channel post · DM · Block Kit body

File attachment with templated message body.

Amazon S3
R2 · MinIO · Wasabi · templated paths

Any S3-compatible bucket with cron variables.

Webhook
POST JSON · HMAC signed · custom headers

Structured payload to any HTTP endpoint.

Output formats
per schedule
CSVUTF-8 · configurable delimiter
.csv
ExcelMulti-sheet · auto-width
.xlsx
PDFPaginated · header/footer
.pdf
JSONWebhook payload
.json
We deliberately do not support SMS. The cost model is different enough that we would rather not ship a half-built version.
The deliberate omission
06/ 10·History & Audit

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
Search…⌘ K
prodJD
Run history
1,284 runs · last 24h
All1,284Schedule847Watch319Manual118
NameTriggerStatusRowsWhen
weekly-revenuescheduleok12,8472 min ago
new-orders.watchwatchok34 min ago
daily-ops.reportscheduleok84714 min ago
order-anomalieswatchempty022 min ago
inventory-hourlyscheduleerror38 min ago
ad-hoc querymanualok1241 hr ago
07/ 10·Teams & Access

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.

Search…⌘ K
prodJD
Acme · workspace
5 members · SAML SSO enforced
Search members…
Sarah Chen
sarah@acme.com
Owner
David Park
david@acme.com
Admin
Anh Nguyen
anh@acme.com
Editor
Maya Rodriguez
maya@acme.com
Editor
Jordan Lee
jordan@acme.com
Viewer
Owner · permissions
Run queries
Edit reports
Edit schedules
Add connections
Invite members
View audit log
Manage billing
Manage API keys

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.
The constraint
An intermission

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.

A BI tool

We render charts on dashboards, but if you need pivot tables, drill-paths, and a semantic layer, you want Metabase or Looker.

An ETL pipeline

We read from your databases; we do not move data between them. Fivetran and dbt live in a different drawer.

A notification firehose

Watches and monitors batch. If you need 10k events per second, this is the wrong layer.

A write tool

The workbench rejects DML and DDL on purpose. We are a reporting surface, not a database client.

08/ 10·Endpoint monitors

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.

Search…⌘ K
prodJD
Monitors
8 endpoints · 1 incident open
All8Down1Up7
api.acme.com/health
GET 30s
42msok
app.acme.com/login
GET 60s
187msok
payments.acme.com/charge
POST 60s
241msok
legacy.internal/jobs
HEAD 60s
timeout503

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
09/ 10·Marketing campaigns

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.

01Draft
02Scheduled
03Sending
04Sent
Search…⌘ K
prodJD
Campaigns
3 scheduled · 2 sent · 1 draft this week
All6Draft1Scheduled3Sent2
Product update — Watches
New: Database Watches, live now
sent
8,471 recipients8,402 delivered
June newsletter
What we shipped in June
scheduled
12,309 recipients delivered
Customer feedback survey
2 questions, 60 seconds
sending
512 recipients188 delivered
Q3 pricing announcement
— draft —
draft
recipients delivered

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.

10/ 10·Dashboards

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.

Revenue today
$184,228
+12.4%
Open orders
2,431
+ 184
Refunds 24h
37
−5
p95 latency
482ms
+18ms
And the rest

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.

Metrics

A semantic layer: one canonical, parameterizable SQL definition per number, shared across every dashboard.

Catalog

Searchable inventory of every introspected table and column, annotated with descriptions and tags.

Hosts

A lightweight push agent streams CPU, memory, disk and network from Linux and Windows boxes.

Status pages

Public uptime pages assembled from your monitors — component status and incident history at a clean URL.

Alerting

Routes with escalation tiers, on-call rotations, and maintenance windows that silence planned work.

Contacts

Audience and broadcast lists with double opt-in, suppression, and one-click unsubscribe at send time.

Sequences

Automated multi-step email drips — email, wait, condition, webhook — triggered by contact events.

Forms

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.