Four equal cards across the content width. Numerals are Display with tabular figures so live updates never shift layout. Each card is a link into its area.
Stat card row — Loading skeleton
Schemas
12
Tables
128
Sources
46
Prediction tasks
88
Labels render immediately — they are chrome, not data. Only the numerals shimmer, sized to their final dimensions.
Stat card row — 6 cards wrapping edge case
Schemas
12
Tables
128
Sources
46
Prediction tasks
88
Derived relations
214
Alert rules
37
When a project defines extra areas, the row wraps to a second line instead of shrinking cards below their 150px minimum. Order stays stable.
Source row
Source row — Healthy state
raw_orders
PostgreSQL
Healthy
2026-07-28 14:02
12,842,113
Source name in mono as a link; connector type in body Inter; health is always dot + word; last sync and records in mono, records right-aligned.
Source row — Lagging state
clickstream_events
Kafka
Lagging
2026-07-28 13:50
12m behind
48,116,207
Lagging rows quantify the lag under the last-sync timestamp — amber text, mono, never a colored row background.
Source row — Failed with retry state
pmxt_feed
SFTP
Failed
2026-07-28 00:14
903,441
Failed rows surface the retry action inline in the trailing gutter. Record count shows the last successful sync's total, not zero.
Source row — Loading skeleton
name
type
health
sync
records
Connector tile
Connector tile — Connected
PgConnected
PostgreSQL
3 sources · last sync 2026-07-28 14:02
No skeleton for tiles: the connector catalog is static configuration, not async data — it renders with the page.
Connector tile — Available, hover state
Sf
Snowflake
Not connected
Available tiles show no badge at rest; the Connect button appears on hover (rendered here in its hover state).
Connector tile — Needs attention state
MyNeeds attention
MySQL
Credentials expire in 3 days
Connector tile — Long name edge case
ESConnected
Elasticsearch (self-managed cluster)
1 source · last sync 2026-07-27 22:41
Names truncate on one line with the full name in a title tooltip. The badge never wraps or shrinks.
Connector tiles — 3×3 grid composition
PgConnected
PostgreSQL
3 sources
KfConnected
Kafka
2 sources
MyNeeds attention
MySQL
Credentials expire in 3 days
Sf
Snowflake
Not connected
S3Connected
Amazon S3
6 sources
ESConnected
Elasticsearch (self-managed cluster)
1 source
SF
SFTP
Not connected
BQ
BigQuery
Not connected
Wh
Webhook
Not connected
Ruling: connector logos are monochrome monogram tiles, never brand color or emoji. Connection lifecycle (Connected / Needs attention) is genuine state, so the badge may use state colors.
Activity feed item
Feed item — Default
⚙️orders_dbt_modelrun completed
2h ago
36px row: type glyph, object name in mono, event verb in body Inter, relative time right-aligned in mono.
Feed item — Failure state
⚙️ing_customerssync failed
14m ago
Failures get a 2px critical left edge and a critical verb — never a colored row background.
The object name truncates; the verb and timestamp never do — scan columns stay aligned down the feed.
Feed — 5 items composed
Recent activity
⚙️orders_dbt_modelrun completed
2h ago
⬇️raw_inventorysynced
3h ago
⚙️ing_customerssync failed
14m ago
📷daily_sales_snapshotsnapshot
5h ago
🎯new_customer_cohorttask trained
1d ago
View all activity →
Feed — Loading skeleton
Recent activity
itemt
itemt
itemt
itemt
View all activity →
Card title and footer link are chrome and render immediately; only the event rows shimmer.
Health summary card
Health summary — All healthy
All systems operational
Ingestion pipelinesHealthy
TransformationsHealthy
Semantic servicesHealthy
Prediction servicesHealthy
View full health →
No skeleton here: health arrives with the page's first poll; while checking, dots render in line grey with the word "Checking…" instead of shimmering.
Health summary — Degraded state
1 subsystem lagging
Ingestion pipelinesLagging
clickstream_events is 12m behind its 5m sync frequency.
TransformationsHealthy
Semantic servicesHealthy
Prediction servicesHealthy
View full health →
The banner drops to the worst state; the affected row gains one detail line naming the object in mono and quantifying the lag.
Health summary — Failed state
⛔
Sync failed: credentials rejected by Postgres. Update the connection and retry.
1 subsystem failing
Ingestion pipelinesFailed
TransformationsHealthy
Semantic servicesHealthy
Prediction servicesHealthy
View full health →
Errors say what happened and what to do next, in the interface's voice. The banner sits above the summary row so triage starts at the top.
Freshness row
Freshness row — Healthy state
raw_orders
Healthy
5m
2m ago
2,412,096
Sparkline bars use the desaturated categorical ramp derived from signal — state colors never appear in chart marks, so red always means failure.
Freshness row — Lagging state
clickstream_events
Lagging
15m
6h ago
23 syncs behind
12,842,113
A tapering sparkline plus the mono "syncs behind" count — staleness reads as geometry before arithmetic.
Freshness row — Failed state
pmxt_feed
Failed
5m
14h ago
903,441
After the failure the sparkline flatlines in line-grey stubs — no state color enters the series. Failure lives in the health column, so red always means exactly one thing.
Freshness row — Loading skeleton
name
health
fq
sync
records
spark
Dataset column card
Column card — Default
Columns7 of 42
Name
Type
Null %
Distinct
Min
Max
Sample
order_id
bigint
0.0
12,842,113
1
12842113
88214207
customer_id
bigint
0.0
2,361,068
1002
9944810
4471203
created_attemporal
timestamptz
0.0
11,204,551
2019-03-01
2026-07-28
2026-07-28 14:02
status
varchar
0.2
6
—
—
fulfilled
total_amount
numeric(12,2)
1.4
402,118
0.00
184220.00
129.99
Every value is mono; numerics right-aligned with tabular figures. Temporal columns carry the violet badge and a violet type — users learn one association: violet means time.
Column card — Long values edge case
Name
Type
Null %
Distinct
Sample
shipping_address
varchar
3.1
1,988,402
1600 Amphitheatre Parkway, Building 43, Mountain View, CA 94043, United States
Sample and name cells truncate to a fixed max width so numeric columns never drift; the full value appears in a tooltip and in the column drawer.
Column card — Loading skeleton
Columnscount
Name
Type
Null %
Distinct
Min
Max
Sample
n
t
%
d
m
m
s
n
t
%
d
m
m
s
n
t
%
d
m
m
s
Profile statistics arrive from an async scan, so cells shimmer; the header row is chrome and renders immediately.
Derived-relation filter row
Filter rows — Default
orders.created_at >= :start_date✕
orders.status IN ('fulfilled', 'shipped')✕
date_trunc('week', orders.created_at)✕
Each expression is a removable row in RelQL mono; the ghost "+ Add filter" row keeps the add action in reading order.
Filter rows — Invalid expression state
orders.created_at >= :start_date✕
orders.total_amont > 100✕
Unknown column total_amont — did you mean total_amount?
The offending token gets a critical wavy underline; the error text names the problem and suggests the fix. The row stays editable in place.
Time-window card
Time window — Default
Training window1 year rolling · horizon 30 days
training window
horizon
2025-10-28
2026-02-28
now
2025-07-28 → 2026-06-28 · anchor at window edges
The signature spine: solid violet region for the training window, hatched region for the label horizon ("data you may not use yet"), hollow carets at anchors, solid caret at now. No skeleton — window geometry is configuration and renders with the card.
Time window — Backfill in progress state
Training windowBackfilling62%
training window
horizon
now
backfilled 2025-07-28 → 2026-03-02 · 7,944,102 of 12,842,113 rows
The full window renders as a dashed outline; the solid fill grows left-to-right as the backfill completes. Progress is stated in mono rows, not just a percentage.
Time window — Misconfigured state
⛔
This window reads data after its availability cutoff. Shorten the window or add a backdating rule.
Training window1 year rolling · horizon 30 days
training window
past cutoff
cutoff 2026-06-28
now
The window's border turns critical where it overlaps the hatched availability region; the cutoff tick and label go critical too. The banner says what to do next.
Skill properties panel
Properties panel — Default
Propertiesv1Active
Data sensitivityNone
Update frequencyDaily
Owneranalytics_team
Last updated2026-05-06 11:32
No skeleton: properties load with the skill document itself, never separately. Keys in body Inter; values that are data (owner, timestamp) in mono.
The value truncates from a fixed max width; the key column never compresses. Full value on hover.
Properties panel — Draft state
Propertiesv2Draft
Data sensitivityNone
Update frequencyDaily
Owneranalytics_team
Last updated2026-07-28 13:47
Draft changes apply after you publish v2. v1 stays active until then.
Label distribution card
Label distribution — Default
Label distributionchurn_flag
2,361,068 distinct · 403,549 covered 17.1%
Histogram bars use the categorical ramp, never state colors. Coverage stat in mono with the percentage lifted to ink for scanning.
Label distribution — Skewed edge case
Label distributionchurn_flag
2,361,068 distinct · 2,290,236 covered 97.0%
Class balance 97:3 — consider resampling.
Bars stay in the categorical ramp even when skewed — the warning lives in the banner, not the chart, so amber keeps its meaning.
Label distribution — Loading skeleton
Label distributionchurn_flag
chart
coverage
The card title and label name are chrome; the histogram and coverage stat come from an async profile scan and shimmer at final size.
Prediction task config card
Task config — Active
churn_modelActive
Target labelchurn_flag
Model typeBinary classification
MetricAUC-ROC
Training window1 year rolling
Horizon30 days
ScheduleWeekly
Next run2026-08-04 06:00
No skeleton: configuration loads with the task record in one request. Values that are data — label, timestamps — are mono; enum choices stay in body Inter.
Task config — Paused state
churn_modelPaused
Target labelchurn_flag
Model typeBinary classification
MetricAUC-ROC
Training window1 year rolling
Horizon30 days
ScheduleWeekly
Next runPaused — no runs scheduled
Paused is a lifecycle state, not a health state, so the badge is grey, not amber. Next run states the consequence in words.
Task config — Last run failed state
churn_modelFailed
⛔
Last run failed: label coverage below 5%. Check churn_flag coverage and rerun.
Target labelchurn_flag
Model typeBinary classification
MetricAUC-ROC
Training window1 year rolling
Horizon30 days
Next run2026-08-04 06:00
Run row
Run row — Completed
churn_model_train_2841
Task
Completed
2026-07-28 14:02
12m 41s
Type badges: Task blue, Ingestion violet-free grey, Pipeline grey — state colors stay reserved for status. Duration right-aligned mono.
Run row — Running state
raw_orders_sync_88214
Ingestion
Running
2026-07-28 14:29
3m 07s
Busy spinner plus live duration ticking in signal blue. Running is progress, not health, so it never uses green or amber.
Run row — Failed state
daily_sales_pipeline_412
Pipeline
Failed
2026-07-28 06:00
4m 22s
View logs
Run row — Queued state
new_customer_cohort_train_91
Task
◌ Queued
—
—
Queued has no start time or duration yet; em dashes hold the columns so nothing shifts when the run starts.
Run row — Loading skeleton
name
type
status
started
dur
Alert row
Alert row — Warning, investigating
daily_sales_delay
Warning
pipeline
1h ago
Investigating
Severity owns color (dot + word); status owns lifecycle and stays plain text. Alert name, source, and trigger time in mono. Ruling: alert severity (Critical / Warning / Info) is a second, alert-scoped vocabulary and intentionally uses state colors — it never bleeds into charts or lifecycle badges.
Alert row — Critical, open state
payments_final_timeout
Critical
ingestion
1m ago
Open
Unacknowledged Critical rows carry a 2px critical left edge — the only row-level color allowed, and only until acknowledged.
Alert row — Leakage state
⧗churn_model reads payments_final after anchor timeleakage
Critical
schema
2h ago
Open
Leakage is a distinct alert class: violet ⧗ glyph plus a violet "leakage" badge tell users this is about temporal correctness, not infrastructure. Severity stays critical.
Titles truncate; severity, source, and trigger columns hold their widths so the table scans down as columns.
Saved query item
Saved query — Default
Weekly order volumeran 2h ago
from orders |> group by date_trunc('week', created_at) |> count()
418 rows
Query title in body Inter; the first RelQL line in mono on a paper chip, truncated to one line. Last run and row count in mono.
Saved query — Running state
Churn cohort snapshot
Running · 0m 42s
from customers |> where cohort = 'new_customer_cohort' |> snapshot(at: :anchor)
rows pending…
While running, the row count slot reads "rows pending…" so the layout holds; elapsed time ticks live in mono.
Saved query — Failed state
Label coverage by regionran 14m ago
from labels |> join regions on labels.region_id = regions.id |> coverage()
Failed · 3 diagnosticsOpen in workbench
Failed queries show the diagnostic count inline and link straight into the workbench where the diagnostics render against the query text.
Member row
Member row — Default
PS
Priya Sharma
priya@acme-supply.com
2026-07-28 09:14
Name in body Inter, email in mono — the email is data. Role is an inline select; last active in mono. No skeleton: the member list is small and loads with the settings page.
Member row — Pending invite state
✉
jordan.lee@acme-supply.com
Resend invite
Invited 2d ago
No name yet, so the email leads. The role select stays live — the invite lands with the role you set here.
Member row — Current user state
DH
Daniel Henneberger You
daniel@acme-supply.com
🔒
now
Your own role select is locked — you cannot demote yourself and orphan the project's last admin. Another admin changes it, or you transfer ownership first.
RelQL Studio · Collections100%scroll to pan · pinch to zoom · ⌘0 resetComponents · Pages