星助天文摄影师的管家

0. 先和大家打个招呼吧 :waving_hand:
我是个 白天写代码、晚上扛赤道仪 的普通开发者,StartTooler 不是为了拿奖做的,是为了 解决我自己拍星时真实的痛苦 。很高兴能借这次活动把它完整公开出来,也感谢 TRAE 陪我把这事儿从「脑子里的画面」一步步推到了「可以发出去让别人用」。

我是怎么和 TRAE「配合」做出 StartTooler 的

我没有正经在大厂待过,算是野生程序员——做 StartTooler 的起因特别朴素: 一次出摊拍了 200 多张深空照片,回来发现文件全散在相机 SD 卡、手机和主力机三个地方,挨个改名、打标签、备份到 OSS 折腾到凌晨三点 。那一晚我跟自己说:「我需要个工具,装在桌面角落,替我把这些破事全兜了。」

脑子里有想法,但落到代码上就是另一回事 ——MVVM 怎么分?SQLite 表结构怎么设计?Go 中转怎么和 C# 桌面端对协议?以前遇到这种问题,要么 Google 半天,要么硬啃文档到深夜。 而这次,我打开了 TRAE 。

一句句话讲给 TRAE 听

我没有一次性甩给它一份完整 PRD,而是 像跟一个耐心的搭档聊天一样,一句一句往里加细节 :

  • 第一次,我只说:「我想做个管理天文照片的桌面 App,要能按拍摄日期分组浏览。」
  • TRAE 帮我拆出「数据层 → 服务层 → ViewModel → View」的四层骨架,给了 SQLite 表结构初稿、Avalonia 页面布局建议,还顺手提醒我「缩略图要异步生成,否则扫一次目录能卡 30 秒」。
  • 第二次,我补一句:「灯箱要支持非模态,能同时开好几张对比。」
  • 它直接给出 LightboxViewModel 的状态机草稿 + 翻页时自动保存标签的实现思路,还主动列出 3 个我没想到的边界 case(全屏退出后焦距丢失、缩放超过 5x 后的内存增长、键盘翻页和缩放的快捷键冲突)。
  • 第三次,我说:「我还要在 VPS 上跑个 Go 中转,让手机在野外没 WiFi 也能把照片传回主力机。」
  • 这一句最让我意外—— TRAE 没有只给我 C# 客户端代码,还顺手把 Go 那边纯标准库的 HTTP+TCP 服务端骨架写出来了,跨语言接口的 JSON schema 一次性对齐 。这一下把我从「得开两个 IDE 反复对协议」里解放出来,直接省了至少两个通宵。

哪一步让我觉得「原来这么简单」?

AI 自动打标那一版 。第一版我写了个超长 Prompt 让 LLM 自由发挥,结果标签库炸了——「星云」「nebula」「NGC 7000」「发射星云」「深空天体」全混在一起,后期根本没法用。

我跟 TRAE 说:「标签能不能做个白名单?LLM 只在白名单里选,选不中就归到’未分类’。」

它反手给出一份 18 个主体标签 + 10 个质量标签 的天文领域白名单( 星云/星系/星团/行星/月亮/彗星/银河/猎户座大星云/仙女座星系/昴星团/土星/木星/… ),还配套了「拖线/失焦/噪点/过曝/欠曝/色差/大气抖动」等质量标签、HTTP 429 自动 backoff 重试、401/403 立刻终止整批的容错策略。
我当时盯着屏幕愣了两秒—— 原本我以为得自己读各家 LLM 文档、调 N 个超参才能搞定的「多厂商 AI 适配」,就这么聊三句就落地了 。

它帮我跨过了哪个原本以为搞不定的坎?

「Go 中转和 C# 桌面端怎么联调」 。

我自己只熟 C#,Go 算半路出家。VPS 上跑一个 HTTP 服务让手机上传,这事儿听起来简单,但要做到:

  • C# 客户端能 SSH 上去自动部署 + 自动启动 + 应用退出时自动 kill;
  • 远端 relay 收到手机上传后,要通过 TCP 长连接 (不是 HTTP)实时通知桌面端,而不是桌面端反复轮询;
  • 桌面端拿到通知后,再 SSH-SCP 把文件拉回本地,触发缩略图生成 + Gallery 刷新。
    这一整套跨语言、跨进程、跨网络边界的协议,以前我至少得折腾一周。 TRAE 一次会话里把 C# PublicRelayService + Go tools/upload-relay/main.go + build-relay.sh 交叉编译脚本三份代码同时给出来,接口 JSON schema 一字不差。

1. Demo 简介

