Skip to content

Killin-7/Health-Reminder

Repository files navigation

Health Reminder

Build License Platform

这是一个做给自己的提醒器。

我长期久坐写代码,经常一坐就是两三个小时忘了动,水杯就在手边也想不起来喝。市面上已有的提醒工具要么太吵(疯狂弹窗、声音关不掉),要么太重(要注册账号、要联网、要统计还要社交),要么就是太容易被无视——提醒多了就麻木了,直接关掉继续坐。

所以我写了这个,核心理念就一条:在尽量不打扰正常工作的前提下,让你注意到该起来活动了、该喝口水了。

它只做两件事:

  • 定时提醒起身活动 — 默认每 50 分钟
  • 定时提醒喝水 — 默认每 90 分钟

以及一点额外的温度:

  • 惊喜提醒 🎲 — 每次弹窗的文案不是固定的,根据时段和语境从 40 条池子里随机抽。普通消息就是日常提醒,稀有消息带点温度,彩蛋偶尔冒出来让你笑一下。不是每一条都要你停下来读——但至少,每次弹窗不再是同一个你已经看麻木了的对话框。

应用基于 Tauri 2 + React + TypeScript。Rust 端负责托盘、系统通知、配置管理和调度器;React 端只负责设置窗口和提醒弹窗。纯本地运行,无需联网,没有账号。

截图

预览


功能

  • 久坐提醒(可配置间隔)
  • 喝水提醒(可配置间隔)
  • 工作时段配置(仅在上下午工作时段内提醒)
  • 暂停提醒 1 小时
  • 开机自启动
  • 提醒声音
  • 惊喜提醒(随机文案 + 稀有度权重)
  • 统计面板(每日站立/喝水次数)
  • 自定义文案

项目目录结构

health-reminder/
├─ .github/workflows/     # CI 配置
├─ assets/                 # 资源文件
├─ src/                    # React 前端
│  ├─ main.tsx
│  └─ styles.css
├─ src-tauri/              # Rust 后端
│  ├─ src/main.rs          # 调度器、配置、托盘、惊喜引擎
│  ├─ Cargo.toml
│  ├─ tauri.conf.json
│  └─ capabilities/
├─ index.html
├─ package.json
├─ vite.config.ts
├─ tsconfig.json
├─ CHANGELOG.md
├─ LICENSE
└─ README.md

关键模块

Rust 端 (src-tauri/src/main.rs)

模块 说明
AppConfig 用户设置,持久化到本地 JSON
SchedulerState 提醒状态:下一次提醒时间、暂停、活跃弹窗
托盘 打开设置、暂停 1 小时、恢复提醒、退出
调度器 每 15 秒 tick,判断是否到提醒时间
惊喜引擎 上下文匹配 + 权重抽选,决定弹窗文案
系统通知 弹窗同时发送 Windows 通知

React 端 (src/main.tsx)

视图 说明
设置窗口 所有配置项在一个页面修改
提醒弹窗 显示提醒内容、三个操作按钮

本地配置文件

保存到 %APPDATA%\Health Reminder\config.json,默认内容:

{
  "standUpEnabled": true,
  "standUpIntervalMinutes": 50,
  "waterEnabled": true,
  "waterIntervalMinutes": 90,
  "morningStart": "09:00",
  "morningEnd": "11:30",
  "afternoonStart": "14:00",
  "afternoonEnd": "17:30",
  "autostartEnabled": true,
  "soundEnabled": false,
  "surpriseEnabled": true
}

调度逻辑

调度器不是长定时器,而是每 15 秒 tick 一次检查,像一个值班员:

  1. 检查当前是否为工作时段
  2. 检查是否处于"暂停 1 小时"
  3. 分别检查起身提醒和喝水提醒是否到期
  4. 两者同时到期时,先弹起身,处理完再弹喝水
  5. 休眠唤醒后检测时间跳跃 > 120 秒,跳过过期提醒,重新计算

工作时段

默认 09:00–11:30 和 14:00–17:30。非工作时段不弹提醒,过期不补。

按钮行为

按钮 效果
我去活动了 / 我喝了 从点击时间重新计算下一次
10 分钟后提醒 / 15 分钟后提醒 仅延后本次提醒
跳过本次 从当前时间重新计算下一次
关闭窗口 等同于跳过本次
托盘暂停 1 小时 所有提醒暂停;恢复时不补发

惊喜提醒引擎

开启后,每次弹窗会:

  1. 根据当前时间判断语境(早上/下午/傍晚/深夜/凌晨 + 工作日/周末)
  2. 从 40 条文案池中过滤出语境匹配的消息
  3. 按稀有度权重抽选:普通 80% → 稀有 15% → 彩蛋 5%
  4. 最近 8 条出现过的消息权重降低到 20%,避免连续重复

可在设置界面随时开关。

本地运行

前置依赖

  • Node.js (>= 18)
  • Rust stable
  • Microsoft WebView2 Runtime(Windows 11 自带,Windows 10 可能需要安装)
  • Visual Studio Build Tools(含 C++ 桌面开发工具链)

启动

npm install
npm run dev

启动后主窗口不会自动显示,请从系统托盘右键打开设置。

打包

npm run build

打包产物在 %LOCALAPPDATA%\Temp\health-reminder-tauri-target\release\bundle\nsis

Rust 编译目录默认输出到用户临时目录,避免杀毒软件对项目内新生成 exe 的拦截。

当前限制

  • 仅支持 Windows(通过 compile_error! 在非 Windows 平台编译时阻断)
  • 不依赖网络运行
  • 数据只保存在本地 JSON 文件
  • 没有账号、同步、云端功能
  • 开发模式下 Windows 通知可能显示为 PowerShell/开发进程名称(Tauri 官方说明)

License

MIT License — 详见 LICENSE

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors