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.6.0.tar.gz (62.6 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.6.0-py3-none-manylinux_2_28_x86_64.whl (2.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

verg-0.6.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.6.0.tar.gz.

File metadata

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

File hashes

Hashes for verg-0.6.0.tar.gz
Algorithm Hash digest
SHA256 50aab5f0aeef0b5b0504c61f049cd2b0d0f05681c1dbdb3f35ff2fdfa1d4375d
MD5 1c59a743eb4498ac176685c9569c6280
BLAKE2b-256 c1deaffa11fcdf8b2a0bfae284d3b73cf83ff0b095b9c5424c041952d349bd6e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: verg-0.6.0-py3-none-manylinux_2_28_x86_64.whl
  • Upload date:
  • Size: 2.3 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.6.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ba7f6953e152c256044a498865289dfe4cc93ecdc94d5f2bdb59f7f6996bc525
MD5 1c87abdcb41722e89828a7ac0a692306
BLAKE2b-256 28e3346b005d4815da194c2f554ab30ff311b7df522d68e5a8c43d8eeb85b9ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9725a3f814433da70ea461b1aa840ae61d91b2ec8c4c08a778f436ecd35ed0b9
MD5 0104bb2bb35f0c5e7fed6ce90323ae13
BLAKE2b-256 0e4a8808a9071a37f9acdbc975ceb7db1177e1fd3219261e5854b2e7f1a64b0f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: verg-0.6.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.6.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4a8aeae7951166a6a56c22def26cc4d1e80acf07aca9e5b1c3edea06cef458de
MD5 ec3cae93545bf44ce3bc4626c7b3b916
BLAKE2b-256 ed721bac0b6a476e2919f8ad93dd16c5936d4254bc32d06bfae9c41216af4969

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 12786cc723dac9d6f9605638b033629c7b2af0f73ca2e938a1e670195b2f6a9f
MD5 6ba12dab0ab7bfa05c1e5a5c5310d59b
BLAKE2b-256 81d9b15c0cb60059fa3be8fc84e1aeee4d673026fb24a75101fb9594797f3f74

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