tycoon
A pip-installable CLI that wires dlt → DuckDB → dbt → Rill into a working local analytics stack. No Docker, no cloud account required.
Adaptable: bring your own ingestion (Airbyte, Fivetran), warehouse (Snowflake, BigQuery, MotherDuck), dbt project, or BI tool — tycoon init asks before it assumes.
Install
Requires Python >= 3.12.
pip install database-tycoon
# or
uv add database-tycoon
Quickstart
Offline (no signup, runs in CI on every PR)
The csv-import template ships with a sample CSV and a working dbt project, so the full ingest → transform pipeline runs without any external network call. This is the block our CI gate runs against every commit — if it ever breaks, the release is blocked.
tycoon init --template csv-import --name analytics-demo
tycoon data sources run files
tycoon data analyze files
tycoon data transform run
Live API (uses the PokéAPI)
A live walkthrough that hits a real public API — no credentials, no signup. Uses the non-interactive --no-prompt flag so the whole arc is scriptable; drop the flag and the equivalent --base-url / --resources flags if you'd rather walk through the interactive prompts.
tycoon init --template csv-import --name pokeapi-demo
tycoon data sources add rest_api \
--base-url https://pokeapi.co/api/v2/ \
--resources pokemon,berry,type \
--no-prompt
tycoon data sources run pokeapi
tycoon data analyze pokeapi
tycoon data transform run --select 'stg_pokeapi__*'
The --rill switch on data analyze (and tycoon start --only rill) opens a Rill dashboard at http://localhost:9009 with pokemon, berry, and type tables ready to explore.
Already have a pipeline? tycoon init will ask about your ingestion tool, warehouse, dbt project, and BI tool — and configure itself around what you already have.
CLI Reference
| Command | Description |
|---|---|
tycoon init |
Scaffold a new project |
tycoon data sources catalog |
Browse available source integrations |
tycoon data sources add <type> |
Register a new data source |
tycoon data sources list |
List sources configured in this project |
tycoon data sources list show <name> |
Show detailed config for a source |
tycoon data sources run <name> |
Run ingestion for a named source |
tycoon data sources run-all |
Run ingestion for all sources |
tycoon data transform run |
Run dbt transformations |
tycoon data analyze <source> |
Scaffold dbt staging models; add --rill to also generate dashboards |
tycoon data db query <sql> |
Run a SQL query against the warehouse |
tycoon data run-all |
Ingest all sources then run dbt build |
tycoon data status |
Show freshness, row counts, and capture counts for each source |
tycoon data history |
List recent dlt + dbt runs from the observability metadata DB |
tycoon data history show <id> |
Per-run detail (per-table rows for dlt, per-node status for dbt) |
tycoon start |
Start the Rill dashboards and the Quack warehouse server |
tycoon stop |
Stop all services |
tycoon run <tool> |
Passthrough to dbt, dlt, rill |
tycoon.yml Reference
name: my-project
version: 0.1.0
database:
raw: data/raw.duckdb # dlt output (or md: URI for MotherDuck)
warehouse: data/warehouse.duckdb # dbt output — read by Rill
dbt_project_dir: dbt_project # path to dbt project (yours or tycoon-scaffolded)
rill_dir: rill # path to Rill dashboard definitions
stack: # generated by tycoon init — edit as needed
ingestion: dlt # dlt | airbyte | fivetran | meltano | none
ingestion_managed: true # false = tycoon won't run `data sources run`
warehouse: duckdb # duckdb | motherduck | snowflake | bigquery | other
transformation_managed: true # false = tycoon won't scaffold or overwrite dbt
bi: rill # rill | metabase | looker | tableau | other | none
bi_managed: true # false = tycoon won't start Rill
sources:
my-github:
type: github # matches a catalog source name
schema: raw_github # schema name in the raw DuckDB file
config:
access_token: ${GITHUB_TOKEN} # env vars are interpolated
owner: my-org
repo: my-repo
Each source produces its own raw DuckDB file: data/raw_<source>.duckdb. All sources write into data/warehouse.duckdb after transformation.
MotherDuck authentication
tycoon doctor recognizes two MotherDuck auth modes for a stack.warehouse: motherduck project:
MOTHERDUCK_TOKENenv var — use this for CI, Tower, or any non-interactive path. Get one at app.motherduck.com/token.- Cached OAuth session — run
duckdb -c "ATTACH 'md:'"once locally to authenticate via browser; DuckDB caches the token under~/.duckdb/and tycoon picks it up from there.
Catalog Sources
These sources are available via tycoon data sources add <name>. They are downloaded on demand via dlt init and not bundled in the package.
| Source | Category | Key Tables |
|---|---|---|
github |
Developer | commits, issues, pull_requests, repositories |
slack |
Communication | channels, messages, users |
stripe |
Finance | customers, invoices, products, subscriptions |
hubspot |
CRM | companies, contacts, deals, tickets |
notion |
Knowledge | databases, pages, users |
Data Directory
Raw DuckDB files follow the naming convention raw_<source>.duckdb (written by ingestion) while warehouse.duckdb is the single transformed database read by Rill. See data/README.md for details.
Rill Dashboards
Rill is a local-first BI tool. Dashboard definitions are YAML files in the rill/ directory.
Launch Rill via tycoon start or tycoon start --only rill.
Auto-generate dashboards for a source after ingestion:
tycoon data analyze my-source --rill
This exports each raw table to Parquet, then generates Rill source, metrics view, and explore
files — one dashboard per table. The --rill flag is opt-in; dashboard generation is skipped
by default since it requires a Rill project directory (rill/) to already exist.
Architecture: sources read from Parquet via Rill's local_file connector into its
built-in in-memory OLAP. Dashboards are immediately usable without a dbt run.
Observability (dlt + dbt run history)
Every tycoon data sources run mirrors dlt's load history into .tycoon/metadata.duckdb.
Every tycoon data transform run/test/build parses target/run_results.json and records
one row per invocation plus one per model/test. Both captures are best-effort — they never
break the underlying command.
Peek at history from the terminal:
tycoon data history # last 20 runs across dlt + dbt
tycoon data history --tool dbt -n 50 # dbt-only, last 50
tycoon data history show deadbeef # drill into a specific run (short prefix OK)
Or open the two Rill dashboards (_tycoon_dlt_usage, _tycoon_dbt_usage) that
auto-appear alongside your per-source explores — success rate, duration, rows
loaded, models built, tests passed/failed, all filterable by schema, table,
command, and dbt version.
Query the metadata DB directly for anything the dashboards don't cover:
tycoon data query --db .tycoon/metadata.duckdb \
"SELECT invocation_id, command, elapsed_s, success
FROM dbt_runs ORDER BY started_at DESC LIMIT 10"
The metadata DB is disposable — delete .tycoon/metadata.duckdb to reset history.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file database_tycoon-0.1.10.tar.gz.
File metadata
- Download URL: database_tycoon-0.1.10.tar.gz
- Upload date:
- Size: 460.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
31cf2b9ba3c257d2555f709163c5de775da0df2b1cc8dd8e130fa04df39d60b2
|
|
| MD5 |
8d753aff9c53760e795694a96683cf8f
|
|
| BLAKE2b-256 |
7ccf807e755de9a63dd73564e2d214deb85b5a528c73a906e30764a476212f37
|
Provenance
The following attestation bundles were made for database_tycoon-0.1.10.tar.gz:
Publisher:
publish.yml on Database-Tycoon/tycoon-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
database_tycoon-0.1.10.tar.gz -
Subject digest:
31cf2b9ba3c257d2555f709163c5de775da0df2b1cc8dd8e130fa04df39d60b2 - Sigstore transparency entry: 2212031882
- Sigstore integration time:
-
Permalink:
Database-Tycoon/tycoon-cli@32abd2f54edade85c32f05113db9e3d560efeadb -
Branch / Tag:
refs/tags/v0.1.10 - Owner: https://github.com/Database-Tycoon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@32abd2f54edade85c32f05113db9e3d560efeadb -
Trigger Event:
push
-
Statement type:
File details
Details for the file database_tycoon-0.1.10-py3-none-any.whl.
File metadata
- Download URL: database_tycoon-0.1.10-py3-none-any.whl
- Upload date:
- Size: 178.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ec7e64ed78d20662fc6fe59f3df6164d8bc9f70b13344360c22594c2af09691
|
|
| MD5 |
1b231a4350bc686e6de7cee535f6f062
|
|
| BLAKE2b-256 |
5fcffc638a174a55a2bb8665b086fbc8f0dfa2ad1763e8f5e9c5cae788127d20
|
Provenance
The following attestation bundles were made for database_tycoon-0.1.10-py3-none-any.whl:
Publisher:
publish.yml on Database-Tycoon/tycoon-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
database_tycoon-0.1.10-py3-none-any.whl -
Subject digest:
6ec7e64ed78d20662fc6fe59f3df6164d8bc9f70b13344360c22594c2af09691 - Sigstore transparency entry: 2212031931
- Sigstore integration time:
-
Permalink:
Database-Tycoon/tycoon-cli@32abd2f54edade85c32f05113db9e3d560efeadb -
Branch / Tag:
refs/tags/v0.1.10 - Owner: https://github.com/Database-Tycoon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@32abd2f54edade85c32f05113db9e3d560efeadb -
Trigger Event:
push
-
Statement type: