Changelog¶
All notable changes to this project are documented in this file. The format follows Keep a Changelog, and the project uses Semantic Versioning.
Unreleased¶
Added¶
- The README and the docs link to the beginner's guide, Sadame: Configuration Management Made Simple, a free book.
0.5.1 - 2026-11-02¶
Push mode checks sudo before it copies anything, and misspelled options are reported on their own line everywhere.
Added¶
- A Japanese README,
README.ja.md; a test keeps its code and output the same as the English one's.
Changed¶
- The README shows a real plan, many servers, how push mode works, every command and resource, and where sadame stands.
- The Docker, push and VM tests, and the docs' transcript capture, stop
before they start when a binary they need in
dist/is older than the source, and name the task that rebuilds it.
Fixed¶
- With sudo, push mode checks that sudo works without a password before it copies anything to a server, as the Remote hosts guide says. It used to copy the binary first, then fail.
- A misspelled option in a call that spans several lines is reported on
its own line by
validate,plan,applyanddrift, as the language server already did. The binary used to name the call's last line.
0.5.0 - 2026-11-02¶
Editor support, and recipes shared between projects.
Added¶
sadame lsp, a language server: editors show whatvalidatefinds as you type, on the right file and line, complete resources, options,state:values and facts, describe them on hover, and list a recipe's resources in the outline. A file a recipe includes is checked through that recipe, for the hosts that include it. The Editor support guide sets it up in Neovim, Helix and Emacs.- The Sharing recipes guide: recipes shared between projects as git submodules, pinned and updated on purpose, with an example project.
- The release binaries' smoke test runs
validate,facts,init,reportand a language server session too, in every distribution image and on macOS.
Fixed¶
- Push mode leaves every
.gitout of the recipe it copies to servers, not only the top one, so a submodule's history stays behind. - The resource pages list the
tagsoption.
0.4.0 - 2026-11-01¶
Checking recipes without servers, running part of a recipe, and reports for CI.
Added¶
sadame validateevaluates the recipe for each selected host, with its name, groups and vars, against a stand-in machine (--platform debian,ubuntu,rocky,alpineorarch), renders its templates, and connects to nothing.- Tags: resources take
tags:,include_recipe "roles/web", tags: [:web]tags everything a file declares, and--tagsand--skip-tagsrun part of a recipe withplan,applyanddrift. Reports list the tags used. sadame reportturns the--jsonoutput ofplan,applyanddriftinto Markdown for a CI summary page, or JUnit XML (--format junit) for test reports.sadame initwrites a recipe,vars.rb,hosts.rband a template, and with--ci githubor--ci gitlaba daily drift check.
Changed¶
- The CI examples put a drift summary on the GitHub Actions run page and a JUnit report in GitLab; the pull request pipeline validates the recipe before planning.
- Example 08 tags each role.
sadame hostssays whenhosts.rbexists but declares no hosts.
0.3.0 - 2026-11-01¶
Recipes can see the machine they run on.
Added¶
factsin recipes and templates:hostname,fqdn,arch,kernel,cpus,memory_mb,swap_mb,root_disk_gb,ipv4,default_interface,ipv4_addresses,ipv6_addresses,virtualization,container,service_managerandmachine_id, read on the machine when first asked for. What cannot be read is nil; an unknown name is an error that lists the facts.sadame factsprints the facts of this machine, or with-h,-gor--limitof each selected host over SSH;--jsonas well.
Changed¶
- Example 05 sizes PostgreSQL's
shared_buffersto a quarter of the machine's memory unless vars set it.
0.2.0 - 2026-11-01¶
Rolling changes across a fleet, four more resource types, and Alpine services.
Added¶
--forks Nworks on at most N hosts at once.--serial Nor--serial N%runs the hosts in batches, one after another, and stops after a batch in which a host failed or could not be reached. The hosts of later batches are reported asskipped.- The
lineresource manages one line in a file that a package owns: lines that matchmatch:are replaced, otherwise the line is appended.verify:checks the edited file first, and plan shows the edit as a diff of the file. - The
linkresource manages symbolic links;force: truereplaces a regular file in the way. - The
groupresource manages local groups and their gid, with BusyBox'saddgroupanddelgroupon an Alpine withoutshadow. - The
gitresource keeps a checkout at a tag, a branch or a commit, and moves it when the branch moves. Withuser:, git runs as that user. serviceworks with OpenRC, so on Alpine too.- Homebrew tap:
brew install enderkus/sadame/sadameinstalls the release binary on macOS and Linux. - The docs' home page shows the navigation, the terminal recording and what sets sadame apart, with buttons to get started and to star the project.
- Links to the project on X, @sadame_rb, in the docs' footer and the README.
Changed¶
- In push mode's JSON,
hosts[].exit_statusisnullfor hosts that--serialskipped. - Example 05 sets PostgreSQL's
include_dirwithlineinstead of a guardedexec, and the Ansible migration example translateslineinfiletoline. - The Docker integration tests boot OpenRC in the Alpine containers, so
the
serviceexamples run on Alpine too. - The terminal recording in the README and on the docs' home page has larger, readable text.
Fixed¶
- The icons on the docs' home page cards were shown as text.
- Links in the docs' dark color scheme were blue instead of the brand pink.
0.1.0 - 2026-11-01¶
The first release.
Added¶
sadame planandsadame applyfor the local machine, with a colored unified diff, per-resource results,--jsonoutput and documented exit statuses.- Resources:
package(apt, dnf, apk, pacman),file(content, template, source, mode, owner, group),directory,service(systemd),exec(creates,not_if,only_if,cwd,env) anduser. sadame drift: compares likeplanand exits 1 when the machine differs from the recipe;--jsonfor CI. Exit statuses are documented per command (0 success, 1 failure or drift, 2 usage, recipe or state-read error).- Notifications:
notifies:andsubscribes:, delayed (once, at the end ofapply) by default or:immediately;execwithaction: :nothingfor commands that only run when notified. - A summary table and the run time at the end of
apply. - Inventories:
hosts.rbwithgroup,host(address,user,port,sudo,ssh_opts,vars),include:and groupvars;command_outputfor dynamic inventories. Vars precedence:--var, host, group (including over included),vars.rb. - Push mode:
-h [user@]host[:port],-g,--limit,--inventory,--sudo. Sadame copies itself (cached by checksum under~/.sadame/bin/) and the recipe with the system'sscp, runs overssh, all hosts in parallel with prefixed output, and ends with a per-host summary or one JSON document. sadame hosts: the selected hosts with their connection options and vars, and where each var came from.host_nameandhost_groupsin recipes;--host-name,--host-groupsand--vars-filefor local runs.filechecks new content withverify:(such asvisudo -cf %{path}) before it replaces the target;servicemanages units of a user's systemd instance withuser:;platform.codename.- Every command runs in the
C.UTF-8locale, so the output sadame reads and guards that match text do not depend on the language of the target or of the SSH session. - Examples 01 to 12, from a one-file hello to a hardened VPS, PostgreSQL, Docker, a multi-role inventory and an Omarchy workstation, plus Ansible and Itamae migration examples and CI pipelines for plan, apply and drift.
- Docker integration tests: every example on Ubuntu, Debian, Rocky, Alpine
and Arch, on amd64 and arm64 (native runners in CI), in containers
booting systemd; certbot against Pebble. A local-only VM layer
(
rake vm:test) on Ubuntu, Debian, Rocky, Arch and Omarchy VMs. - JSON report fields
drift,exit_status,duration_seconds, and the notifications each resource triggers; documented in the JSON output reference. - Recipe DSL with
include_recipe,varsfromvars.rband--var, andplatformfacts read from/etc/os-release. - An ERB-compatible template engine (
<%= %>,<% %>,<%# %>,-%>,<%-,<%%). - mruby build (
rake build:native) and a test suite that runs on CRuby and inside the mruby build. - Release binaries: static Linux builds for amd64 and arm64 (built with musl in Docker) and macOS builds for Apple silicon and Intel, each about 1 MB. CI runs the Linux binaries unmodified in Ubuntu, Debian, Rocky, Alpine and Arch images (Arch Linux ARM, a community image, for arm64), each on a runner of its own architecture, before they can be published.
install.sh: installs the right binary for the system after checking its SHA-256 checksum.- Release workflow: a
v*tag publishes the binaries,SHA256SUMSand the changelog section as a GitHub release. - A Homebrew formula and an AUR package (
sadame-bin) for the release binaries, generated from the release's checksums. - Documentation at https://enderkus.github.io/sadame/: getting started, concepts, recipes and the inventory, every resource, guides, command line, JSON output and exit code references, and a comparison with Ansible, Itamae, mitamae, Chef and Puppet.