Skip to main content

Desired-state infrastructure convergence engine

Project description

verg

Desired-state infrastructure convergence engine. A fast, stateless alternative to Ansible, built in Rust.

Pre-1.0: verg is under active development. Expect breaking changes between minor versions.

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 with Jinja2 templating where needed. No variable precedence maze.
  • Agent-friendly--json output, schema command, 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

  1. Declare desired state in TOML files under verg/state/
  2. Define hosts in verg/hosts.toml with group assignments
  3. 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


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.5.0.tar.gz (55.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

verg-0.5.0-py3-none-manylinux_2_28_x86_64.whl (2.2 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

verg-0.5.0-py3-none-manylinux_2_28_aarch64.whl (2.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

verg-0.5.0-py3-none-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

verg-0.5.0-py3-none-macosx_10_12_x86_64.whl (2.1 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file verg-0.5.0.tar.gz.

File metadata

  • Download URL: verg-0.5.0.tar.gz
  • Upload date:
  • Size: 55.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for verg-0.5.0.tar.gz
Algorithm Hash digest
SHA256 2deb1bacedc7357016adef2e14d308a94ad004a929b8df49a2c5c5e81df848ba
MD5 1b4efb1a35b1563feeb673300c57df2c
BLAKE2b-256 f0f108d4535bba752585deb0af573a582fa8405ecaef70f0369b9c02e71e620a

See more details on using hashes here.

File details

Details for the file verg-0.5.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

  • Download URL: verg-0.5.0-py3-none-manylinux_2_28_x86_64.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: Python 3, manylinux: glibc 2.28+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for verg-0.5.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5fd57cc3918341aeb9984d9b61eecd61e59daece54903131bbba4b1462d5486e
MD5 48b694b74a7f21a725bdfa29f403dd1c
BLAKE2b-256 8730891cc378e91f15aaf33cad909422a048eff9617dccd18d3f15afa66efb12

See more details on using hashes here.

File details

Details for the file verg-0.5.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for verg-0.5.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 953ba22ccff438362fa7685b7d78099e48220a7fce7cee0fd898836fe8698b45
MD5 66edc89427a0893a9dc51b40636619ee
BLAKE2b-256 ec0a629b8b95e7cdb82affbb6141b0e49c6fb830da9e57e38116cb88a77ca237

See more details on using hashes here.

File details

Details for the file verg-0.5.0-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: verg-0.5.0-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for verg-0.5.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d3fd5e02a5594ab626abbe18a260f3d4f1b9ecdfd63c1d438a69b87023d2d832
MD5 dcd3c262cdc185a98957462676bfffb1
BLAKE2b-256 fb11efaccf99b1c110c6ea4d853f4d8fc69a301a6cbe4cd53f01b995b0055881

See more details on using hashes here.

File details

Details for the file verg-0.5.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for verg-0.5.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a0014fdfa092eac82bf53f12144ce8be0e43d33e5f21e3bd042693375e8a7aee
MD5 c859b20cc7e36bbba745285364740ce7
BLAKE2b-256 8b60fe4aedba6c1d1dbea00890013651ca79c9b23646124199b474ba101e291f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page