Build system for the Omarchy Package Repository. Builds PKGBUILDs from local sources and AUR, signs them, and syncs to production.
Multi-Architecture: Supports both x86_64 and aarch64 (ARM64).
To build ARM64 packages on x86_64, enable QEMU emulation:
# Run after each reboot
docker run --privileged --rm tonistiigi/binfmt --install arm64
# Verify
docker run --rm --platform linux/arm64 alpine:latest uname -m
# Should output: aarch64Note: aarch64 builds use QEMU and slower than native x86_64 builds.
The release command is smart and incremental - it only builds packages that have changed or are missing. You generally don't need to specify a package manually unless you are debugging a specific failure.
# Build changed/new packages, sign, promote, clean, update, and sync
bin/repo release
# Stable Mirror
bin/repo release --mirror stable
# ARM64
bin/repo release --arch aarch64
# Force build specific package (useful for debugging failures)
bin/repo release --package omarchy-nvimbin/repo build # Build (unsigned)
bin/repo sign # Sign packages
bin/repo promote # Copy to production
bin/repo clean # Remove old versions
bin/repo update # Update database
bin/repo sync # Sync to remoteThese flags can be used with all commands:
--mirror <edge|stable>: Selects the repository mirror (default:edge).--arch <x86_64|aarch64>: Selects the target architecture (default:x86_64).
bin/repo build # All packages (x86_64, edge)
bin/repo build --arch aarch64 # ARM64
bin/repo build --mirror stable # Stable mirror
bin/repo build --package yay cursor-bin # Specific packagesOutput: Unsigned .pkg.tar.zst in build-output/. Only builds packages that are newer than what is in the repository.
bin/repo signFetches GPG key from 1Password or environment, signs all packages in build-output/. Supports --arch and --mirror.
bin/repo promote # Copy to production
bin/repo promote --arch aarch64 # ARM64
bin/repo promote --dry-run # PreviewCopies signed packages from build-output/ → pkgs.omarchy.org/.
bin/repo clean # Keep 2 versions
bin/repo clean --keep 3 # Keep 3 versions
bin/repo clean --dry-run # PreviewRemoves old package versions from the file system. Does not update the database.
bin/repo update # Update databaseUpdates the repository database (adding the newest version of each package). Run this after promote or clean.
bin/repo sync # Sync current arch/mirror
bin/repo sync --mirror stable # Sync stable
bin/repo sync --arch aarch64 # Sync ARM64
bin/repo sync --skip-prod-check # No confirmationSyncs to remote server using rclone based on the configured mirror and architecture.
bin/repo list # List packages
bin/repo remove <package> # Remove packageomarchy-pkgs/
├── pkgbuilds/ # Source PKGBUILDs
├── build-output/ # Unsigned packages (temporary)
│ ├── x86_64/
│ └── aarch64/
├── pkgs.omarchy.org/ # Signed packages (production)
│ ├── x86_64/
│ └── aarch64/
├── build/ # Build scripts (in container)
└── bin/ # CLI tools (on host)
# Add to sync list
echo "package-name" >> build/packages/omarchy-aur.packages
# Sync PKGBUILD
bin/sync-aur package-name
# Build and release
bin/repo release --package package-nameCreate pkgbuilds/package-name/patches/*.patch to maintain modifications across AUR syncs:
cd pkgbuilds/package-name
# Make changes
git diff > patches/my-fix.patch
# Next sync will auto-apply patchesmkdir pkgbuilds/my-package
# Add PKGBUILD and files
bin/repo release --package my-package- Native builds (fast)
- Mirrors: mirror.omarchy.org, rackspace, pkgbuild.com
- QEMU emulation required on x86_64 hosts (slower)
- Uses Arch Linux ARM repositories
- Additional repos:
[alarm],[aur] - Same workflow, just add
--arch aarch64
# Build x86_64
bin/repo release --package myapp
# Build aarch64
bin/repo release --arch aarch64 --package myapp
# Sync both
bin/repo sync
bin/repo sync --arch aarch64The build system automatically handles inter-package dependencies:
- Parses
depends=()andmakedepends=()from PKGBUILDs - Builds in correct order
- Makes newly-built packages available via temporary
[omarchy-build]repo
Example: If aether depends on hyprshade, hyprshade is built first.
Packages are only rebuilt if:
- PKGBUILD version is newer than repository version
- Package doesn't exist in production
The repository includes a GitHub workflow and systemd services for automated daily releases.
- GitHub Action (6:00 AM UTC): Syncs AUR packages and opens a PR if there are updates
- Merge PR: Review and merge the PR to trigger the release pipeline
- check-upstream (2:00 PM Eastern): Detects the merged changes, pulls them, creates state files
- auto-release (3:00 PM Eastern): If state file exists, runs full release workflow and removes state file on success
State files are stored in /root/.state/:
.sync-needed-edge.sync-needed-stable
# Copy systemd units
cp /root/omarchy-pkgs/systemd/*.service /root/omarchy-pkgs/systemd/*.timer /etc/systemd/system/
# Reload systemd
systemctl daemon-reload
# Enable and start timers
systemctl enable --now omarchy-check-upstream.timer
systemctl enable --now omarchy-auto-release-edge.timer
systemctl enable --now omarchy-auto-release-stable.timer
# Create state directory
mkdir -p /root/.state# Check timer status
systemctl list-timers omarchy-*
# Manual trigger
systemctl start omarchy-check-upstream.service
systemctl start omarchy-auto-release-edge.service
# View logs
journalctl -u omarchy-check-upstream.service
journalctl -u omarchy-auto-release-edge.service