Your first deployment
Ten minutes, no devices, no containers. We will deploy two toy components with a dependency between them, watch them run, kill one, and watch Keystone put it back.
1. A working directory
The agent keeps its state and installed components under runtime/ in whatever
directory you start it from, so give it its own.
2. Two recipes
recipes/clock.toml — a component that just keeps running:
recipes/reporter.toml — a component that depends on the first:
The [[dependencies]] block refers to the recipe name clock. Keystone maps
it to whichever component in the plan uses that recipe.
3. A plan
plan.toml:
4. Start the agent
Warning
--insecure-skip-verify turns off the mandatory artifact signature checks. These
recipes have no artifacts to verify, but the flag keeps the demo friction-free.
Never use it on a real device — see
Secure defaults.
5. Apply the plan
In another terminal:
The agent uploads and parses the plan, resolves the graph, and starts clock
first, then reporter. The log tells the story:
6. Look at what is running
last_health is unknown because neither recipe declares a health check — that
is normal, not a problem. See Health checks.
7. Break something
New PID, restarts: 1. The restart policy was always, so the runner brought it
back. Nothing you had to do.
8. Re-apply the same plan
The PIDs do not change. Applying an unchanged plan is a no-op: Keystone reconciles rather than restarts. This matters on a device you cannot afford to disturb. See Reconcile and reuse.
9. Stop everything
Using the CLI instead
Everything above works through keystonectl too:
What to read next
- Recipes — every field you can write.
- How it works inside — what the agent did during that apply.
- Security — what to change before this touches a real device.