Skip to main content

Workflow automation framework — define infrastructure as YAML, automate with Python, execute in containers

Project description

CUTIP

Python 3.11+ Pydantic v2 uv Runtime CI Docs

Automate multi-step operations using containers as reproducible execution environments.

CUTIP is a workflow automation framework. You define container infrastructure as typed YAML artifacts, write orchestration logic in Python, and CUTIP handles the lifecycle: pre-build file generation, container startup ordering, health-check loops, and post-deployment verification. Every artifact is validated statically before any container runtime is contacted.

Containers are the medium, not the goal. The task is the goal — SSH into a VM, configure a service, patch a deployment, start a dev environment. CUTIP makes that operation structured, validated, and reproducible.

What cutip is NOT

  • Not a Docker replacement. cutip uses Docker or Podman as backends. It does not build images differently or replace docker run.
  • Not a Kubernetes orchestrator. cutip manages local container workloads. For K8s operations, use cutip-blocks which provides kubectl blocks over SSH.
  • Not a CI/CD system. cutip runs workflows locally or in containers. It complements CI — it doesn't replace GitHub Actions or Jenkins.
  • Not a Docker Compose replacement for simple stacks. If you're running postgres + redis + your app with no custom startup logic, use Compose. cutip solves a different class of problems.

Who is this for

  • DevOps engineers automating VM or Kubernetes operations that span multiple tools (SSH, kubectl, REST APIs)
  • Teams that outgrew bash scripts but don't need the weight of Ansible
  • Developers who want reproducible multi-step procedures with validation, hooks, and visual inspection
  • Anyone who needs to generate config files, exec into containers during startup, or branch on health state

The model

ImageCard   ─┐
NetworkCard ─┘──>  ContainerCard  ──>  Unit  ──>  Group  ──>  workflow.py
Layer What it is
Card A YAML file defining one container resource (image, network, or container config). Validated by Pydantic v2.
Unit A named container instance — references one ContainerCard + optional pre/post hooks.
Group A collection of Units + a workflow.py. The executable artifact: cutip run <group>.
Workflow A Python function main(ctx) that starts containers, runs health checks, and orchestrates. Full Python — no DSL.

Every artifact is a versioned YAML file (apiVersion: cutip/v1). Every ref is resolved and validated before any backend is contacted.

Install

pip install cutip

Quick start

cutip init              # scaffold a workspace with example projects
cutip validate          # static validation — no container runtime needed
cutip plan hello-world  # dry-run — print what would happen
cutip run hello-world   # validate → connect → execute workflow

Before and after

Before (bash script):

#!/bin/bash
ssh root@$VM_IP "kubectl exec -n prod deploy/web -- cat /opt/config/handler.py > /root/patches/handler.py"
ssh root@$VM_IP "sed -i 's|get_host(req)|localhost:4000|g' /root/patches/handler.py"
ssh root@$VM_IP "chmod 777 /root/patches/handler.py"
ssh root@$VM_IP "kubectl get deployment -n prod web -o yaml | python3 -c 'import sys,yaml; ...' | kubectl apply -f -"
ssh root@$VM_IP "kubectl rollout status deployment -n prod web --timeout=120s"
# Hope nothing went wrong. No validation. No rollback. No visibility.

After (cutip workflow):

@orchestrator
def main(ctx):
    container.start(ctx, container="ops-runner")

    with ssh.session(ctx, container="ops-runner",
                     host=vm["ip"], username="root", password=pw) as sesh:

        stage("Pre-op Validation")
        ssh.probe(ctx, sesh)
        k8s.get_deployment(ctx, sesh, namespace="prod", deployment="web")

        stage("Operations")
        patch_handler(ctx, sesh)
        apply_deploy(ctx, sesh)

        stage("Post-op Validation")
        k8s.rollout_status(ctx, sesh, namespace="prod", deployment="web")

    container.stop(ctx, container="ops-runner")

