Cookbook

Ship your package

For someone who wrote a LuCI app or theme and wants people to install it. Three stages, each its own page, each useful without the next.

The whole path, in eight commands

# 1 — while you work
owlab up
owlab sync --watch
owlab test --release 25.12.5 --release 24.10.8 --install 'dist/*/my-app-*'

# 2 — when you tag
owlab build --release 25.12.5
owlab build --release 24.10.8
owfeed sign --key env:OWFEED_AUTHOR_KEY
owfeed release

# 3 — once, to join a feed
#     open an issue with your repository, a tag and your public keys

Where to stop

Stop after 1 if the package is not released yet. owlab holds no keys and publishes nothing; it exists to answer "does this actually work on 24.10".

Stop after 2 if your package is installed occasionally, by people who can paste a command. A signed release asks your users for nothing but a signature check, and it does not make anyone's key a trust anchor on their router.

Go to 3 when you want apk upgrade to work. That is the one thing a feed does that a release cannot — and the overview argues the case for not running a feed where a release would do.

What each stage needs

StageRequires
Develop and testDocker. Nothing else.
Build and releaseTwo keys, made once. No toolchain to install: the apk tools are fetched from the OpenWrt SDK and verified against a pinned key.
Get into a feedA signed release, and a feed willing to carry it.