| title | README.md — get-bashed |
|---|---|
| updated | 2026-04-10 |
| status | current |
A modular, portable Bash environment you can install on any machine. get-bashed gives you clean shell defaults, ordered runtime modules, a centralized tool installer, and reproducible configuration — without touching anything you do not explicitly ask it to touch.
BREAKING CHANGE: As of the latest release, get-bashed consolidates all runtime modules, local secrets, and dotfiles into a single managed prefix (default: ~/.get-bashed/).
If you are upgrading from a legacy installation (where files were stored in ~/.bashrc.d and ~/.secrets.d), the installer will attempt to automatically migrate your custom scripts and secrets into the new managed prefix.
Before upgrading, it is highly recommended to back up your custom modules:
cp -r ~/.bashrc.d ~/bashrc.d.backup 2>/dev/null || true
cp -r ~/.secrets.d ~/secrets.d.backup 2>/dev/null || trueTo upgrade your environment, simply re-run the installer over your existing setup:
./install.sh --auto- Ordered
bashrc.d/modules loaded bybashrcat shell startup. - A generated config file (
get-bashedrc.sh) that encodes your feature choices. - A dependency-aware tool installer driven by a single registry (
installers/tools.sh). - Profile presets (
minimal,dev,ops) with per-feature overrides. - Optional dotfile symlinking from
$HOMEinto~/.get-bashedwith automatic backups. - Cross-platform: macOS, Linux, WSL.
- A replacement for your existing dotfile manager (it can coexist).
- A framework that auto-sources secrets or alters behavior without explicit opt-in.
- Opinionated about your prompt or editor — both are optional and configurable.
curl -fsSL -o install.sh https://raw.githubusercontent.com/jbcom/get-bashed/main/install.sh
# Review install.sh before running
sh install.shTo symlink shell dotfiles and set git identity:
sh install.sh --link-dotfiles --name "Jane Doe" --email "jane@example.com"To install with the dev profile (GNU tools, build flags, dev CLI bundle):
sh install.sh --profiles dev --link-dotfiles --name "Jane Doe" --email "jane@example.com"Profiles set feature flag defaults and an installer list. CLI flags always override profile defaults.
| Profile | Features | Use case |
|---|---|---|
minimal |
all off | Minimal defaults, no tool installs |
dev |
GNU tools, build flags, auto tools | Developer workstation |
ops |
dev + SSH agent, Doppler | Ops/platform workstation |
sh install.sh --profiles opsEnable or disable individual behaviors with --features. Prefix no- to disable.
| Feature | Description |
|---|---|
gnu_over_bsd |
Prefer GNU coreutils/sed/tar over BSD equivalents on macOS |
build_flags |
Export Homebrew build paths (CPPFLAGS, LDFLAGS, PKG_CONFIG_PATH) |
auto_tools |
Auto-install optional CLI tools at shell startup |
ssh_agent |
Auto-start and reuse ssh-agent |
doppler_env |
Enable Doppler env integration (does not auto-source on startup) |
bash_it |
Enable the bash-it framework if installed |
git_signing |
Install gnupg and enable GPG git signing |
dev_tools |
Bundle: rg, fd, bat, fzf, jq, yq, tree, direnv, starship, nodejs, python, bash |
ops_tools |
Bundle: gh, git-lfs, terraform, awscli, kubectl, helm, stern, doppler, nodejs, python, java, bash |
sh install.sh --profiles minimal --features gnu_over_bsd,ssh_agentInstall any combination of tools from the registry:
sh install.sh --install brew,asdf,rg,fd,bat,fzf,jqThe installer resolves dependencies in order and uses the best available method (brew, apt, dnf, yum, pacman, pipx, git, curl).
Available tools: brew, asdf, bash, bash_it, vimrc, shdoc, dialog, pipx, pre_commit, bashate, shellcheck, actionlint, bats, curl, wget, gnupg, gnu_tools, git, git_lfs, gh, direnv, starship, rg, fd, bat, fzf, jq, yq, tree, nodejs, python, java, terraform, awscli, kubectl, helm, stern, doppler.
Inspect without installing:
sh install.sh --list
sh install.sh --list-profiles
sh install.sh --list-features
sh install.sh --list-installers
sh install.sh --dry-run --install rg,fd,bat| Flag | Description |
|---|---|
--prefix PATH |
Install to PATH instead of ~/.get-bashed |
--profiles NAMES |
Comma list of profiles to apply |
--features LIST |
Comma list of features (supports no- prefix) |
--install LIST |
Comma list of tools to install |
--link-dotfiles |
Symlink dotfiles from $HOME to ~/.get-bashed |
--name NAME |
Set user.name in the installed gitconfig |
--email EMAIL |
Set user.email in the installed gitconfig |
--vimrc-mode MODE |
awesome (default) or basic vimrc flavor |
--with-ui |
Use curses dialog UI if dialog is available |
--auto / -a |
Disable interactive prompts |
--yes / -y |
Auto-accept all prompts |
--force |
Overwrite existing files |
--dry-run |
Print what would happen, make no changes |
Modules in bashrc.d/ load in numeric order at shell startup. You can add your own by creating a file with the next available prefix. Each module reads GET_BASHED_* flags from get-bashedrc.sh and enables behavior conditionally.
Place local secrets in ~/.get-bashed/secrets.d/*.sh. The installer creates a starter file secrets.d/00-local.sh. All files in secrets.d/ are sourced by bashrc.d/99-secrets.sh. The secrets.d/ directory is git-ignored and never committed.
After install, ~/.get-bashed/get-bashedrc.sh holds the resolved config. You can edit it directly to change behavior without re-running the installer.
See docs/CONFIG.md for all keys and their defaults.
# Clone
git clone https://github.com/jbcom/get-bashed.git ~/.get-bashed-dev
cd ~/.get-bashed-dev
# Test install into temp prefix
./install.sh --prefix /tmp/get-bashed-test --auto --force
# Run the full test suite
make test
# Lint
make lint
# Regenerate docs
make docsSee CONTRIBUTING.md for the full guide. Quick summary:
- Fork and create a branch.
- Follow POSIX-safe conventions in
install.sh; Bash 4+ elsewhere. - Add shdoc annotations for new public functions.
- Run
make lint && make testbefore pushing. - PR titles must follow Conventional Commits (
feat:,fix:,docs:, etc.).
See SECURITY.md for the threat model and vulnerability reporting guidance.
Full docs: https://jonbogaty.com/get-bashed
Generated API docs are in docs/ and published to GitHub Pages via docs.yml.
