OpenWrt 主题 Lumen:我做的现代 LuCI 界面,手机也好用
OpenWrt 主题 Lumen 是我做的 ucode LuCI 界面:深浅色、侧栏、实时仪表盘和手机布局。v1.0.1 支持 25.12.6 APK 和 24.10.8 IPK,附签名验证和回退步骤。

Lumen 是我做的一款 OpenWrt 主题,给 ucode LuCI 用。它有清晰的侧栏、深色和浅色配色、实时仪表盘,在窄窗口和手机上也能正常排版。现在的版本是 v1.0.1,2026 年 10 月 26 日 10:37(北京时间)发布,提供 OpenWrt 25.12.6 的 APK 包和 24.10.8 的 IPK 包。
这篇我讲四件事:它长什么样,适合哪些版本,怎么安全地装上,还有哪些地方我还没验证过。文中的截图都是合成的演示数据,不代表设备性能,也不是真实的网络状态。
源码和文档都在上面这个仓库里。安装包在 Releases 页面下载,安装和签名验证的完整步骤在 INSTALL.md 里。
这款 OpenWrt 主题有哪些功能
Lumen 的功能我列在下面:
- 深色、浅色,或者跟随系统自动切换。
- 两种外观风格:
default和claude。 - 独立的 Lumen 仪表盘,有负载、带宽、连接三种实时图表。
- 表格、长文本、操作按钮和状态卡片都做了响应式处理,手机上也能看。
- 字体和 SVG 图标都打包在主题里,不连外部的字体 CDN 或图标服务。
- 界面有英文和简体中文。中文用的是标准的 LuCI PO 翻译文件,可以自己改。
- 可以手动检查 GitHub 上的新版本。它只给下载链接,不会自动安装。
如果你平时常用 Claude,可以在外观里把风格换成 claude 试试。不想换的话,一直用 default 就行。
路由器名称、硬件型号、接口和统计数据都从系统里读取。界面上显示的名称可以单独设置,只改显示,不改真实的主机名。
LuCI 原生页面我都保留了。Lumen 自己的页面都放在 admin/lumen/ 下面,不会覆盖系统原来的状态页。
Lumen 长什么样
下面三张图是我在仓库里放的截图,用的都是演示数据。先看深色模式下的仪表盘:

浅色模式的布局一样,只是换了配色:

手机上,卡片会竖着排成一列,侧栏收起来了。截图宽度是 390 px:

