Garmin watch photo album

WristAlbum

手机端裁切和发布手表尺寸图片,手表端下载 manifest 和图片缓存。原图与相册列表留在本地,云端只承载导出的同步素材。

Phone to watch

同域 Next.js 前端与 API

wristalbum.wristtale.com 同时承载落地页、应用 API 和 R2 素材分发。Flutter 只调用 API 路径,手表只下载相册素材路径。

01

手机端选择本地照片

原图、相册列表和编辑状态只保存在手机本地,不进入云端。

02

按手表屏幕裁切

裁切框使用当前连接设备的屏幕尺寸和形状,让预览尽量贴近手表显示。

03

仅上传导出图

上传的是压缩后的手表尺寸图片,Worker 校验大小、格式、哈希和配额。

04

手表下载 manifest

Flutter 发送 manifest URL 和下载指令,手表也可以在已配对后手动重新下载。

Local-first

只把手表需要的裁切图放到云端

WristAlbum 的云端状态保持很薄:上传意图、限流计数、裁切后的图片对象和当前 manifest。用户原始照片、相册选择、排序和编辑数据仍由 Flutter 应用本地保存。

这样可以先避开账号系统,把安全边界收敛到 install token、album token、对象校验、上传限额和图片尺寸限制上。

Implementation model

为 Garmin 同步路径保留余量

No account for MVP

使用本地安装身份和长随机 album token 保护写入链路,避免一开始引入账号系统。

R2 asset delivery

图片和 manifest 通过 wristalbum.wristtale.com 同域分发,便于手表端直接访问。

Watch-first image path

正常路径使用 Connect IQ 网络图片请求,由手表端拿到设备可用的 bitmap。