The workshop · Edition No. 34 · 28 Sep 2026

bashly-framework/bashly

Describe a command-line tool's commands, arguments and flags in one YAML file and it generates a standalone shell script with the parsing, validation and help text written.

← The workshopRead the whole edition →
05

bashly-framework/bashly

💎 hidden gem

2,454 stars · MIT, read from /blob/master/LICENSE on 2026-09-28 after /blob/main/LICENSE returned 404; plain, copyright "(c) Danny Ben Shitrit" · v2.0.0 (2026-09-27), read from /releases/latest, confirmed by ungh and by the rubygems API, which records the gem as created 2026-09-27T09:37:33 UTC, seven minutes before the GitHub release · Track this in Scout

Describe a command-line tool's commands, arguments and flags in one YAML file and it generates a standalone shell script with the parsing, validation and help text written.

▶Repo detailsthe review · specs · pros & cons · install

What it is

A generator. You write a YAML file naming the commands, arguments and flags, run one command, and it emits a standalone shell script with the parsing, validation and help text already written. Your own logic lives in separate per-command files that the generator leaves alone.

What it is good for. Anyone whose useful scripts have become embarrassing. The moment a script needs two subcommands and a --dry-run flag, hand-written argument parsing turns into a wall of case statements nobody wants to touch. This removes that wall and keeps the result a plain shell script, so it still runs anywhere with no runtime to install.

Stars2,454
LicenceMIT, read from /blob/master/LICENSE on 2026-09-28 after /blob/main/LICENSE returned 404; plain, copyright "(c) Danny Ben Shitrit"
Latestv2.0.0 (2026-09-27), read from /releases/latest, confirmed by ungh and by the rubygems API, which records the gem as created 2026-09-27T09:37:33 UTC, seven minutes before the GitHub release
Good
  • The output is one ordinary shell script. There is nothing to install on the machine that runs it, which is the whole reason for choosing shell in the first place.
  • It ships a standard library: coloured output, settings files, YAML reading and shell completions, so those are not written by hand either.
  • It is tightly kept. One open issue, and version 2.0.0 landed on 27 September 2026, the day before this edition.
Watch for
  • Version 2.0.0 is one day old. It is the least-tested release in the project's history, and it is a major version, so anyone on the 1.x line faces a migration. Its notes include swapping out a dependency and reworking completions.
  • It needs Ruby 3.3 or newer to run the generator, which is an odd dependency for a shell tool and a real obstacle on older systems. The Docker route avoids that.
  • The generated scripts need bash 4.2 or newer. That excludes the bash that ships with macOS by default, so macOS users install a newer bash first.
Similar repositories
  • matejak/argbash

    1,487 stars, last code 17 July 2025; generates only the argument-parsing block, with no subcommand framework, no standard library and no completions.

    Track this in Scout
  • ko1nksm/getoptions

    522 stars, and its last code landed on 18 November 2024, about twenty-two months ago; a runtime library rather than a generator, and it works on shells other than bash.

    Track this in Scout
  • docopt/docopts

    523 stars, and its last code landed on 2 July 2024, about twenty-six months ago; it derives the parsing from the help text you write, which is the opposite direction, and does nothing else.

    Track this in Scout
Install
# as a Ruby gem
gem install bashly
# or with Homebrew
brew install bashly
# or with Docker, which avoids installing Ruby
alias bashly='docker run --rm -it --user $(id -u):$(id -g) \
  --volume "$PWD:/app" dannyben/bashly'
Screenshots
bashly-framework/bashly: GitHub preview cardbashly-framework/bashly: Screenshot 1

Get the next edition in your inbox

A dozen repositories, opened and checked. The licence read, the last release dated, and the ones that did not make it named with the reason. It is the half most lists leave out.

No tracking pixels. One click to leave. The archive stays free either way.

We use your address to send the edition and nothing else. Confirm by email, leave in one click. How we handle it.