Skip to content

Installation

The club CLI is a single native binary built for every major platform. There are four ways to get it:

  1. Install script: a one-liner that fetches the right archive for your OS + CPU, verifies the checksum, and drops the binary on your PATH. install.sh for Linux/macOS, install.ps1 for Windows.
  2. Homebrew: on macOS (and Linux with Homebrew installed), tap this repo and brew install club. Upgrades and uninstall flow through brew like any other formula.
  3. Manual download: grab the archive from the releases page and extract it wherever you want. Use this in locked-down environments or when you want to pin a specific version by hand.
  4. From source: activate the CLI via dart pub global activate from a cloned repo. Best for local development on the CLI itself.

For CI/CD, see the CI/CD Integration guide. There’s a one-liner GitHub Action that installs the CLI and configures dart pub in a single step.

Install script (Linux and macOS)

Terminal window
curl -fsSL https://club.birju.dev/install.sh | bash

The script detects your OS (linux / macos) and CPU (x64 / arm64), downloads the matching release archive, verifies its SHA-256 against the release’s SHA256SUMS.txt, and installs the binary to ~/.local/bin/club.

Options

FlagEnv varDescription
--version <x>CLUB_VERSIONInstall a specific release (e.g. 0.1.0) instead of the newest stable one.
--preCLUB_PREInclude pre-releases when resolving the newest version.
--install-dir <path>n/aInstall to a different directory. Default ~/.local/bin.
--repo <owner/name>CLUB_REPOPull from a fork or mirror. Default BirjuVachhani/club.

By default the script installs the newest stable release. Pass --pre to include pre-releases.

Examples:

Terminal window
# Pin to a specific version
curl -fsSL https://club.birju.dev/install.sh \
| bash -s -- --version 0.1.0
# Include pre-releases
curl -fsSL https://club.birju.dev/install.sh \
| bash -s -- --pre
# Install into /usr/local/bin instead of ~/.local/bin
curl -fsSL https://club.birju.dev/install.sh \
| sudo bash -s -- --install-dir /usr/local/bin

PATH

If the chosen install directory is not on your PATH, the script prints the exact line to add to your shell’s rc file. For the default ~/.local/bin:

Terminal window
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

Install script (Windows)

Terminal window
iwr -useb https://club.birju.dev/install.ps1 | iex

The script detects the native Windows architecture (x64 or arm64), even when PowerShell itself is running under emulation. It downloads the matching .zip, verifies its SHA-256 against SHA256SUMS.txt, and copies club.exe into %USERPROFILE%\.club\bin.

Options

ParameterEnv varDescription
-Version <x>CLUB_VERSIONInstall a specific release (e.g. 0.1.0) instead of the newest stable one.
-PreCLUB_PREInclude pre-releases when resolving the newest version.
-InstallDir <path>CLUB_INSTALL_DIRInstall to a different directory. Default %USERPROFILE%\.club\bin.
-Repo <owner/name>CLUB_REPOPull from a fork or mirror. Default BirjuVachhani/club.

By default the script installs the newest stable release. Pass -Pre to include pre-releases.

Parameters require direct invocation. When piping to iex, set the matching env var first:

Terminal window
# Pin a version
$env:CLUB_VERSION = '0.1.0'
iwr -useb https://club.birju.dev/install.ps1 | iex
# Or, with the script saved to disk:
iwr -useb https://club.birju.dev/install.ps1 -OutFile install.ps1
.\install.ps1 -Version 0.1.0 -InstallDir "$env:LOCALAPPDATA\Programs\club\bin"

PATH

If the install directory isn’t on PATH yet, the script prints the exact PowerShell line to add it persistently for your user. The default location, %USERPROFILE%\.club\bin, isn’t on PATH out of the box. Add it with:

Terminal window
[Environment]::SetEnvironmentVariable(
'Path',
"$env:USERPROFILE\.club\bin;" + [Environment]::GetEnvironmentVariable('Path','User'),
'User'
)

Then open a new terminal.

Homebrew (macOS and Linux)

The club repo doubles as a Homebrew tap. Because the repo is named club (not homebrew-club), the tap URL has to be passed explicitly the first time:

