A system provisioning & configuration tool for bootstrapping & maintaining consistent software across multiple platforms.
| License |
Table of Contents
Anvil converges a system to a declared desired state using tags and roles to specify which software and configuration should be present. Operations are idempotent: Anvil always queries live system state and applies only what is missing, making it safe to run repeatedly on new or existing systems.
Currently, the following platforms are supported (older and newer versions may also work):
| Platform | Version | Tier |
|---|---|---|
| Alpine Linux | 3.23 | Tier 1 |
| Arch Linux | rolling | Tier 1 |
| Bazzite | rolling | Tier 2 |
| CachyOS | rolling | Tier 1 |
| Debian | 13, rolling | Tier 2 |
| Fedora | 44 | Tier 2 |
| FreeBSD | 15.0 | Tier 3 |
| macOS | 26 (Tahoe) | Tier 1 |
| OpenBSD | 7.8 | Tier 1 |
| TrueNAS | 25.10 (Goldeye) | Tier 2 |
| Ubuntu | 26.04 | Tier 2 |
- Tier 1: Actively used and maintained, expected to work from test coverage, CI, and real world usage.
- Tier 2: Built with platform in mind, not used as frequently, full fidelity may drift over time.
- Tier 3: Best effort support, not actively used or tested, may accumulate issues.
On a system with Curl installed, download and run the install script:
curl -fsSL https://fnichol.github.io/anvil/install.sh | shAlternatively with wget:
wget -qO- https://fnichol.github.io/anvil/install.sh | shOn a fresh OpenBSD system with ftp:
ftp -o - https://fnichol.github.io/anvil/install.sh | shFor a full set of options, check out the help usage with:
curl -fsSL https://fnichol.github.io/anvil/install.sh | sh -s -- --helpOn first run, initialise your configuration interactively:
anvil config initThen converge your system to the desired state:
anvil apply| Command | Description |
|---|---|
anvil apply |
Converge system to desired state |
anvil config edit |
Edit current config in $EDITOR |
anvil config init |
Initialize a config file |
anvil config show |
Show current config |
anvil module add |
Register and fetch a module |
anvil module check |
Check if modules are up to date |
anvil module install |
Fetch registered modules not yet on disk |
anvil module list |
List registered modules |
anvil module remove |
Deregister and delete a module |
anvil module show |
Show details of a module |
anvil module update |
Pull latest for one or all modules |
anvil diff |
Show what would change if apply was run |
anvil doctor |
Verify system health and requirements |
anvil facts |
Show discovered system information |
anvil role list |
List available roles |
anvil role show |
Show details of a role |
anvil self check |
Check if a newer version is available |
anvil self update |
Update to the latest release |
anvil tag list |
List available roles |
anvil tag show |
Show details of a role |
anvil status |
Show current system vs. desired state |
Run anvil --help or anvil <command> --help for full details.
Check formatting and linting:
make checkRun the test suite:
make testCI configuration will be added in the future.
This project adheres to the Contributor Covenant code of conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to fnichol@nichol.ca.
If you have any problems with or questions about this project, please contact us through a GitHub issue.
You are invited to contribute to new features, fixes, or updates, large or small; we are always thrilled to receive pull requests, and do our best to process them as fast as we can.
Before you start to code, we recommend discussing your plans through a GitHub issue, especially for more ambitious contributions. This gives other contributors a chance to point you in the right direction, give you feedback on your design, and help you find out if someone else is working on the same thing.
Created and maintained by Fletcher Nichol (fnichol@nichol.ca).
Licensed under the Mozilla Public License Version 2.0 (LICENSE.txt).
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the MPL-2.0 license, shall be licensed as above, without any additional terms or conditions.