Skip to main content


The plan is a representation of what Kurtosis will do inside an enclave. It is central to the multi-phase run design of Kurtosis. Plans are built via Starlark by calling functions on the Plan object like add_service, remove_service, or upload_files.

You never construct a Plan object in Starlark. Instead, the run function of your should have a variable called plan, and Kurtosis will inject the Plan object into it. You can then pass the object down to any functions that need it.

For example:

# ------ ---------
some_library = import_module("")

def run(plan):
plan.print("Hello, world!")


Any value returned by a Plan function (e.g. Plan.add_service, Plan.upload_files) is a future-reference to the actual value that will only exist at execution time. This means that you cannot run conditionals or manipulations on it in Starlark, at interpretation time!

Instead, do the manipulation you need at execution time, using something like Plan.run_sh or Plan.run_python.