Stack Definitions
Stack definitions are TOML files that describe the spaces, dependencies, and configuration that make up a stack. This page covers the complete TOML format with all available options.
Minimal Example
name = "web-app"
description = "Simple web application"
[[spaces]]
name = "web"
template = "ubuntu-latest"This creates a single-space stack. The space uses the ubuntu-latest template and is named web.
Complete Example
name = "lamp-stack"
description = "Linux, Apache, MySQL, PHP stack"
scope = "user"
groups = ["developers"]
zones = ["us-east"]
[[spaces]]
name = "db"
description = "MySQL database server"
template = "mysql-8"
shell = "/bin/bash"
startup_script = "init-db"
[[spaces.custom_fields]]
name = "MYSQL_ROOT_PASSWORD"
value = "secret"
[[spaces.custom_fields]]
name = "MYSQL_DATABASE"
value = "appdb"
[[spaces]]
name = "web"
description = "Apache web server"
template = "apache-2.4"
depends_on = ["db"]
[[spaces.port_forwards]]
to_space = "db"
local_port = 6379
remote_port = 6379
[[spaces]]
name = "cache"
description = "Redis Cache"
template = "redis-7"Top-Level Options
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | Yes | — | Unique name for the stack definition |
description |
string | No | "" |
Description shown in the UI and CLI |
scope |
string | No | "user" |
Visibility scope: user or global |
groups |
list | No | [] |
Groups allowed to create stacks from this definition (global scope only, names resolved to IDs) |
zones |
list | No | [] |
Zone restrictions — definition is only available in listed zones (empty = all zones) |
Scope
user— Only visible to the creator. Use for personal development stacks.global— Visible to all users (subject to group restrictions). Use for shared stacks that teams can create instances of.
Space Configuration
Each [[spaces]] block defines a space in the stack. The name is used as the identifier — spaces are named {prefix}-{name} when the stack is created, and name is used in dependency and port forward references.
| Option | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | Yes | — | Space name — used for naming (prefix-name), dependencies, and port forward targets |
template |
string | Yes | — | Name of the template to use (resolved to template ID) |
description |
string | No | "" |
Space description |
shell |
string | No | template default | Override the default shell |
startup_script |
string | No | — | Name of a script to run on startup (resolved to script ID) |
depends_on |
list | No | [] |
List of space names this space depends on |
Dependencies
Dependencies control startup order. When starting a stack, spaces are started after all their dependencies are running. When stopping, spaces are stopped before the spaces they depend on.
[[spaces]]
name = "web"
template = "apache-2.4"
depends_on = ["db", "cache"]
[[spaces]]
name = "db"
template = "mysql-8"
[[spaces]]
name = "cache"
template = "redis-7"In this example, web will not start until both db and cache are running.
Custom Fields
Custom fields set environment variables or configuration values on a space. Each [[spaces.custom_fields]] block within a space defines a name-value pair.
[[spaces]]
name = "db"
template = "mysql-8"
[[spaces.custom_fields]]
name = "MYSQL_ROOT_PASSWORD"
value = "secret"
[[spaces.custom_fields]]
name = "MYSQL_DATABASE"
value = "appdb"
[[spaces.custom_fields]]
name = "MYSQL_USER"
value = "appuser"Custom fields are applied when the space is created and can be modified afterwards through the space settings.
Port Forwards
Port forwards configure network connectivity between spaces. Each [[spaces.port_forwards]] block within a space defines a forwarding rule.
[[spaces]]
name = "web"
template = "apache-2.4"
depends_on = ["db"]
[[spaces.port_forwards]]
to_space = "db"
local_port = 3306
remote_port = 3306| Option | Type | Required | Description |
|---|---|---|---|
to_space |
string | Yes | Name of the target space |
local_port |
integer | Yes | Port on the source space |
remote_port |
integer | Yes | Port on the target space |
Port forwards are created as persistent forwards — they survive space restarts. The to_space value references another space by its name in the same stack definition.
CLI Workflow
# Create a stack definition
knot stack create-def lamp.toml
# List all definitions
knot stack list-defs
# View detailed definition info
knot stack list-defs --details
# Disable a definition (prevents creating stacks from it)
knot stack disable-def lamp-stack
# Re-enable a definition
knot stack enable-def lamp-stack
# Update a definition
knot stack apply lamp.toml
# Delete a definition
knot stack delete-def lamp-stackScripting
Stack definitions can also be created and managed from scripts using the knot.stack library:
import knot.stack as stack
# Create a definition programmatically
stack.create_def(
"my-stack",
description="My development stack",
scope="user",
spaces=[
{
"name": "web",
"template": "ubuntu-latest",
"depends_on": ["db"],
},
{
"name": "db",
"template": "mysql-8",
"custom_fields": [
{"name": "MYSQL_ROOT_PASSWORD", "value": "secret"},
],
},
],
)See the knot.stack library reference for the full API.