How maintainers publish GitHub Releases and the signed binary feed on GitHub Pages. End users install from Releases or the opkg/apk feed; builders use src-link — see Installation.
| Path | Audience |
|---|---|
GitHub Releases — .ipk / .apk attachments |
Router owners (manual download) |
| GitHub Pages feed — fwlive-packages | Router owners (opkg install / apk add) |
src-link to openwrt-feed/ |
Firmware / SDK builders |
Run from the repo root on Linux x86_64:
./scripts/fwlive-test.sh
./scripts/validate-baseline.shFor upstream/release sign-off, require fresh source extraction by setting
FWLIVE_I18N_REQUIRE_SCAN=1 and provide the OpenWrt scanner with
FWLIVE_I18N_SCAN=/path/to/luci/build/i18n-scan.pl when it is not on PATH.
Missing scanner prerequisites then fail the sign-off run instead of being
treated as a passing skip.
Optional QEMU confidence: ./scripts/validate-openwrt.sh --version 24.10 — see validation matrix.
Full publish checklist: github-publish-checklist.md.
Before cutting a v* tag, make sure that the peaceiris/actions-gh-pages SHA in
publish-packages.yml still matches the upstream tag (checklist pre-release item).
-
Bump the third octet of
PKG_VERSION(keepPKG_RELEASE:=1) inopenwrt-feed/luci-app-fwlive/Makefile:0.1.(N-1)→0.1.N(e.g.0.1.33→0.1.34). -
Mirror
APP_VERSIONinopenwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/constants.js— it MUST equalPKG_VERSION(AGENTS.md lock). -
Fold the changelog: move the
## [Unreleased]entries into a new## [v0.1.N] — YYYY-MM-DDsection at the top ofCHANGELOG.md, grouped under### Security/### Changed/### Added/### Fixedwith issue/PR references appended, and add the compare link at the bottom:[v0.1.N]: https://github.com/lucas-albers-lz4/fwlive/compare/v0.1.N-1...v0.1.N. -
Update
scripts/feeds.lock/if the OpenWrt point release changed — see binary-feed.md. -
Commit as a direct
chore: release v0.1.Ncommit onmaster(release commits are not PRs) and push. -
Create an annotated tag and push it — do not create or publish a GitHub Release first; CI creates it with assets attached:
git tag -a v0.1.N -m "fwlive v0.1.N" git push origin v0.1.NPushing the tag triggers
.github/workflows/publish-packages.yml, which:- Builds packages for 21.02, 22.03, 23.05, 24.10, 25.12
- Checks reproducible builds (
verify-reproducible-build.sh) - Signs and deploys the feed to
lucas-albers-lz4/fwlive-packages(GitHub Pages) - Uploads release assets (one
.ipkper opkg line,.apkfor 25.12 — filenames include the OpenWrt line, e.g.luci-app-fwlive_0.1.34_21.02_all.ipk) - Runs a QEMU feed smoke (
smoke-from-feedjob) installing from the live feed URL — always on tag pushes (default cell 24.10;workflow_dispatchcan override viafeed_smoke/smoke_versioninputs)
GitHub immutable releases cannot receive assets after publish. If you already published an empty release, delete it on GitHub (keep the tag) and re-run the workflow from Actions → Run workflow, entering the tag name.
Make sure that the GitHub Actions secrets are configured — see binary-feed.md.
luci-app-fwlive is _all — one package per OpenWrt version is enough (any SDK target produces the same _all artifact).
export SOURCE_DATE_EPOCH=$(git log -1 --format=%ct)
./scripts/docker-sdk.sh build --target x86-64 --version 21.02
./scripts/docker-sdk.sh build --target x86-64 --version 22.03
./scripts/docker-sdk.sh build --target x86-64 --version 23.05
./scripts/docker-sdk.sh build --target x86-64 --version 24.10
./scripts/docker-sdk.sh build --target x86-64 --version 25.12
./scripts/verify-reproducible-build.shArtifacts:
out/x86_64/21.02.7/fwlive/luci-app-fwlive_*_all.ipk
out/x86_64/22.03.7/fwlive/luci-app-fwlive_*_all.ipk
out/x86_64/23.05.5/fwlive/luci-app-fwlive_*_all.ipk
out/x86_64/24.10.8/fwlive/luci-app-fwlive_*_all.ipk
out/x86_64/25.12.5/fwlive/luci-app-fwlive-*.apk
GitHub Release attachments are renamed with the OpenWrt line suffix (e.g. _21.02_all.ipk) so multiple _all.ipk builds do not collide on upload.
Make sure that the filenames match PKG_VERSION in the Makefile.
The publish workflow generates the GitHub Release body from the matching
## [vX.Y.Z] section of CHANGELOG.md (feed_publish_release_notes_file) —
not from GitHub's --generate-notes, which enumerates only merged PRs in the
tag range and ships a near-empty body when the range holds direct commits
(v0.1.40 shipped with just the compare link). Consequences for the cut:
- The CHANGELOG fold for the version is required before tagging — if the
section is missing, the workflow falls back to
--generate-noteswith a warning, which is exactly the empty-body behavior we removed. - Keep each folded section readable standalone on the release page: it is copied verbatim; the workflow appends the feed-install footer and the previous-tag compare link.
Include in each release (CHANGELOG section content):
- Supported OpenWrt: 21.02, 22.03, 23.05, 24.10 (opkg) · 25.12 (apk)
- Feed install: binary-feed.md
- Menu: Status → Firewall Live View
- Requires firewall rules with
log— enabling firewall logs - Manual install: installation.md
- Make sure that the README Install links work.
- Make sure that the feed URLs respond:
./scripts/wait-feed-pages.sh https://lucas-albers-lz4.github.io/fwlive-packages - Optional: announce on OpenWrt forums / third-party feed indexes.