Skip to content

Repository files navigation

OpenWrts

English | 简体中文

OpenWrts builds OpenWrt firmware with GitHub Actions.

OpenWrts

Scheduled ReleaseManual BuildRelease DownloadsLatest ReleaseLicense

Firmware Builds

The firmware build list is synchronized into manifests/builds.json from config fragments under configs/ when workflow generation runs. The scheduled workflow controls timed releases and alternates between LEDE and ImmortalWrt in auto mode.

SourceDevice IDPlatformFlavorWorkflow statusDownloads
ledex86_64x86_64 genericstandardScheduled ReleaseDownloads
lederpi3Raspberry Pi 3B/3B+standardScheduled ReleaseDownloads
lederpi4Raspberry Pi 4BstandardScheduled ReleaseDownloads
lederpi5Raspberry Pi 5standardScheduled ReleaseDownloads
lederockchipR68S, NanoPi R2S/R4S/R5C/R5S, Orange Pi R1 PlusstandardScheduled ReleaseDownloads
immortalwrtx86_64x86_64 genericliteScheduled ReleaseDownloads
immortalwrtrpi3Raspberry Pi 3B/3B+liteScheduled ReleaseDownloads
immortalwrtrpi4Raspberry Pi 4BliteScheduled ReleaseDownloads
immortalwrtrpi5Raspberry Pi 5liteScheduled ReleaseDownloads
immortalwrtrockchipR68S, NanoPi R2S/R4S/R5C/R5S, Orange Pi R1 PlusliteScheduled ReleaseDownloads

LuCI Plugins

LEDE Standard

CategoryPlugins
Store and proxyluci-app-store, luci-app-openclash, luci-app-passwall2, luci-app-ssr-plus
Networkluci-app-ddns, luci-app-mwan3, luci-app-n2n, luci-app-openvpn, luci-app-softethervpn, luci-app-syncdial, luci-app-upnp, luci-app-wireguard, luci-app-zerotier, luci-app-smartdns
Servicesluci-app-adguardhome, luci-app-docker, luci-app-dockerman, luci-app-filebrowser, luci-app-frpc, luci-app-nfs, luci-app-nps, luci-app-samba4, luci-app-ttyd, luci-app-vsftpd
System and toolsluci-app-accesscontrol, luci-app-arpbind, luci-app-autoreboot, luci-app-cifs-mount, luci-app-commands, luci-app-control-timewol, luci-app-diskman, luci-app-filetransfer, luci-app-firewall, luci-app-netdata, luci-app-nlbwmon, luci-app-onliner, luci-app-pushbot, luci-app-qos, luci-app-serverchan, luci-app-usb-printer, luci-app-vlmcsd, luci-app-wol
Extra appsluci-app-ipsec-vpnd, luci-app-mentohust, luci-app-oaf, luci-app-qbittorrent_static, luci-app-qbittorrent-simple_dynamic, luci-app-turboacc
Themesluci-theme-argon, luci-theme-bootstrap, luci-theme-infinityfreedom, luci-theme-material, luci-theme-netgear, luci-theme-neobird

ImmortalWrt Lite

CategoryPlugins
Store and proxyluci-app-store, luci-app-openclash, luci-app-passwall2, luci-app-ssr-plus
Networkluci-app-accesscontrol, luci-app-smartdns, luci-app-turboacc, luci-proto-wireguard
Servicesluci-app-docker, luci-app-dockerman, luci-app-filetransfer, luci-app-firewall, luci-app-netdata, luci-app-oaf, luci-app-onliner, luci-app-ttyd
System defaultsdefault-settings, default-settings-chn, luci-app-autoreboot
Themesluci-theme-argon, luci-theme-bootstrap, luci-theme-material

Supported Sources

Source IDUpstream repositoryDefault branchNotes
ledehttps://github.com/coolsnowwolf/ledemasterLean LEDE, currently used for standard builds
immortalwrthttps://github.com/immortalwrt/immortalwrtmasterImmortalWrt, currently used for shared lite builds

The two sources do not share the same SDK, feeds, LuCI version, package set, or plugin compatibility guarantees. High-confidence shared fragments live under common; source-specific fragments remain isolated and take precedence when they use the same name.

Warning

Firmware built from different sources must not be mixed during upgrades. Do not use a LEDE image to perform an in-place or keep-settings upgrade on ImmortalWrt, or vice versa, even when the device and flavor names match. To switch sources, back up the required settings separately, perform a clean installation using the device-appropriate factory/recovery procedure, and then restore only compatible settings. Do not restore a complete configuration archive from the other source.

Workflows

WorkflowPurpose
schedule-release.ymlScheduled release with source, device, and flavor filters. auto alternates one source between LEDE and ImmortalWrt by ISO week parity
manual-build.ymlManual build entry point with source, device, flavor, branch, and release controls
build-openwrt.ymlReusable workflow that builds one matrix item

