{"id":13514099,"url":"https://github.com/remotemobprogramming/mob","last_synced_at":"2026-01-14T12:59:14.218Z","repository":{"id":35429276,"uuid":"149731937","full_name":"remotemobprogramming/mob","owner":"remotemobprogramming","description":"Tool for smooth git handover.","archived":false,"fork":false,"pushed_at":"2025-11-10T18:47:14.000Z","size":2212,"stargazers_count":1767,"open_issues_count":32,"forks_count":161,"subscribers_count":19,"default_branch":"main","last_synced_at":"2025-11-10T20:31:55.724Z","etag":null,"topics":["cli","cli-tool","ensemble","ensemble-programming","ensembles","extreme-programming","git","go","golang","hacktoberfest","mob","mob-programming","mob-programming-timer","pair-programming","pairing","remote-mob-programming","remote-mobs","software-teaming","timer","xp"],"latest_commit_sha":null,"homepage":"https://mob.sh","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/remotemobprogramming.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["simonharrer"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2018-09-21T08:13:46.000Z","updated_at":"2025-11-10T18:47:17.000Z","dependencies_parsed_at":"2023-02-12T22:00:43.753Z","dependency_job_id":"ddd219e1-00cf-44b6-b684-fe7b9a6337e6","html_url":"https://github.com/remotemobprogramming/mob","commit_stats":{"total_commits":1019,"total_committers":99,"mean_commits":"10.292929292929292","dds":0.6830225711481845,"last_synced_commit":"17a6d97ede0c1c6866c79956dd240673611c46b1"},"previous_names":[],"tags_count":82,"template":false,"template_full_name":null,"purl":"pkg:github/remotemobprogramming/mob","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remotemobprogramming%2Fmob","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remotemobprogramming%2Fmob/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remotemobprogramming%2Fmob/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remotemobprogramming%2Fmob/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/remotemobprogramming","download_url":"https://codeload.github.com/remotemobprogramming/mob/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remotemobprogramming%2Fmob/sbom","scorecard":{"id":770458,"data":{"date":"2025-08-11","repo":{"name":"github.com/remotemobprogramming/mob","commit":"78292ef4691b299e2a3d9783689c0f942406dde5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":3,"reason":"Found 6/17 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yaml:1","Warn: no topLevel permission defined: .github/workflows/publish-aur.yaml:1","Warn: no topLevel permission defined: .github/workflows/release.yaml:1","Warn: no topLevel permission defined: .github/workflows/virustotal.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yaml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yaml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-aur.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/publish-aur.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-aur.yaml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/publish-aur.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-aur.yaml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/publish-aur.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:128: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/release.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:133: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/release.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/release.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/release.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yaml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/virustotal.yaml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/virustotal.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/virustotal.yaml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/virustotal.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/virustotal.yaml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/remotemobprogramming/mob/virustotal.yaml/main?enable=pin","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   6 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v5.4.0 not signed: https://api.github.com/repos/remotemobprogramming/mob/releases/208352363","Warn: release artifact v5.3.3 not signed: https://api.github.com/repos/remotemobprogramming/mob/releases/180705746","Warn: release artifact v5.3.2 not signed: https://api.github.com/repos/remotemobprogramming/mob/releases/179200864","Warn: release artifact v5.3.1 not signed: https://api.github.com/repos/remotemobprogramming/mob/releases/177045366","Warn: release artifact v5.3.0 not signed: https://api.github.com/repos/remotemobprogramming/mob/releases/176659133","Warn: release artifact v5.4.0 does not have provenance: https://api.github.com/repos/remotemobprogramming/mob/releases/208352363","Warn: release artifact v5.3.3 does not have provenance: https://api.github.com/repos/remotemobprogramming/mob/releases/180705746","Warn: release artifact v5.3.2 does not have provenance: https://api.github.com/repos/remotemobprogramming/mob/releases/179200864","Warn: release artifact v5.3.1 does not have provenance: https://api.github.com/repos/remotemobprogramming/mob/releases/177045366","Warn: release artifact v5.3.0 does not have provenance: https://api.github.com/repos/remotemobprogramming/mob/releases/176659133"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 22 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T02:06:28.132Z","repository_id":35429276,"created_at":"2025-08-23T02:06:28.132Z","updated_at":"2025-08-23T02:06:28.132Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28420815,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T10:47:48.104Z","status":"ssl_error","status_checked_at":"2026-01-14T10:46:19.031Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cli-tool","ensemble","ensemble-programming","ensembles","extreme-programming","git","go","golang","hacktoberfest","mob","mob-programming","mob-programming-timer","pair-programming","pairing","remote-mob-programming","remote-mobs","software-teaming","timer","xp"],"created_at":"2024-08-01T05:00:46.356Z","updated_at":"2026-01-14T12:59:14.212Z","avatar_url":"https://github.com/remotemobprogramming.png","language":"Go","readme":"# Fast git handover with mob\n\n![mob Logo](logo_def.svg)\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/remotemobprogramming/mob/actions/workflows/ci.yaml?query=branch%3Amain\"\u003e\n    \u003cimg alt=\"Test Workflow\" src=\"https://img.shields.io/github/actions/workflow/status/remotemobprogramming/mob/ci.yaml?branch=main\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/remotemobprogramming/mob/graphs/contributors\"\u003e\n    \u003cimg alt=\"Contributors\" src=\"https://img.shields.io/github/contributors/remotemobprogramming/mob\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/remotemobprogramming/mob/releases\"\u003e\n    \u003cimg alt=\"Downloads\" src=\"https://img.shields.io/github/downloads/remotemobprogramming/mob/total\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/remotemobprogramming/mob/releases\"\u003e\n    \u003cimg  alt=\"Downloads of latest\" src=\"https://img.shields.io/github/downloads/remotemobprogramming/mob/latest/total\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://img.shields.io/github/stars/remotemobprogramming/mob\"\u003e\n    \u003cimg alt=\"Stars\" src=\"https://img.shields.io/github/stars/remotemobprogramming/mob\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://join.slack.com/t/mobsh/shared_invite/zt-2gxr4zvli-NnYvxvI32sjs9TjXUvnydA\" rel=\"nofollow\"\u003e\u003cimg src=\"https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack\u0026amp;style=social\" alt=\"Slack Status\" data-canonical-src=\"https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack\u0026amp;style=social\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**#StandWithUkraine [donate here](https://www.savethechildren.org.uk/where-we-work/europe/ukraine) #StandWithUkraine**\n\nFast [git handover](https://www.remotemobprogramming.org/#git-handover) for remote pair/mob programming.\n\n- **mob** is [an open source command line tool written in go](https://github.com/remotemobprogramming/mob)\n- **mob** is the fastest way to [hand over code via git](https://www.remotemobprogramming.org/#git-handover)\n- **mob** keeps your branches clean and only creates WIP commits on temporary branches\n- **mob** has a shared team timer [timer.mob.sh](https://timer.mob.sh)\n- **mob** is on 'assess' in the [Thoughtworks Technology Radar](https://twitter.com/simonharrer/status/1453372354097205253?s=20)\n- **mob** has [VSCode integration](https://marketplace.visualstudio.com/items?itemName=alessandrosangalli.mob-vscode-gui)\n\n![diagram how mob works](diagram_def.svg)\n\n## What people say about mob\n\n\u003e Sometimes you come across a tool that you didn't realize you needed until you do; mob is just such a tool. Living as we do in a world where remote pair programming has become the norm for many teams, having a tool that allows for seamless handover either between pairs or a wider group as part of a mob programming session is super useful. mob hides all the version control paraphernalia behind a command-line interface that makes participating in mob programming sessions simpler. It also provides specific advice around how to participate remotely, for example, to \"steal the screenshare\" in Zoom rather than ending a screenshare, ensuring the video layout doesn't change for participants. A useful tool and thoughtful advice, what's not to like? \u0026mdash; [Technology Radar\n Volume 25, thoughtworks](https://www.thoughtworks.com/radar/tools/mob)\n\n\u003e \"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!\" \u0026mdash; [Jeff Langr, developer](https://twitter.com/jlangr)\n\n\u003e \"I love it, it is a quantum leap in our collaboration.\" \u0026mdash; Vasiliy Sivovolov, Senior Software Engineer\n\n\u003e\"What a great tool to organise remote working.\" \u0026mdash; [Jennifer Gommans, IT Consultant](https://twitter.com/missjennbo)\n\n\u003e \"I was recently introduced to [mob.sh](https://mob.sh) for remote pairing/mobbing collaboration and I absolutely love it. The timer feature is really a selling point for me. Kudos\" \u0026mdash; [Fabien Illert, IT Consultant](https://twitter.com/fabienillert)\n\n## How to install\n\nThe recommended way to install mob is as a binary via the provided install script:\n\n```bash\n# Works for macOS, Linux, and even on Windows in Git Bash\ncurl -sL install.mob.sh | sh\n```\n\nOn macOS via Homebrew:\n\n```bash\nbrew install mob\n```\n\nOn Windows via [Scoop](https://scoop.sh/):\n\n```bash\nscoop install mob\n```\n\nor via [Chocolatey](https://chocolatey.org/):\n\n```bash\nchoco install mob\n```\n\nOn Arch Linux via yay:\n\n```bash\nyay -S mobsh-bin\n```\n\nOn [Nix](http://nixos.org) through declarative installation:\n\n```nix\n{ pkgs, ... }:\n{\n  # Either for all users\n  environment.systemPackages = with pkgs; [ mob ];\n\n  # Or for an explicit user\n  users.users.\"youruser\".packages = with pkgs; [ mob ];\n}\n```\n\nOn NetBSD, macOS, SmartOS, Linux, FreeBSD, OpenBSD, and more, via [pkgsrc](https://pkgsrc.org):\n\n```bash\n# If there's a binary package for your platform\npkgin install mob\n\n# Otherwise, for any platform\ncd pkgsrc/devel/mob \u0026\u0026 bmake install clean\n```\n\nOn Ubuntu there's an EXPERIMENTAL [snap](https://snapcraft.io/mob-sh) package with a known limitation (ssh-agent not working):\n\n```bash\nsudo snap install mob-sh\nsudo snap connect mob-sh:ssh-keys\n```\n\n\n### Using go tools\n\nIf you have go 1.20+ you can install and build directly from source:\n\n```bash\ngo install github.com/remotemobprogramming/mob/v4@latest\n```\n\nor pick a specific version:\n\n```bash\ngo install github.com/remotemobprogramming/mob/v4@v4.4.0\n```\n\nor to install latest unreleased changes:\n\n```bash\ngo install github.com/remotemobprogramming/mob/v4@main\n```\n\n## How to use\n\nYou only need three commands: `mob start`, `mob next`, and `mob done`.\n\nSwitch to a separate branch with `mob start` and handover to the next person with `mob next`.\nRepeat.\nWhen you're done, get your changes into the staging area of the `main` branch with `mob done` and commit them.  \n\n[![asciicast](https://asciinema.org/a/321885.svg)](https://asciinema.org/a/321885)\n\nHere's a short example on how the two developers Carola and Maria code a feature together and push it in the end.\n\n```bash\n# Carola\nmain $ mob start\nmob/main $ echo \"hello\" \u003e work.txt\nmob/main $ mob next\n\n# Maria\nmain $ mob start\nmob/main $ cat work.txt # shows \"hello\"\nmob/main $ echo \" world\" \u003e\u003e work.txt\nmob/main $ mob next\n\n# Carola\nmob/main $ mob start\nmob/main $ cat work.txt # shows \"hello world\"\nmob/main $ echo \"!\" \u003e\u003e work.txt\nmob/main $ mob done\nmain $ git commit -m \"create greeting file\"\nmain $ git push\n```\n\nAnd here's the man page of the tool:\n\n```\nmob enables a smooth Git handover\n\nBasic Commands:\n  start              start session from base branch in wip branch\n  next               handover changes in wip branch to next person\n  done               squashes all changes in wip branch to index in base branch\n  reset              removes local and remote wip branch\n  clean              removes all orphan wip branches\n\nBasic Commands(Options):\n  start [\u003cminutes\u003e]                      Start a \u003cminutes\u003e timer\n    [--include-uncommitted-changes|-i]   Move uncommitted changes to wip branch\n    [--discard-uncommitted-changes|-d]   Discard uncommitted changes\n    [--branch|-b \u003cbranch-postfix\u003e]       Set wip branch to 'mob/\u003cbase-branch\u003e-\u003cbranch-postfix\u003e'\n    [--create|-c]                        Create the remote branch\n    [--room \u003croom-name\u003e]                 Set room name for timer.mob.sh once\n  next\n    [--stay|-s]                          Stay on wip branch (default)\n    [--return-to-base-branch|-r]         Return to base branch\n    [--message|-m \u003ccommit-message\u003e]      Override commit message\n  done\n    [--no-squash]                        Squash no commits from wip branch, only merge wip branch\n    [--squash]                           Squash all commits from wip branch\n    [--squash-wip]                       Squash wip commits from wip branch, maintaining manual commits\n  reset\n    [--branch|-b \u003cbranch-postfix\u003e]       Set wip branch to 'mob/\u003cbase-branch\u003e/\u003cbranch-postfix\u003e'\n  goal                                   Gives you the current goal of your timer.mob.sh room\n    [\u003cyour-goal\u003e]                        Sets the goal of your timer.mob.sh room\n    [--delete]                           Deletes the goal of your timer.mob.sh room\n\n\nTimer Commands:\n  timer \u003cminutes\u003e           Start a \u003cminutes\u003e timer\n    [--room \u003croom-name\u003e]    Set room name for timer.mob.sh once\n  timer open                Opens the timer website\n    [--room \u003croom-name\u003e]    Set room name for timer.mob.sh once\n  start \u003cminutes\u003e           Start mob session in wip branch and a \u003cminutes\u003e timer\n  break \u003cminutes\u003e           Start a \u003cminutes\u003e break timer\n  goal                      Gives you the current goal of your timer.mob.sh room\n    [\u003cyour-goal\u003e]           Sets the goal of your timer.mob.sh room\n    [--delete]              Deletes the goal of your timer.mob.sh room\n\nShort Commands (Options and descriptions as above):\n  s                  alias for 'start'\n  n                  alias for 'next'\n  d                  alias for 'done'\n  b                  alias for 'branch'\n  t                  alias for 'timer'\n  g                  Alias for 'goal'\n\nGet more information:\n  status             show the status of the current session\n  fetch              fetch remote state\n  branch             show remote wip branches\n  config             show all configuration options\n  version            show the version\n  help               show help\n\nOther\n  moo                moo!\n\nAdd --debug to any option to enable verbose logging\n\n\nExamples:\n  # start 10 min session in wip branch 'mob-session'\n  mob start 10\n\n  # start session in wip branch 'mob/\u003cbase-branch\u003e/green'\n  mob start --branch green\n\n  # handover code and return to base branch\n  mob next --return-to-base-branch\n\n  # squashes all commits and puts changes in index of base branch\n  mob done\n\n  # make a sound check\n  mob moo\n```\n\nIf you need some assistance when typing the subcommands and options, you might want to have a look at [fig](https://fig.io/) which gives you autocompletion in your shell.\n\n## Best Practices\n\n- **Say out loud**\n  - Whenever you key in `mob next` at the end of your turn or `mob start` at the beginning of your turn say the command out loud.\n  - *Why?* Everybody sees and also hears whose turn is ending and whose turn has started. But even more important, the person whose turn is about to start needs to know when the previous person entered `mob next` so they get the latest commit via their `mob start`.\n- **Steal the screenshare**\n  - After your turn, don't disable the screenshare. Let the next person steal the screenshare. (Requires a setting in Zoom)\n  - *Why?* This provides more calm (and less diversion) for the rest of the mob as the video conference layout doesn't change, allowing the rest of the mob to keep discussing the problem and finding the best solution, even during a Git handover.\n- **Share audio**\n  - Share your audio when you share your screen.\n  - *Why?* Sharing audio means everybody will hear when the timer is up. So everybody will help you to rotate, even if you have missed it coincidentally or deliberately.\n- **Use a timer**\n  - Always specify a timer when using `mob start` (for a 5 minute timer use `mob start 5`)\n  - *Why?* Rotation is key to good pair and mob programming. Just build the habit right from the start. Try to set a timer so everybody can have a turn at least once every 30 minutes.\n- **Set up a global shortcut for screensharing**\n  - Set up a global keyboard shortcut to start sharing your screen. In Zoom, you can do this via Zoom \u003e Preferences \u003e Keyboard Shortcuts. [More tips on setting up Zoom for effective screen sharing.](https://effectivehomeoffice.com/setup-zoom-for-effective-screen-sharing/)\n  - *Why?* This is just much faster than using the mouse.\n- **Set your editor to autosave**\n  - Have your editor save your files on every keystroke automatically. IntelliJ products do this automatically. VS Code, however, needs to be configured via \"File \u003e Auto Save toggle\".\n  - *Why?* Sometimes people forget to save their files. With autosave, any change will be handed over via `mob next`.\n\n### The Perfect Git Handover\n\nThe perfect git handover is quick, requires no talking, and allows the rest of the team to continue discussing how to best solve the current problem undisturbed by the handover. Here's how to achieve that.\n\n- **Situation** Maria is typist sharing the screen, Mona is next\n- **Maria** runs `mob next`\n  - keeps sharing the screen with the terminal showing the successful run of `mob next`\n  - does nothing (i.e., no typing, no mouse cursor movement, no window switching)\n- **Mona** steals screenshare using keyboard shortcut, and, afterwards, runs `mob start`\n- **Maria** checks her twitter\n\n### Complementary Scripts\n\n`mob-start feature1` creates a new base branch `feature1` to immediately start a wip branch `mob/feature1` from there.\n\n```bash\nmob-start() { git checkout -b \"$@\" \u0026\u0026 git push origin \"$@\" --set-upstream \u0026\u0026 mob start --include-uncommitted-changes; }\n```\n\n### Useful Aliases\n\n```bash\nalias ms='mob start'\nalias mn='mob next'\nalias md='mob done'\nalias moo='mob moo'\n```\n\n### Use the name you like\n\n```bash\nmob version\n#v1.11.0\nalias ensemble='mob' # introduce alias\nexport MOB_CLI_NAME='ensemble' # makes it aware of the alias\nensemble next\n#👉 to start working together, use\n#\n#  ensemble start\n#\n```\n\nAnd starting with v1.12.0, `mob` is symlink aware as well:\n\n```bash\nmob version\n#v1.12.0\nln -s /usr/local/bin/mob /usr/local/bin/ensemble\nensemble next\n#👉 to start working together, use\n#\n#  ensemble start\n#\n```\n\n### Automatically set the timer room when using ticket numbers as branch modifiers\n\nSay you're a larger team and work on the same git repository using ticket numbers as branch modifiers.\nIt's easy to forget exporting the room that enables the integration with timer.mob.sh.\nJust set the configuration option `MOB_TIMER_ROOM_USE_WIP_BRANCH_QUALIFIER=true` in `~/.mob` for that.\n\n### Automatically open the last modified file of the previous typist\n\nWhen you are rotating the typist, you often need to open the file, which the previous typist has modified last.\nMob supports you and can automate this step. You just need the configuration option `MOB_OPEN_COMMAND` with the command to open a file in your preferred IDE. \n\nFor example if you want use IntelliJ the configuration option would look like this: `MOB_OPEN_COMMAND=\"idea %s\"`\n\n## More on Installation\n\n### Known Issues\n\n- When you have an ssh key with a password and you running mob on windows in powershell, you will not be able to enter a password for your ssh key. You can circumvent this problem by using the git bash instead of powershell.\n\n### Linux Timer\n\n(This is not needed when installing via snap.)\n\nTo get the timer to play \"mob next\" on your speakers when your time is up, you'll need an installed speech engine.\nInstall that on Debian/Ubuntu/Mint as follows:\n\n```bash\nsudo apt-get install espeak-ng-espeak mbrola-us1\n```\n\nor on Arch Linux as follows:\n```bash\nsudo pacman -S espeak-ng-espeak\nyay -S mbrola-voices-us1\n```\n\nCreate a little script in your `$PATH` called `say` with the following content:\n\n```bash\n#!/bin/sh\nespeak -v us-mbrola-1 \"$@\"\n```\n\nIf you use WSL2 on windows, install eSpeak as windows tool and Create a little script in your `$PATH` called `say` with the following content:\n\n```bash\n#!/bin/sh\n/mnt/c/Program\\ Files\\ \\(x86\\)/eSpeak/command_line/espeak.exe \"$@\"\n```\n\nmake sure that the path to the windows `espeak.exe`fits your installation.\nYou can avoid the long path by adding it to your windows path variable.\n\n## How to configure\n\nShow your current configuration with `mob config`:\n\n```toml\nMOB_CLI_NAME=\"mob\"\nMOB_DONE_SQUASH=squash\nMOB_GIT_HOOKS_ENABLED=false\nMOB_NEXT_STAY=true\nMOB_NOTIFY_COMMAND=\"/usr/bin/osascript -e 'display notification \\\"%s\\\"'\"\nMOB_NOTIFY_MESSAGE=\"mob next\"\nMOB_OPEN_COMMAND=\"idea %s\"\nMOB_REMOTE_NAME=\"origin\"\nMOB_REQUIRE_COMMIT_MESSAGE=false\nMOB_SKIP_CI_PUSH_OPTION_ENABLED=true\nMOB_START_COMMIT_MESSAGE=\"mob start [ci-skip] [ci skip] [skip ci]\"\nMOB_START_CREATE=false\nMOB_STASH_NAME=\"mob-stash-name\"\nMOB_TIMER_LOCAL=true\nMOB_TIMER_ROOM_USE_WIP_BRANCH_QUALIFIER=false\nMOB_TIMER_ROOM=\"mob\"\nMOB_TIMER_URL=\"https://timer.mob.sh/\"\nMOB_TIMER_USER=\"sh\"\nMOB_TIMER=\"\"\nMOB_VOICE_COMMAND=\"say \\\"%s\\\"\"\nMOB_VOICE_MESSAGE=\"mob next\"\nMOB_WIP_BRANCH_PREFIX=\"mob/\"\nMOB_WIP_BRANCH_QUALIFIER_SEPARATOR=\"-\"\nMOB_WIP_BRANCH_QUALIFIER=\"\"\nMOB_WIP_COMMIT_MESSAGE=\"mob next [ci-skip] [ci skip] [skip ci]\"\n```\n\nOverride default value permanently via a `.mob` file in your user home or in your git project repository root. (recommended)\n\nOverride default value permanently via environment variables:\n\n```bash\nexport MOB_NEXT_STAY=true\n```\n\nOverride default value just for a single call:\n\n```bash\nMOB_NEXT_STAY=true mob next\n```\n\n### Integration with timer.mob.sh\nFor your name to show up in the room at timer.mob.sh you must set a timer value either via the `MOB_TIMER` variable, a config file, or an argument to `start`.\n\n## How to uninstall\nMob can simply be uninstalled by removing the installed binary (at least if it was installed via the http://install.mob.sh script). \n\n### Linux\n\n```bash\nrm /usr/local/bin/mob\n```\n\n### Windows (Git Bash)\n\n```bash\nrm ~/bin/mob.exe\n```\n\n### MacOS\n\n```bash\nbrew uninstall remotemobprogramming/brew/mob\n```\n\n## How to contribute\n\n[Propose your change in an issue](https://github.com/remotemobprogramming/mob/issues) or [directly create a pull request with your improvements](https://github.com/remotemobprogramming/mob/pulls).\n\n```bash\n# PROJECT_ROOT is the root of the project/repository\n\ncd $PROJECT_ROOT\n\ngit version # \u003e= 2.17\ngo version # \u003e= 1.15\n\ngo build # builds 'mob'\n\ngo test # runs all tests\ngo test -run TestDetermineBranches # runs the single test named 'TestDetermineBranches'\n\n# run tests and show test coverage in browser\ngo test -coverprofile=cover.out \u0026\u0026 go tool cover -html=cover.out\n```\n\n## Design Concepts\n\n- **mob** is a thin wrapper around git.\n- **mob** is not interactive.\n- **mob** owns its wip branches. It will create wip branches, make commits, push them, but also delete them.\n- **mob** requires the user to do changes in non-wip branches.\n- **mob** provides a copy'n'paste solution if it encounters an error.\n- **mob** relies on information accessible via git.\n- **mob** provides only a few environment variables for configuration.\n- **mob** only uses the Go standard library and no 3rd party plugins.\n\n## Who is using 'mob'?\n\n- [INNOQ](https://www.innoq.com)\n- [BLUME2000](https://twitter.com/slashBene/status/1337329356637687811?s=20)\n- [REWE Digital](https://www.rewe-digital.com/)\n- [Amadeus IT Group](https://amadeus.com/)\n- [DB Systel GmbH](https://www.dbsystel.de/)\n- [FlixMobility TECH (FlixBus)](https://www.flixbus.com/)\n- And probably many others who shall not be named.\n\n## Credits\n\nCreated by [Dr. Simon Harrer](https://twitter.com/simonharrer) in September 2018.\n\nCurrently maintained by [Gregor Riegler](https://twitter.com/gregor_riegler) and [Joshua Töpfer](https://twitter.com/JoshuaToepfer), and to some limited degree still by [Dr. Simon Harrer](https://twitter.com/simonharrer).\n\nContributions and testing by Jochen Christ, Martin Huber, Franziska Dessart, Nikolas Hermann\nand Christoph Welcz. Thank you!\n\nLogo designed by [Sonja Scheungrab](https://twitter.com/multebaerr).\n\n\u003ca target=\"_blank\" href=\"https://www.innoq.com/en/impressum/\"\u003eLegal Notice\u003c/a\u003e | \u003ca target=\"_blank\" href=\"https://www.innoq.com/en/datenschutz/\"\u003ePrivacy\u003c/a\u003e\n\n\u003ca href=\"https://github.com/remotemobprogramming/mob/\" class=\"github-corner\" aria-label=\"View source on GitHub\"\u003e\u003csvg width=\"80\" height=\"80\" viewBox=\"0 0 250 250\" style=\"fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;\" aria-hidden=\"true\"\u003e\u003cpath d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"\u003e\u003c/path\u003e\u003cpath d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\" fill=\"currentColor\" style=\"transform-origin: 130px 106px;\" class=\"octo-arm\"\u003e\u003c/path\u003e\u003cpath d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\" fill=\"currentColor\" class=\"octo-body\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\n","funding_links":["https://github.com/sponsors/simonharrer"],"categories":["Go","hacktoberfest"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremotemobprogramming%2Fmob","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fremotemobprogramming%2Fmob","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremotemobprogramming%2Fmob/lists"}