This walkthrough builds on the
eks-simple
directory of the example-app-configs
repository, which now ships a branch.toml.eks-simple already ships its branch config. This walkthrough syncs it into your org and takes a change
through it end to end: preview the diff, plan each deployment group, approve, deploy.
Prerequisites
- Finish Create an AWS EKS App first, or otherwise have the
eks-simpleapp synced to Nuon with at least one install that has finished provisioning. - The Nuon CLI, authenticated with
nuon auth loginand pointed at your org withnuon orgs select. - A clone of
example-app-configs.
What You Will Create
- An app branch named
mainin your org, created by syncing the branch config that ships in theeks-simpledirectory of the example repository. - Two deployment groups named
stageandproduction, which select their installs by label. - A labeled install, so it lands in the
stagegroup. - A plan-only preview run, and then a real run you approve group by group.
Review the Branch Config
branch.toml
The branch config is a single file at the root of the app config directory, alongside metadata.toml. eks-simple
already includes it — open
eks-simple/branch.toml in your
clone and read it against what follows:
branch.toml
name = "main"is the branch’s name in Nuon. It comes from this key, not from the filename, and it is what you pass tonuon sync --branch.[public_repo]is the repository the branch tracks.directoryis the path to the app config inside that repo, soeks-simplehere rather than".". All three fields are required.- Two
[[install_groups]]—stagefirst (order = 1), thenproduction(order = 2). Lowerorderdeploys first, and each group’s plan waits for your approval before its deploy runs. [install_groups.label_selector]picks each group’s installs by label. An install labeledenv = "stage"is in thestagegroup; one labeledenv = "prod"is inproduction. Nothing is hard-coded to a particular install, so adding a customer to a group is a matter of labeling it.
Both groups use
label_selector rather than install_names on purpose. Names are resolved to install IDs when you
sync and an unknown name fails the whole sync, so a name-based group breaks in any org where that install does not
exist. Label selectors re-evaluate on every run.Label your install
Thestage group is empty until an install carries env = "stage". Label the install you provisioned earlier:
installs/eks-simple-ci-stage.toml
nuon apps sync:
Sync the app
From theeks-simple directory (start in the directory where you cloned example-app-configs):
Branch commands take the app ID (
app...) — copy it from nuon apps list. Selecting the app with
nuon apps select (no flags, pick from the list) stores it once, which is what lets the rest of this walkthrough
drop --app-id from trigger and runs.main. In the dashboard, the app now has a Branches view showing the branch and its
Deployment plan: stage, then production.

The main branch's deployment plan after the sync: stage first, then production, each selecting installs by label.
Preview a Change
Before deploying anything, see what a change would do. Edit thesub_domain input default in inputs.toml (this is
an excerpt — leave the rest of the file as it is):
inputs.toml (excerpt)
A changed default only shows up in the diff for installs that inherit it. An install that sets
sub_domain
explicitly (including eks-simple-ci-stage, whose config file pins it) shows an empty diff for this change. To
see the diff on every install, change something unconditional instead, or remove the explicit value from your
install first.nuon apps branches runs --app-id <your-app-id> --branch-id main, which opens the workflow TUI.
A manual plan-only run still walks the deployment groups: it creates each group’s
plan install group and
deploy install group step, but each approval gate auto-approves (“Auto-approved in plan-only mode”) and
nothing is applied, so the run finishes on its own. Read the per-install diffs from the completed run. (A pull
request preview behaves differently and never creates the group steps at all.)Run It for Real
Drop the--preview and the same command becomes a real rollout:
nuon sync --branch hands Nuon a
config it already built from your working directory while trigger fetches one from git:
From step 3 on they are identical:
building components and sandboxrebuilds only what changed.- each
plan install groupcomputes the diff for every install in the group and then waits for you. - each
deploy install groupruns once you approve the plan before it.
Approve the plan
The run pauses atplan install group: stage. In the diff, installs that inherit the default show sub_domain
moving from whoami to hello; installs that pin sub_domain explicitly show no change for it (see the note in
Preview a Change). Approve the plan and the group deploys.
The run then stops at plan install group: production. A group with no matching installs still pauses; Skip
install group moves the run past it.
Every group’s plan waits for an approval, from the dashboard or an API caller. There is no setting that
auto-approves a deployment group.
Watch runs from the CLI
Trigger From a Git Push
So far every run has been triggered by hand, becausebranch.toml tracks nuonco/example-app-configs, a repository
you cannot push to. To get the push-triggered behavior, point the branch at a repository of your own.
1
Push the config to your own repository
Fork
example-app-configs, or copy the eks-simple directory into a repository you control.2
Connect it to Nuon
Connect the Nuon GitHub App for your repository’s owner (see connecting a repository). This is what
makes pull request previews possible. It is an org-level connection keyed on the owner, so it enables previews for
any branch tracking a repo under that owner, whether the branch config uses
[connected_repo] or [public_repo].3
Update the repo block
Swap
[public_repo] for [connected_repo], pointing at your repository and the directory the config lives in:branch.toml
4
Sync, then push
main is the trigger, with no CLI step in between.5
Open a pull request
Open a pull request against
main with a config change in it. Nuon runs a plan-only preview and posts a comment
headed ## Nuon Preview — main (the branch’s name, not the app’s) with a table of what changed, plus a
nuon/preview commit status. Push another commit and the same comment is updated in place.Inspect the History
Every config change to an install is recorded as an app config version. Open the install in the dashboard and look at its Versions view, or list them over the API (create an API token in the dashboard’s org settings; the install ID comes fromnuon installs list):
Wrapping Up and Next Steps
You now have a git branch wired to a fleet: a change to the config produces a build, a diff per install, and an approval gate in front of each group. Where to go next:Configure app branches
Multiple branches, label-driven groups, and the full command reference.
How app branches work
Run types, previews, and version history in depth.
Branch config reference
Every field on
branch.toml.Webhooks
Have your own systems react to branch runs.