errand--

Run it elsewhere.

Put errand -- in front of the command you'd normally run. Your working tree goes over, uncommitted edits included. The logs stream back and you get the exit code. No remote clone to babysit.

$ brew install lydakis/errand/errand
Line drawing of a man at a 1990s computer whose ghostly double floats through a cloud to type at a second computer far away.
Running it elsewhere is a lot like astral projection. Adapted from Figure 7.1 in Daniel P. Dern's The Internet Guide for New Users (1994).

Examples

~/myapp

          

Why I built it

I build Atlas, a NixOS host for agents, on an Apple Silicon Mac. Its VM tests need /dev/kvm, which a Mac can't give you, so they crawled under emulated QEMU. My Linux box had KVM and nothing to do.

I didn't want to commit half-done work, SSH in, pull, run and copy results back every time. So I wrote errand. Now the tests run on the Linux box, straight from my uncommitted tree.

These days my coding agents use it more than I do.

George

How it works

  1. Your files go over

    Tracked files and uncommitted edits. Git-ignored files stay home, and repeat runs ship only what changed.

  2. It runs over there

    Each job gets a fresh workspace on the runner. Your local files stay untouched.

  3. Output comes back

    Logs stream back with the real exit code. Ctrl-C stops the job, Ctrl-D detaches.

  4. Changes come back

    Changed files are kept, even on failure. errand fetch --apply brings them into your checkout.

How fast it is

Medians from the scoreboard in the repo.

228 ms

From saving a file on a laptop to it showing up on a Linux runner with push --watch, 1,000-file checkout.

230 ms

Fetching and applying a finished job's changes from that runner, 1,000-file checkout.

6.2→1.0 s

Applying 128 changed files across 128 directories on macOS, before and after the 0.5 apply work.

More

errand --where 'os=linux,go' -- go test ./...
Pick any runner that has what the command needs.
errand --on local -- make test
Run in a separate workspace on this machine.
errand push --workspace dev --watch --apply
Keep a workspace on the runner in sync while you edit.
errand --cache compiler=target -- cargo test
Reuse the runner's build cache between jobs.
.errand.toml
Save a project's usual runner, caches and ports.
errand doctor
Tells you why a runner isn't answering.

Good to know

  • It runs commands directly on machines you control. It's not a sandbox.
  • Commands run without a terminal attached. Run coding agents in their noninteractive mode.
  • Install the same errand version on both ends.
  • A Windows PC can run jobs but can't send them yet. experimental
  • No telemetry. MIT licensed.

Set it up

Both machines on the same Tailscale network, or plain SSH.

  1. On both machines
    brew install lydakis/errand/errand

    Or grab a binary from GitHub Releases.

  2. On the machine that runs things
    errand setup

    Installs and starts the runner service.

  3. On your laptop
    errand peers discover
    # then run the line it prints, like:
    errand peers add mac-mini YOUR_RUNNER_HOSTNAME

    Using SSH instead? errand peers add mac-mini YOUR_SSH_HOST --ssh

  4. From any Git checkout
    errand -- make test

    The first runner you add is the default. Pick another with --on NAME.

Windows runner (experimental)
scoop bucket add errand https://github.com/lydakis/scoop-errand
scoop install errand
errand setup

Runs jobs sent from a Mac or Linux machine over Tailscale. See what works so far.