Orchestrate, converge,
and secure your infrastructure.
An unprivileged control plane for self-hosted fleets. Run Ansible playbooks with factual drift detection, manage OpenTofu remote state with plan diffs and approval gates, and store envelope secrets with age encryption. Everything runs through one serialized queue in plain SQLite with zero sudo and zero SaaS dependencies.
Healthy is quiet. Failure is loud.
An instrument panel built for rapid comprehension under operational stress. Signal colour is spent only where an operator decision is required. Every state is a word plus a colour.
Dual-theme Web Console. Obsidian dark mode on the left and warm Lab Notebook light mode on the right across real-time queue rows, reachability checks, and attention bands.
Web Console Spec →Pinned tools. Standard protocols.
exocomp coordinates state ledgers, schedules, and security sandboxes, delegating execution to established open source tools without proprietary formats.
Ansible Core
Replaces AWX and Semaphore for homelabs. Runs playbooks and ad-hoc commands across your inventory with check-mode drift detection and automatic SSH fleet key distribution.
OpenTofu
Built-in HTTP remote state backend and execution runner. Delivers automated plan diffs with resource change counters, CEL policy verification, and gated applies before modifying infrastructure.
Restic & Litestream
Per-second SQLite WAL replication via Litestream combined with scheduled deduplicated, encrypted Restic snapshots to local NAS or S3 endpoints.
Age & SOPS
Envelope encryption using modern age keys. Secrets stay encrypted at rest and in git, decrypted in memory only inside the sandboxed execution boundary.
Model Context Protocol
Native Model Context Protocol (MCP) server at /mcp. Lets autonomous coding agents query fleet posture, inspect workspaces, and trigger queued actions with scoped tokens.
Mobile Approvals Coming Soon
Currently in development. Direct mobile alerts without cloud intermediaries. Receive notifications on your phone with action buttons to approve or reject mutating jobs directly from the lock screen.
Architectural rules that never yield.
Every execution path, data model, and user interface surface is governed by immutable constraints. Breaking any of these fails review.
One operator, single process, plain SQLite
No external database. No PostgreSQL cluster, no Redis queues, and no distributed consensus. Runs directly as a user systemd service or inside a rootless container with WAL-mode SQLite and continuous Litestream replication to S3 or SFTP.
Zero bespoke data formats
Nothing is stored in a proprietary format. Data stays in plain restic repositories, plain git bundles, plain age or SOPS envelope files, and standard OpenTofu state files. Recovery requires only standard open source tools.
Exit codes decide correctness
Subprocess truth is strictly exit 0 versus non-zero. Parsed output enriches the user interface and agent queries, but exit codes strictly dictate state transitions, ledgers, and notifications.
Secrets never leak
Secrets never appear in logs, CLI flags, job events, docs, commits, or test fixtures. Run secrets are injected via Landlock and bwrap sandboxed memory pipes or scrubbed environment variables.
The one queue is the only executor
Every execution path routes through the single FIFO job queue. Concurrency keys, execution locks, and approvals live in the queue engine rather than scattered application logic.
Zero sudo across the system
Nothing in exocomp runs root. It runs unprivileged as your host user or inside a rootless container. Work requiring elevation on target machines is delegated through explicit operator-approved flags.
Designed for operators and autonomous agents.
Predictable flags, muscle-memory guards, per-host structured JSON output, and real-time polling progress.
Restore onto dead hardware in 5 minutes.
Disaster recovery never depends on exocomp itself, a running daemon, or an online container registry. Recovery relies entirely on standard POSIX tools.
Physical Age Key
At bootstrap, exocomp generates a printed recovery card containing the master age private key and storage locations.
Fetch Encrypted Snapshot
Retrieve the encrypted Restic repository or Litestream WAL replica from your NAS, S3 bucket, or offsite storage.
Zero-Dependency Restore
Run recovery.sh on any clean Linux machine. Standard age and restic tools decrypt your database and fleet keys.
Restart Service or Container
Point your restored directory to a new service instance or rootless container. The daemon boots immediately with all state and secrets intact.
Host service or rootless container. Your choice.
No external PostgreSQL cluster, no Redis queues, and no background worker sidecars. exocomp is a single static Go binary. Run it natively as a user systemd service on your host or inside an unprivileged rootless container.
mkdir -p ~/.config/systemd/user cat << 'EOF' > ~/.config/systemd/user/exocomp.service [Unit] Description=exocomp homelab control plane After=network.target [Service] ExecStart=%h/.local/bin/exocompd --port 8080 Restart=always RestartSec=5s Environment=XDG_DATA_HOME=%h/.local/share [Install] WantedBy=default.target EOF systemctl --user daemon-reload && systemctl --user enable --now exocomp