This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
This repository contains GitHub Actions workflows for building custom OpenWRT firmware images with additional packages (Passwall, Argon theme). It supports multiple OpenWRT versions and architectures.
- OpenWRT 24.x: Uses
opkgpackage manager with.ipkfiles - OpenWRT 25.x: Uses
apkpackage manager with.apkfiles - Version detection pattern:
[[ "$VERSION" == 24.* ]]or[[ "$VERSION" == 25.* ]]
- build_passwall - Builds Passwall (requires Go installation)
- build_theme_argon - Builds Argon theme
- build_image - Combines artifacts and creates final firmware image
Jobs run in parallel where possible; build_image depends on all package builds.
- Package builds run in
debian:13(trixie) containers; the OpenWrt SDK tarball is downloaded from downloads.openwrt.org and unpacked to/builderby each job's Prepare step (recreating the/builder+buildbotuser layout the official SDK images had) build_imagedownloads the ImageBuilder tarball on the host and runsbuild_image.shin adebian:13container with the unpacked tree bind-mounted at/builder- The official
openwrt/sdk/openwrt/imagebuilderDocker images are no longer used: they are based on Debian bullseye, whose apt security repo was retired when bullseye LTS ended 2026-08-31, breaking every job'sapt-get update - Version discovery in the
setupjob parses the releases index at downloads.openwrt.org (no Docker Hub tag queries)
- Architectures:
x86-64,rockchip-armv8,mediatek-filogic(25.12+ only — the nradio profile was merged upstream after the 24.10 branch, so the setup job excludes filogic from the 24.10 matrix line) - Profiles:
generic(x86-64),friendlyarm_nanopi-r2s(rockchip-armv8),nradio_c8-668gl(mediatek-filogic; official upstream device support — no custom DTS/patches needed)
Creates final firmware image. Key environment variables:
PROFILE- Device profile namePACKAGES- Space-separated package listROOTFS_SIZE/KERNEL_SIZE- Partition sizesARCH/VERSION- Target architecture and OpenWRT version
For OpenWRT 25.x, uses ADD_LOCAL_KEY=1 to allow unsigned custom packages.
if [[ "${{ matrix.version }}" == 24.* ]]; then
echo "PKG_EXT=ipk" >> $GITHUB_ENV
else
echo "PKG_EXT=apk" >> $GITHUB_ENV
fi- Intermediate packages: 7 days
- Final firmware images: 30 days
- Push to
masterbranch - Manual dispatch (
workflow_dispatch) - Daily schedule at 21:00 UTC