Start
Getting started
Run a checked-in plan against a disposable sample API, then write a small plan for a service you control. Commands below use a POSIX shell from the repository root. The supported walkthrough baseline is Linux (including a Linux environment on Windows); native Windows and macOS execution are not established here.
Prerequisites
Obtain a source checkout or archive containing go.mod, cmd/, and examples/. This guide does not assume a particular source-host URL or a published binary installer. Building requires Go 1.26 (the repository prefers toolchain 1.26.7) and network access to download modules and, if needed, the Go toolchain. A running HTTP plan does not require Go. No Nix, Kubernetes cluster, database, Node, or Python is needed for this first run.
Build from source
From the checkout root:
CGO_ENABLED=0 go build -o bin/ ./cmd/...
make build is an equivalent convenience if Make is installed. The commands in this guide use bin/vero; reference pages use vero to mean a binary already on your PATH.
Run the sample API
Use two terminals at the checkout root. In Terminal 1, start the disposable fixture in the foreground:
bin/vero-testserver
Leave it running. In Terminal 2, inspect the graph and run the rate-limit example:
bin/vero plan --graph examples/rate-limit.yaml
bin/vero run examples/rate-limit.yaml
The graph shows task data dependencies and shared-resource claims. With the fixture running on its default port 18080, the run should report four passed tasks and exit 0; elapsed time varies. Stop the fixture with Ctrl-C in Terminal 1 when finished. vero-testserver is a demonstration API, not a daemon required to test your own service. The rate-limit example assumes its authentication, reset, and orders endpoints; changing only the URL does not adapt that plan to an arbitrary API. For requirements of the other checked-in plans, see Running the examples.
Test your own service
Save this complete read-only plan as health.yaml in the checkout root:
apiVersion: vero.plan/v1
kind: Plan
metadata: { name: service-health }
env:
baseUrl: "${VERO_BASE_URL}"
healthPath: "${VERO_HEALTH_PATH:-/healthz}"
lifecycle: { strategy: isolated }
tasks:
- name: health
steps:
- http:
method: GET
url: "{{ env.baseUrl }}{{ env.healthPath }}"
assert: [status == 200]
Against the sample API, in Terminal 2:
export VERO_BASE_URL=http://127.0.0.1:18080
bin/vero plan health.yaml
bin/vero run health.yaml
Expect one passed task and exit 0. For another dedicated test API, set VERO_BASE_URL to its origin without a trailing slash and VERO_HEALTH_PATH to its health endpoint starting with /. Adjust the expected status to the service's documented contract, not just to turn a failure green. The required base URL has no default: an unset target fails at load time before any request. Neither variable is secret; use secretRef for real credentials.
isolated declares an isolation assumption; it does not start a server. Use a dedicated test target. For plans that mutate application data, select a real reset strategy or uniquely named data rather than copying this declaration without isolation. The plan reference describes lifecycle strategies and assertions.
Troubleshooting
bin/vero: not found: build from source first, from the checkout root.- Connection refused: start the sample fixture in Terminal 1, or verify your own service is listening at the configured URL.
- Port 18080 occupied: stop only your own fixture, or choose another address and change the plan target too. The shipped rate-limit plan hardcodes port 18080; it does not use
VERO_BASE_URL. - Required environment variable unset:
vero planexits with a load error before making a request. SetVERO_BASE_URLforhealth.yaml, or provide the variable named in your plan. - Assertion failed: inspect the actual status and response against your service's contract. Do not weaken an assertion automatically to make the run pass.
This page is docs/content/guides/getting-started.md in the repository.