Every step is a named @action. The workflow is validated before execution. Failed steps report which action and stage broke. The entire pipeline is visible as a DAG in CUTIP Desktop.

How it compares

Bash script Docker Compose Ansible CUTIP
Validation None Runtime only YAML lint Static graph validation — no runtime needed
Reproducibility Hope-based Image tags Playbook idempotency Deterministic: same YAML + same workflow = same result
Startup ordering Sequential commands depends_on with health poll Task ordering Python: exec into container, branch on result
Pre-build hooks Makefile target None None pre_build(ctx) per unit
Post-start hooks None None Handlers (limited) startup(ctx) per unit
Secrets .env or hardcoded .env flat substitution Vault / vars secrets.yaml with fail-fast validation
Visual inspection set -x None --verbose DAG visualization in CUTIP Desktop
Migration Manual Manual cutip from-compose converts any compose file

Ecosystem

Project Description
cutip Core framework — YAML artifacts, Python workflows, CLI
cutip-blocks Reusable workflow blocks — SSH, kubectl, file ops, container lifecycle (34 blocks, 9 categories)
cutip-desktop Visual companion — DAG visualization, artifact inspection, container management, observability

CLI

Command Description
cutip init Scaffold workspace with example projects
cutip validate Static graph validation (no runtime needed)
cutip plan <group> Dry-run: print execution table
cutip run <group> Validate, connect, execute workflow
cutip tree Print workspace artifact tree
cutip show <type> <name> Dump a resolved artifact
cutip from-compose <file> Convert a Docker Compose file to cutip artifacts
cutip secrets set/list/check Manage secrets.yaml

Documentation

joshuajerome.github.io/cutip

  • Why CUTIP? — detailed comparison with Docker Compose
  • Concepts — cards, units, groups, lifecycle, graph resolution
  • Quickstart — end-to-end walkthrough
  • Use Cases — real-world examples

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

cutip-1.0.0-cp313-cp313-win_amd64.whl (418.7 kB view details)

Uploaded CPython 3.13Windows x86-64

cutip-1.0.0-cp313-cp313-manylinux_2_34_x86_64.whl (574.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

cutip-1.0.0-cp313-cp313-macosx_11_0_arm64.whl (514.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

cutip-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl (523.7 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

File details

Details for the file cutip-1.0.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: cutip-1.0.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 418.7 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cutip-1.0.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8ca4572d2e70e9439dfd50561f849693ccef615f4ffd69f00792407616b65c89
MD5 7b33f9a8e69be0e4e9bd3fc25d65adfd
BLAKE2b-256 4c544cc4b860f09fef55ecd02a86c8d128c9b5569420b6933f99d22aff07e3c2

See more details on using hashes here.

File details

Details for the file cutip-1.0.0-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for cutip-1.0.0-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 655cc086c3ecdff0c82f938daebf0712c1e6f3861f73e02752b39977df194c38
MD5 5b3f6ea4f65d2238a47ceeff67f1dba6
BLAKE2b-256 499db1a7474e398fc299f91419417336a2ff42dc862a4164a0bf99bb57d41528

See more details on using hashes here.

File details

Details for the file cutip-1.0.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cutip-1.0.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5ca7fe422dae7be6d1f61a6a160e21c4a6518821cbeeab2e8a678ec278a4e57a
MD5 20f1a7d21b548d6a7db9813a5c62a554
BLAKE2b-256 b0d6c7b7bb43d10c79c4385d140a4507caf9abcb01c902d290e7d264937e4190

See more details on using hashes here.

File details

Details for the file cutip-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for cutip-1.0.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d179502facea3afe9d0b3b9b2bdb330868b412e81c2d7c16a07558942905718e
MD5 a2b1e38e7766e3ad3af5ee971f8094d9
BLAKE2b-256 8cf65ac223c6a5989ef7c784a8984f8e8c33c3cdb727a343f79c39c91b938d1d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page