SpiriConfig
Plugin-based configuration and container management, built around one rule:
Anything SpiriConfig can do, you must be able to do without it.
Press Up on a stack in the web UI and SpiriConfig runs this, showing you the line as it goes, with a button to copy it:
cd /srv/compose/whoami && docker compose -p whoami -f compose.yaml up -d
No database, no registry, no bespoke on-disk format. If SpiriConfig vanished tomorrow, everything it manages would keep working -- and you would already know the commands to manage it.
Installation
Every service SpiriConfig manages runs in a container; SpiriConfig itself cannot, because the process that starts those containers on boot has to live on the host. So it installs itself as a systemd service. You need uv on the machine, then:
uvx spiriconfig install
That pulls the latest release from PyPI, writes a systemd unit and an environment
file, and enables and starts the service -- the web UI comes up on
http://localhost:8080 and returns on every boot. Add --show to print every
command it will run before it runs anything.
Run it as root for a system-wide service, or as a normal user for a
single-operator systemctl --user one; that choice is the security model, not
a preference. Update in place with spiriconfig update. See
Installing SpiriConfig for the full walkthrough.
To track the latest development instead of a release, install from git -- the positional argument is anything uv accepts:
spiriconfig install git+https://github.com/spiri-robotics/SpiriConfig.git
A git-branch install pins to a commit, so spiriconfig update --reinstall
refetches the branch when it moves.
Usage
Point it at your compose directory and start the web UI:
export SPIRICONFIG_DOCKER_COMPOSE_DIR=/srv/compose
spiriconfig serve # web UI on http://localhost:8080
Adding a service is making a directory. No CLI required -- that is the point:
sudo mkdir -p /srv/compose/whoami
sudo $EDITOR /srv/compose/whoami/compose.yaml
A non-root install defaults its compose directory to ~/spiri-apps, so dropping
your own in-development project there -- a directory with a compose.yaml -- is
all it takes to get started; SpiriConfig picks it up as a stack, no install step.
Add a compose.dev.yaml alongside it to build from source and get the dev-mode
"Up (dev)" path.
From the shell:
spiriconfig docker list
whoami running
grafana stopped
spiriconfig docker up whoami
spiriconfig docker logs whoami -f
Not sure what a command will do? Ask, without running it:
spiriconfig docker up whoami --show
cd /srv/compose/whoami && docker compose -p whoami -f compose.yaml up -d
Because the compose project name is the directory name, these are the same containers you get from running compose yourself -- SpiriConfig and a plain shell can manage the same stack on the same afternoon without confusing each other.
Configuration
Environment variables only. See the docs for the full list; the one you need is:
| Variable | Default | Meaning |
|---|---|---|
SPIRICONFIG_DOCKER_COMPOSE_DIR |
test_data/compose |
One subdirectory per compose project. On a real machine it defaults to /srv/compose (root install) or ~/spiri-apps (user install). |
The defaults are relative on purpose: running out of a checkout should not start managing the containers on your actual box. See configuration.
Plugins
The docker plugin is the only one that ships, and it is not special: it is
discovered through the spiriconfig.plugins entry point group exactly as yours
would be.
[project.entry-points."spiriconfig.plugins"]
tailscale = "spiriconfig_tailscale:TailscalePlugin"
Install the package and it appears in the CLI and the web UI. See docs/plugins.md for the interface and the rules, and docs/design.md for why the rules exist.
Development
Work from a checkout with uv:
uv sync
You can drive the whole flow without touching your real machine. test_data/ is
gitignored and disposable, and the default settings point at it, so trying
SpiriConfig out cannot start managing the containers on your box:
./scripts/test-data.sh # a compose dir + an example app store
uv run spiriconfig appstore check
uv run spiriconfig appstore install whoami
uv run spiriconfig docker up whoami
uv run spiriconfig serve &
curl localhost:8337/plugin/whoami/
Hostname: 2d5bcd6f2629
GET / HTTP/1.1
whoami publishes no port of its own -- the reverse proxy above is the only way
in, same as any other plugin (see spiriconfig.plugin.* labels in
examples/store/whoami/compose.yaml).
Run the tests and build the docs:
uv run pytest # 92 tests
uv run sphinx-build -b html docs docs/_build # docs
Tests that need a docker daemon are skipped when there is not one, so the suite passes on a laptop with no docker and still means something on a machine that has it. Most of them never need one anyway: the plugin builds commands and the tests assert on the command line, which is the actual contract.
Metadata
Release files for spiriconfig 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| spiriconfig-0.3.0.tar.gz | 345.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| spiriconfig-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 527.1 kB
Release files / spiriconfig-0.3.0.tar.gz
| Download URL | spiriconfig-0.3.0.tar.gz |
|---|---|
| Size | 345.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1a1dd7955103311583355273cce9ddb1428ed4d855c4e414e5503c81dceeeb3b
|
|
BLAKE2b-256 checksum How to use checksums |
a976fa17d27819714e01ecb217912105bde38d4ed8a35a40a47bc4dfa3db6c19
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.
Transparency logRelease files / spiriconfig-0.3.0-py3-none-any.whl
| Download URL | spiriconfig-0.3.0-py3-none-any.whl |
|---|---|
| Size | 181.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ae011e96c9d776d3087f95715813e7d6feef12ea12ff4b676bb408699442ebd4
|
|
BLAKE2b-256 checksum How to use checksums |
66631c26e383347fd220637774328d8f17b65525b0b934a32df763d64476351a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.
Transparency log