Buildhound vs ushr

ushr schedules GitHub Actions jobs on your own Macs and Linux machines, with an open-source agent and a hosted control plane. Buildhound does the same job with a fresh VM for every job and GitHub-hosted as the fallback.

Set up by hand
  • Checked 16 October 2026
  • No referral agreement

What a month costs

Machines
  • GitHub's self-hosted runnerregistered and kept up by hand$0
  • ushra host is one machine$49
  • Buildhound Teammachines you already have$72

ushr costs less here, $49 against $72 for 3 machines on Team. On a personal account, Personal is $30.

List prices, before free minutes or credits on either side. One machine runs these minutes a job at a time; Personal is $10 a machine on a personal account.

Choose the one that fits

Choose ushr when

  • You want open source you can run yourself; its controller and agent are Apache-2.0.
  • One pool should serve several organisations.
  • You want the lowest price for a small fleet, with one host free and 3 for $49 a month.

Choose Buildhound when

  • Jobs should keep moving while a machine is offline, with GitHub-hosted as the fallback.
  • Linux jobs need their own VM instead of a container on the host.
  • Laptops join the Fleet and take jobs only while plugged in and not in use.

Side by side

ushr from its own pages, checked 16 October 2026

Two ways to run the same workflow
Clean runners on machines you already have$24a machine a month on Team
ushrOpen-source runners on your own machinesFreefor one host, then $49 for 3

Price

How it is priced
BuildhoundFlat, per machine$10 a machine a month on a personal account, $24 in an organisation, counted only on days it runs a job. Public repositories free.
ushrBy hostFree for one host and one GitHub account or organisation; $49 a month for up to 3 hosts, then $19 a host.
macOS
BuildhoundYour MacA fresh macOS VM per job; Apple allows two per Mac.
ushrYour MacIn a Tart or Lume VM.
Linux
BuildhoundYour Mac or Linux boxA fresh Linux VM per job, arm64 on a Mac.
ushrYour machineIn a Docker or Podman container on the host.
Windows
BuildhoundNot yetWindows jobs stay on GitHub-hosted.
ushrNot offered

Where it runs

Machines
BuildhoundYoursA spare Mac, a Linux box, or a laptop while plugged in and not in use.
ushrYoursYour own Macs and Linux machines.
Each job
BuildhoundA fresh VM, destroyed afterIt reaches the internet and never your network.
ushrA fresh runnermacOS in a VM, Linux in a container.
Secrets
BuildhoundOn your hardwareOnly on a machine a person marked Trusted.
ushrOn your hardwareThe GitHub App key stays on your machine.

When things change

Runners unavailable
BuildhoundNew jobs route to the healthy sideGitHub-hosted, within about two minutes; a stuck job is re-run.
ushrNo fallback in its docsWhile its control plane is down, running jobs finish and no new ones start.
Jobs at once
BuildhoundAs many as your machines holdSuch as one macOS and one Linux job on a 24 GB Mac mini. When every machine is busy, new jobs go to GitHub-hosted after two and a half minutes.
ushrOne shared poolAcross organisations, by priority and wait time.
Setup
BuildhoundOne prompt to your coding agentOr two commands by hand.
ushrOne agent per hostushr init rewrites runs-on to self-hosted labels.

One line in runs-on

Both ask you to change the runner label in your workflow. Your coding agent makes the Buildhound change in a pull request.

ushrruns-on: [self-hosted, macos]The job runs where ushr runs it.
Buildhoundruns-on: ${{ vars.BUILDHOUND_MACOS || 'macos-latest' }}The job runs on your machine while one can take it, and on GitHub-hosted when none can.

Put the machines you already have to work.

A spare Mac, a Linux box, or the laptop you code on while it is plugged in and not in use. One prompt into Claude Code, Codex or Cursor: Linux jobs run within minutes, macOS jobs once the Mac has built its image.

Set up by hand
  • The Buildhound agent holds no GitHub credential
  • A fresh VM per job, off your network
  • Your agent prepares, you approve
  • How security works