图里的 CPU、内存、流量和设备列表都是演示数据。截图页面没有连接路由器。
适合哪些 OpenWrt 版本
这款 OpenWrt 主题的 v1.0.1 只支持 ucode LuCI,旧的 Lua LuCI 用不了。这次构建的两个目标是这样的:
| OpenWrt 版本 | 包格式 | 架构 | LuCI 运行环境 |
|---|---|---|---|
| 25.12.6 | APK | noarch | ucode LuCI |
| 24.10.8 | IPK | all | ucode LuCI |
| 旧版 Lua LuCI | 不支持 | — | — |
架构无关不等于所有固件都能用。包格式和 LuCI 运行环境要和你的固件对得上。APK 和 IPK 不要混着装,也不要换系统的包管理器。OpenWrt 从 25.12 开始用 APK。
它依赖 luci-base、luci-mod-status 和 luci-theme-bootstrap。Bootstrap 是留着做回退用的。它不依赖代理、Docker 或广告过滤,也不挑硬件。中文包 luci-i18n-lumen-zh-cn 是可选的。
空间要留够。光字体就有大约 6.53 MB(未压缩),另外还有脚本、样式和模板,升级时也要临时空间。
厂商改过的 LuCI 页面,还有以后的新 LuCI 版本,都不在我验证过的范围里。
从 SDK 自己编译
如果你想自己编译,要用和固件版本匹配的 OpenWrt SDK 或源码树。v1.0.1 的目标 SDK 是 25.12.6 和 24.10.8。下面的命令在 SDK 或源码树的根目录执行:
./scripts/feeds update -a
./scripts/feeds install -a
git clone --branch v1.0.1 --depth 1 https://github.com/qidlek114/luci-theme-lumen.git package/luci-theme-lumen
make menuconfig
make package/luci-theme-lumen/compile V=s
在 menuconfig 里选 LuCI → Themes → luci-theme-lumen。要中文的话,同时打开 LuCI 的简体中文翻译。编译完会得到两个包:luci-theme-lumen 是主题本体,luci-i18n-lumen-zh-cn 是中文翻译。生成的包在 SDK 的 bin/packages/ 下面。
注意,Release 里的源码 ZIP 和 tar.gz 不能直接当 APK 或 IPK 装。
怎么安全安装
装第三方的 OpenWrt 主题,我建议先在备用设备或者能恢复的测试环境里试。装之前先看一下固件版本和剩余空间,再记下现在用的主题路径:
cat /etc/openwrt_release
df -h /overlay /tmp
uci -q get luci.main.mediaurlbase
安装包在 v1.0.1 Release 里下载。这些包是用官方 SDK 编译的第三方包,签名是 Lumen 项目自己的,不是 OpenWrt 官方签名。第一次信任公钥之前,最好通过你已经信任的渠道核对完整摘要。只对上 SHA-256 不能证明是谁发布的。HTTPS 证书校验和包签名校验都不要关。
APK:OpenWrt 25.12.6
APK 公钥是 lumen-apk.pub,DER 编码的 SHA-256 是 af8e18e2e8009552e711cff8c28eab28ed636ccb71f0ef01999dcf3f8582f41a。需要 curl、openssl、sha256sum 和支持 verify 的 apk。在路由器终端里执行下面这段,按提示输入 Release 里两个 APK 的完整文件名:
set -eu
printf 'Theme APK filename from v1.0.1 Release: '
read -r THEME_APK
printf 'Chinese APK filename from v1.0.1 Release: '
read -r ZH_APK
printf '%s\n' "$THEME_APK" | grep -Eq '^luci-theme-lumen[-_][A-Za-z0-9.+~_-]+\.apk$'
printf '%s\n' "$ZH_APK" | grep -Eq '^luci-i18n-lumen-zh-cn[-_][A-Za-z0-9.+~_-]+\.apk$'
task_dir=$(mktemp -d /tmp/lumen-apk.XXXXXX)
cd "$task_dir"
base='https://github.com/qidlek114/luci-theme-lumen/releases/download/v1.0.1'
for file in "$THEME_APK" "$ZH_APK" SHA256SUMS; do
curl -fL --proto '=https' --proto-redir '=https' -o "$file" "$base/$file"
done
curl -fL --proto '=https' --proto-redir '=https' -o lumen-apk.pub \
'https://raw.githubusercontent.com/qidlek114/luci-theme-lumen/v1.0.1/docs/keys/lumen-apk.pub'
openssl pkey -pubin -in lumen-apk.pub -outform DER -out lumen-apk.der
printf '%s %s\n' \
'af8e18e2e8009552e711cff8c28eab28ed636ccb71f0ef01999dcf3f8582f41a' \
'lumen-apk.der' | sha256sum -c -
awk -v a="$THEME_APK" -v b="$ZH_APK" '
$2 == a { na++; print }
$2 == b { nb++; print }
END { if (na != 1 || nb != 1) exit 1 }
' SHA256SUMS > selected.sha256
sha256sum -c selected.sha256
# The native signature authenticates the APK; the plain manifest alone does not.
mkdir trusted-apk-keys
cp lumen-apk.pub trusted-apk-keys/lumen-apk.pub
apk --keys-dir "$task_dir/trusted-apk-keys" verify "./$THEME_APK" "./$ZH_APK"
上面每一步都成功以后,再把项目公钥加进 APK 的信任目录。这样做表示以后也信任这把密钥。如果目录里已经有一个内容不同的同名文件,命令会停下来,不会覆盖:
mkdir -p /etc/apk/keys
if [ -e /etc/apk/keys/lumen-apk.pub ]; then
cmp -s lumen-apk.pub /etc/apk/keys/lumen-apk.pub
else
cp lumen-apk.pub /etc/apk/keys/lumen-apk.pub
chmod 644 /etc/apk/keys/lumen-apk.pub
fi
然后在同一个终端、同一个目录里安装:
# APK: run in the same shell and verification directory.
apk update
apk add "./$THEME_APK" "./$ZH_APK"
IPK:OpenWrt 24.10.8
IPK 公钥是 lumen-usign.pub,整个文件的 SHA-256 是 893c2871dbacbbcf61d5f83c7d5e130beedbbd4290b8c4cfcd09dfbc5c421860,key ID 是 feab778b1224810b。需要 curl、usign 和 sha256sum。本地装 IPK 时,opkg 不会帮你验证 SHA256SUMS.sig,所以这一步要自己做:
set -eu
printf 'Theme IPK filename from v1.0.1 Release: '
read -r THEME_IPK
printf 'Chinese IPK filename from v1.0.1 Release: '
read -r ZH_IPK
EXPECTED_KEY_SHA256='893c2871dbacbbcf61d5f83c7d5e130beedbbd4290b8c4cfcd09dfbc5c421860'
printf '%s\n' "$THEME_IPK" | grep -Eq '^luci-theme-lumen[-_][A-Za-z0-9.+~_-]+\.ipk$'
printf '%s\n' "$ZH_IPK" | grep -Eq '^luci-i18n-lumen-zh-cn[-_][A-Za-z0-9.+~_-]+\.ipk$'
printf '%s\n' "$EXPECTED_KEY_SHA256" | grep -Eq '^[0-9a-fA-F]{64}$'
task_dir=$(mktemp -d /tmp/lumen-ipk.XXXXXX)
cd "$task_dir"
base='https://github.com/qidlek114/luci-theme-lumen/releases/download/v1.0.1'
for file in "$THEME_IPK" "$ZH_IPK" SHA256SUMS SHA256SUMS.sig lumen-usign.pub; do
curl -fL --proto '=https' --proto-redir '=https' -o "$file" "$base/$file"
done
printf '%s %s\n' "$EXPECTED_KEY_SHA256" 'lumen-usign.pub' | sha256sum -c -
actual_key_id=$(usign -F -p lumen-usign.pub)
[ "$actual_key_id" = 'feab778b1224810b' ]
usign -V -p lumen-usign.pub -m SHA256SUMS -x SHA256SUMS.sig
awk -v a="$THEME_IPK" -v b="$ZH_IPK" '
$2 == a { na++; print }
$2 == b { nb++; print }
END { if (na != 1 || nb != 1) exit 1 }
' SHA256SUMS > selected.sha256
sha256sum -c selected.sha256
验证通过后,在同一个终端、同一个目录里安装:
# IPK: run in the same shell and verification directory.
opkg update
opkg install "./$THEME_IPK" "./$ZH_IPK"
如果包是下载到电脑上的,验证完以后到 LuCI 的 系统 → 软件包 上传安装,先装主题,再装中文包。装的必须是你验证过的那一份文件。更多细节看 INSTALL.md。
装完要手动启用
安装只会登记主题,不会自动切换过去。安装过程可能会清理 LuCI 缓存、重载 rpcd,重新登录一下就好。它不会重启网络、防火墙或代理,也不改 DNS。
接着到 系统 → 系统 → 语言和界面,手动选 Lumen。配色和界面名称在 Lumen → 外观 里调,仪表盘和实时图表在 Lumen 菜单下面。
默认的配置文件是 /etc/config/lumen:
config theme 'main'
option style 'default'
option mode 'auto'
style 可以填 default 或 claude。mode 可以填 auto、light 或 dark。可选的 hostname 和 model 只改界面上的显示,留空就读取设备的实际信息。
检查更新不会自动安装
打开 Lumen → 检查更新,点了按钮它才会去查。查询是你的浏览器直接访问 GitHub 的公开 API,不发送登录凭据或令牌,也不会定时轮询。
选好目标版本后,它会把当前版本之后、到目标版本为止的所有正式版说明都列出来。比如从 1.0.0 选到 1.1.0,中间的 1.0.1 和 1.0.2 也会显示。下载区只列出和当前包格式匹配的文件,下载以后也不会自动安装。
如果查询超时、被限流,或者数据不完整,页面会提示无法确定,不会告诉你已经是最新版。
装完不满意怎么退回
最稳的做法是先在 语言和界面 里切回原来的 OpenWrt 主题,再卸载。如果网页已经打不开,可以用现有的终端连接把界面切回 Bootstrap,这里只提交 LuCI 的界面配置:
uci set luci.main.mediaurlbase='/luci-static/bootstrap'
uci commit luci
刷新浏览器,确认原来的主题能用,再按包格式卸载。下面的命令假设中文包也装了:
# APK
apk del luci-i18n-lumen-zh-cn luci-theme-lumen
# IPK
opkg remove luci-i18n-lumen-zh-cn luci-theme-lumen
如果卸载时 Lumen 还是当前主题,卸载脚本会自动切回 Bootstrap。LuCI 基础包和回退主题不要删。网络、DNS 和代理的设置都不用动。
哪些我还没验证
这部分我想说清楚。两个 SDK 都编译成功了。APK 和 IPK 在隔离环境里做过签名校验安装、从旧测试包升级和卸载检查,UCI 配置都保留了。235 个运行时文件和源码对上了,168 条中文翻译也核对过。更新页在 Chromium 下用 320、390、1280 px 三个宽度检查过深色和浅色布局。
真机这边,我只在一台 OpenWrt 25.12.6 路由器上部署了更新页相关的 5 个界面文件,确认中文界面和手动查询 GitHub 都正常。真机没有用包管理器装过完整的发布包。隔离环境和真机都没有做过完整的开机或重启测试。
所以其他固件、厂商改过的 LuCI、第三方插件和各种浏览器组合,我都不能保证。完整的验证记录在 VALIDATION.md。遇到问题可以在 GitHub 上提 issue,写上固件、LuCI 和浏览器的版本,还有出问题的页面路径。截图记得去掉隐私信息。
如果你也喜欢折腾家里的设备,可以看看我之前写的 安卓电视去广告。想在本地跑大模型的话,可以看 DeepSeek 本地部署和硬件要求。