Skip to main content

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:8337

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 /srv/compose as root, ~/spiri-apps otherwise One subdirectory per compose project; installed apps are symlinks in here.

spiriconfig serve [HOST][:PORT] [--no-login-required] overrides the bind address and login for one run. 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 script points the checkout's .env 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.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for spiriconfig 0.3.1
File Size Uploaded
spiriconfig-0.3.1.tar.gz 358.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for spiriconfig 0.3.1
File Interpreter ABI Platform
spiriconfig-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 543.9 kB

Release files / spiriconfig-0.3.1.tar.gz

Download URL spiriconfig-0.3.1.tar.gz
Size 358.1 kB
Tags Source
SHA-256 checksum
How to use checksums
111e386c2d347158f2dfe99b448ff059768c074edfe18af0eb89cfb454f8bdd5
BLAKE2b-256 checksum
How to use checksums
744f104221219a2c5edb60bd7e35ab021f0c40566f836d18da12090f5c1edb8f
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 Oct 3, 2026.

Transparency log

Release files / spiriconfig-0.3.1-py3-none-any.whl

Download URL spiriconfig-0.3.1-py3-none-any.whl
Size 185.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ed3f3e91f54b944680399c3c5505f620fcbf033a6d55ccbe1678703ac524a3dc
BLAKE2b-256 checksum
How to use checksums
d9580ac55ac31ae9fc4c2a25b27e8ea37666882e0d62d710b7a11c67dad858db
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 Oct 3, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page