Skip to main content

Open Data Stack

CI Status PyPI Version Python Versions License

Architecture Diagram

A curated collection of open-source technologies and an accompanying CLI (odctl) for experimenting with modern data architecture and MLOps locally.

To see why it exists, read Why odctl.

Provisioning a local data environment with distributed systems can be highly complex. The Open Data Stack streamlines this process by resolving dependency conflicts, network routing configurations, and integration challenges across tools like Kafka, Spark, Flink, Iceberg, and Airflow. It provides a cohesive, Docker-based blueprint that operates seamlessly out of the box.

Documentation: jaehyeon.me/odctl. It covers every profile with its ports, images and memory limits, the CLI reference, guides and troubleshooting.

Installation

odctl needs Docker running, with 8 to 16 GB of memory, and Python 3.10 or later. Install it into its own environment:

uv tool install odctl
# or
pipx install odctl

odctl follows semantic versioning from 1.0, so a project can pin odctl>=1.0,<2.

Quick Start

odctl init                    # copy the compose files and settings into ./.odctl
odctl list                    # show the profiles
odctl up kafka-lite flink-lite spark-lite
odctl down --all

odctl up starts the profiles each one depends on first, here PostgreSQL, SeaweedFS (S3) and the Iceberg REST catalog. See Getting started for more.

Installing odctl, previewing what flink-lite starts, starting kafka-lite, listing the containers and stopping them

Why not plain Docker Compose?

odctl runs Docker Compose underneath, and a Compose file of your own is enough for one small project. odctl helps when you have several projects: the compose files live in one tested place instead of drifting apart in copies, the services are already connected to each other, and commands such as odctl ps and odctl explain show what is running and on which ports. Why not plain Docker Compose? explains it in more detail.

Blog posts about odctl and the projects built on it are tagged odctl on jaehyeon.me.

Projects that use odctl:

  • benchtop: hands-on data engineering and machine learning demos that run locally, each on the odctl stack.
  • desflow (docs): a SimPy library for simulations that stream to Kafka, PostgreSQL, Redis and Iceberg; its examples and integration tests run their infrastructure with odctl.
  • agentic-analytics-system: conversational analytics over an Iceberg lakehouse, with Trino, Iceberg and object storage started by odctl.

Development

Pull requests are welcome. To work on the CLI:

  1. Clone the repository and install uv.
  2. Install the dependencies and the project in development mode:
    uv sync
    
  3. Install the pre-commit hooks, which run the formatting and type checks:
    uvx pre-commit install
    
  4. Run the tests:
    uv run pytest tests/
    
  5. Build the documentation site, then serve it while you edit. It is served at http://127.0.0.1:8000/odctl/:
    uv run mkdocs build --strict
    uv run mkdocs serve
    

The profile pages and the CLI reference are generated by scripts/gen_pages.py during the build, so edit registry.yml, the compose files or the commands rather than those pages.

License

This project is licensed under the Apache License 2.0. See the LICENSE file for details.

Metadata

Release files for odctl 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for odctl 1.2.0
File Size Uploaded Provenance
odctl-1.2.0.tar.gz 896.3 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for odctl 1.2.0
File Interpreter ABI Platform
odctl-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.1 MB

Release files / odctl-1.2.0.tar.gz

Download URL odctl-1.2.0.tar.gz
Size 896.3 kB
Tags Source
SHA-256 checksum
How to use checksums
a73d12c98c647ac6ad90eef943e0e666939a2edf8169bea6cf89037cfb0bb624
BLAKE2b-256 checksum
How to use checksums
f085a36e44fb7fd4a12a8870f6b9f0a9b8f25b2b878ae10c1d6c8f002caa6d07
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

Release files / odctl-1.2.0-py3-none-any.whl

Download URL odctl-1.2.0-py3-none-any.whl
Size 171.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9e30c0afbfa5ddd61523ce8c872a7e7cf12e53d8eec11a583af30964c6505810
BLAKE2b-256 checksum
How to use checksums
7a34644713d439c66888123235c3724abfbac42f55fd4267d9f65712bca50bc1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 23, 2026.

Transparency log

Security for odctl 1.2.0

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.

Select from 2 files

Attestation for odctl-1.2.0.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 23, 2026.

Transparency log

A 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.

Release history Release notifications | RSS feed

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page