Terminal window
brew tap birjuvachhani/club https://github.com/BirjuVachhani/club.git
brew trust birjuvachhani/club
brew install club

The formula pulls the prebuilt binary for your platform (macOS arm64/x64, Linux arm64/x64) from the matching GitHub release and verifies its SHA-256.

Why brew trust is needed

Homebrew 5.1.15 started requiring non-official taps to be trusted before it will load anything from them. brew tap still succeeds without it, so the failure surfaces one step later, at install time:

Error: Refusing to load formula birjuvachhani/club/club from untrusted tap birjuvachhani/club.
Run `brew trust --formula birjuvachhani/club/club` or `brew trust birjuvachhani/club` to trust it.

Trusting the tap covers every formula in it, and it is a one-time step. Upgrades do not need it again.

Trusted entries live in ~/.homebrew/trust.json, or in $XDG_CONFIG_HOME/homebrew/trust.json when that variable is set. Run brew trust with no arguments to list them.

Older Homebrew versions have no brew trust command and need no such step. If yours predates it, skip straight to brew install club.

Upgrade and uninstall with the usual brew commands:

Terminal window
brew update && brew upgrade club
brew uninstall club
brew untap birjuvachhani/club # if you want to drop the tap too

Manual download

Every tagged release attaches one archive per supported target plus a single SHA256SUMS.txt:

TargetArchive
Linux x86_64club-cli-<version>-linux-x64.tar.gz
Linux arm64club-cli-<version>-linux-arm64.tar.gz
macOS Intelclub-cli-<version>-macos-x64.tar.gz
macOS Apple siliconclub-cli-<version>-macos-arm64.tar.gz
Windows x86_64club-cli-<version>-windows-x64.zip
Windows ARM64club-cli-<version>-windows-arm64.zip
  1. Grab the archive and the checksums file from the latest release:

    Terminal window
    VERSION=0.1.0
    TARGET=linux-x64 # or macos-arm64, etc.
    curl -fLO "https://github.com/BirjuVachhani/club/releases/download/${VERSION}/club-cli-${VERSION}-${TARGET}.tar.gz"
    curl -fLO "https://github.com/BirjuVachhani/club/releases/download/${VERSION}/SHA256SUMS.txt"
  2. Verify the archive:

    Terminal window
    shasum -a 256 -c SHA256SUMS.txt --ignore-missing

    You should see club-cli-${VERSION}-${TARGET}.tar.gz: OK.

  3. Extract and install:

    Terminal window
    tar -xzf "club-cli-${VERSION}-${TARGET}.tar.gz"
    install -m 0755 "club-cli-${VERSION}-${TARGET}/bin/club" ~/.local/bin/club

From source

Useful when you’re hacking on the CLI itself or want to run an unreleased build. Requires the Dart SDK 3.11 or newer.

Terminal window
git clone https://github.com/BirjuVachhani/club.git
cd club
dart pub get
dart pub global activate --source path packages/club_cli

Make sure $HOME/.pub-cache/bin is on your PATH:

Terminal window
export PATH="$PATH:$HOME/.pub-cache/bin"

Verifying the install

Terminal window
club --version

If you see the version printed, you’re done. Continue to Login & Setup to authenticate against your club server.

Upgrading

Use club upgrade:

Terminal window
club upgrade

It resolves the newest stable release, then hands off to the same install script that put the binary there, so the result is identical to re-running the one-liner. Replacing the running binary is safe on every platform.

Options

FlagDescription
--checkReport whether a newer release exists, then exit without installing.
--version <x>Install this exact version. Accepts 0.4.2 or v0.4.2. Downgrades are allowed and prompt for confirmation.
--preConsider pre-release tags when resolving the newest version.
--forceReinstall when already current, and proceed on a local build.
--dry-runPrint what would be installed and where, then exit.
-y, --yesSkip the downgrade confirmation.
--install-dir <path>Override the auto-detected install directory.
--jsonMachine-readable output.

Exit codes

CodeMeaning
0Upgraded, already current, or --check found nothing newer.
65--check only: a newer version is available.
66A downgrade needed confirmation but the shell is not interactive. Pass --yes.
69GitHub was unreachable, a pinned build is unavailable, or Homebrew could not be started.
70The install script or a Homebrew command ran and failed.
78The install cannot be upgraded as requested, an option is unsupported for Homebrew, or the target directory is not writable.