The scheduled workflow uses UTC:

schedule:
- cron: "23 16 * * 6"

This is roughly Sunday 00:23 in Asia/Shanghai.

The scheduled build defaults to repo=auto, devices=all, and flavors=lite. For a manual run of the scheduled workflow, devices and flavors accept comma-separated values, for example rpi3,rpi5 and lite,standard. Device values are config names under configs/targets/ without the .config suffix.

Build Flow

scheduled/manual workflow
-> scripts/openwrts.mjs validate-manifest
-> scripts/openwrts.mjs generate-workflows --check
-> scripts/openwrts.mjs resolve-matrix generates the build matrix
-> build-openwrt.yml
-> scripts/prepare-env.sh
-> scripts/clone-source.sh
-> scripts/apply-openwrt.sh system feeds
-> OpenWrt feeds update/install
-> scripts/apply-openwrt.sh packages
-> scripts/compose-config.sh
-> scripts/build.sh
-> upload artifact / release

Repository Layout

.github/workflows/
build-openwrt.yml reusable build workflow
schedule-release.yml scheduled source-rotation release workflow
manual-build.yml manual build workflow
manifests/
builds.json build matrix definition
feeds/
common.conf shared feed overlays
<repo>.conf optional repo-only feed overlays
packages/
lede.sh LEDE third-party packages
immortalwrt.sh ImmortalWrt third-party packages
configs/
targets/ shared target/device configs
apps/ common and source-specific LuCI app configs
drivers/ source-specific driver extension configs
scripts/
openwrts.mjs Node.js CLI for manifest validation, matrix resolution, and workflow generation
prepare-env.sh install build dependencies
clone-source.sh clone the selected upstream source
apply-openwrt.sh apply system defaults, shared/repo feeds, and repo packages
compose-config.sh compose .config and run make defconfig
build.sh download dependencies and compile firmware

The old root-level source.sh, environment.sh, configure.sh, and package.sh compatibility wrappers have been removed. New automation should call scripts under scripts/ directly.

Workflow Generation

GitHub Actions workflow_dispatch choice options are static YAML values. They cannot be loaded dynamically at runtime in the Actions UI. Regenerate after changing target, app, or driver config fragments:

node scripts\openwrts.mjs generate-workflows
node scripts\openwrts.mjs generate-workflows --check

generate-workflows scans shared targets from configs/targets/*.config, combines them with configs/apps/common/*.config and selected configs/apps/<repo>/*.config fragments, updates manifests/builds.json, and then writes the workflow options. Repo-specific app fragments take precedence over same-named common app fragments. Existing manifest metadata such as op_name is preserved, so you can edit display names after the first generation.

The generated workflows contain a validation step that fails when committed manifest or workflow options are out of sync with the config fragments.

Cache Strategy

The new workflow caches dl and .ccache with actions/cache. The cache key includes:

repo + branch + cache_scope + hash(feeds/packages/scripts/configs/manifests)

This avoids reusing incompatible cache data across LEDE, ImmortalWrt, devices, and firmware flavors.

Default Firmware Settings

  • Management IP: 192.168.10.1
  • User: root
  • Password: password

Manual Builds

Open GitHub Actions and run Manual OpenWrt Build, then choose:

  • repo: auto, lede, or immortalwrt. auto always selects one source using the scheduled ISO-week rotation rule.
  • device: all or a device ID from the matrix
  • flavor: standard, lite, or all. The default is standard with repo=lede. Use all when you want every matching manifest entry for the selected repo/device.
  • branch: leave empty to use the manifest default, or provide an upstream branch
  • upload_release: whether to upload firmware to GitHub Releases

For example, repo=lede, device=all, flavor=lite builds all LEDE targets with configs/apps/common/lite.config. If a selected repo/device/flavor combination does not exist, matrix resolution stops before compilation and reports the available flavors.

Local Matrix Checks

node scripts\openwrts.mjs validate-manifest
node scripts\openwrts.mjs resolve-matrix--repo lede --device x86_64
node scripts\openwrts.mjs resolve-matrix--repo immortalwrt --device all
node scripts\openwrts.mjs resolve-matrix--repo auto

The Node.js CLI uses only built-in Node modules and does not require npm install.

Adding a Device

  1. Add the target/device config under configs/targets/.
  2. Add or reuse an app config under configs/apps/common/ or configs/apps/<repo>/.
  3. Add driver extensions under configs/drivers/<repo>/ when needed.
  4. Update packages/<repo>.sh if the device needs extra packages.
  5. Run node scripts\openwrts.mjs generate-workflows to sync manifests/builds.json and workflow choices.
  6. Optionally edit the generated op_name in manifests/builds.json for a nicer release name, then rerun generate-workflows.
  7. Run node scripts\openwrts.mjs validate-manifest.

Screenshots

OpenWrt

App Store

Service

Network

Credits

License

This project is released under the MIT License. See LICENSE.