Croft is a free, open-source command-line tool that runs a whole data pipeline in TypeScript and keeps everything in one DuckDB file on your laptop. The croft data pipeline launched on Product Hunt on 19 October 2026. It makes a blunt pitch: you may not need a Python loader, dbt, Airflow and a cloud warehouse to answer the questions your data raises.
Key takeaways
- Croft (version 0.3.0, MIT licence) loads, transforms, schedules and serves data from a single DuckDB file.
- Pipelines are written as TypeScript and SQL files. Each file becomes one table.
- Croft generates TypeScript types for every table, so renaming a column breaks the type check instead of breaking your app later.
- It is built to work with Claude Code: changes can be previewed first, and steps that could lose data wait for your approval.
- It runs on one machine only, on macOS and Linux. Its makers say teams with a working dbt warehouse should keep it.
What is the croft data pipeline tool?
Croft is built by Zabaca, and the Product Hunt listing names James Lee as the maker. The project site describes it as “the whole data pipeline, in TypeScript”: pull data from APIs and files, transform it, and keep it fresh on a schedule.
The storage layer is DuckDB, an in-process analytical database. “In-process” means it runs inside your program, like SQLite, rather than as a separate server you have to host. All your data lives in one file on disk.
A croft project is just a folder. You install it with bun add -g @zabaca/croft, which needs the Bun runtime (1.3.14 or newer, according to the GitHub README), then run croft init my-data to scaffold a project.
How does a croft pipeline actually work?
Croft splits the work into four steps, and each one is a file or a setting rather than a separate service.
- Ingest: an
ingest()call in a.tsfile pulls rows from an API such as Stripe or GitHub, or from a CSV export. Loads are incremental, so a rerun only adds what is new. - Transform: each derived table is either a
.sqlfile or atransform()function. You can attach checks, such asrevenue >= 0, and they run before anything is saved. - Schedule: you write a plain-language rule such as
schedule: "every hour", then switch it on withcroft schedule on. Tables further down the chain update afterward, in order. - Serve: any Bun or Node app can read tables through
@zabaca/croft/read, with no database server running.
Think of it as a small kitchen where one cook preps, cooks and plates, instead of a restaurant with a separate station for each job. You get fewer handoffs, and the kitchen can only serve so many tables.
Why the generated types matter
Most data pipelines fail quietly. Someone renames amount to amount_usd in a SQL model, and a dashboard finds out at 3 a.m.
After each run, croft reads the real columns of every table and writes a TypeScript type for it. Run croft validate --types and any code that still reads the old column fails the type check, with a list of the columns that do exist. The site also says it catches mistyped SQL without running the query.
That renamed-column check is the feature early commenters on Product Hunt picked out. In my opinion it is the most practical idea here, because it turns a data bug into an ordinary compile error that TypeScript developers already know how to fix.
Croft vs the usual data stack
The croft site compares itself with the common “modern data stack”. Here is that comparison, job by job:
| Job | Typical stack | Croft |
|---|---|---|
| Load | dlt, Airbyte, custom Python | ingest() in a .ts file |
| Transform | dbt (SQL and YAML) | .sql file or transform() |
| Tests | dbt tests | Checks before every save |
| Schedule | Dagster, Airflow, cron | schedule: setting |
| Store | Hosted warehouse | One local DuckDB file |
| Language | Python, YAML, SQL | TypeScript plus SQL |
The idea of collapsing that stack onto DuckDB is not new. Manning’s DuckDB in Action builds a pipeline from dlt, dbt and Dagster around a DuckDB file. Croft’s twist is replacing all three with one TypeScript tool.
Is it safe to let an AI agent run it?
Croft is openly designed for coding agents. Commands accept a --json flag, and croft init writes a skill file and a CLAUDE.md block so Claude Code knows the rules. It also ships as a Claude Code plugin.
The safety net has three layers:
croft previewbuilds a change in a sandbox and shows a diff against the live table.- Writes are all-or-nothing. If a check fails, the old data stays.
- Anything destructive needs
croft confirm, and replaced or deleted data goes to a trash thatcroft restorecan bring back.
That matters if you are one of the small teams leaning on AI to do more with less, a trend we covered in how AI is changing small businesses. An agent that can make a mess is fine as long as the mess can be undone.
Who should skip it?
The makers are unusually frank about this. Croft is built for one machine and one DuckDB file. It does not read dbt, Dagster or Airflow projects, so there is no import path for existing pipelines.
It runs on macOS and Linux (WSL works on Windows). The project is also very young: when we checked the GitHub repository on 20 October 2026 it had 3 stars, around 300 commits and no tagged releases. Treat it as an early tool, not something to bet a company’s reporting on.
What happens next
Croft has no public roadmap, so watch the GitHub repository for releases past 0.3.0. The big open questions are Windows support, and whether the single-file design can grow to multi-user setups without losing its simplicity.
It also depends on DuckDB’s own JavaScript client. DuckDB has moved Node users to its newer Node “Neo” API, and that client still lists unfinished features. Gaps there could limit what croft can do.
FAQ
Is croft free?
Yes. Croft is open source under the MIT licence and needs no account or cloud service. Your data stays in one local DuckDB file.
Does croft replace dbt?
For single-machine projects, it covers the same jobs: SQL transforms and tests. It cannot read existing dbt projects, and its makers recommend keeping dbt if your team already runs a warehouse on it.
Do I need Python or a database server?
No. Croft needs Bun 1.3.14 or newer on macOS or Linux. Pipelines are TypeScript and SQL, and apps read the DuckDB file directly through croft’s read package.
If you have a side project fed by a few APIs and CSV exports, try croft init on a copy of that data over a weekend. You will know within an hour whether one file and one language beat the stack you have been putting off building.
Leave a comment