QDevQDev
Add to Chrome
FOR DATA ENGINEERS

Debug the payload
before it breaks the DAG.

Event streams, webhook payloads, dead-letter records, config blobs — inspect the one malformed message, count events by type, or catch schema drift by asking. QDev writes the jq and runs it locally.

  • Find the record with the null field without a scratch script
  • Counts & rollups are exact — jq computes them, not a model
  • Production data & PII stay on your machine — never uploaded
⌘K
try
● EVENTS.NDJSON — 128,400 RECORDS · LOCAL
{ "events": [ { "ts": "2026-07-04T09:14:02Z", "type": "page_view", "user_id": "u_1204", "status": "ok" }, { "ts": "2026-07-04T09:14:03Z", "type": "purchase", "user_id": null, "status": "ok" }, { "ts": "2026-07-04T09:14:05Z", "type": "checkout", "user_id": "u_0098", "status": "error" } ] }
↑ Ask a rollup or a validation — jq scans all 128k records locally. Only the schema is ever sent.
exact rollups · reproducible jq · nothing uploaded
SOUND FAMILIAR?

3am, the pipeline's red

Schema drift, silently
An upstream service started sending user_id: null and half a partition got dropped before anyone noticed.
The dead-letter queue
A few thousand records failed to parse. You need the one field that's wrong across all of them — fast.
NDJSON too big to grep
A 300 MB export won't open, and jq on the CLI means quoting a filter three times to get the escaping right.
ASK, DON'T SSH INTO A NOTEBOOK

From a bad record to a root cause

🧬
Catch schema drift
Find records missing a field, with a wrong type, or a value outside the enum you expected.
events where status isn't ok or error
📈
Roll up & count
Events by type, error rate per source, volume per hour — exact counts, computed by jq.
count events by type per hour
🧯
Triage the DLT
Isolate the malformed records and see exactly which field failed, across the whole batch.
records where amount is not a number
🪆
Flatten nested records
Explode a nested payload into flat rows ready to reload or diff against the source.
flatten payload.items into one row each
FITS YOUR STACK

Wherever your JSON lands

STREAMS
Kafka / events
Event and message payloads — grouped, counted, and validated locally.
NDJSON
Line-delimited
Log exports and batch files too big to open elsewhere.
WEBHOOKS
API payloads
Inspect the exact body that failed a downstream contract.
CONFIG
Configs & manifests
dbt, Airflow, package manifests — read the shape at a glance.
# QDev: "records where user_id is null" → paste the jq into your DLT replay [.events[] | select(.user_id == null)] | length # 412 dropped
● PROD DATA STAYS IN PROD

Payloads never leave the tab.

Customer records, PII, tokens caught in an event — the values stay local. Only the schema (field names & types) and your question are ever sent, and only on the hosted tier. Handling regulated data? Run local AI, free, and nothing leaves at all.

jq runs in a sandboxed Web Worker — no network access
Hosted proxy is stateless & zero-retention — logs nothing
No data pipeline to a vendor, no sampling, no copy of your stream

One record is malformed. Find it.

Install free, keep your stream local, and let ⌘K write the jq that isolates the bad payload.

QDevQDev

The JSON viewer that answers back. Free & open source, for Chrome and Firefox.

PRODUCT
RESOURCES
ACCOUNT
MIT licensed · zero-retention proxy · your data stays yours
© 2026 qdev