APT, RPM, and Arch Linux repositories for Open CLI Collective command-line tools.
# Add the GPG key
curl -fsSL https://open-cli-collective.github.io/linux-packages/keys/gpg.asc | sudo gpg --dearmor -o /usr/share/keyrings/open-cli-collective.gpg
# Add the repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/open-cli-collective.gpg] https://open-cli-collective.github.io/linux-packages/apt stable main" | sudo tee /etc/apt/sources.list.d/open-cli-collective.list
# Update and install
sudo apt update
sudo apt install cfl jtk sfdc # or any package from the table below# Add the repository
sudo tee /etc/yum.repos.d/open-cli-collective.repo << 'EOF'
[open-cli-collective]
name=Open CLI Collective
baseurl=https://open-cli-collective.github.io/linux-packages/rpm
enabled=1
gpgcheck=1
gpgkey=https://open-cli-collective.github.io/linux-packages/keys/gpg.asc
EOF
# Install
sudo dnf install cfl jtk sfdc # or any package from the table below# Import and locally sign the repository signing key.
key_file=$(mktemp)
curl -fsSL https://open-cli-collective.github.io/linux-packages/keys/gpg.asc \
-o "$key_file"
fingerprint=$(gpg --with-colons --import-options show-only --import "$key_file" 2>/dev/null \
| awk -F: '$1 == "fpr" { print $10; exit }')
# Check the repository's pinned primary key before trusting it.
[ "$fingerprint" = "1CB5DA9AA0FC049E7D75966B631EF017ACC6C776" ] || {
echo "Unexpected repository signing key" >&2
rm -f "$key_file"
exit 1
}
sudo pacman-key --add "$key_file"
sudo pacman-key --lsign-key "$fingerprint"
rm -f "$key_file"
# Add the repository.
sudo tee -a /etc/pacman.conf <<'EOF'
[open-cli-collective]
SigLevel = Required DatabaseOptional
Server = https://open-cli-collective.github.io/linux-packages/arch/$arch
EOF
After enrollment, install a package on Arch Linux:
sudo pacman -Syu crOn Omarchy, use its update and package installation commands:
omarchy update
omarchy pkg add crOmarchy's update command handles snapshots, migrations, and system package
updates together. Arch availability depends on published source releases. After
updating, list the packages currently available with pacman -Sl open-cli-collective
and use one of those package names in place of cr to install another tool.
Subsequent system updates also update packages from
this repository. Repository setup is a one-time step; do not append the same
repository stanza more than once.
Arch Linux officially supports x86_64. The repository also publishes
aarch64 packages for compatible Arch Linux ARM systems when source releases
provide them.
| Package | Description | Source Repo |
|---|---|---|
cr |
Automated pull-request review CLI | codereview-cli |
cpm |
TUI for managing Claude Code plugins | cpm |
hspt |
HubSpot CLI | hubspot-cli |
spotify-cli |
Spotify CLI (sptfy) |
spotify-cli |
cfl |
Confluence Cloud CLI | atlassian-cli |
google-readonly |
Google read-only CLI (Gmail, Calendar, Contacts) | google-cli |
google-readwrite |
Google read-write CLI (grw) |
google-cli |
jtk |
Jira Cloud CLI | atlassian-cli |
nrq |
New Relic CLI | newrelic-cli |
retune |
Desktop music player for local files and Spotify | Retune |
sfdc |
Salesforce CLI | salesforce-cli |
slck |
Slack CLI | slack-chat-api |
Follow these steps to add a new Open CLI Collective tool to the Linux repositories.
In the source repo's .goreleaser.yml, add:
nfpms:
- id: <package-name>
package_name: <package-name>
vendor: Open CLI Collective
homepage: https://github.com/open-cli-collective/<repo-name>
maintainer: Open CLI Collective <https://github.com/open-cli-collective>
description: <description>
license: MIT
formats:
- deb
- rpm
- archlinux
mtime: "{{ .CommitDate }}"
bindir: /usr/bin
contents:
- src: LICENSE
dst: /usr/share/licenses/<package-name>/LICENSEIn the source repo's .github/workflows/release.yml, add a job:
linux-packages:
needs: goreleaser
runs-on: ubuntu-latest
steps:
- name: Trigger linux-packages repo update
uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.LINUX_PACKAGES_DISPATCH_TOKEN }}
repository: open-cli-collective/linux-packages
event-type: package-release
client-payload: |-
{
"package": "<package-name>",
"version": "${{ github.ref_name }}",
"repo": "open-cli-collective/<repo-name>"
}Add LINUX_PACKAGES_DISPATCH_TOKEN to the source repo's secrets:
- Create a Personal Access Token (PAT) with
reposcope - Add it as a repository secret
Add the new package to the "Available Packages" table above.
┌──────────────────────────────────────────┐
│ Source repository │
│ (e.g. atlassian-cli) │
└─────────────────────┬────────────────────┘
│ 1. Release tagged
▼
┌──────────────────────────────────────────┐
│ GoReleaser │
│ - Creates .deb, .rpm, and .pkg.tar.zst │
│ - Attaches packages to the release │
└─────────────────────┬────────────────────┘
│ 2. repository_dispatch
▼
┌──────────────────────────────────────────┐
│ linux-packages │
│ - Downloads and signs packages │
│ - Updates repository indexes │
└─────────────────────┬────────────────────┘
│ 3. Push to main
▼
┌──────────────────────────────────────────┐
│ GitHub Pages │
│ - Serves APT, RPM, and pacman repos │
└──────────────────────────────────────────┘
The repositories are signed with a GPG key. This setup only needs to be done once.
gpg --full-generate-keyWhen prompted:
- Key type:
RSA and RSA(option 1) - Key size:
4096 - Expiration:
0(does not expire) or set an expiry - Real name:
Open CLI Collective - Email:
open-cli-collective@users.noreply.github.com - Passphrase: Choose a strong passphrase
gpg --list-secret-keys --keyid-format LONGOutput:
sec rsa4096/ABC123DEF456789 2025-01-23 [SC]
FULLFINGERPRINTHERE
uid Open CLI Collective <...>
The key ID is ABC123DEF456789 (after rsa4096/).
# Export private key (for GitHub secret)
gpg --armor --export-secret-keys <KEY_ID> > private-key.asc
# Export public key (for this repo)
gpg --armor --export <KEY_ID> > keys/gpg.ascGo to org secrets or repo secrets and add:
| Secret | Value |
|---|---|
LINUX_PACKAGES_GPG_PRIVATE_KEY |
Contents of private-key.asc |
LINUX_PACKAGES_GPG_PASSPHRASE |
The passphrase you chose |
rm private-key.asc # Delete the private key file - it now lives only in GitHub SecretsCommit the public key (keys/gpg.asc) to this repository.
If a release didn't trigger the workflow automatically, or you need to re-run it:
gh workflow run receive-package.yml \
--repo open-cli-collective/linux-packages \
-f package=cfl \
-f version=v0.10.0 \
-f repo=open-cli-collective/atlassian-cliWatch the run:
gh run list --repo open-cli-collective/linux-packages --limit 1
gh run watch --repo open-cli-collective/linux-packagesTo manually add a package (for testing or one-off releases):
# APT
reprepro -b apt includedeb stable /path/to/package.deb
# RPM
cp /path/to/package.rpm rpm/packages/
createrepo_c rpm/packagesThen commit and push. GitHub Pages will update automatically.