- Shell 100%
| downloads | ||
| downloads.sha256sum | ||
| init.sh | ||
| LICENSE | ||
| README.md | ||
| refresh-sha256sum.sh | ||
zshrc
Multi-distro Zsh deployment repository for installing a shared shell setup across several Linux distributions and FreeBSD.
Overview
This repository is organized around a simple deployment pipeline:
init.shis the remote bootstrap script.downloads/zsh.shis the interactive installer and deployment entry point.downloads/zshrcis the runtime shell entry point.downloads/*.zrccontains shared shell modules plus distro-specific and optional overlays.
The installer deploys a common Zsh base, then adds overlays for the selected package manager and optional features.
The repository can now be used in two ways:
- remote-first through the published bootstrap URL
- locally from a checked-out clone, where
downloads/zsh.shcopies assets from the repository instead of re-downloading them
Repository updates are handled separately from distro package refreshes:
zupdatechecks the SHA-256 manifest and only re-downloads changed files fromdownloads/updateremains the distro-specific package manager refresh command inside each04-pkg-*.zrc
Bootstrap
To start from the published remote bootstrap script:
curl -fSsL https://raw.githubusercontent.com/firebadnofire/zshrc-modern/refs/heads/main/init.sh | bash
init.sh downloads the current installer payloads from downloads/ into /tmp and prompts you to run /tmp/zsh.sh.
You can also run the installer directly from a local checkout:
bash ./downloads/zsh.sh
When run locally, downloads/zsh.sh prefers repository files over remote downloads.
Repository Layout
.
├── README.md
├── init.sh
├── downloads/
│ ├── 00-paths.zrc
│ ├── 02-git-signing.zrc
│ ├── 03-system-aliases.zrc
│ ├── 04-pkg-arch.zrc
│ ├── 04-pkg-debian.zrc
│ ├── 04-pkg-freebsd.zrc
│ ├── 04-pkg-gentoo.zrc
│ ├── 04-pkg-opensuse-tumble.zrc
│ ├── 04-pkg-rhel.zrc
│ ├── 05-tools.zrc
│ ├── 06-mullvad.zrc
│ ├── 07-warn-docker.zrc
│ ├── 99-post.zrc
│ ├── fastfetch.sh
│ ├── firebadnofire.zsh-theme
│ ├── golang.sh
│ ├── suppress-warning.zrc
│ ├── zsh.sh
│ └── zshrc
Key Components
init.sh
Remote bootstrap script intended to be fetched over curl | bash. It downloads:
zsh.shfastfetch.shgolang.sh
downloads/zsh.sh
Main deployment script. It provides an interactive menu for:
- installing base packages for a supported distro
- deploying the shared Zsh configuration
- installing Rust
- installing Fastfetch
- installing Go
- enabling Mullvad aliases
- enabling Docker SELinux reminders
- generating a local SSH key
This script is the main place where distro package installation is defined. It now centralizes:
- shared remote asset path handling
- local-versus-remote asset deployment
- distro overlay selection
- backup of an existing
~/.zshrcbefore replacement
downloads/zshrc
Runtime shell entry point. It:
- exits for non-interactive shells
- sets common environment defaults
- bootstraps Oh My Zsh
- ensures the custom theme is present
- loads all
~/.zshrc.d/*.zrcmodules - exports
ZMODULESandPRETTY_ZMODULE_NAMES - exposes
zupdatefor SHA-based per-file repository updates - prints
zmodules: ...after startup so the loaded module order is visible
If Oh My Zsh is missing, it exits cleanly instead of partially bootstrapping a broken shell.
downloads/*.zrc
Flat payload directory for modules and overlays copied into ~/.zshrc.d by the installer.
Shared modules:
00-paths.zrc: commonPATHand tool environment setup02-git-signing.zrc: Git signing configuration using SSH or GPG03-system-aliases.zrc: general aliases and helper commands05-tools.zrc: network/tool variables and helper aliases99-post.zrc: startup diagnostics and final shell post-load actionssuppress-warning.zrc: placeholder file to avoid empty-glob issues
Package manager overlays:
04-pkg-arch.zrc04-pkg-debian.zrc04-pkg-freebsd.zrc04-pkg-gentoo.zrc04-pkg-opensuse-tumble.zrc04-pkg-rhel.zrc
Each package overlay defines a common user-facing interface:
- package upgrade count on shell startup
insupdateupgradesearchremPKGMGR
Optional overlays:
06-mullvad.zrc: adds themlexalias whenmullvad-excludeis installed07-warn-docker.zrc: warns before selected Docker commands to remind about:Zflags
downloads.sha256sum
Root-level SHA-256 manifest for every file under downloads/. It is used by zupdate to compare the local state against upstream and only fetch files whose hashes differ.
To refresh it locally, run:
./refresh-sha256sum.sh
Supported Distros
Current base package installation support in downloads/zsh.sh:
- Debian
- Arch Linux
- RHEL-compatible systems
- OpenSUSE
- FreeBSD
- Gentoo
Additional distro-aware support exists in downloads/fastfetch.sh, which includes several extra platforms for Fastfetch installation.
downloads/golang.sh is intentionally Linux-only and now exits clearly on unsupported operating systems.
Deployment Model
The project separates installation from runtime behavior:
- installation logic lives in
downloads/zsh.sh - runtime shell behavior lives in
downloads/zshrcplus the.zshrc.dmodules - distro-specific runtime behavior is injected by copying one of the
04-pkg-*.zrcfiles fromdownloads/into~/.zshrc.d
This means the runtime shell config stays mostly uniform while package-manager commands vary by selected distro.
Typical Flow
- Run the bootstrap command.
- Execute
/tmp/zsh.sh. - Select your distro to install base packages and the matching package-manager overlay.
- Select
Install Zshrcto deploy the runtime configuration. - Optionally install Rust, Fastfetch, Go, Mullvad aliases, or Docker reminders.
- Start a new Zsh session.
Notes and Caveats
init.shis still a remote bootstrap script, butdownloads/zsh.shcan deploy directly from a local checkout.- Startup diagnostics remain enabled by default, but they can now be disabled by setting
ZSHRC_SHOW_STARTUP_INFO=0. - Some shared aliases assume Linux tooling such as
systemctl, so not every shared module is fully portable across every supported platform. - The theme fetch path is now aligned with
downloads/underZSHRC_REMOTE_BASE. updatestays tied to distro package managers; usezupdatefor repository file refreshes.- Install-time generated files still exist, such as
~/.zshrc.d/08-golang.zrc.
Development
When changing this repository, keep the current layering intact:
- update
downloads/zsh.shwhen changing installer behavior - update
downloads/zshrcfor shell bootstrap/runtime changes - update files in
downloads/for shared shell behavior and overlays - update
downloads.sha256sumwhenever the contents ofdownloads/change
If you add a new distro, update both:
- the package installation logic in
downloads/zsh.sh - the matching
downloads/04-pkg-*.zrcoverlay