Container Unit Templates in Python — a deterministic framework for building container workloads
Project description
CUTIP
Container Unit Templates in Python — a deterministic framework for defining, validating, and orchestrating container environments using structured YAML artifacts and Python workflows.
CUTIP is not a replacement for docker-compose. It is designed for a different use case: environments where the startup sequence is imperative, not declarative.
| docker-compose | CUTIP | |
|---|---|---|
| Startup ordering | depends_on with condition polling |
Python loop — exec into container, branch on result |
| Post-start hooks | None native | startup(ctx) per unit — full podman-py API |
| Pre-build file staging | None | pre_build(ctx) — generate config, copy deps before build |
| Config variables | .env flat substitution |
vars.yaml with required/generated sections + fail-fast validation |
| Validation | Runtime only | Static graph validation — no backend required |
| Orchestration logic | Shell scripts outside compose | First-class Python in workflow.py |
| Migration from compose | — | cutip from-compose — convert any compose file to a CUTIP workspace |
The Model
Container infrastructure is organized into four composable layers:
ImageCard ─┐
NetworkCard ─┘──▶ ContainerCard ──▶ Unit ──▶ Group ──▶ workflow.py
| Layer | What it represents |
|---|---|
| Card | One atomic container resource (image, network, or container configuration) |
| Unit | One running container instance — a ContainerCard reference |
| Group | A collection of Units + a Python workflow.py — the executable artifact |
| Workflow | A plain Python function main(ctx: CutipContext) — full control, no magic |
Every artifact is a versioned YAML file. Every ref is validated before any backend is contacted.
Install
pip install cutip
cutip --help
Contributing? Clone the repo and use
uv pip install -e .for an editable install — see the installation guide.
[!NOTE]
cutip init,cutip from-compose,cutip tree,cutip validate,cutip show, andcutip planrun without any container runtime installed. Onlycutip runrequires Podman.
Quick Look
# cutip/cards/images/app.yaml
apiVersion: cutip/v1
kind: ImageCard
metadata:
name: app
spec:
source: build
context: resources/buildtime
dockerfile: resources/dockerfiles/app.dockerfile
tag: latest
# cutip/cards/containers/app.yaml
apiVersion: cutip/v1
kind: ContainerCard
metadata:
name: app
spec:
imageRef:
ref: images/app
networkRef:
ref: networks/dev
environment:
ENV: production
workdir: /app
# cutip/groups/dev/workflow.py
def main(ctx):
ctx.container("app").start()
cutip validate
cutip plan dev
cutip run dev
CLI
| Command | Description |
|---|---|
cutip init [--path] |
Scaffold workspace directories and cutip.yaml |
cutip from-compose <file> [--output-dir] |
Convert a docker-compose.yaml into a CUTIP workspace |
cutip tree [--path] |
Print discovered cards, units, and groups |
cutip validate [--path] |
Full schema + graph validation (no backend required) |
cutip show card <ref> |
Dump a resolved card as YAML |
cutip show unit <name> |
Show a unit's resolved card graph |
cutip show group <name> |
Show a group's units and workflow status |
cutip plan <group> [--path] |
Dry-run: print execution table, start nothing |
cutip run <group> [--local] [--path] |
Validate → connect → execute workflow |
cutip group ls |
List all groups in the workspace |
cutip unit ls |
List all units in the workspace |
cutip card ls |
List all cards in the workspace |
cutip run connects to the Podman socket over SSH by default. Pass --local to use the local socket directly (useful in CI or rootless setups).
vars.yaml
Workspace variables are declared in cutip/vars.yaml with two sections:
required:
ssh_private_key: "" # must be filled in — cutip fails fast if empty
generated:
data_dir: ".my-data" # cutip creates this directory automatically
CUTIP validates all {{ vars.key }} references in cards before any container backend is contacted — missing or empty required values surface as a clear error, not a runtime failure.
Documentation
Full documentation at joshuajerome.github.io/cutip
| Section | Contents |
|---|---|
| Getting Started | Installation, quickstart, workspace layout |
| Concepts | The 4-layer model, cards, units, groups, graph resolution |
| Reference | CLI flags, card schemas, workflow contract, exceptions |
| Guides | Podman setup, writing workflows, CI/CD |
License
Project details
Release history Release notifications | RSS feed
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 cutip-0.1.7.tar.gz.
File metadata
- Download URL: cutip-0.1.7.tar.gz
- Upload date:
- Size: 182.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6458325275ceb2be63a86e9ee8d334308b0c94ffa51fe441be247ad379bc9fd7
|
|
| MD5 |
c321eb0a7fd051b6febb4bd23b0002dd
|
|
| BLAKE2b-256 |
c1ea6a146705e66a3e77457568c3bcbc229ce24e4f7c90a8a7714615407c8922
|
File details
Details for the file cutip-0.1.7-py3-none-any.whl.
File metadata
- Download URL: cutip-0.1.7-py3-none-any.whl
- Upload date:
- Size: 68.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.8 {"installer":{"name":"uv","version":"0.10.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
30c419db9e2055841ba1ae1a1db9da8c0fae9ba7a014adaaf4269bc73f8fc614
|
|
| MD5 |
e4eafa700deedb7d761435c9f5ddf40c
|
|
| BLAKE2b-256 |
b1f69c27238d26c7856a42c05dbfa8085687a6f1d9ad2b459a3431238c381a57
|