Skip to content

Install

SoloINC runs where your agents run: on a machine you own, next to a Claude Code sign-in. Two installs, one engine.

Requirements

Claude Code optional: needed only to spend a Claude Code seat. A provider key or a local engine runs on SoloINC's own native runtime without it
git the state root and every cell's ledger are git repositories; the Windows installer carries it
macOS 14 or newer; launchd runs the engine and the workloads; sandbox-exec confines them
Windows 10 or 11; Task Scheduler runs the engine and the workloads, and the sandbox is built in

The application

One download, one icon, two processes: the engine, which keeps running with the window closed, and a shell that is a tray icon and a window onto it. The window attaches to the engine over a local socket — a Unix socket in the state directory on macOS, a named pipe on Windows. Nothing listens on the network.

Open it and the window takes you through Onboard.

From a checkout

pipx install soloinc
soloinc console            # the engine in the foreground, once
soloinc install            # then as a service that survives reboots

Python 3.12 or newer; the only dependency is PyYAML.

Windows

The engine runs as a Task Scheduler task that starts when you log in and runs as you, never as an administrator. Scheduled agents are sandboxed with what Windows already has:

  • low integrity — the agent's own commands run at an integrity level below everything you own, and Windows refuses a write from below. SoloINC opens exactly the folders that workload is allowed into (its own company folder and a private temporary directory) and closes them again when the run ends;
  • a job object — every program the agent starts is inside it, none can leave it, the number of them is capped, and closing SoloINC closes all of them.

What this does not hold, stated plainly. On macOS the operating system also enforces what an agent may read and where it may connect. Windows offers no equivalent that works without an administrator, so on Windows those two are enforced by SoloINC itself — its file tools refuse a denied path, and its network gate allows only the hosts on the list. A program the agent starts could read a file SoloINC would have refused it, or open a socket that goes around the gate.

If you want the stronger box, install Docker Desktop or Podman Desktop and SoloINC uses it automatically for scheduled agents — a container is a full kernel boundary in all three directions. If you later stop it, the agents keep running in the native box.

A machine that can do neither is refused workloads rather than given unsandboxed ones. The console itself works either way.

What soloinc install does

  1. Detects the platform.
  2. Writes the engine's service — a LaunchAgent on macOS, a Task Scheduler task on Windows — pointing at this checkout, and starts it. Both run as you; neither asks for an administrator password.
  3. With --workloads, checks the sandbox first, and refuses on any host that cannot contain one: macOS without a working sandbox-exec, Windows where neither a container engine nor the native box can hold a process — proved by building a box and watching a write outside it fail, never by checking a version number. When the box that answers is the weaker one, the output says so. A root-domain install (sudo python3 scripts/kernel/install.py --apply) is the option for a Mac that must run its workloads with nobody logged in.
  4. Prints what it did and what is yours to do next.

Both schedulers are driven from one cron grammar, so a workload fires at the same wall-clock moment whichever host it is on. soloinc install --dry-run prints every step and writes nothing.

Reaching it from elsewhere

The engine publishes an encrypted copy of the Desk to your own edge account; the Desk app reads it there and answers a card through GitHub, which the engine polls and applies. The machine remains the runtime.

Updating

soloinc check-update compares your version with the latest release; the window shows an update chip when one is out (checked once a day; SOLOINC_UPDATE_CHECK=off disables it). Update with the installer, then soloinc migrate brings the state root to the new release's shape — the engine also does this at startup.