Install guide · Ubuntu
Sotero Runtime Ubuntu Installation and Developer Setup Guide
Install, configure, verify, operate, integrate, upgrade, and remove Sotero Runtime 0.0.2 on Ubuntu x86_64. The shortest successful path: install the package, run the daemon once to create configuration, validate it, configure and start the registered systemd service, and confirm that both supervisor and health report success.
| Audience | Developers and technical evaluators |
| Package | sotero-runtime-0.0.2-linux-x86_64.deb |
| Supported distribution/arch | x86_64 (verified on Ubuntu 26.04 LTS) |
| Default transport | Local Unix domain socket |
Before you begin
What the installer adds
The package installs a self-contained Sotero daemon, shared developer resources, and a systemd service registration. Unlike macOS, the service runs under a dedicated, unprivileged sotero-daemon system account — not root, and not your own login user. This means the background service's configuration and state live in a different location from the one you create when trying the daemon interactively as yourself.
| Component | Installed location |
|---|---|
| Daemon command | /usr/bin/sotero-daemon |
| Shared files and examples | /usr/share/sotero-runtime |
| systemd unit | /etc/systemd/system/sotero-daemon.service |
| Service environment file | /etc/sotero-daemon/environment |
| Per-user configuration and state (interactive) | ~/.sotero/ (only used if you run sotero-daemon interactively as yourself) |
| Service configuration and state | /var/lib/sotero-daemon/.sotero/ (used by the systemd-managed instance, owned by the sotero-daemon account) |
Requirements
- Ubuntu x86_64. This guide was verified end to end on Ubuntu 26.04 LTS; other current LTS releases are expected to work the same way.
- A user account with sudo rights for package installation and service management.
- Terminal access for initial configuration, health checks, and developer operations.
- The official .deb and, when supplied, its matching .sha256 checksum file.
Download Sotero Runtime
- Open the Download link from the site navigation and sign in with Google, Microsoft, or your Sotero email and password. Create an account if you don't already have one.
- Review and accept the End User License Agreement. Marketing or product-contact consent, when presented separately, is optional.
- Choose Linux x86_64 and download sotero-runtime-0.0.2-linux-x86_64.deb.
cd ~/Downloads
sha256sum -c sotero-runtime-0.0.2-linux-x86_64.deb.sha256If no checksum sidecar is supplied, your release administrator should provide the expected SHA-256 value through a trusted channel.
Install with apt
sudo apt install ./sotero-runtime-0.0.2-linux-x86_64.debWhat happens automatically. The package creates a dedicated sotero-daemon system account, installs /etc/systemd/system/sotero-daemon.service, and enables it (systemctl enable) — but does not start it yet, the same "register, don't start" posture as macOS and Windows. It also installs /etc/sotero-daemon/environment.example as a template for the one required secret.
Installing over an existing 0.0.2 installation refreshes the installed files while preserving both ~/.sotero/ and /var/lib/sotero-daemon/.sotero/.
Configure the first run
Choose how to provide the required secret
The required [control].signing_key_secret performs two security jobs: it encrypts the persisted JWT signing key and authenticates Control API operations. It must contain at least 32 bytes.
| Scenario | Recommended choice |
|---|---|
| Local evaluation on one machine | Run sotero-daemon interactively and press Enter to generate a secure value. |
| Multiple machines that must trust the same credentials | Use the same high-entropy secret supplied through your approved secret-management process. |
| systemd-managed service | Store the value in /etc/sotero-daemon/environment. A systemd service does not inherit variables exported in your shell's .bashrc or a terminal session. |
Run the setup wizard
- Open a terminal and run sotero-daemon without sudo.
- At the hidden Signing key secret prompt, enter an approved shared secret or press Enter to generate one for local use.
- Wait until the daemon reports that it is ready on ~/.sotero/daemon.sock.
- Press Ctrl+C to stop this temporary foreground process.
- Run sotero-daemon config validate. Continue only when it reports that configuration is complete.
This foreground copy is fine for a quick look, but it stops the moment you close the terminal or log out — it does not survive a reboot. For anything longer-lived, continue below.
Start and verify the background service
The package already registered sotero-daemon as a systemd service. It runs as the dedicated sotero-daemon account, so it uses its own configuration, separate from the one you just created as yourself: /var/lib/sotero-daemon/.sotero/sotero.toml.
- Give it the one required secret via the environment file (never generated on the machine itself — reuse the same value across every machine that needs to trust each other's credentials).
- Start the service and confirm it is active.
sudo cp /etc/sotero-daemon/environment.example /etc/sotero-daemon/environment
sudo nano /etc/sotero-daemon/environmentFill in a real value for SOTERO_CONTROL_KEY_SECRET, save, and exit. Generate one with openssl rand -hex 32 if you don't already have one to reuse:
openssl rand -hex 32sudo systemctl start sotero-daemon
systemctl status sotero-daemoncd /tmp
sudo -H -u sotero-daemon sotero-daemon service status
sudo curl --unix-socket /var/lib/sotero-daemon/.sotero/daemon.sock http://localhost/healthz
sudo curl --unix-socket /var/lib/sotero-daemon/.sotero/daemon.sock http://localhost/readyzUse the ready endpoint for deployment checks because it verifies the registry, policy catalog, signing and replay store, and Control authentication — not only whether the process exists.
Service lifecycle commands
| Task | Command |
|---|---|
| Show status and health | sudo -H -u sotero-daemon sotero-daemon service status (run from /tmp or similar) |
| Start | sudo systemctl start sotero-daemon |
| Restart after configuration changes | sudo systemctl restart sotero-daemon |
| Stop | sudo systemctl stop sotero-daemon |
| Re-register the systemd unit | sudo sotero-daemon service install |
| Unregister the systemd unit | sudo sotero-daemon service uninstall |
install, uninstall, start, stop, and restart via the sotero-daemon service ... wrapper all require sudo on Linux. Plain systemctl start|stop|restart|status sotero-daemon work identically and are equally valid.
View live logs any time with:
sudo journalctl -u sotero-daemon -fUse Sotero Runtime as a developer
Use the Unix socket from an application
Ubuntu defaults to a Unix domain socket, not a browser-addressable TCP port. Copy the packaged thin client into your Python project under an importable filename.
cp /usr/share/sotero-runtime/thin-client.py ./sotero_thin_client.py
python -m pip install "httpx>=0.27" "PyJWT[crypto]>=2.8" "cryptography>=42"from pathlib import Path
from sotero_thin_client import ThinClientRuntime
runtime = ThinClientRuntime()
runtime.onboard(
daemon_url="http://daemon",
socket_path=Path.home() / ".sotero" / "daemon.sock",
)When Control API authentication is required, supply the secret through SOTERO_CONTROL_KEY_SECRET or the api_key argument using your application's secret-management mechanism. Do not hard-code it.
Install the bundled Claude Code skills
sotero-daemon install-skills
# Default destination: ~/.claude/skillsRun this command without sudo. It updates bundled Sotero skill directories but does not touch unrelated skills. Restart Claude Code if it was already running and does not detect the newly installed skills.
Useful operator commands
| Purpose | Command |
|---|---|
| List registered agents | sotero-daemon agent list |
| Show recent audit entries | sotero-daemon logs --last 100 |
| Follow the audit log | sotero-daemon logs --follow |
| Print local Control credentials for a trusted tool | sotero-daemon print-credentials --json |
| Validate configuration without starting | sotero-daemon config validate |
Configuration and file reference
Interactive (~), your own account, vs. service, /var/lib/sotero-daemon/.sotero — same filenames, different parent directory:
| Item | Filename |
|---|---|
| Configuration | sotero.toml |
| Agent registry | registry.db |
| Signing and JWT keystore | keys.db |
| Replay and nonce security store | security.db |
| Audit log | audit.jsonl |
| Unix socket | daemon.sock |
| Default editable policy | examples/policy.rego |
| Secret (environment) | inside sotero.toml (interactive) or /etc/sotero-daemon/environment (service) |
When changes take effect
- Changes to sotero.toml and SOTERO_* environment variables require a service restart.
- A configured agents.json file and a configured Rego policy file are watched and hot-reloaded.
- When both sotero.toml and a matching environment variable contain a value, sotero.toml wins.
- For the systemd-managed instance, put required secrets in /etc/sotero-daemon/environment — a shell export in your own session never reaches a systemd-started process.
Logs and troubleshooting
| Symptom | What to check |
|---|---|
| command not found: sotero-daemon | Open a new terminal, then run /usr/bin/sotero-daemon --help. Confirm /usr/bin is on PATH. |
| Configuration is incomplete and exit code 78 | Set [control].signing_key_secret in /etc/sotero-daemon/environment (service) or sotero.toml (interactive), then validate and restart. |
| service status reports Health unreachable even though the service is active | Impersonate the account: sudo -H -u sotero-daemon sotero-daemon service status, run from a directory it can read (e.g. /tmp). |
| sudo -H -u sotero-daemon crashes with PermissionError | Run it from a directory the account can traverse — cd /tmp first. It cannot read your own home directory. |
| A shell environment change has no effect | systemd does not inherit shell exports. Put the setting in /etc/sotero-daemon/environment and restart. |
| Browser cannot open localhost UI | Default transport is a Unix socket. This is expected; use a socket-capable client or the external UI. |
Detailed diagnostics
sudo systemctl status sotero-daemon
sudo journalctl -u sotero-daemon -n 100 --no-pager
ls -la ~/.sotero
sudo ls -la /var/lib/sotero-daemon/.sotero
sotero-daemon config validateUpgrade Sotero Runtime
- Back up ~/.sotero/ and /var/lib/sotero-daemon/.sotero/ before a major upgrade, especially sotero.toml, keys.db, registry.db, security.db, and audit.jsonl.
- Download and verify the newer official .deb.
- Install it over the existing version with apt install. The package preserves both state directories and re-registers the systemd unit.
- Run sotero-daemon config validate, restart the service, and confirm active and healthy.
sudo apt install ./sotero-runtime-<new-version>-linux-x86_64.deb
sudo systemctl restart sotero-daemon
sudo -H -u sotero-daemon sotero-daemon service status # run from /tmpUninstall Sotero Runtime
Preserve or remove user data deliberately. The standard removal below stops and unregisters the systemd service and deletes the installed product files, but leaves both ~/.sotero/ and /var/lib/sotero-daemon/.sotero/ in place, so a reinstall can resume with the same configuration, keys, registry, and audit history.
Remove the application and service
sudo apt remove sotero-runtimeVerify the binary and unit are gone:
test ! -e /usr/bin/sotero-daemon && echo "binary removed"
systemctl status sotero-daemon # expect: "could not be found"This does not remove the dedicated sotero-daemon system account, ~/.sotero/, or /var/lib/sotero-daemon/.sotero/.
Optionally remove all user data
cp -a ~/.sotero ~/Desktop/sotero-backup
sudo cp -a /var/lib/sotero-daemon/.sotero /root/sotero-service-backup
rm -rf ~/.sotero
sudo rm -rf /var/lib/sotero-daemon/.sotero
sudo userdel sotero-daemon
sudo groupdel sotero-daemon
sudo rm -rf /etc/sotero-daemonQuick reference
| Goal | Command |
|---|---|
| Validate configuration | sotero-daemon config validate |
| Start (service) | sudo systemctl start sotero-daemon |
| Restart (service) | sudo systemctl restart sotero-daemon |
| Stop (service) | sudo systemctl stop sotero-daemon |
| Check status and health (service) | sudo -H -u sotero-daemon sotero-daemon service status (from /tmp) |
| Check liveness (service) | sudo curl --unix-socket /var/lib/sotero-daemon/.sotero/daemon.sock http://localhost/healthz |
| Check readiness (service) | sudo curl --unix-socket /var/lib/sotero-daemon/.sotero/daemon.sock http://localhost/readyz |
| Follow service logs | sudo journalctl -u sotero-daemon -f |
| Follow audit events | sotero-daemon logs --follow |
| Install Claude Code skills | sotero-daemon install-skills |
Expected steady state: configuration complete, supervisor active, health healthy, and both health endpoints returning success.
Ready to install?
Download the Sotero Runtime DEB package from the site navigation, then follow this guide.