One Go binary · one TOML file · plain SSH

Run shell commands on a pile of servers, in parallel, and watch it happen.

gorun takes the commands you already type, runs them on every server at once, and shows each server's progress live, in your terminal or your browser. Nothing to install on the servers.

curl -fsSL https://raw.githubusercontent.com/jenmud/gorun/master/scripts/install.sh | sh
gorun rolling a release out to 42 servers in the terminal

42 servers, 324 tasks, one deliberate failure, about fifteen seconds.

0agents on your servers
1static binary
∥every server at once
100%plain shell you can copy

How it works

Three steps. If you can write the command, you can run it everywhere.

1

Write tasks

A task is a shell command or script in a Gorunfile. Add dependencies, timeouts, retries, sudo, templates and secrets from your environment when you need them.

2

Say who runs what

List servers, put them in groups and tag them. Groups and bundles share task lists, so a hundred servers stay one readable file.

3

Pick and run

gorun Gorunfile opens a picker. Choose servers, check their tasks, press enter, and watch every server work at once.

[tasks.update]
cmd  = "apt-get update && apt-get upgrade -y"
sudo = true

[servers]
tasks = ["update"]

[servers.hosts.web-1]
hostname = "web-1.example.com"
    [servers.hosts.web-1.ssh]
    username = "deploy"
# check the plan, then run it
$ gorun Gorunfile --list-servers
$ gorun Gorunfile

# no picker: scripts, cron and CI
$ gorun Gorunfile --run --plain --tag prod

# the same, in a browser
$ gorun -web Gorunfile

Why gorun

Plain commands

A task is a shell command. When something breaks, copy it and run it by hand. --dump-tasks writes every task out as a runnable script.

Parallel by default

Every selected server runs at the same time. A failure stops that server, never the others, and the run exits non-zero.

Nothing runs by accident

You pick servers and tasks in a picker first, untick anything you don't want, and every task has a timeout.

Grows with you

Dependencies, bundles, server groups, tags, templates with per-task variables, file copies, retries and include for large fleets.

Remembers

Every run is saved with its commands, exit codes and output, to browse later in the terminal or the web UI.

Terminal or browser

A fast TUI for operators and a live web dashboard for everyone else, both fed by the same engine and events.

Terminal and web, same engine

Use whichever fits the moment. Runs started from the terminal show up live in the web dashboard too.

Picking servers and running them from gorun's terminal picker

The picker

Fuzzy-filter servers, groups and tags, check each server's task pipeline, then run.

Starting a run from gorun's web UI and watching the live dashboard

The web dashboard

gorun -web ticks servers, starts runs and streams progress live.

See every demo →

Go library

Build your own tools on it

The whole engine is a Go package. Load a Gorunfile, run tasks across servers in parallel, and get a progress event for every step, so your own dashboards, bots and CLIs can show exactly what's happening. Here's a service manager built on it in a few hundred lines.

See the code and examples →
Service Deck, a web app built on the gorun library, deploying to eight servers

When to use something else

gorun runs commands; it doesn't enforce state. It has no modules, facts, drift detection, dry runs, dynamic inventories or secrets vault. If you need those, reach for Ansible, Salt, Puppet or Nix. If you need to run the same commands on many machines and see what happened, gorun is the short path.

Open the playground