这是一个面向 FnDepot 的第三方 fnOS 应用源,使用 FnDepot V2 源格式。清单文件是仓库根目录的 fnpack.json。
在 FnDepot 的“应用源”页面添加以下任一地址:
- GitHub 仓库地址(推荐):
https://github.com/latte03/fnos-apps - 清单直链:
https://raw.githubusercontent.com/latte03/fnos-apps/main/fnpack.json
仓库必须保持公开,FnDepot 才能无鉴权读取。GitHub 源会优先读取默认分支根目录的 fnpack.json;文件名大小写必须完全一致,客户端不会探测 fndepot.json。
| 应用 | appname | 架构 | 版本 | 上游 |
|---|---|---|---|---|
| 磁盘瞭望 DiskLens | DiskLens |
x86 / arm | 0.3.3 | JoySec123/DiskLens |
| 飞牛夸克下载器 | fnos-quark |
x86 / arm | 0.7.12 | ElyDemiurge/fnOS-quark |
| 飞牛影视在线扩展 | fnmedia-ext |
all | 0.2.0 | yujian0815/fnmedia-ext |
| 抖音下载 | DouyinDL |
all | 1.0.5 | Zyc009234/fnos-douyin-dl |
| RustFS | rustfs-fnos |
all | 1.0.4-2 | a10463981/rustfs-fnos |
| NAS 管家 | deskicons |
x86 / arm | 0.3.6 | kaf931/fnos-manager |
| QAS 控制台(夸克自动转存) | qas |
x86 | 0.3.7 | latte03/quark-auto-save |
七个应用的安装包都直接引用上游 GitHub Release,并用 sha256 与 size 锁定;本仓库只保存清单、图标和说明。上游发布新版本后,定时工作流会更新清单。
fnmedia-ext 是 MIT、纯 Python 的 all 架构应用,本源默认使用完整版(含 TVBox 运行时);0.8 MB 的公开精简版在应用详情页给出直达链接。
fnOS-quark 使用专有许可,明确禁止复制、镜像或再发布软件本体,因此本仓库不复制它的 FPK、官方图标或截图:安装包只引用官方 Release,预览图直接链接上游,应用图标使用本源自制的通用云下载占位图。
DouyinDL 未提供开源许可证,默认保留所有权利;本源同样不复制它的图标或素材,图标使用自制的通用视频下载占位图。它依赖 nodejs_v22,分享链接下载还需要 NAS 安装 Chromium,服务端口为 8866。
RustFS 是由社区(a10463981)打包的 RustFS for fnOS,上游 RustFS 本体以 Apache-2.0 发布,本仓库直接使用其安装包内图标。它依赖 Docker,安装与升级时需要能访问容器镜像仓库;包内没有架构相关二进制,一个 all 包同时用于 x86 与 ARM(ARM 上游未做真机验证)。
deskicons(NAS 管家)未提供开源许可证。应用图标直接取自上游安装包(与安装后 NAS 上的 /vol1/@appcenter/deskicons/ui/images/icon_256.png 一致),预览图链接上游 docs/ 截图。它依赖 nodejs_v22,没有固定 TCP 端口,并且在 FPK 里声明以 root 运行(管理容器、计划任务、SSH 与存储文件需要),安装前请确认接受这一点。
qas(QAS 控制台)以 AGPL-3.0 发布,是源作者自己的项目;本仓库直接使用其安装包内图标。它是原生 Go 应用(不是 Docker 应用),仅发布 x86 安装包,服务端口为 8710。
{
"schema_version": "2",
"source_info": {
"name": "源名称",
"author": "源作者",
"homepage": "https://example.com",
"description": "源简介"
},
"apps": {
"sample.app": {
"display_name": "示例应用",
"desc": "应用简介。",
"platform": ["all"],
"categories": ["系统工具"],
"icon_url": "./apps/sample.app/icon.png",
"run_as": "package",
"install_type": "",
"is_docker": false,
"releases": {
"1.0.0": {
"packages": {
"all": {
"download_url": "https://example.com/sample.app-1.0.0.fpk",
"sha256": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"size": 12345678
}
}
}
}
}
}
}schema_version 必须是字符串 "2";数字 2、"2.0"、"2.1" 都会被拒绝。source_info.name 与 source_info.author 必填。
apps 的键就是 FPK manifest 里的 appname,大小写敏感,只能使用字母、数字、点、下划线和短横线,且必须以字母或数字开头。
| 字段 | 必填 | 说明 |
|---|---|---|
display_name |
是 | 应用显示名称 |
desc |
是 | 应用简介,支持 HTML 文本 |
platform |
是 | 字符串或数组,只允许 all、x86、arm |
categories |
是 | 固定分类,最多两个,第一个为主分类 |
icon_url |
是 | 图标地址,PNG 或 WebP,建议小于 500 KB |
run_as |
是 | 只允许 package 或 root |
install_type |
是 | 空字符串表示存储空间,root 表示系统空间 |
is_docker |
是 | 必须是布尔值 |
releases |
是 | 版本映射,单文件模式必填 |
preview_urls |
否 | 预览图数组,最多读取前 8 张,单张小于 2 MB |
readme_url |
否 | 详情页 README 地址,小于 1 MB |
bug_report_url |
否 | 问题反馈地址 |
maintainer / maintainer_url |
否 | 上游维护者与链接 |
distributor / distributor_url |
否 | 分发者与链接 |
service_port |
否 | 服务端口,没有 TCP 端口时留空字符串 |
details_url / details_updated_at |
否 | 拆分详情文件模式,本仓库未使用 |
i18n |
否 | 名称与简介的本地化 |
固定分类只有九个:影音娱乐、系统工具、编程开发、AI赋能、生活服务、智能智控、教育学习、游戏地带、硬件驱动。不要填写“全部”。
releases 的键是可比较的版本号,推荐 SemVer,不能使用 latest 或日期文本。每个版本的结构:
{
"changelog": "本次更新内容。",
"updated_at": "2026-10-20T05:24:31Z",
"os_min_version": "1.1.31",
"os_max_version": "",
"packages": {
"x86": { "download_url": "...", "sha256": "...", "size": 12345678 },
"arm": { "download_url": "...", "sha256": "...", "size": 12345678 }
}
}packages的键只能是all、x86、arm;其他键会让版本校验失败。- 每个架构分支必须有
download_url;sha256为 64 位十六进制,size为字节数。 - x86 设备按
packages.x86→packages.all回退;arm 设备按packages.arm→packages.all回退。 - 字段合并顺序为:应用级 → 版本级 →
packages.all→packages.[当前架构]。 download_url不会从其他架构分支继承。
- 主清单约 2 MB,拆分详情文件约 512 KB,单源最多 5,000 个应用、单应用最多 100 个版本。
- 源级错误(JSON 语法、顶层结构、
schema_version、缺少source_info)会中止整次同步,但保留旧缓存。 - 应用级错误只跳过该应用;版本或安装包级错误只跳过该分支,并回退到
all。 - 相对 URL 按清单文件所在目录解析,也可以直接写绝对 URL。
完整规则以上游 FnDepot README 为准。
.
├─ fnpack.json # FnDepot V2 源清单
├─ apps/
│ ├─ DiskLens/
│ │ ├─ icon.png # 256 × 256 PNG 图标
│ │ └─ README.md # 详情页说明
│ ├─ fnos-quark/
│ │ ├─ icon.png # 本源自制的通用占位图标
│ │ └─ README.md # 详情页说明
│ ├─ fnmedia-ext/
│ │ ├─ icon.png # 上游 MIT 图标
│ │ └─ README.md # 详情页说明
│ ├─ DouyinDL/
│ │ ├─ icon.png # 本源自制的通用占位图标
│ │ └─ README.md # 详情页说明
│ ├─ rustfs-fnos/
│ │ ├─ icon.png # 上游安装包内图标(Apache-2.0)
│ │ └─ README.md # 详情页说明
│ └─ deskicons/
│ ├─ icon.png # 上游安装包内图标
│ └─ README.md # 详情页说明
│ └─ qas/
│ ├─ icon.png # 上游安装包内图标(AGPL-3.0)
│ └─ README.md # 详情页说明
├─ scripts/
│ ├─ lib/upstream.mjs # 各同步脚本共用的上游 pin 自愈逻辑
│ ├─ sync-disklens.mjs # 跟随 DiskLens Release 更新清单
│ ├─ sync-fnos-quark.mjs # 跟随 fnOS-quark Release 更新清单
│ ├─ sync-fnmedia-ext.mjs # 跟随 fnmedia-ext Release 更新清单
│ ├─ sync-douyin-dl.mjs # 跟随 DouyinDL Release 更新清单
│ ├─ sync-rustfs.mjs # 跟随 RustFS Release 更新清单
│ ├─ sync-fnos-manager.mjs # 跟随 NAS 管家 Release 更新清单
│ ├─ sync-qas.mjs # 跟随 QAS 控制台 Release 更新清单
│ └─ validate.mjs # 按 V2 规则校验
└─ .github/workflows/
├─ sync-apps.yml # 每日检查七个上游的新版本
└─ validate.yml # push / PR 时校验清单
七个同步脚本分别跟随各自的上游 Release:
sync-disklens.mjs找到DiskLens-<version>-amd64.fpk与-arm64.fpk,读取仓库内fnos/manifest核对appname、版本、名称、简介和 changelog。sync-fnos-quark.mjs找到fnos-quark-<version>-x86_64.fpk与-arm64.fpk。上游只发布 FPK,脚本会下载 x86_64 包,从包内manifest读取appname、application_version、display_name、desc、service_port、os_min_version,并从config/privilege读取run_as。sync-fnmedia-ext.mjs默认找到完整版fnmedia-ext-<version>-full.fpk;加--slim可切到公开精简版fnmedia-ext-<version>.fpk。它从包内manifest读取appname、version、platform、display_name、desc、os_min_version,并从config/privilege读取run_as。sync-douyin-dl.mjs读取固定文件名DouyinDL.fpk,从包内manifest读取appname、version、display_name、desc、service_port、os_min_version、changelog,并从config/privilege读取run_as。sync-rustfs.mjs找到rustfs-fnos-<version>-all.fpk,从包内manifest读取appname、version、platform、display_name、desc、service_port、os_min_version,从config/privilege读取run_as,从config/resource判断是否为 Docker 应用;changelog 优先取 Release 正文。sync-fnos-manager.mjs找到NAS.-<version>-x86_64.fpk与-arm64.fpk(上游 tag 不带v前缀)。上游同样只发布 FPK,脚本会下载 x86_64 包,从包内manifest读取appname、version、display_name、desc、platform、os_min_version,并从config/privilege读取run_as;预览图按同步到的 tag 指向上游docs/images/readme/的截图。sync-qas.mjs找到qas_<version>_x86.fpk,从包内manifest读取appname、version、platform、display_name、desc、service_port、os_min_version、changelog,并从config/privilege读取run_as。
七者都会读取 GitHub 提供的 sha256 摘要(缺失时下载文件自行计算),把新版本写入 fnpack.json,保留已有版本并按发布时间倒序排列。历史版本的校验值也会自动核对:上游在原 tag 重传资产时刷新 size/sha256,上游删除的版本则从清单移除,这段逻辑在 scripts/lib/upstream.mjs 里由各脚本共用。
node scripts/sync-disklens.mjs
node scripts/sync-fnos-quark.mjs
node scripts/sync-fnmedia-ext.mjs
node scripts/sync-fnmedia-ext.mjs --slim
node scripts/sync-fnmedia-ext.mjs --dry-run
node scripts/sync-fnmedia-ext.mjs --tag v0.2.0
node scripts/sync-fnmedia-ext.mjs --fpk /path/to/fnmedia-ext-0.2.0-full.fpk
node scripts/sync-fnmedia-ext.mjs --proxy https://gh-proxy.com/
node scripts/sync-fnmedia-ext.mjs --force
node scripts/sync-douyin-dl.mjs
node scripts/sync-douyin-dl.mjs --dry-run
node scripts/sync-douyin-dl.mjs --tag v1.0.5
node scripts/sync-douyin-dl.mjs --fpk /path/to/DouyinDL.fpk
node scripts/sync-douyin-dl.mjs --proxy https://gh-proxy.com/
node scripts/sync-douyin-dl.mjs --force
node scripts/sync-rustfs.mjs
node scripts/sync-rustfs.mjs --dry-run
node scripts/sync-rustfs.mjs --tag v1.0.4-2
node scripts/sync-rustfs.mjs --fpk /path/to/rustfs-fnos-1.0.4-2-all.fpk
node scripts/sync-rustfs.mjs --proxy https://gh-proxy.com/
node scripts/sync-rustfs.mjs --force
node scripts/sync-fnos-manager.mjs
node scripts/sync-fnos-manager.mjs --dry-run
node scripts/sync-fnos-manager.mjs --tag 0.3.6
node scripts/sync-fnos-manager.mjs --fpk /path/to/NAS.-0.3.6-x86_64.fpk
node scripts/sync-fnos-manager.mjs --proxy https://gh-proxy.com/
node scripts/sync-fnos-manager.mjs --force
node scripts/sync-qas.mjs
node scripts/sync-qas.mjs --dry-run
node scripts/sync-qas.mjs --tag v0.3.7
node scripts/sync-qas.mjs --fpk /path/to/qas_0.3.7_x86.fpk
node scripts/sync-qas.mjs --proxy https://gh-proxy.com/
node scripts/sync-qas.mjs --force已存在的版本在下载地址不变(即上游原地重传)时会自动刷新校验值;下载地址变化时默认报错退出,需要 --force 才会覆盖。GitHub Actions 每天 03:17 UTC 运行一次,也可以在 Actions 页面手动触发,并可用 disklens_tag / quark_tag / fnmedia_tag / douyin_tag / rustfs_tag / manager_tag / qas_tag 指定上游版本;工作流会在提交前用 GitHub Release API 的 digest 字段核对全部安装包的 sha256 与 size(非 GitHub 地址或 API 未提供 digest 时回退为下载核对)。GitHub 可能在仓库连续 60 天无活动后暂停定时工作流,届时在 Actions 页面手动运行 Sync app sources 即可。
- 新建
apps/<appname>/,放入icon.png(PNG/WebP,小于 500 KB)和可选的README.md。 - 在
fnpack.json的apps下增加条目,键必须与 FPK manifest 的appname完全一致。 - 至少写入一个版本;每个架构分支填写
download_url、sha256、size。 - 运行
node scripts/validate.mjs,再提交。
jq empty fnpack.json
node scripts/validate.mjs
node scripts/validate.mjs --remote # 额外下载安装包核对摘要,较慢
git diff --checkvalidate.mjs 会检查顶层结构、必填字段、分类与架构取值、版本号、安装包分支、本地图标/说明文件的类型与大小,以及 sha256 格式和 size 是否为非负整数。
- 本仓库只提供索引与元数据。应用版权归各自上游所有;DiskLens 与 fnmedia-ext 以 MIT 许可证发布,RustFS 及其社区应用包、qas 以 Apache-2.0 / AGPL-3.0 发布,fnOS-quark 为专有软件,DouyinDL 与 deskicons 未提供 LICENSE、默认保留所有权利。
- 安装包引用上游 Release 地址。上游在原 tag 重传资产时,同步脚本会自动刷新
size/sha256;上游删除某个版本时,该版本会从清单移除,保证清单里的下载地址始终可用。镜像前请先确认上游许可证是否允许(DiskLens、fnmedia-ext、RustFS、qas 可以;fnOS-quark、DouyinDL、deskicons 需要先联系作者)。 - fnmedia-ext 依赖官方「影视」(
trim.media)保持安装并启用;DouyinDL 与 deskicons 依赖nodejs_v22(FPK manifest 已声明),DouyinDL 的分享链接下载还需要 NAS 安装 Chromium;RustFS 依赖 Docker 与容器镜像仓库访问。这些依赖由 fnOS 或用户环境处理,FnDepot 只负责下载安装包。 - deskicons 在 FPK 中声明以
root运行,用于容器、计划任务、SSH 和存储文件等系统级操作。 - fnOS-quark 和 DouyinDL 的预览图直接链接上游(如有),应用图标是本源自制的通用占位图,不是上游官方素材;RustFS、deskicons 与 qas 的图标取自各自上游安装包(deskicons 与安装在 NAS 上的图标一致)。
- 源名称、简介与字段规则可能随 FnDepot 更新;升级客户端后建议重新检查上游 README。