内容
# Gains
一款私有的、本地优先的 iPhone 应用,它在您的设备上以一个加密的记录保存您的健康数据:营养、体重、步数和活动,以及 Whoop 恢复、睡眠和压力。原生 Swift/SwiftUI,iOS 18+。
## 界面
<p align="center">
<img src="docs/screenshots/onboarding.png" width="215" alt=" onboarding" />
<img src="docs/screenshots/overview.png" width="215" alt="概览仪表盘" />
<img src="docs/screenshots/whoop.png" width="215" alt="Whoop 恢复" />
</p>
<p align="center">
<img src="docs/screenshots/health.png" width="215" alt="健康与设置" />
<img src="docs/screenshots/widget.png" width="215" alt="锁屏小部件" />
</p>
<p align="center"><em> onboarding、概览、Whoop、健康和锁屏小部件,显示示例数据。</em></p>
### 卡路里跟踪
<p align="center">
<img src="docs/screenshots/log-food.png" width="230" alt="食物日志,包含每项宏量营养素和 AI 估计" />
<img src="docs/screenshots/calories.png" width="230" alt="卡路里环和宏量营养素甜甜圈" />
</p>
<p align="center"><em>一种类似笔记的食物日志,包含每项宏量营养素、水和保存的餐食,以及当天的卡路里环和宏量营养素甜甜圈。AI 估计是可选的,显示置信度和来源。</em></p>
### 设置目标
<p align="center">
<img src="docs/screenshots/goals.png" width="230" alt="目标单页,带有“帮助我估计”按钮" />
<img src="docs/screenshots/goal-calculator.png" width="230" alt="目标估计计算器" />
</p>
<p align="center"><em>手动设置每日卡路里和宏量营养素目标,或点击“帮助我”根据您的个人资料(活动水平和体重目标)进行估计,然后编辑并保存。</em></p>
### 食物记录的工作原理
您输入或拍摄您所吃的食物。应用仅将该描述通过单个审核出口发送到运行在您自己的 **OpenRouter** 密钥上的模型,然后获取带有置信度和引用来源的可编辑估计的卡路里和宏量营养素。条形码通过 Open Food Facts 在本地解析;新型或餐厅食物使用基于网络的模型返回引用。没有任何内容是自动写入的。每个估计值都由您在记录之前确认或编辑。如果没有密钥,记录仍然有效,您可以自己输入宏量营养素。
## 功能
- **本地和私有。** 您的记录在设备上加密(使用 CryptoKit 的 AES-256-GCM,密钥在钥匙链中)。除非您选择加入,否则没有任何数据离开手机。
- **营养。** 类似笔记的食物日志,包含宏量和微量营养素、保存的餐食、最近记录和通过 Open Food Facts 的条形码扫描。可选地,使用您自己的 OpenRouter 密钥,根据文本或照片描述估计卡路里和宏量营养素。
- **体重。** 体重趋势,可选从 Apple Health 导入。
- **Whoop。** 只读恢复、睡眠和压力在仪表盘上。
- **锁屏小部件。** 卡路里环和倒数计时(“X 天剩余”),到您在应用中设置的日期。
- **个人 MCP 服务器(可选)。** 一个小型可自行托管的服务器(`server/`),通过模型上下文协议公开您的只读数据切片,以便您跨领域向 MCP 客户端提问。默认关闭。
> **Whoop 集成:请自担风险。** Whoop 没有此数据的公共 API,因此应用通过 Whoop 的私有应用 API 读取它。目前可以正常工作,但这是非官方的,未经 Whoop 批准,因此链接您的帐户可能会导致限速或封禁。请自担风险启用 Whoop 集成。
## 仓库布局
| 路径 | 描述 |
|------|------|
| `Sources/` | iOS 应用。SwiftUI 视图和 `@Observable` 视图模型;外部依赖项(HealthKit、Whoop、钥匙链、AI 提供商、持久性)位于薄协议后面。 |
| `Tests/`、`UITests/` | 单元测试和 UI 测试。 |
| `server/` | 可选的个人 MCP 服务器(TypeScript,部署到 Fly)。 |
| `docs/` | 截图和资产。 |
## 构建
需要 Xcode 16+。Xcode 项目由 [XcodeGen](https://github.com/yonaskolb/XcodeGen) 从 `project.yml` 生成,因此没有提交 `.xcodeproj`。首先生成它:
1. 安装 XcodeGen:`brew install xcodegen`
2. 生成项目:`xcodegen generate`
3. 在 Xcode 中打开并运行:`open Gains.xcodeproj`
或者,在步骤 2 后直接构建到模拟器:
```sh
xcodebuild -project Gains.xcodeproj -scheme Gains \
-destination 'platform=iOS Simulator,name=iPhone 16' build
```
重新运行 `xcodegen generate`,每当您添加或删除源文件时。AI 食物记录需要您自己的 **OpenRouter** 密钥,在 **设置** 下添加;如果没有密钥,记录仍然有效,您可以自己输入宏量营养素。
## 个人 MCP 服务器(可选)
参见 [`server/README.md`](server/README.md)。它部署在 Fly 上,并在内存中保存您的数据切片;应用的 **设置 → AI 连接器(MCP)** 使用您设置的令牌连接到它。可选,默认关闭。
## 致谢
- 食物记录灵感来自 **Amy**。
- 视觉设计灵感来自 **Bevel**。
## 许可证
[MIT](LICENSE)。