Desired-state infrastructure convergence engine
Project description
verg
Desired-state infrastructure convergence engine. A fast, stateless alternative to Ansible, built in Rust.
Features
- Fast — pushes a single static binary to targets over SSH, executes locally. No Python, no per-task SSH round-trips.
- Predictable — stateless convergence. Every run checks reality and converges. No state files.
- Simple — TOML declarations. No YAML, no Jinja2, no variable precedence maze.
- Agent-friendly —
--jsonoutput,schemacommand, structured exit codes. Built for both humans and AI agents.
Quick Start
# Install
cargo install verg
# Initialize a project
verg init
# Edit hosts and state
vim verg/hosts.toml
vim verg/state/base.toml
# Preview changes
verg diff --targets all
# Apply
verg apply --targets all
How It Works
- Declare desired state in TOML files under
verg/state/ - Define hosts in
verg/hosts.tomlwith group assignments - Run
verg apply— the tool pushes a binary to each target over SSH, which checks current state and converges
Resource Types
| Type | Description |
|---|---|
pkg |
System packages (apt, dnf, pacman — auto-detected) |
file |
Files and directories (content, permissions, ownership) |
service |
Systemd services (running/stopped, enabled/disabled) |
cmd |
Run a command (requires idempotency guard) |
user |
System users (create/remove) |
Example
# verg/hosts.toml
[hosts.web1]
address = "192.168.1.10"
user = "root"
groups = ["web"]
# verg/state/web.toml
targets = ["web"]
[resource.pkg.nginx]
name = "nginx"
state = "present"
[resource.file.nginx-conf]
path = "/etc/nginx/nginx.conf"
content = "server { listen {{ http_port }}; }"
after = ["pkg.nginx"]
[resource.service.nginx]
name = "nginx"
state = "running"
enabled = true
after = ["file.nginx-conf"]
Commands
| Command | Description |
|---|---|
verg apply -t <targets> |
Converge targets to desired state |
verg diff -t <targets> |
Show what would change (dry-run) |
verg check -t <targets> |
Verify targets match desired state |
verg schema |
Print resource type schemas as JSON |
verg init |
Scaffold a new project |
verg completions <shell> |
Generate shell completions |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
verg-0.1.0.tar.gz
(32.2 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file verg-0.1.0.tar.gz.
File metadata
- Download URL: verg-0.1.0.tar.gz
- Upload date:
- Size: 32.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9c3cf4fef4c8acb4a926ffc13ce3b4d8bc9e3f00a5b3aa9da6d62661a0ef64e
|
|
| MD5 |
0aab0dfa6e2345f112a835fc97f86f46
|
|
| BLAKE2b-256 |
ccf41e0e9af693cd50c3f334730db6bfb401c20a682686b2e5c5c43bb22e9def
|
File details
Details for the file verg-0.1.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: verg-0.1.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.4 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7820b1d5d16ea3d100db39df5ed59a3ae01c7333f0038c137a629f8cb19e6de4
|
|
| MD5 |
dae58c9ee855d7794b45f0c66a6bf2b9
|
|
| BLAKE2b-256 |
25149d20ecb2f735af04750e87071542bb36915ec8ba6d3720e9183d415a3d9c
|