The official Debian .deb repository for M5 CardputerZero
applications β hosted on GitHub, served via GitHub Pages.
# Import the signing key
curl -fsSL https://m5stack.github.io/CardputerZeroRepository/KEY.gpg \
| sudo tee /etc/apt/trusted.gpg.d/cardputer.asc > /dev/null
# Add the repository
echo 'deb [arch=arm64] https://m5stack.github.io/CardputerZeroRepository stable main' \
| sudo tee /etc/apt/sources.list.d/cardputer.list
sudo apt update
sudo apt install <appname>- Metadata (
dists/stable/main/binary-arm64/Packages*,Release,InRelease) lives on themainbranch and is republished togh-pageson every push. This is small text (~KB per app). .debbinaries live as GitHub Release assets, not in the git tree. ThePackagesindex points tohttps://github.com/m5stack/CardputerZeroRepository/releases/download/<tag>/<pkg>.deb. This avoids LFS quotas entirely.- Signing happens inside GitHub Actions using a GPG key stored as a repo secret.
The public key is committed as
KEY.gpgso clients can verifyInRelease. - Submissions come in as Pull Requests containing an uploaded
.debunderincoming/. Thevalidate-submission.ymlworkflow runs on PR without secrets (safe). On merge,publish.ymlmoves the file to a Release, rebuilds the index, signs it, and pushes togh-pages.
Why GitHub Pages + Releases and not LFS? LFS on free plan is 1 GB storage /
1 GB bandwidth per month β and bandwidth counts even for public repos. The
Pages+Releases split avoids LFS entirely; see docs/ARCHITECTURE.md for the
full writeup.
Developers either:
czdev upload <file.deb>from CardputerZero-AppBuilder β opens a PR in this repo with the.debdropped underincoming/.- Manual PR β drop a
.debintoincoming/, open a PR. CI validates dpkg metadata + architecture + filename. Maintainer reviews, merges.
Auth / signing for submitters is not wired yet β maintainer merge gates the publication.
CardputerZeroRepository/
βββ dists/stable/main/binary-arm64/ # apt metadata (Packages, Release, InRelease)
βββ pool/main/ # reserved; small debs may land here later
βββ incoming/ # PR landing zone, emptied on merge
βββ KEY.gpg # public signing key
βββ .github/workflows/
βββ validate-submission.yml # PR safety: verify deb format only
βββ publish.yml # on merge to main: release + reindex + sign
- Repo structure bootstrapped (this PR)
-
validate-submission.ymlβ checks deb header, architecture=arm64 -
publish.ymlβ builds Packages/Release, signs, pushes to gh-pages - GPG signing key added as secret (see
docs/MAINTAINERS.md) - GitHub Pages enabled on
gh-pagesbranch -
czdev uploadsubcommand wired to this flow (CardputerZero-AppBuilder)