Metadata-Version: 2.5
Name: odctl
Version: 1.1.0
Summary: Orchestrator for the Open Data Stack
Project-URL: Homepage, https://github.com/jaehyeon-kim/odctl
Project-URL: Repository, https://github.com/jaehyeon-kim/odctl
Project-URL: Documentation, https://jaehyeon.me/odctl/
Project-URL: Issues, https://github.com/jaehyeon-kim/odctl/issues
Author-email: Jaehyeon Kim <dottami@gmail.com>
License-File: LICENSE
Keywords: cli,data-engineering,docker,docker-compose,machine-learning,open-data,orchestrator
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Information Technology
Classifier: Intended Audience :: Science/Research
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3.15
Classifier: Topic :: Database
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Classifier: Topic :: System :: Distributed Computing
Classifier: Topic :: System :: Systems Administration
Requires-Python: >=3.10
Requires-Dist: pydantic>=2.0.0
Requires-Dist: python-on-whales>=0.70.0
Requires-Dist: pyyaml>=6.0.1
Requires-Dist: rich>=13.7.0
Requires-Dist: typer>=0.12.0
Description-Content-Type: text/markdown

# Open Data Stack

![CI Status](https://img.shields.io/github/actions/workflow/status/jaehyeon-kim/odctl/pipeline.yml?branch=main&label=CI)
![PyPI Version](https://img.shields.io/pypi/v/odctl)
![Python Versions](https://img.shields.io/pypi/pyversions/odctl)
![License](https://img.shields.io/github/license/jaehyeon-kim/odctl)

![Architecture Diagram](https://raw.githubusercontent.com/jaehyeon-kim/odctl/refs/heads/main/image/diagram.png)

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

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](https://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:

```bash
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

```bash
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](https://jaehyeon.me/odctl/latest/getting-started/) for more.

![Installing odctl, previewing what flink-lite starts, starting kafka-lite, listing the containers and stopping them](https://raw.githubusercontent.com/jaehyeon-kim/odctl/refs/heads/main/image/demo.gif)

## 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?](https://jaehyeon.me/odctl/latest/#why-not-plain-docker-compose) explains it in more detail.

## Related reading

Blog posts about odctl and the projects built on it are tagged [odctl](https://jaehyeon.me/tags/odctl/) on jaehyeon.me.

Projects that use odctl:

- [benchtop](https://github.com/jaehyeon-kim/benchtop): hands-on data engineering and machine learning demos that run locally, each on the odctl stack.
- [desflow](https://github.com/jaehyeon-kim/desflow) ([docs](https://jaehyeon.me/desflow/)): 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](https://github.com/jaehyeon-kim/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](https://docs.astral.sh/uv/).
2. Install the dependencies and the project in development mode:
   ```bash
   uv sync
   ```
3. Install the pre-commit hooks, which run the formatting and type checks:
   ```bash
   uvx pre-commit install
   ```
4. Run the tests:
   ```bash
   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/`:
   ```bash
   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](LICENSE) file for details.
