What is StreamWright?
StreamWright turns a few YAML files into a working data pipeline. You describe what to pull — from an API, a file store, or a database — and StreamWright handles the how: signing in, paging, retries, shaping the data with SQL, and writing it out. No per-connector code, and one command runs any source.
01
requestsFetch
Pull records from an API, file or database. Sign-in, paging and retries come from the source.
02
stepsShape
Reshape records with DuckDB SQL: filter, join across streams, cast types, compute columns.
03
exportsWrite
Emit to the output you choose: Singer, files, DuckDB/DuckLake, or a dlt destination.
A source is a folder
my_source/
├── source.yaml # inputs, sign-in, HTTP/connection defaults
└── streams/
├── campaigns.yaml # one file per stream
└── metrics.yaml
Each stream runs three steps:
- Fetch —
requestspull records from an API, file or database. - Shape —
stepstransform records with DuckDB SQL. - Write —
exportsemit to the output you choose.
Why StreamWright
- Declarative, not code. A connector is configuration — ship new sources without writing or deploying connector code.
- Real SQL transforms. Shape records with DuckDB SQL: filter, join across streams, cast types.
- Shared vocabulary. One pipeline runs across many networks that name their streams differently.
- Run anywhere. The same source runs locally, in Docker, or on Kubernetes — orchestrated per user and network with Dagster.
- Open outputs. Singer, JSONL/CSV/TSV/Parquet, DuckDB/DuckLake, or any dlt destination.