Automated APT repository for the odio ecosystem.
Part of the odio project — full documentation.
Automated APT repository for the Odio ecosystem, served via GitHub Pages.
| Package | Source |
|---|---|
go-odio-api |
b0bbywan/go-odio-api |
go-mpd-discplayer |
b0bbywan/go-mpd-discplayer |
spotifyd |
b0bbywan/spotifyd |
mympd |
b0bbywan/odio-mympd (build of upstream jcorporation/myMPD) |
mpd2mpris |
b0bbywan/mpd2mpris
(formerly mpDris2) — tracks latest |
mpdris2 |
b0bbywan/mpd2mpris
pinned at v0.11.1 (last release shipping
mpdris2_*.deb) so apt install mpdris2 keeps
working |
# Add GPG key
curl -fsSL https://apt.odio.love/key.gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/odio.gpg
# Add repository
echo "deb [signed-by=/usr/share/keyrings/odio.gpg] https://apt.odio.love stable main" \
| sudo tee /etc/apt/sources.list.d/odio.list
# Install
sudo apt update
sudo apt install go-odio-api go-mpd-discplayer spotifyd mympd mpd2mpris# Add testing repo (after adding the GPG key above)
echo "deb [signed-by=/usr/share/keyrings/odio.gpg] https://apt.odio.love testing main" \
| sudo tee /etc/apt/sources.list.d/odio-testing.list
sudo apt update
sudo apt install go-odio-apiTags containing -rc, -beta, or
-alpha go to testing. Everything else goes to
stable.
Rename note:
mpDris2was renamed tompd2mpris. New installs should usempd2mpris; thempdris2package stays in the repo (pinned atv0.11.1, the last release shippingmpdris2_*.deb) so existingapt install mpdris2setups keep resolving. The two carry different package names, so both coexist.
go-odio-api,
go-mpd-discplayer, spotifyd,
odio-mympd, or mpd2mpris) publishes a GitHub
Release with .deb artifactsrepository_dispatch on this repo.deb from each source
project’s latest stable and prerelease tags, skipping any release
already fetched in a previous run (a cached debs/ keyed on
the resolved versions)reprepro builds the APT repository metadata for both
stable and testing suitesA scheduled rebuild (Monday and Thursday 04:00 UTC) catches any
missed releases and keeps the .deb cache warm (GitHub
evicts caches after 7 days without access). Thanks to the cache, a
rebuild with no new releases re-downloads nothing — keeping source
projects’ GitHub download counters honest. No binaries stored in git —
source projects remain the single source of truth.
# Generate a key (no passphrase for CI)
gpg --batch --gen-key <<EOF
%no-protection
Key-Type: RSA
Key-Length: 4096
Name-Real: Odio APT Repository
Name-Email: apt@odio.love
Expire-Date: 2y
%commit
EOF
# Export private key → GitHub secret GPG_PRIVATE_KEY
gpg --armor --export-secret-keys "apt@odio.love"| Secret | Where | Description |
|---|---|---|
GPG_PRIVATE_KEY |
apt-repo |
GPG private key for signing |
APT_REPO_TOKEN |
go-odio-api, go-mpd-discplayer,
spotifyd, odio-mympd,
mpd2mpris |
PAT with repo scope to trigger dispatch |
In apt-repo → Settings → Pages → Source: GitHub
Actions.
Add the job from trigger-snippet.yml to the release
workflow of each source project.
gh workflow run update-repo.yml
Or with specific versions (any subset of inputs):
gh workflow run update-repo.yml \
-f odio_version=v0.9.0 \
-f discplayer_version=v0.8.0 \
-f spotifyd_version=v0.3.5 \
-f mympd_version=v25.0.1 \
-f mpd2mpris_version=v0.12.0
If a manually supplied version contains -rc,
-beta, or -alpha, it is routed to
testing and the latest stable for that package is kept in
stable.
The repository-build logic lives in
scripts/build-apt-repo.sh (called by the workflow):
./scripts/build-apt-repo.sh configure --gpg-key-id "$GPG_KEY_ID"
./scripts/build-apt-repo.sh resolve [--odio-version vX.Y.Z ...] >> "$GITHUB_ENV"
./scripts/build-apt-repo.sh download
./scripts/build-apt-repo.sh build --gpg-key-id "$GPG_KEY_ID"
Run ./scripts/build-apt-repo.sh --help for full
subcommand documentation.
BSD 2-Clause — see LICENSE.