Smooth git handover with ‘mob’.
“Mob has allowed us to run fast-paced, engaging, and effective sessions by enabling sub-10-second handover times and otherwise getting out of the way. A simple but great tool!” — Jeff Langr, developer
“I love it, it is a quantum leap in our collaboration.” — Vasiliy Sivovolov, Senior Software Engineer
“What a great tool to organise remote working.” — Jennifer Gommans, IT Consultant
“Really enjoying working with http://mob.sh. Whole team added it to the “Glad” column during yesterday’s retro ;-)” — twitter.com/miljar
The recommended way to install mob is as a binary via the provided install script:
# works for macOS, linux, and even on windows in git bash curl -sL install.mob.sh | sh
On macOS via homebrew:
brew install remotemobprogramming/brew/mob # upgrade to latest version brew upgrade remotemobprogramming/brew/mob
On windows via Scoop:
scoop install mob
On Arch Linux via yay:
yay -S mobsh-bin
On Ubuntu there’s an EXPERIMENTAL snap package with a known limitation (ssh-agent not working):
sudo snap install mob-sh sudo snap connect mob-sh:ssh-keys
When you already have a working go environment with a defined GOPATH you can install latest via
With go < 1.16
go get github.com/remotemobprogramming/mob go install github.com/remotemobprogramming/mob
go 1.16 introduced support for package@version syntax, so you can install directly with:
go install github.com/remotemobprogramming/mob@latest
or pick a specific version:
go install firstname.lastname@example.org
You only need three commands:
mob next, and
Switch to a separate branch with
mob start and handover to the next person with
When you’re done, get your changes into the staging area of the
master branch with
mob done and commit them.
mob enables a fast Git handover Basic Commands: start start mob session from base branch in wip branch next handover changes in wip branch to next person done squashes all changes in wip branch to index in base branch reset removes local and remote wip branch Basic Commands(Options): start [<minutes>] Start a <minutes> timer [--include-uncommitted-changes|-i] Move uncommitted changes to wip branch [--branch|-b <branch-postfix>] Set wip branch to 'mob/<base-branch>/<branch-postfix>' next [--stay|-s] Stay on wip branch (default) [--return-to-base-branch|-r] Return to base branch [--message|-m <commit-message>] Override commit message done [--no-squash] Do not squash commits from wip branch [--squash] Squash commits from wip branch reset [--branch|-b <branch-postfix>] Set wip branch to 'mob/<base-branch>/<branch-postfix>' Experimental Commands: squash-wip Combines wip commits in wip branch with subsequent manual commits to leave only manual commits. ! Works only if all wip commits have the same wip commit message ! [--git-editor] Not intended for manual use. Used as a non-interactive editor (GIT_EDITOR) for git. [--git-sequence-editor] Not intended for manual use. Used as a non-interactive sequence editor (GIT_SEQUENCE_EDITOR) for git. Timer Commands: timer <minutes> start a <minutes> timer start <minutes> start mob session in wip branch and a timer Get more information: status show the status of the current mob session config show all configuration options version show the version of mob help show help Other moo moo! Add --debug to any option to enable verbose logging Examples: # start 10 min session in wip branch 'mob-session' mob start 10 # start session in wip branch 'mob/<base-branch>/green' mob start --branch green # handover code and return to base branch mob next --return-to-base-branch # squashes all commits and puts changes in index of base branch mob done # make a sound check mob moo
mob nextat the end of your turn or
mob startat the beginning of your turn say the command out loud.
mob nextso they get the latest commit via their
mob start(for a 5 minute timer use
mob start 5)
There are two Arch packages in the AUR:
Example installation using AUR helper
yay -S mobsh-bin # OR yay -S mobsh
(This is not needed when installing via snap.)
To get the timer to play “mob next” on your speakers when your time is up, you’ll need an installed speech engine. Install that on Debian/Ubuntu/Mint as follows:
sudo apt-get install espeak-ng-espeak mbrola-us1
Create a little script in your
say with the following content:
#!/bin/sh espeak -v us-mbrola-1 "$@"
If you use WSL2 on windows, install eSpeak as windows tool and Create a little script in your
say with the following content:
#!/bin/sh /mnt/c/Program\ Files\ \(x86\)/eSpeak/command_line/espeak.exe "$@"
make sure that the path to the windows
espeak.exefits your installation.
You can avoid the long path by adding it to your windows path variable.
Show your current configuration with
MOB_REMOTE_NAME=origin MOB_WIP_COMMIT_MESSAGE=mob next [ci-skip] [ci skip] [skip ci] MOB_REQUIRE_COMMIT_MESSAGE=false MOB_VOICE_COMMAND=say "%s" MOB_NOTIFY_COMMAND=/usr/bin/osascript -e 'display notification "%s"' MOB_NEXT_STAY=true MOB_START_INCLUDE_UNCOMMITTED_CHANGES=false MOB_WIP_BRANCH_QUALIFIER= MOB_WIP_BRANCH_QUALIFIER_SEPARATOR=- MOB_DONE_SQUASH=true MOB_TIMER=
Override default value permanently via environment variables:
Override default value just for a single call:
MOB_NEXT_STAY=true mob next
# PROJECT_ROOT is the root of the project/repository cd $PROJECT_ROOT git version # >= 2.17 go version # >= 1.14 go build # builds 'mob' ./create-testbed # creates test assets go test # runs all tests go test -run TestDetermineBranches # runs the single test named 'TestDetermineBranches' # run tests and show test coverage in browser go test -coverprofile=cover.out && go tool cover -html=cover.out
Developed and maintained by Dr. Simon Harrer.
Contributions and testing by Jochen Christ, Martin Huber, Franziska Dessart, Nikolas Hermann and Christoph Welcz. Thank you!
Logo designed by Sonja Scheungrab.