Immich官方App不够用,我干脆自己写了一个
之前聊了在NAS上部署Immich服务端的事儿,跑得确实挺稳。但用着用着吧,对官方那个App越来越不满意——功能就那么几个,界面也比较素,很多我想要的东西它都没有。后来一想,反正Immich的API全部是开放的,那我干嘛不自己写一个?
从动念头到现在搞了好几个月了,用UniApp加Vue 3,把Immich的REST API翻了个遍。成品72个页面,21个公共组件,已经迭代到1.0.12版本。做着做着就刹不住车了,照片管理只是起点,小说写作、AI聊天、公众号运营全给塞进去了,变成了一个什么都能干的”超级App”。底部五个Tab——照片、相册、写作、搜索、我的——光听这排列你就知道,它已经不只是个相册客户端了。

官方App差在哪了
Immich的官方App是Flutter写的,能用,但好几个地方一直让我不太爽。暗色主题切换比较粗糙、相册管理太简单、搜索体验一般、标签功能几乎没做、照片堆叠管理没有、视频编辑更别提了。这些单独拎出来都不算大毛病,但堆在一起用着就是差点意思。
再加上我平时还在搞小说写作和公众号运营,每次在手机上切三四个App才能干完活。要是一个App全搞定多好?这念头一冒出来就按不住了。
界面重做了,不只是换个皮
UI这块是真花了心思。72个页面全部关掉了原生导航栏,自己写了一套navbar组件替代——标题、返回按钮、右侧按钮全部可定制,状态栏高度和安全区域自己算。麻烦是麻烦了点,但换来了每个页面样式完全可控,值。
主题系统做了完整的亮色和暗色两套,不是简单地把背景变黑那种。而是用CSS变量定义了一整套色彩体系——主色、背景色、卡片色、文字色、边框色、阴影、分割线,全都有对应的暗色版本。亮色主色用的 Material 蓝,暗色稍微提亮一点。底部TabBar选中色用了翠绿色,图标全部iconfont矢量字体,加载快体积小。SCSS那边还定义了完整的字号层级、间距系统、圆角规范、阴影层级、动画时长,整个设计系统是统一的。
照片时间线是整个App最复杂的页面之一。做了虚拟滚动,按月和日分桶加载数据,不会一次性把几万张照片的DOM全渲染出来。加载过程有骨架屏占位动画,不是白屏干等。长按进入多选模式,可以批量删除、分享、创建堆叠、添加到相册。导航栏右上角有个上传按钮,实时显示备份队列数量和上传动画,随时能看到同步状态。
登录页面也不是随便糊的。支持多账号历史记录一键切换,做了”双地址模式”——可以同时填内网和外网两个地址,App启动时自动ping内网,通了就走内网秒开,不通就切外网。在家在外无缝衔接,这个功能我自己用着贼爽。

Immich的API我基本翻了个遍
Immich提供的API能力其实比官方App展现出来的多很多。我把能用的接口基本全对接了——认证登录、时间线分桶、资源增删改查、缩略图原图视频播放、相册管理、人脸人物、搜索、回收站、收藏归档、地图标记、回忆、标签、伴侣、堆叠、通知、共享链接、会话管理、服务器统计……光API封装文件就写了上千行。
相册管理做了创建编辑删除、添加移除照片、设置封面、管理共享用户。还做了文件夹视图按原始路径浏览,外部导入过照片的人会觉得这个很好用。人脸识别这块人物列表、合并拆分、隐藏人物、按人物统计照片数量都有。地点浏览按拍摄位置分组,旅行照片回顾的时候特别方便。
标签系统是官方App几乎没做的功能,我做了完整的标签列表、标签详情、批量打标签。照片堆叠多张相似照片叠成一组只显示最好那张,创建、拆分、管理全都支持。管理员功能也做进来了——用户列表、创建编辑用户、服务器存储统计,手机上就能管理Immich后台。

整理图库这套工具,官方完全没有
在”我的”页面下面做了一整套图库整理工具,这个是我比较得意的部分。
重复项检测——调用Immich的重复检测API,把相似照片找出来让你选择保留哪张。我传照片的时候经常不小心传重复了,这功能帮我清理了好几百张。大文件查找——按文件大小排序,一眼看到哪些视频最占空间,4K随手录的那种好几个G的,不要的就删了。坐标位置管理——没GPS信息或者GPS错的照片可以手动修正。
释放空间——备份完的照片可以从手机本地删除只保留云端,腾手机存储。锁定文件夹——Immich的PIN锁功能,私密照片放进去要输PIN码才能看,我做了完整的PIN设置修改、内容浏览、单独的时间线展示,比官方那个精细不少。


从看照片到改照片——编辑和幻灯片
照片详情页进场用了fade-in动画,看着舒服。能查看完整EXIF信息、收藏、归档、添加到相册、生成分享链接、查看活动记录这些都是标配。
官方App完全没有编辑功能,我做了图片裁剪旋转,还单独做了一个视频剪辑页面。不指望跟专业工具比,但简单处理一下不用额外开App了。
幻灯片功能选一批照片自动轮播。过年在电视上投屏放家庭照片合集,长辈们看得挺开心的,这功能做完之后觉得值了。