一款面向 macOS / Windows / Linux 桌面的跨平台原生应用(Avalonia + .NET 9),专为天文摄影师解决「野外拍片 → 集中存储 → 智能标注 → 跨设备上云」的全链路问题。形态为本地 App,配套自研 Go 公网中转服务(纯标准库,无第三方依赖)。

面向谁:

  • 业余 / 进阶天文摄影爱好者(深空、行星、彗星、银河等题材)
  • 多机位、多设备协作的拍摄小团队(需要把手机 / 相机里的素材快速汇集到主力机)
  • 对「AI 自动打标签、本地优先、云端备份」有强需求的影像工作者

主要功能(2–3 个核心):

  1. 媒体时间轴 + 灯箱预览:按拍摄日期自动分组,网格浏览 + 双击进入非模态灯箱,支持滚轮缩放、方向键翻页、全屏、幻灯片;卡片右上一眼可见 OSS 同步状态、左下显示 AI 评分。
  2. 局域网 + 公网双通道手机上传:局域网一键起 HTTP 服务 + 自动生成二维码,手机扫码即传;部署自研 Go 中转至 VPS 后,公网环境下也能用手机拍照直传回桌面端(TCP 长连接 + SSH-SCP 自动拉取)。
  3. AI 智能标注(多厂商 LLM) + OSS 私有桶备份:支持 Claude / GPT / Gemini / DeepSeek / 通义千问 / Kimi / 智谱,自动识别星云、星系、行星等主体并给质量评分(18 主体标签 + 10 质量标签白名单);大文件自动分片上传 + 断点续传,应用重启后可恢复未完成任务。




2. Demo 创作思路

灵感来源:我自己在拍深空摄影时遇到一个很现实的痛点——一次出摊可能产生 200+ 张 RAW / TIFF / 视频,散落在相机存储卡、手机、主力机三个地方;后期还要挨个翻照片给文件起名、打标签、备份到云端。Lightroom / Bridge 偏「修图」而非「整理」,纯文件管理器又太原始。我想做一款「装在桌面角落、不抢戏、但能在导入 / 备份 / 检索全流程替我兜底」的工具。

想解决的问题(用户真实痛点):

  • 拍摄后大量素材需要集中管理 + 可视化浏览,而不是面对一堆缩略图乱码文件名;
  • 多设备素材需要便捷地汇集到主力机(尤其在野外没有公网的环境);
  • 备份到云端(OSS)既要支持大文件,又要断点安全(关掉应用再打开能从断点续);
  • 标签管理:AI 自动打 + 手动精修 缺一不可,且要支持批量 diff 预览,避免误操作覆盖;
  • 野外夜视:深色界面太亮毁暗适应,需要红光夜视主题

为什么做这个方向:
我评估了几个备选——做通用图床(竞争激烈、无差异化)、做 AI 修图插件(被 LR / PS 生态壁垒卡住)、做手机端相册(本地权限复杂 + 竞品极多)。最终选择**「垂直场景 + 桌面端 + AI + 私有云」** 这个组合:天文摄影这个细分赛道用户付费意愿强、痛点真实且具体;桌面端能调用本地文件系统 + FFmpeg + SkiaSharp 做高性能处理,这是 Web / 移动端做不到的;「私有 OSS」契合用户既想备份又不想公开照片的需求。取舍上,我把功能边界严格控制在「整理 + 备份 + 打标」,不做修图 / 后期,把星空后期的活儿留给 PixInsight / Siril,工具之间不重叠。

3. Demo 体验地址(三选一)
由于本作品为桌面端原生 App(非 Web),不提供公网在线 Demo,采用「App Zip + 演示视频 + 完整 GitHub 源码」三种方式公开,供评审在不同环境下任选其一体验。

git clone 仓库后 dotnet run --project StartTooler/StartTooler.csproj(需要 .NET 9 + 可选 FFmpeg)

##4. TRAE 实践过程

本项目从 v0.1 基石版本到 v0.12 生态版本,核心代码与设计文档全程在 TRAE 中完成。TRAE 不仅是 IDE,更承担了「需求拆解 → 工程规范文档 → 代码实现 → 跨语言联调(Build script for Go relay)」的全流程。

4.1 开发流程概览(关键节点)