--check returning 65 follows the git diff --exit-code convention, which trips up CI steps that treat any non-zero code as failure. Prefer --json there:

Terminal window
club upgrade --check --json | jq -e .updateAvailable

Homebrew installs

When the binary came from Homebrew, club upgrade delegates to Homebrew instead of replacing files in the Cellar itself. It runs the equivalent of:

Terminal window
brew update && brew upgrade club

Homebrew installations use package-manager-specific option behavior:

  • --check updates tap metadata, then queries brew outdated without installing.
  • --dry-run prints the Homebrew commands without running them.
  • --force uses brew reinstall club.
  • --yes is forwarded to Homebrew.
  • --version, --pre, and --install-dir are rejected because the stable formula owns the available version and destination.

A missing brew executable returns 69. A Homebrew command that starts but fails returns 70 with the command to retry. --json captures Homebrew output so stdout remains one machine-readable JSON document.

dart pub global activate installs and source checkouts are still detected and refused with the right command to run instead.

Pre-releases

club upgrade and both install scripts default to the newest stable release. Pass --pre to any of them to include pre-releases.

Newly published releases

A release is only offered once its build artifacts have finished uploading. Releases are published manually and the build runs afterwards, so a tag can be visible on GitHub for a few minutes before it is installable. During that window club upgrade reports that you are up to date rather than sending you into an installer that would fail. --json reports the pending version as pendingVersion so the state is still visible.

Update notifications

After a command runs, club may print a one-line hint when a newer release exists. It checks at most once every 24 hours and caches the result in ~/.config/club/update_check.json. Set NO_UPDATE_CHECK to turn it off; it is already skipped in CI.

Manual installs

For manual installs, repeat the download step with the new version.

Uninstalling

Use the uninstall script that matches how you installed.

Terminal window
curl -fsSL https://club.birju.dev/uninstall.sh | bash

This removes the binary at ~/.local/bin/club and, if present, the bundle directory at ~/.local/share/club. Stored credentials at ~/.config/club are kept by default. Pass --purge to delete them too.

FlagDescription
--purgeAlso delete ~/.config/club and unregister club’s dart pub tokens.
--install-dir <path>Look for the binary here instead of ~/.local/bin. Must match the value you passed to install.sh.
--dry-runPrint what would be removed without deleting anything.
Terminal window
# Preview the removal
curl -fsSL https://club.birju.dev/uninstall.sh | bash -s -- --dry-run
# Remove binary, credentials, and registered pub tokens
curl -fsSL https://club.birju.dev/uninstall.sh | bash -s -- --purge
# Uninstall from a custom location
curl -fsSL https://club.birju.dev/uninstall.sh \
| sudo bash -s -- --install-dir /usr/local/bin

What --purge covers

club login and club setup register your token with dart pub token add, which writes it into dart’s own config rather than club’s:

  • ~/.config/dart/pub-tokens.json on Linux and macOS
  • %APPDATA%\dart\pub-tokens.json on Windows

Deleting club’s config directory would leave that token behind, still pointing at your server. --purge (-Purge on Windows) reads the servers out of credentials.json before deleting it and runs dart pub token remove for each one.

If dart isn’t on PATH, the script prints the exact commands to finish the job rather than failing.

Homebrew

If you installed via Homebrew, uninstall with brew instead, since the script only knows about install.sh layouts:

Terminal window
brew uninstall club
brew untap birjuvachhani/club # if you want to drop the tap too
brew untrust birjuvachhani/club # and its trust entry

brew untrust matches the stored entry literally, so pass it the same form you trusted with. If you trusted the clone URL, untrust the clone URL. Run brew trust with no arguments to see what is actually stored.

Manual

If you’d rather do it by hand:

Terminal window
rm -f ~/.local/bin/club
rm -rf ~/.local/share/club # only if the bundle layout was used
rm -rf ~/.config/club # credentials, only for a clean slate
# One per server you logged into
dart pub token remove https://pub.example.com

To list the servers you logged into before deleting anything, run club config show or read the servers keys out of credentials.json.