开源项目Halcyon Video 是一个将你的 Jellyfin 媒体库变成一个可自由行走的 1990 年代录像带租赁店的 3D 应用。它使用 three.js 构建,基于 Vite + TypeScript,并可选通过 Tauri 打包为桌面应用。
简单来说,它不是一个“带皮肤的菜单”,而是一个真实的店铺——你可以从停车场走进去,在货架间穿行,从墙上取下《回到未来》的录像带,翻过来看封底简介,拿到柜台结账,店员会把它装进一个会发出窸窣声的塑料袋里,然后你把它“带回家”在客厅的 VCR 里播放。
Jellyfin是啥?
简单来说,Jellyfin 是一个完全免费、开源的“私人媒体服务器”软件。
你可以把它想象成一个完全由你自己掌控、只为你和家人服务的“私人 Netflix”。
核心功能:它具体能做什么?
Jellyfin 的主要作用,是把你的数字媒体文件整理成一个方便访问的“私人影音库”,具体功能如下:
集中管理你的媒体库:把你散落在电脑硬盘里的电影、电视剧、音乐、照片、甚至有声书,全部收集并整理到一个统一的媒体库中。
自动获取影片信息:它能自动联网(通过“刮削”功能),为你的电影和电视剧下载匹配的海报、简介、演员表、评分等信息,让媒体库变得像专业流媒体平台一样精美。
随时随地在任何设备上播放:在你的电脑、NAS(网络存储设备)或树莓派上安装 Jellyfin 服务端后,你就可以通过手机、平板、电脑、电视、游戏机等设备上的客户端或浏览器,随时随地播放媒体库里的内容。
它和 Plex、Emby 有什么不同?
你很可能听过 Plex 或 Emby,Jellyfin 正是它们的开源、免费替代品。它们的核心区别在于:
Jellyfin:完全免费,且开源。没有“付费墙”,所有功能都对用户开放。
Plex / Emby:核心功能免费,但高级功能需要付费订阅。
此外,Jellyfin 非常注重隐私和控制权。它不依赖任何外部云端账户或服务,所有的媒体数据和你的观看记录都完全保存在你自己的设备上,不用担心数据被第三方收集。
当然,它的代价是需要你花一点点时间进行安装和初始设置。相比于 Plex 的“开箱即用”,Jellyfin 需要你具备一些动手能力。
这是一个真实运行在你们家客厅 HTPC 上的媒体服务器前端
打开浏览器,输入一串地址,你看到的不是海报墙,是一整间录像带租赁店。
你站在停车场,面前是砖墙门面,玻璃窗里贴着你收藏的电影海报。推门进去,日光灯嗡嗡响,货架一排排摆开,新 release 那面墙贴着金色“NEW RELEASE RENTAL $3”的招牌。你走到科幻区,手指划过一排 VHS 盒,抽出一部片子翻过来,封底印着真正的剧情简介、导演、演员、时长、评分,还有一串从你本地文件里读出来的技术规格——画幅比、HDR10 还是 Dolby Vision、几条音轨、哪些字幕。按一下演员名字,镜头直接把你带到那个演员的专属货架。挑好了,拿到柜台,店员把录像带塞进一个白色塑料袋里,袋子真的在你面前鼓起来、垂下去、晃了几下。结账出门。你回到客厅。录像带和收据摊在咖啡桌上。你把带子塞进 VCR,电影在房间的电视上开始播放。
这听起来像是一个复古游戏,或者某个独立游戏开发者的 demo 作品。
但它不是。
这是一个真实运行在你们家客厅 HTPC 上的媒体服务器前端,连接着你自己的 Jellyfin 影库,已经连续几个月成为一家人每晚选片的日常工具。项目叫 Halcyon Video,代码在 GitHub 上,GPL-3.0 开源。但你注意了——它不收 pull request。
一个开源项目,公开仓库,不接受任何人的代码贡献。
这件事本身已经够反常了。更反常的是你接下来会看到的细节。
你造了一间店,它闲着的时候什么都不干
所有做过程序员的人都懂一个常识:3D 应用是吃资源的。three.js 跑在浏览器里,渲染循环每秒 60 帧,GPU 温度往上蹿,风扇开始转,笔记本电池肉眼可见地往下掉。
Halcyon 的解决方式简单到粗暴:没人碰它的时候,它什么都不画。
渲染按需触发。你不动鼠标键盘,整个 three.js 的 requestAnimationFrame 循环直接停掉。天花板上的 CRT 电视暂停播放,环境音效静音,CPU 和 GPU 回落到接近零。屏幕上留着的只是最后一帧画面——静态的、不消耗任何算力的像素。
这不是什么“省电模式”或者“休眠策略”。这是从架构层面把“空闲”定义成“不干活”。每帧分配零内存,所有重复网格走 InstancedMesh,着色器在启动时预热完,运行期间没有任何东西需要编译。系统还自带一个动态分辨率缩放器,实时测量你显示器的真实刷新率来调整渲染负载。
你造了一间店。顾客走了,店就自动熄灯。但灯还是亮着的——只是不再费电了。
一个用 three.js 写的 3D 应用,长期空闲时 CPU 占用接近零。这句话放在五年前任何一个前端论坛里都会被当成笑话。现在它躺在 GitHub 的 README 里,一行白纸黑字。
一个塑料袋用了三百四十个节点
你拿起一盒录像带走到柜台。店员接过去,从柜台下面抽出一个白色塑料袋,把带子装进去。
袋子不是贴图,不是动画序列,是一个真实的布料模拟软体。
大约三百四十个节点组成的两片焊接塑料布,中间被一个冲切提手贯穿两层。录像带放进去,塑料网格被物理推挤变形,袋子表面鼓起一个盒子的形状。你拎起来,袋子在你的视野里下垂、摇晃、然后慢慢静止。静止之后物理求解器进入休眠——因为“这里没有任何东西允许在空闲时消耗瓦特”。
一个塑料袋,三百四十个节点的布料模拟。只是为了让你在虚拟店铺里买完东西拎走时,那个袋子看起来是真的。
你当然可以说这是炫技。但你也可以换个角度想:一个用 three.js 写媒体服务器前端的人,在塑料袋上砸了三百多个物理节点,然后专门写了一段代码让物理引擎在袋子不动的时候自动睡觉。
这个人的优先级跟普通开发者不太一样。
硬核模式:九十年代的租赁店把你锁在门外
Halcyon 默认就是个普通选片工具,随便看随便播。但它藏了一个开关,叫“Rental mode”,备注写着“hardcore”。
打开之后,规则变成九十年代录像带租赁连锁店的真实条款:工作日晚上限借两盒,第二天中午之前归还。周末限借四盒,周一早上八点之前归还。超期不还?店铺直接把你锁在外面——你连门都进不去,直到还清为止。
“锁在外面”不是比喻。你走到店门口,门打不开。屏幕上没有“你违规了”的弹窗,没有倒计时,没有付费解锁按钮。就是门锁了。你站在停车场,看着玻璃窗里面你借走的那些录像带还摆在柜台上,但你进不去。
还带要通过柜台侧面的“▼ RETURN TAPES HERE ▼”投递口,一盒一盒往里塞,每一盒都发出“哐当”一声。
这套系统是认真的。它读取系统时钟,区分工作日和周末,处理夏令时转换,打印一张带有实际归还时间的“DUE BACK”凭条。它不是开玩笑的复古皮肤,是一套完整的、有执行力的租赁规则引擎。
一个开源媒体服务器前端,内置了一个能把你自己锁在门外的租赁规则引擎。
为了什么?为了让你周五晚上从货架上拿下两盒录像带时,心里真的有一点点“明天中午前要还”的紧迫感。为了让你在虚拟店铺里的行为,跟你小时候在那个蓝色招牌的店里一模一样。
店员只会说真话,一句假的不说
店里有个店员。Doom 风格的定向精灵——五张手绘图,根据她面对的方向和你摄像头的夹角实时合成。她在店铺的真实平面图上行走,补货、在终端上打字、在收银台待机。
但你不用管她怎么走路。你要看的是她怎么说话。
货架边上有几个夹子,写着“ASK FOR RECOMMENDATIONS!”。你按一下,她会走到你站的位置,根据你所在的分区给你推荐一部片子。
推荐理由永远是真的。
不是“猜你喜欢”,不是协同过滤的黑盒输出,不是大语言模型生成的漂亮废话。推荐引擎只说自己能证明的话。比如:“你有三部异形电影”“因为你收藏了《盗火线》”——按导演、演员、制片公司、类型的顺序排列强度。它还会从你反复查看的片子中学习你的口味,带一个缓慢的衰减函数,让你随时间变化的偏好能跟得上。
整件事最反常的地方就在这里:这个店员是一个不会撒谎的推荐系统。
在 2026 年,任何一个做推荐的产品都在想方设法让你停留更久、点得更多、买得更勤。算法是黑箱,理由是编的,行为是操控的。而 Halcyon 的店员只说自己能证明的东西。它不生成任何虚假内容,因为生成虚假内容的那条代码路径根本不存在。
你不拥有的电影,在货架上是一个空盒子
连接 Jellyseerr 之后,店里多了一套机制。
你收藏了《异形》前三部,缺第四部?那第四部就站在货架上,是一个空盒子,角上贴着一个蓝色“REQUEST”标签。你选中它,标签当场变成金色“COMING SOON”,店员在旁边弹出一条提示说她帮你订了。
你没拥有的热门电影,不会被丢到一个“猜你喜欢”的角落里。它们被直接嵌在你的库存中间,跟你的片子摆在同一排货架上。店员推荐也基于你的观看历史,计算“喜欢此片的人也喜欢”列表的重叠度,重叠次数越高的排得越靠前。你自己已经拥有的推荐结果,货架上正常显示;你没拥有的,放在分类端架上,贴一个“FOR YOU”的星爆标签。
不感兴趣?长按方向键下,那个推荐盒子就从所有货架上永久消失。这个长按操作故意设计得比结账时长一点点,让你在按下去的过程中可以反悔。
这套逻辑背后有一个非常硬核的工程原则:没配置 Jellyseerr 的话,所有这些功能根本就不构建。代码里没有“if 未配置 then 隐藏”的分支。未配置就是不存在。店里的货架不会挂一个店员回答不了的“问我”按钮。
一台树莓派也能跑,而且不用 WebGL
你以为前面说的那些——三百四十个节点的布料模拟、第一人称行走、实时合成的店员精灵、动态日光 HDR 天空——这些东西只能跑在独立显卡上?
Halcyon 有第二个渲染模式,叫 2.5D 模式。
纯 HTML 和 CSS。没有 WebGL。没有 three.js 的下载。在树莓派上几乎瞬间加载。但视觉上仍然是一间录像带店,不是网格——每个封面都是立体盒子,带一个倾斜的书脊,你聚焦的时候书脊会朝你转过来。同样的主题、同样的新 release 墙、同样的分类、同样的发现行、同样的搜索终端、同样的封底详情弹窗。
3D 模式和 2.5D 模式可以在设置里无缝切换,不需要刷新页面。
这件事的反常识程度,取决于你对 WebGL 应用的性能预期有多低。一个 three.js 项目,跑在树莓派上,用纯 CSS 实现了“仍然是一间店”而不是“退化成表格”。
它甚至不叫“低配模式”或者“兼容模式”。它叫 2.5D 模式,是“同等的渲染方式”。
一个不收 PR 的开源项目
Halcyon Video 在 GitHub 上,GPL-3.0 许可证。你可以 fork,可以修改,可以部署你自己的店。
但项目不接受 pull request。
README 里写得清清楚楚:“源代码是开放的,开发过程不是。这是一个人为自己的客厅打造的产品,因为做出来效果不错所以分享出来——不是一个寻求贡献者的协作项目。”
Bug 报告欢迎,问题会回答。补丁、功能投票、委员会式设计,不是这个项目的模式。如果你想让它往另一个方向走,许可证允许你 fork 然后自己带它去那里。
这句话在开源社区几乎是一种禁忌。开源项目的惯例是“欢迎 PR”,哪怕实际上根本不 merge,面子上也要挂着这句话。Halcyon 直接说“我不收”。
而且它说得很有底气。因为这是一个已经在作者客厅里跑了几个月的产品。它不是 prototype,不是 proof of concept,不是“来帮我完善这个想法”。它是一个完整的、可运行的、每天被真实家庭使用的工具。作者不需要你帮他修 bug,不需要你帮他加功能,不需要你帮他设计下一版。
他要的只是把东西放在那里。你想用就用。你想改就 fork。但别往他的仓库里发 PR。
你可以在手机上逛同一间店,服务器替你渲染
HTPC 是渲染服务器。手机打开 /remote.html,实时画面和整个店铺的合成音轨通过 WebRTC 点对点传输。你的触摸操作实时回传成输入。
两种模式:共享镜像——你跟沙发上的人看到同一个店铺,操作同一个实例。私有实例——服务器为每个访客生成一个独立的 headless Chromium,运行完整的店铺。空闲几分钟后自动回收。因为按需渲染的设计,空闲实例不产生任何帧,captureStream 只在渲染循环实际绘制时才产生画面。
最弱的智能电视浏览器也能全画质行走——因为电视只负责解码视频流,渲染在服务器上完成。
这句话的意思是:你客厅里那台 HTPC 渲染了一间 3D 店铺,通过 WebRTC 把画面推到你手机浏览器上,你躺在床上逛店、选片、下单,然后 HTPC 上的播放器开始播片。
整个链条里,手机只是一个屏幕。算力在客厅。
把怀旧做成了工程,而不是皮肤
Halcyon 最反常识的地方,不是它用了 three.js,不是它做了布料模拟,不是它不收 PR。
是它把“怀旧”当成一个工程问题来解决,而不是一个皮肤问题。
大多数复古产品做的是视觉——像素字体、扫描线、磁带图标。Halcyon 做的是行为。店铺的平面布局有三种(人字形、直线型、对角线)。装修年代有四种(1990 招牌+VHS、1993 装饰带、2000 拱形牌匾、2010 DVD 黑色线框货架)。光照有三种(白天、日落、夜晚,基于真实太阳位置的 HDR 天空)。介质可以在 VHS 和 DVD 之间切换,整个店铺的封面全部重排。
这些不是预设方案。它们是独立设置,任意组合都生成一间可以走进去的店。
连品牌都是数据驱动的。项目内置了一个虚构连锁品牌“Halcyon Video”,但整个视觉身份——标志、颜色、字体、招牌、租赁包装——全部是数据而非硬编码。你把一个 SVG 或透明 PNG 丢进指定文件夹重启应用,标志会自动出现在店招、品类牌、租赁盒、购物袋、会员卡、POS 终端等所有位置。更深的品牌包可以控制调色板、字体、矢量徽章路径、每块招牌的独立内容。项目甚至内置了一个品牌编辑器,在设置里直接调。
你小时候常去的那家蓝底金字、招牌缺了一角的店,你可以用这套系统重建它。而且重建的结果会留在你本地,在你和你自己的怀旧之间。
这是一个把情感记忆翻译成配置文件的工程。
周五晚上,新片上映,满满一袋
项目的名字叫 Halcyon。这个词的意思是“太平盛世”——一段被回忆为幸福安宁的时光。
README 最后一段是这么写的:“周五晚上,新片上映,满满一袋。这就是整个应用想要唤起的感受。”
这句话不是一个营销口号。它是一个功能列表的终点。所有那些技术选型、架构决策、性能优化、物理模拟、推荐引擎、品牌系统——最终指向的唯一目标是:让你在 2026 年打开浏览器的时候,心里闪过一下 1994 年周五晚上的那种感觉。
这可能是整个项目里最反常识的一件事。
一个软件工程项目的最终验收标准,不是测试覆盖率,不是 benchmark 分数,不是用户留存率。是一个感受。
而且它真的做到了。
总的来说,Halcyon Video 是一个将怀旧体验与实用媒体浏览深度结合的项目。它不是炫技 demo,而是一个真实家庭每晚选片已经用了数月的日常工具。从物理模拟的塑料袋到基于真实影库的店员推荐,每一个细节都在为“像 90 年代一样租电影”这个核心体验服务。