需求收集(doc/0.11/demand/*.md)
       ↓   TRAE 协助拆解为可执行 spec
工程规范(doc/0.11/spec/*.md)
       ↓   TRAE 按 spec 落地代码 + 单元用例
编码实现(ViewModels / Services / Data 三层)
       ↓   TRAE 跨语言联调: C# 桌面端 ↔ Go 中转
端到端调试(扫描 → 打标 → 上传 → 灯箱 → 回收站)
       ↓   TRAE 协助 review + 生成 CHANGELOG
归档 / 提交 / 打 Tag

4.2 关键开发步骤(附截图)

4.2.1 图片对比和分组



4.2.2 右键菜单

4.2.3 灯箱开发

4.3 关键任务对话 Session ID(共 3 个)

用于证明本作品由 TRAE 开发完成,Session ID 列表如下:

  1. 1854249671328500:b15253460c38f5c1035f2f73a00c3e2d_6a565070631c7c817917b480.6a565195631c7c817917b482.6a5651945a397d25d5edbfac(2026/7/14 23:11:17,TRAE CN)
    • 任务:v0.11 媒体库需求拆解 + GalleryViewModel 重构 + 状态栏 / 快捷键 / 多选批量操作落地
  2. 1854249671328500:83367c4285157e98bd8b6f028f3e4ddc_6a565070631c7c817917b480.6a565854631c7c817917b5ae.6a5658535a397d25d5edbfb7(2026/7/14 23:40:04,TRAE CN)
    • 任务:AI 智能标注多厂商适配 + 标签白名单 + 429/5xx 重试 + 401/403 终止策略
  3. 1854249671328500:a3c28053abe858b20d11687374bba05c_6a567654631c7c817917b6fb.6a5678b6631c7c817917b738.6a5678b65a397d25d5edbfbc(2026/7/15 01:58:14,TRAE CN)
    • 任务:Go 公网中转(纯标准库 HTTP+TCP)+ C# PublicRelayService 跨语言联调 + build-relay.sh 交叉编译脚本

4.4 TRAE 在本项目中的具体价值

  • 跨语言无缝联调:TRAE 同时理解 C# / Avalonia XAML / Go / Shell / TOML,本项目涉及 4 种语言 + 2 个进程(桌面端 ↔ VPS relay),TRAE 一次性给出 C# 客户端 + Go 服务端 + 构建脚本的三方一致接口设计;
  • 工程规范驱动开发:每个版本先在 doc/ 写 demand → spec → checklist,TRAE 按 spec 落地代码,出错时按 doc/10-trap-book.md(已知陷阱记录)规避历史问题;
  • 可观测的演进过程:doc/ 目录共 15 篇工程规范 + 完整 git log,可在 GitHub 上 100% 复盘从 v0.1 到 v0.12 的演进;
  • 避免重复造轮子:SQLite 仓储、配置 KV、缩略图缓存、上传分片续传、断点恢复等基础设施在 TRAE 协助下从第一行就保持了清晰分层(Data / Services / ViewModels),后续 8 个版本迭代几乎未做过大重构。

5、经验总结(可选附加部分)

5.1 做对的事

  1. 先把规范写清楚再写代码:doc/0.11/spec/01-15.md 共 15 篇规格文档,让 TRAE 的产出可被「白盒 review」,也让我自己在三个月后回看不至于读不懂;
  2. 跨语言项目用同一种模型描述接口:Go relay 与 C# 客户端共享「请求 / 响应 / 通知」三套 JSON schema,在 TRAE 中先一次性把 schema 定下来,两端再分别实现,显著降低联调时间;
  3. 乐观更新 + 失败回滚的 UI 模式:灯箱翻页保存 / 标签批量编辑 / OSS 续传状态都采用「先更新 UI,失败时回滚 + Toast」,UI 始终保持响应感;
  4. 野外场景的真实约束:红光夜视主题(深色背景下用红色调文字)是天文摄影师的硬需求,不是装饰性 feature,用户一上手就能体会到;
  5. 数据可携带性:~/Library/Application Support/StartTooler/ 单目录管理,设置页支持「导入 / 导出配置 JSON(含密钥)」,换机时一键迁移。

5.2 踩过的坑

  1. Avalonia 跨平台文件选择器必须用 IStorageProvider,直接调 OpenFileDialog 在 Linux 上不工作,最后引入 IDirectoryPickerService 抽象解决;
  2. FFmpeg 路径校验必须独立于 PATH,用户在野外笔记本上不一定装了 FFmpeg,所以设置页允许指定 exe 绝对路径,且失焦自动校验;
  3. AI 标注的 token 成本:第一版每张图都发原图(单张 30MB),改成「长边 resize 到 512px → base64」后,token 成本下降 95% 且准确率几乎不变;
  4. Go 中转的安全边界:第一版把 VPS 的 SSH 密码明文存到本地,改成「私钥优先 + 密码可选 + 配置导出时加密」三段式后,通过自审;
  5. Avalonia 主题切换的「真·即时」:Application.Current.RequestedThemeVariant 切换后部分自定义控件需要手动刷新,封装进 ThemeManager 统一处理。

5.3 后续规划(v0.12 已在做)

  • 跨设备云端同步:多桌面端 / 笔记本 / 工作室机器之间同步媒体索引和标签,详见 需求 / 规格;

6 附加信息
报名帖链接