Generate complete, working Nuon BYOC app configuration files (TOML) for deploying applications into customer cloud accounts. Use when creating a new Nuon app config, scaffolding components (Helm charts, Terraform modules, Kubernetes manifests, Docker builds, container images), defining sandboxes, inputs, dependencies, action scripts, or install configs. Triggers on requests involving Nuon, BYOC (Bring Your Own Cloud), app packaging for customer cloud deployment, or any mention of Nuon TOML config files. Also use when the user asks how to structure a Nuon app, add components, define dependencies, write action scripts, or configure installs.
Generate complete, validated Nuon BYOC application configuration files. Every generated config must be a working TOML file that passes nuon apps sync validation.
Before generating any config files, gather the following through a structured interview. Ask questions in logical groups — do not dump all questions at once.
my-app)How is your application deployed?
For each component: name (snake_case), source (public/connected/inline), and type-specific details (chart name, namespace, Terraform version, Dockerfile path, image URL, etc.)
database → secrets → app_server → load_balancer → certificateCloud platform and compute environment?
nuonco/aws-eks-sandbox → runner_type = "aws"nuonco/aws-eks-karpenter-sandbox → runner_type = "aws"nuonco/aws-min-sandbox → runner_type = "aws"nuonco/azure-aks-sandbox → runner_type = "azure"All apps require a runner.toml. The runner_type is determined by the cloud platform above.
Do you need Nuon DNS? (enables *.nuon.run public URLs; AWS only — not available on Azure)
string/number/bool/json), default, sensitiveinstall.toml)?
auto or prompt), AWS region, and default input valuesreferences/template-variables.md.<app-name>/
├── metadata.toml # required
├── runner.toml # required
├── stack.toml # required for AWS — without it, "Generate install stack" fails
├── inputs.toml
├── sandbox.toml
├── policies.toml # optional — OPA policy registration
├── permissions/ # required — must be a DIRECTORY, not a single file
│ ├── provision.toml
│ ├── deprovision.toml
│ └── maintenance.toml
├── components/
│ ├── <N>-<component-name>.toml
│ └── ...
├── policies/ # optional — Rego policy files
│ └── <policy-name>.rego
├── actions/ # optional
│ └── <action-name>.toml
└── install.toml # optional — AWS only; defines install defaults and approval flow
Number prefixes (1-postgres.toml) are visual only. Deployment order is determined by the dependencies array.
These files must begin with a type comment (the CLI uses them to determine file type):
# runner | # inputs | # helm | # terraform | # kubernetes-manifest | # docker-build
# container-image | # install | # action | # policy
These files do not use type comments: metadata.toml, sandbox.toml, permissions/*.toml.
metadata.toml exists at the app root with a version fieldrunner.toml exists at the app root with the correct runner_type for the target cloudstack.toml exists at the app root for AWS installs — missing this causes "Generate install stack" to fail silentlysandbox.toml includes cluster_version in [vars] — omitting it causes cluster provisioning failurespermissions/ is a directory (not a single file) containing provision.toml, deprovision.toml, and maintenance.tomltimeout, at least one [[triggers]], and at least one [[steps]][[input]] in inputs.toml has a group field matching a declared [[group]]# runner, # inputs, # helm, # terraform, # kubernetes-manifest, # action, etc.) — metadata.toml, sandbox.toml, permissions/*.toml do NOT use type commentsname in snake_casedependencies arrays reference valid, existing component names{{ .nuon... }} variables reference valid paths (see references/template-variables.md)inputs.toml[public_repo] or [connected_repo] with repo, directory, branchterraform_versionnamespacestack.toml missing for AWS — required for AWS installs; without it, "Generate install stack" fails silently with no clear error. See references/component-templates.md for the template.cluster_version missing from sandbox — easy to forget; always include it in [vars] in sandbox.toml. Omitting it causes cluster provisioning failures.permissions/ must be a directory with three separate .toml files, not a single file.AdministratorAccess on the IAM role lets it call AWS APIs (EKS, S3, EC2, etc.) but does not grant access inside the Kubernetes cluster. You must explicitly add the maintenance role to EKS RBAC. When something is "forbidden," identify which system is rejecting it — they fail in completely different ways.post-provision action to grant the maintenance role cluster access; it cannot work. Anything the runner needs to function must be set up during provisioning via Terraform, not via actions. The right pattern: a components/0-eks-access.toml Terraform component that creates the EKS access entry and runs before all other components. Alternatively, check if the sandbox module accepts a maintenance_role_arn var — if so, pass it there and get this for free.post-provision won't fire for existing installs — if an install was provisioned before a post-provision action was added to the config, that trigger will never fire for that install. Don't rely on post-provision for installs that already exist.[[input]] must have a group field referencing a declared [[group]]. Missing or empty group → invalid group "" error on syncreadme file reference — if metadata.toml uses readme = "./README.md" (file path), the file must exist or nuon apps sync will fail with unable to fetch field value. Either omit readme, use an inline markdown string, or create the referenced filename field value, not the filenamesensitive = true for secretsstorage_driver = "configmap" for Helm unless you have a reasonkubectl access, not as podsreferences/component-templates.mdreferences/template-variables.mdreferences/example-mattermost.mdbrew install nuonco/tap/nuon
nuon login
nuon apps create --name <app-name>
nuon apps sync