Change Log¶
v0.6.0 (unreleased)¶
v0.5.0 (2026-10-05)¶
Added the
stopcommand, which stops every installed project unit, or the named ones, in a singlesystemctltransaction.
v0.4.0 (2026-10-05)¶
Added the
SYSTEMD_SOURCE_DIRsetting, a default forinstall --sourceso installs use pre-rendered units without the option.
v0.3.0 (2026-10-05)¶
Added the
SYSTEMD_RENDER_DIRsetting to change the defaultrenderoutput directory from the current directory.listprints its table with Rich. Output that is not a terminal is never wrapped, so piped rows keep one unit per line.
v0.2.3 (2026-09-30)¶
Fixed django packages readme link.
v0.2.2 (2026-09-30)¶
Fixed CoC link.
Updated description.
Drop rich optional dep as it is automatically included with typer now.
v0.2.1 (2026-09-29)¶
Doc updates.
v0.2.0 (2026-09-29)¶
System scope is now the default: units are managed with the system manager, installed under
/etc/systemd/system, and run as theUser=they name. The user scope remains available throughSYSTEMD_SCOPEor--scope user.Privilege escalation is explicit and never guessed.
SYSTEMD_ESCALATE(or--escalate) configures a prefix such assudo -nfor privileged calls in the system scope; it is never applied tolistor to any read-only query, and never when already running as root.Added the link install method (
LINK,SYSTEMD_INSTALL_METHOD,SYSTEMD_LINK_DIR): rendered units are kept in a directory the deploying user owns andsystemctl linkplaces the symlink, so only polkit authorization is needed, never file system privileges.scopeis now always in the template context, so one unit template can serve both scopes.Every
systemctlcall now passes--no-ask-passwordso a missing authorization fails instead of prompting.
v0.1.0 (2026-09-28)¶
Initial Release.
Requires Python 3.11 or later and Django 5.2 or later.
Apps bundle systemd unit templates in a
systemd/directory. The set of templates matchingSYSTEMD_TEMPLATESforms the project’s unit manifest (project_units()).The
systemdmanagement command provideslist,render,install,uninstall,restartandreload, all driven by the manifest so deployments never name units.render --contextandinstall --sourcesupport rendering at package time and installing the pre-rendered units on the host.Units are managed in the user scope only, through
systemctl --user. Nothing runs as root.unit_installedis sent withunitanddestinationfor each installed unit.Unit files are rendered with autoescaping off, since they are not HTML.