Busabase
Busabase는 AI 에이전트를 위한 오픈소스(MIT) 데이터베이스 및 작업 공간입니다
데이터 파이프라인을 소프트웨어처럼 버전 관리하고, 의존성을 선언하면 Duckstring이 실행 DAG를 자동으로 해결합니다
Build data pipelines the way you build software: version each transform, declare its dependencies, and Duckstring resolves the execution DAG automatically.
데이터Python · TypeScriptGitHub @duckstring-dev온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Get your ducks in a row.
Duckstring is an open source data engineering platform built on DuckDB. Data into the terabytes fits comfortably on a single machine, which is where DuckDB is at its best, and Duckstring provides what a pipeline needs around it: packaging and versioning, orchestration, incremental processing, a catalog and delivery. It runs the same on a laptop, on a single server, or with work spread across cloud machines.
Each set of transformations is a Pond: a Python project whose pond.toml names it, gives it a semantic version and lists the Ponds it reads from.README 전문 보기 ↗Get your ducks in a row.
Duckstring is an open source data engineering platform built on DuckDB. Data into the terabytes fits comfortably on a single machine, which is where DuckDB is at its best, and Duckstring provides what a pipeline needs around it: packaging and versioning, orchestration, incremental processing, a catalog and delivery. It runs the same on a laptop, on a single server, or with work spread across cloud machines.
Documentation · Quickstart · Playground
Each set of transformations is a Pond: a Python project whose pond.toml names it, gives it a semantic version and lists the Ponds it reads from.
[pond]
name = "sales"
version = "1.2.0"
[sources]
transactions = "1.0.0"
products = "1.1.0"
The pipeline follows from those declarations, so it never has to be drawn by hand. A breaking change ships as a new major version, which runs alongside the old one while downstream Ponds move across at their own pace.
Schedules are set on the Ponds whose output is actually used, at the end of the pipeline. Duckstring works back from there, running each upstream Pond only as often as something downstream needs it, so a path nobody consumes never runs. A daily job is one command:
duckstring refresh add reports --every 1d
Data can also stay fresh just because it's being used: a Tap gives an app its own key, and its queries refresh the Pond when the data is older than you allow, so nothing runs while the app is idle.
The Playground runs the demo pipeline in your browser, with a short guided tour of how it's scheduled.
A Trickle stores a table's changes as a Z-set: rows weighted +1 when added and -1 when removed. Joins and aggregations written with the Trickle builder recompute only the keys that changed since the last run, and handle updates and deletes correctly across any shape of join:
from duckstring import ripple
@ripple
def priced_line(pond):
(
pond.trickle("orders.order_line")
.join(pond.trickle("catalog.product"), on="product_id")
.select(
"s0.order_id, s0.product_id, s0.quantity, s1.unit_price, "
"CAST(round(s0.quantity * s1.unit_price, 2) AS DECIMAL(14,2)) AS revenue"
)
.merge("priced_line", pk="order_id")
)
The runtime, called the Catchment, is also the catalog. Each major version of a Pond is a schema holding its tables, with lineage, run history and the version's schema contract recorded alongside. Query it from the CLI, from Python, or from any Postgres client:
SELECT * FROM reports_v1.monthly_summary;
Ripples, the steps inside a Pond, are Python functions with a DuckDB connection, so SQL, DuckDB's relation API, pandas and Arrow all work. Everything a Catchment does can be driven from the duckstring CLI or its HTTP API, and a web UI shows pipelines as they run.
Duckstring needs Python 3.10 or newer.
pip install duckstring
duckstring catchment init --name dev
This starts a local Catchment, with its web UI at http://127.0.0.1:7474. Leave it running, and in a second terminal:
mkdir demo && cd demo
duckstring pond demo # transactions, products → sales → reports
duckstring pond deploy --all --yes
duckstring refresh now reports # run the pipeline once, from the end
duckstring query reports.monthly_summary
The Quickstart goes through the same steps with explanations.
pyproject.toml and uv.lockdocs.duckstring.com has the concepts, task guides, and a reference for the CLI, Python API, pond.toml and HTTP API. To try pull orchestration without installing anything, the Playground simulates it in the browser, with a guided tour.
Ask questions, share what you're building or suggest ideas in GitHub Discussions. Bugs go in Issues.
Duckstring is pre-1.0, so interfaces may still change between minor versions. Changes are listed in the changelog.
A hosted Catchment service is planned at duckstring.com. If you're interested, get in touch at [email protected].