Quacksmith Quacksmith Quacksmith Quacksmith Coming 2027 Tell me when it ships

Your colleague can check your pipeline
without reading SQL.

Describe it in words or draw it. Then read it back, step by step, with real data.

revenue_by_segment.sql22 lines · 1 statement
-- revenue_by_segment
SELECT
    cs.segment,
    cs.country,
    date_trunc('month', t.booked_at)                    AS month,
    sum(t.amount)                                    AS net_revenue,
    count(*)                                         AS txns,
    rank() OVER (PARTITION BY date_trunc('month', t.booked_at)
                 ORDER BY sum(t.amount) DESC)          AS rnk,
    sum(t.amount) - lag(sum(t.amount)) OVER (
        PARTITION BY cs.segment, cs.country
        ORDER BY date_trunc('month', t.booked_at))    AS mom_delta
FROM read_parquet('s3://warehouse/transactions/*') t
JOIN (
      SELECT c.customer_id, c.country, p.segment
      FROM public.customers c
      LEFT JOIN read_csv_auto('plans.csv') p USING (plan_code)
     ) cs USING (customer_id)
WHERE t.status = 'settled'
  AND t.booked_at >= DATE '2026-01-01'
GROUP BY 1, 2, 3
ORDER BY month, rnk;

Today, checking it means reading this.

Twenty-two lines, written the way a person actually writes them — not one step per line, but everything folded into one statement. Every join and every filter in it is correct. Not one of them will tell you what it threw away.

15,889 transactions fell out of that join. Nothing above says so. You would have to run it yourself, and know to go looking.

The same flow, drawn

Try it yourself

This is the studio’s own canvas, not a picture of one. Every wire carries the number of rows that crossed it. Drag a node. Press one to read its rows. Look at what the join did quietly.

flow canvas · revenue_by_segment drag a node · click one to inspect it · scroll sideways for the rest
SOURCE transactions/* SOURCE public.customers SOURCE plans.csv FILTER settled · 2026 SELECT 3 columns JOIN on customer_id LOOKUP segment from plans AGGREGATE sum by segment · month WINDOW rank · MoM delta OUTPUT revenue_by_segment 48,213,904 812,455 812,455 14 43,908,177 812,455 43,892,288 −15,889 1,284 1,284
You describe it, in your own words. The canvas draws it — three sources, a filter pushed down, a join, a lookup. It runs left to right, and every wire carries its own count. 15,889 transactions had no matching customer. The join says so, on the wire — now drag a node, or press one to read its rows.
Read it as a run — the record the product keeps
okrevenue_by_segment 10 nodes8,849 msbase snapshot 3

Where the time went, and where the rows went

Started 30 Aug 2026 09:14· ran for 8.85s· every track below is that window

The durations and the start time here are illustrative — drawn for this page, not measured from a run. The shape, the grain and the order are the record’s own.

  1. transactions/*source_transactions 612ms · at +12ms 0→48,213,904 read 48,213,904 rowsParquet in S3, this year’s transactions
  2. public.customerssource_customers 88ms · at +628ms 0→812,455 read 812,455 rowsThe customers table, already in the project
  3. plans.csvsource_plans 6ms · at +720ms 0→14 read 14 rowsA fourteen-row plan-code to segment reference
  4. settled · 2026filter_settled 38ms · at +730ms 48,213,904→43,908,177 dropped 4,305,727 rows — 9% of what came in most of any stepstatus = 'settled', booked this year
  5. 3 columnsselect_customer 21ms · at +772ms 812,455→812,455 kept all 812,455 rowscustomer_id, country, plan_code
  6. segment from planslookup_tier 190ms · at +797ms 812,469→812,455 kept all 812,455 rows — the other 14 came in as the reference it readsTurns each plan code into the segment it belongs to — on the customers, before the transactions arrive
  7. on customer_idjoin_customers 4.18s · at +991ms 44,720,632→43,892,288 joined to 43,892,288 rows 15,889 unmatchedInner join, transactions to customers
  8. sum by segment · monthaggregate_revenue 2.94s · at +5.17s 43,892,288→1,284 grouped 43,892,288 rows into 1,284Net revenue and transaction count per segment, country and month
  9. rank · MoM deltawindow_rank 71ms · at +8.12s 1,284→1,284 kept all 1,284 rowsRank within the month, and the change on the month before
  10. revenue_by_segmentoutput_revenue 15ms · at +8.19s 1,284→1,284 wrote 1,284 rowsWrites the result out
  11. after the last step 640ms · at +8.21s time inside the run that no step accounts for

Each bar sits where that step ran, and is as long as it took.

The steps do not open on this page — press a node on the canvas above instead.

Where this is going

A flow is the first object. It is not the only one.

What you just dragged is one flow, on one canvas. The product it belongs to is the place the rest of the job lives — on the same objects, in the same picture, not in four tools that have to be kept in step by hand.

Versions, not working copies

Publish a flow and the version is what runs — never the draft you happen to have open. Every run says which one it was.

Runs you can reopen

Every step's rows in and out, what it cost, and the document that actually ran — kept with the run, so last Tuesday is read rather than re-run. Where a step wrote something down, it reopens at the rows it wrote.

Deployments, and promotion

Flows in order, per environment, promoted one version at a time. Bronze, silver and gold as one named thing rather than three schedules that agree by luck.

Watched, on the same picture

What woke a run, what it wrote, what it dropped and where it slowed down — on the canvas you drew, not in a log somebody has to go and find.

Today that job is a scheduler, a catalog, a lineage tool and a warehouse, held together by somebody’s YAML and the one engineer who remembers how. We are aiming at one place where all four are the same object — and at a picture your colleague can read without being that engineer.

What it is

press a card to open it · scroll or use the arrows

COMING 2027

Interested? We are building it now, and we would rather hear from you early than late.

One mail from a person when there is something to see. Your address is kept for that and nothing else, and one line to us takes it off. Or just say hello: hello@quacksmith.io