Android备份这块,坑最多
备份是整个App里最折腾的部分,没有之一。UniApp不是原生框架,很多底层能力得自己想办法。
写了一个Android原生插件叫 Immich-ForegroundService,用前台服务保活备份进程。不然App一进后台系统过会儿就给杀了,备份跑一半断掉。有了前台服务,状态栏挂一个常驻通知,系统就不会轻易回收了。
上传走的是OkHttp原生multipart而不是UniApp自带的上传方法。因为uni.uploadFile处理大文件不太稳,关键是会丢EXIF信息——拍摄时间、GPS坐标这些元数据全没了,传上去的照片就变成了没有任何信息的图片文件。用OkHttp直接传二进制流,EXIF完整保留,速度也快,失败了才回退到uni.uploadFile兜底。
还做了AlarmManager定时唤醒。即使App被杀了,手机充电连WiFi的时候AlarmManager也会把它唤醒执行备份检查。从后台恢复超过3分钟也自动触发一次扫描。App回到前台的时候会自动降低上传速度,优先保证操作流畅;进入后台就全速跑。
备份设置里可以选文件夹、仅WiFi、充电才备份这些策略。传输管理页面能看到队列和进度。整套备份做下来,日常真的不用操心了,拍了照片回家充电就自动传了。



网络层下的功夫比UI还多
NAS在家里嘛,外网访问有各种奇怪的网络环境,不做兜底迟早翻车。
DoH(DNS over HTTPS)——有些网络DNS解析会被劫持或者特别慢,做了DoH支持,通过阿里云、腾讯云或者Cloudflare的HTTPS接口解析域名,绕过本地DNS。外面用公共WiFi的时候这个功能救过我好几次。IPv4/IPv6直连——解析出IP后直接用IP加Host头访问,跳过系统DNS缓存,避免地址切换不及时。
内外网双地址自动切换前面提了,App启动和每次回前台时都会检测网络环境,自动切换。Immich和小说后端的地址同步切换,不用分别配。连接模式学习——App记住上次成功的连接方式,下次优先用,减少重试。下载也做了多路回退——原生下载器、框架下载、DoH下载轮着试。
离线操作队列——没网的时候收藏、删除这些操作先记下来,有网了自动同步。还做了一个网络诊断页面,连接有问题的时候能看到到底哪一步不通。
光网络相关的代码大概占了整个项目三分之一,但也正因为做了这些,不管什么网络环境App都能正常用,这个对我来说很重要。


顺手做的那些小功能
系统分享接收——微信、QQ里的图片可以直接分享到这个App上传到Immich,不用保存本地再手动导入。伴侣共享——和另一半共享照片时间线,看到对方今天拍了什么。回忆——”那年今日”功能,卡片式展示去年今天拍的照片,偶尔翻到会有点感触。
智能搜索支持Immich的CLIP和元数据两种模式。CLIP搜索可以打”海边的狗””红色衣服”这种自然语言真的能搜到对应照片,元数据搜索可以按文件名、日期、相机型号过滤。
图片缓存预热——Immich缩略图请求要带Token,系统缓存不太好使,我写了image-cache模块启动时预热,滑时间线明显更快了。应用内自动更新——有新版本直接在App里提示下载安装。
不只是相册——写作、AI、公众号全塞进来了
这部分跟Immich其实没关系了哈哈,纯粹是懒得开好几个App。
TabBar第三个”写作”,点进去是一个完整的小说创作工作台——新建小说、编辑章节、管理大纲、设定角色、搭建世界观,还有AI写作中心让AI帮忙续写改写。小说搜索和在线阅读也做了,相当于自带了个简易版阅读器。这些全部对接的是我自己的ThinkPHP后端,跟Immich共用一个App壳子,两套账号体系各管各的。
AI模块做了聊天对话、视觉识别、自拍流、图片生成以及视频生成。ai配置基本涵盖了大部分免费api了,没办法,我就是白嫖党。还接入了本地ollama以及comfyui来玩。后端通过WebSocket推送流式输出,手机上实时看到AI一个字一个字蹦出来。公众号管理做了软文编辑预览、赛道管理、定时发布、热点追踪,出门想看数据或者紧急改文章,手机上就能搞定。甚至还塞了个TVBox聚合源配置,管理视频源地址——这已经完全跑偏了,但谁叫这些都是我每天要用的呢。




“我的”页面信息量有点大
顶部用户头像名称邮箱,下面照片视频已用空间统计。再往下是分组的功能菜单——整理图库、图库管理、回收站、备份设置、传输管理、伴侣共享、锁定文件夹、通知、会话管理、服务器信息、网络诊断、账号安全、设置、关于。登录了小说后端的话还多出小说配置和TVBox入口,管理员账号还能看到用户管理,直接在App里增删改用户。
大概数了一下,光”我的”下面的入口就有二十多个。有时候我自己都觉得功能有点多了,但每个都是真的在用,删不掉。

回头看这个项目,从”做一个好用一点的Immich客户端”开始,到后面变成了一个什么都往里塞的超级App,大概就是程序员的通病吧——总觉得还差一个功能就完美了。备份模块和网络层的坑一个接一个,但做完之后每天打开手机就一个App解决照片管理、小说写作、AI工具、公众号运营,这种All in One的感觉确实挺爽的。
Immich的API开放性是这一切的基础。你不满意官方的实现?那就自己写一个呗,反正接口都在那摆着。不一定非得搞72个页面这么夸张,但自建的乐趣就在于——代码是自己的,想怎么改就怎么改。后面有空再写一篇讲讲Android后台保活那些坑吧,光那个就够聊一篇了。
有对这个自建app感兴趣的可以留言,我会放出来给大家玩玩
夜雨聆风