Skip to content

Process Compose compatibility ​

Kranz opens a supported process-compose.yaml directly, so you can try it on an existing project without maintaining a second configuration.

bash
cd your-project
kranz                       # finds process-compose.yaml automatically
kranz -f process-compose.yaml

A native kranz.yaml in the same directory takes priority, so adding one later is not a breaking change.

A native composition can include a Process Compose file by exact path, glob, or discovery. It is a terminal leaf in that graph: its processes become services, but it cannot declare Kranz include or overrides. The conventional adjacent process-compose.override.yaml is still merged with the leaf, and a composition-wide --override can patch the final effective service names.

Compatibility is deliberately conservative: a feature is either translated faithfully, ignored with a visible diagnostic, or rejected before anything starts. Kranz never accepts a file by quietly dropping a field that changes what your processes do.

Top level ​

FieldSupportNotes
version✅ TranslatedKept as the project version
name✅ TranslatedProject name; defaults to the directory name
environment✅ TranslatedMapping or NAME=value list
processes✅ TranslatedSee below
include, overrides❌ RejectedNative composition directives are not valid in a terminal leaf

Process fields ​

FieldSupportMaps to
command✅ Translatedcommand
description✅ Translateddescription
working_dir✅ Translateddir
environment✅ Translatedenv
env_file✅ Translatedenv_files
depends_on✅ Translateddepends_on with conditions
readiness_probe✅ Translatedhealthcheck.readiness
liveness_probe✅ Translatedhealthcheck.liveness
ready_log_line✅ Translatedready_log_line
availability✅ Translatedavailability
shutdown✅ Translatedshutdown
success_exit_codes✅ Translatedsuccess_exit_codes
disabled, is_disabled✅ Translateddisabled
is_dotenv_disabled✅ TranslatedSkips the adjacent .env
namespace⚠️ ApproximatedBecomes a tag, unless it is default
log_location⚠️ IgnoredReported as a diagnostic; Kranz keeps logs in the interface
replicas❌ RejectedValues above 1 are not supported
is_daemon❌ RejectedKranz supervises process groups it starts
is_tty, is_interactive, is_foreground❌ RejectedUse a Kranz interactive action instead
schedule❌ RejectedKranz is not a scheduler

A rejected field fails the load with a message naming the process and the field. An ignored field loads successfully and reports a diagnostic in the interface.

Dependency conditions ​

Both the list form and the mapping form are supported:

yaml
processes:
  web:
    depends_on:
      api:
        condition: process_healthy
      seed:
        condition: process_completed_successfully
ConditionSupport
process_started✅ (default for the list form)
process_healthy✅
process_completed✅
process_completed_successfully✅
process_log_ready✅

Any other condition is rejected by name.

Probes ​

Probe fieldSupportNotes
exec.command✅Becomes a command check
http_get✅Becomes an http check; its port is also declared
http_get.host✅Defaults to 127.0.0.1
http_get.scheme✅Defaults to http
http_get.path✅Defaults to /
http_get.headers✅Passed through
http_get.status_code✅Defaults to 200
initial_delay_seconds✅→ initial_delay
period_seconds✅→ interval, default 10s
timeout_seconds✅→ timeout, default 1s
failure_threshold✅Default 3
success_threshold⚠️ ApproximatedValues above 1 are accepted as 1, with a diagnostic

Exactly one of exec or http_get is required per probe.

What you gain by converting ​

Compatibility mode gives you the Kranz interface over your existing file. Moving to a native kranz.yaml additionally gives you:

The full-stack example ships the same project in both formats, so you can compare them field by field.

Released under the MIT License.