The Linxira-OS/packages repository centrally manages the PKGBUILDs of every first-party Linxira OS package. CI builds each package in a clean Arch Linux container, signs it, and publishes it to the [linxira] repository on GitHub Pages. This page explains the repository layout, the four package source modes, and how to update or add a package.
packages/
├── packages/ # each subdirectory = one package
│ ├── calamares/ # adopted upstream installer (release tarball + patch)
│ ├── linxira-catalog/ # first-party package (codeload commit mode)
│ ├── linxira-hwd-detector/ # first-party package
│ ├── shelly/ # adopted upstream package (codeload commit mode)
│ └── ... # 18 packages in total
├── scripts/
│ ├── check-boundaries.sh # boundary check (CI first gate; update alongside PKGBUILD)
│ └── publish-repo.sh # sign + repo-add + publish to GitHub Pages
├── .github/workflows/
│ └── packages.yml # CI: boundaries → build (4) + system-stack (13) → publish
├── README.md # repo overview + per-package purpose
├── RELEASE.md # release process + key management
└── CONTRIBUTING.md # this file PKGBUILD source=() supports four forms, corresponding to four package source modes:
The source is pinned to a commit; makepkg downloads it from codeload automatically and sha256 verifies integrity.
_commit=<40-hex SHA>
source=("$pkgname-$_commit.tar.gz::https://codeload.github.com/Linxira-OS/$pkgname/tar.gz/$_commit")
sha256sums=('<sha256 of the tarball>') Uses the upstream release tarball; tags are immutable.
source=("https://github.com/calamares/calamares/releases/download/v${pkgver}/calamares-${pkgver}.tar.gz")
sha256sums=('<upstream-published sha256>') Git source does not verify sha256 (git clone has its own integrity checks).
source=("git+$url.git#commit=$_commit")
sha256sums=('SKIP') The keyring's .gpg file lives directly in the same directory as the PKGBUILD.
source=("linxira.gpg")
sha256sums=('<sha256 of the local file>') When a first-party repository (e.g. linxira-catalog) gets a new commit, update the PKGBUILD in the packages repository:
# in the source repository
git log --oneline -1
# output: 9dd16cda... (use the full 40-character SHA) Change two things: _commit=<new 40-hex SHA> and sha256sums=('<new tarball sha256>'). Three ways to compute the new sha256 (Arch environment):
# Method 1: updpkgsums (recommended; updates the PKGBUILD automatically)
cd packages/linxira-catalog
updpkgsums
# Method 2: makepkg -g (prints only the new sha256; paste it manually)
cd packages/linxira-catalog
makepkg -g
# Method 3: download and hash manually
curl -L "https://codeload.github.com/Linxira-OS/linxira-catalog/tar.gz/<commit>" -o /tmp/tarball.tar.gz
sha256sum /tmp/tarball.tar.gz If pkgver or pkgrel also need updating, change them at the same time.
scripts/check-boundaries.sh hardcodes each package's _commit and sha256sums. After changing the PKGBUILD you must update the matching lines in this script, otherwise the CI boundaries job fails.
# Find your package's lines in check-boundaries.sh
grep linxira-catalog scripts/check-boundaries.sh
# Output: two lines:
# grep -q '89b25593...' packages/linxira-catalog/PKGBUILD
# grep -q 'bdf3657d...' packages/linxira-catalog/PKGBUILD
# Update both hashes to the new values in the PKGBUILD # Run the boundary check (same as CI)
bash scripts/check-boundaries.sh
# If you have an Arch environment, try building
cd packages/linxira-catalog
makepkg -f git add packages/<pkg>/PKGBUILD scripts/check-boundaries.sh
git commit -m "update <pkg> to <first 7 chars of commit>"
git push After the push, CI runs automatically: boundaries → build/system-stack. If CI is green, the package is built automatically (artifacts are downloadable).
push/PR
│
├─ boundaries # check-boundaries.sh (seconds)
│
├─ build (matrix) # calamares / artwork / hooks / shelly
│ └─ docker archlinux:base-devel → makepkg
│
├─ system-stack # 13 linxira-* packages, built in dependency order
│ └─ docker archlinux:base-devel → makepkg + pacman -U (installed into the container for downstream packages)
│
└─ publish (manual only) # sign + repo-add → GitHub Pages | Cause | Symptom | Fix |
|---|---|---|
| sha256 mismatch | ==> ERROR: One or more files did not pass the validity check! | Recompute the sha256: makepkg -g |
| _commit updated but sha256 not | Same as above | Update _commit and sha256 together |
| check-boundaries.sh not synced | boundaries job fails | Sync the hardcoded _commit/sha256 |
| Missing makedepends | error: header file not found or bindgen failed | Add the missing package to makedepends in the PKGBUILD |
| CRLF issue | makepkg reports strange errors while parsing the PKGBUILD | Make sure the PKGBUILD uses LF line endings (.gitattributes or dos2unix) |
packages/ and put the PKGBUILD in itpackages=(...) array in packages.ymlcheck-boundaries.shgroups=('linxira') so pacman -S linxira can discover itSee RELEASE.md for details. Key points:
LINXIRA_GPG_PRIVATE_KEY + LINXIRA_GPG_FINGERPRINT; exact fingerprints are not published on this sitelinxira-keyring package distributes the public key; users must install it to verify packages from the [linxira] repositorygit add -A: it may stage unexpected files (e.g. .pkg.tar.zst build artifacts). Use explicit paths: git add packages/<pkg>/PKGBUILD