Odibi
Declarative data pipelines. YAML in, star schemas out.
Note: Personal open-source project. See IP_NOTICE.md for details.
Odibi is a framework for building data pipelines. You describe what you want in YAML; Odibi handles how. Every run generates a "Data Story" — an audit report showing exactly what happened to your data.
🤖 AI/LLM Users: For comprehensive context, see docs/ODIBI_DEEP_CONTEXT.md — 2,200+ lines covering all patterns, transformers, validation, connections, and runtime behavior.
🎯 Try Odibi in 5 Minutes (No Install Needed)
Click the badge above → run 3 cells → see your first simulation. No Python install, no cloning, no setup.
The notebook walks you through:
pip install odibi(runs in the cloud)- Define a simulation in YAML (sensors, sales data, or industrial equipment)
- Run the pipeline → see the output → chart it with Altair
When you're ready for more: 38 simulation configs covering buildings, compressors, reactors, cooling towers, wastewater, production lines, and sales pipelines.
⚡ Quick Start (Local)
pip install odibi
Option 1: Simulate data from YAML
Create sim.yaml:
project: my_first_sim
engine: pandas
connections:
output:
type: local
base_path: ./odibi-quickstart-output
story:
connection: output
path: stories/
system:
connection: output
pipelines:
- pipeline: demo
nodes:
- name: sensors
read:
connection: null
format: simulation
options:
simulation:
scope:
start_time: "2026-01-01T00:00:00Z"
timestep: "5m"
row_count: 100
seed: 42
entities:
count: 3
id_prefix: "sensor_"
columns:
- name: sensor_id
data_type: string
generator: {type: constant, value: "{entity_id}"}
- name: timestamp
data_type: timestamp
generator: {type: timestamp}
- name: temperature
data_type: float
generator:
type: random_walk
start: 22.0
min: 16.0
max: 30.0
volatility: 0.3
mean_reversion: 0.15
write:
connection: output
format: parquet
path: bronze/sensors.parquet
mode: overwrite
Validate, plan, then run it. Continue only when the planner response has
status == "planned":
odibi validate sim.yaml --format json
cat sim.yaml | odibi plan --stdin --format json
Effects before you run: relative to the directory containing sim.yaml, execution
overwrites odibi-quickstart-output/bronze/sensors.parquet; creates timestamped
odibi-quickstart-output/stories/demo/YYYY-MM-DD/run_HH-MM-SS.{html,json} Stories; and
initializes or updates odibi-quickstart-output/_odibi_system/ meta_* catalog assets.
A repeat replaces the sensor target, normally creates a later Story pair subject to
retention, and updates run/catalog metadata. To clean up, delete only
odibi-quickstart-output/ and the sim.yaml created for this example; do not do so if
either path was repurposed.
Run:
python -c "from odibi.pipeline import PipelineManager; PipelineManager.from_yaml('sim.yaml').run()"
Output: odibi-quickstart-output/bronze/sensors.parquet contains simulated sensor data
with memory, drift, and mean reversion. No database needed.
Option 2: Build a star schema from CSV
Effects before init: odibi init creates my_project/; it replaces an existing
directory only when explicitly forced, and this command does not use --force.
odibi init my_project --template star-schema
cd my_project
Effects before you run: execution overwrites data/gold/dim_customer.parquet,
dim_product.parquet, dim_date.parquet, and fact_sales.parquet; writes timestamped
Stories below data/gold/stories/{build_dimensions|build_facts}/YYYY-MM-DD/run_HH-MM-SS.{html,json};
and initializes or updates data/gold/_system/meta_*. Repeats replace the four data
targets, create later Stories, and update catalog metadata. The generated sample_data/
is inside the project. Cleanup is removal of the newly generated my_project/ only;
never delete a reused project.
odibi run odibi.yaml
odibi story last # View the audit report
Option 3: Clone the reference example
Review the canonical reference's exact effects, repeat behavior, and cleanup before execution.
git clone https://github.com/henryodibi11/Odibi.git
cd Odibi/docs/examples/canonical/runnable
odibi run 04_fact_table.yaml
This builds a complete star schema in seconds:
- 3 dimension tables (customer, product, date)
- 1 fact table with FK lookups and orphan handling
- HTML audit report
📖 The Canonical Example
pipelines:
- pipeline: build_dimensions
nodes:
- name: dim_customer
read:
connection: source
format: csv
path: customers.csv
pattern:
type: dimension
params:
natural_key: customer_id
surrogate_key: customer_sk
scd_type: 1
write:
connection: gold
format: parquet
path: dim_customer
- name: dim_date
pattern:
type: date_dimension
params:
start_date: "2025-01-01"
end_date: "2025-12-31"
write:
connection: gold
format: parquet
path: dim_date
- pipeline: build_facts
nodes:
- name: fact_sales
depends_on: [dim_customer, dim_date]
read:
connection: source
format: csv
path: orders.csv
pattern:
type: fact
params:
grain: [order_id, line_item_id]
dimensions:
- source_column: customer_id
dimension_table: dim_customer
dimension_key: customer_id
surrogate_key: customer_sk
orphan_handling: unknown
write:
connection: gold
format: parquet
path: fact_sales
🚀 Key Features
| Feature | Description |
|---|---|
| Data Stories | Every run generates an HTML audit report |
| Dimensional Patterns | 6 built-in patterns: SCD1/SCD2, date dimension, fact tables, merge, aggregation |
| 56 Transformers | Comprehensive library for data manipulation and quality |
| Validation & Contracts | Fail-fast checks, quarantine bad rows |
| Multi-Engine | Pandas, Polars, and Spark — same config across all engines |
| Production Ready | Retry, alerting, secrets, Delta Lake support |
| Battle-Tested | 5500+ tests ensure reliability and correctness |
📚 Documentation
| Goal | Link |
|---|---|
| Get running in 10 minutes | Golden Path |
| Copy THE working example | THE_REFERENCE.md |
| Solve a specific problem | Playbook |
| Understand when to use what | Decision Guide |
| See all config options | YAML Schema |
📦 Installation
# Standard (Pandas engine)
pip install odibi
# With Polars engine
pip install "odibi[polars]"
# With Spark + Azure support
pip install "odibi[spark,azure]"
# All engines and features
pip install "odibi[all]"
🎯 Who is this for?
- Solo data engineers building pipelines without a team
- Analytics engineers moving from dbt to Python-based pipelines
- Anyone tired of writing the same boilerplate for every project
🤝 Contributing
We welcome contributions! See CONTRIBUTING.md.
Maintainer: Henry Odibi (@henryodibi11)
License: Apache 2.0
Metadata
Release files for odibi 3.15.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| odibi-3.15.1.tar.gz | 2.0 MB | With provenance | Details for odibi-3.15.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| odibi-3.15.1-py3-none-any.whl | Python 3 | none | any | Details for odibi-3.15.1-py3-none-any.whl |
Total release size: 4.2 MB
Release files / odibi-3.15.1.tar.gz
| Download URL | odibi-3.15.1.tar.gz |
|---|---|
| Size | 2.0 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
47504efe0e10c21131919560c80cbc42877b28f1c8fdf64332bb2af11c592fce
|
|
BLAKE2b-256 checksum How to use checksums |
aafc8f2b064c06d730cda0014c5e007f8efd75794a442ffbfc4f9edfd8c97edd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logRelease files / odibi-3.15.1-py3-none-any.whl
| Download URL | odibi-3.15.1-py3-none-any.whl |
|---|---|
| Size | 2.2 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3648623bd81cd621796d9b5af1e02099b32fa91d4215fcdf569f3cb72bc5fefe
|
|
BLAKE2b-256 checksum How to use checksums |
6643b9305c17e321fd0fd5a0039a3257adbd77b7a4e642f82ca61280e949fa6d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logSecurity for odibi 3.15.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for odibi-3.15.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 19, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.