你有没有过这种感觉?
写代码的时候,刚准备“再看五分钟”。
结果一抬头,已经过去了两个小时。
眼睛发干、发涩、发酸,肩膀也开始僵,脑子却还在被屏幕拽着走。最离谱的是,哪怕你明明知道要休息,还是会对自己说一句:
“等我把这一段写完。”
而程序员都知道,这个“写完”,往往没有尽头。
所以我后来发现,真正的问题不是“我不知道要护眼”,而是:
绝大多数人缺的,从来不是道理,而是一个存在感刚刚好的提醒器。
不能太重,不然懒得开。
不能太吵,不然会烦。
不能只支持一个系统,不然你换台机器就废了。
更不能长得像个实验项目,开一次就再也不想打开第二次。
于是,我干脆自己做了一个。
我做了什么?
我用 Rust 做了一个跨平台护眼提醒工具,名字叫 BlinkSpark。
它很克制,功能也不复杂,但每一个点都冲着“长期可用”去做:
- 支持 Linux / macOS / Windows
- 基于 20-20-20 护眼规则进行提醒
- 启动后显示一个可拖动的倒计时小窗
- 支持系统通知
- 支持中文 / 英文切换
- 支持循环提醒,也支持提醒一次后退出
- 自动记住上一次窗口位置
- 支持一键重置倒计时
它不是一个“大而全”的效率平台。
它就是一个很小、很轻、很安静,但你真的会愿意一直开着的工具。
为什么我会想做这样一个工具?
因为市面上很多提醒类工具,要么太重,要么太花,要么太打断工作流。
有些产品功能很多,番茄钟、任务管理、统计分析、习惯追踪全都塞进去,但真正用起来的时候,你会发现:
我只是想被提醒一下该眨眼、该看远处 20 秒,仅此而已。
还有一些工具虽然能提醒,但体验不稳定:
- 换个系统就没了
- 通知行为不一致
- 界面不顺手
- 开起来占资源
- 中文显示不友好
我想要的其实很简单:
一个跨平台的、轻量的、桌面级的、能长期挂着不烦人的护眼提醒工具。
所以 BlinkSpark 从一开始就不是为了“功能堆砌”设计的,而是为了一个非常明确的目标设计的:
让护眼这件事,变成不费意志力的默认行为。
为什么这次我选 Rust?
因为这个项目虽然小,但它有几个要求其实挺硬核:
- 要跨平台
- 要足够轻量
- 要启动快
- 要资源占用低
- 要能比较稳地处理不同平台的通知逻辑
如果用传统 Web 技术包一层桌面壳,当然也能做。
但像这种常驻、轻量、对启动速度和资源占用敏感的小工具,我更愿意直接上 Rust。
原因很现实:
- 性能和体积更可控
- 原生跨平台能力更扎实
- 更适合做这种“小而长期运行”的桌面程序
- 平台差异可以清晰地在代码层面收敛
更重要的是,Rust 很适合把“看起来不大,但细节很多”的项目做扎实。
BlinkSpark 这种工具,真正的难点从来不是“倒计时”本身,而是这些看起来不起眼的小问题:
- 不同系统怎么发通知?
- 窗口放哪儿更合理?
- 用户拖过位置之后,下次怎么恢复?
- 如果窗口跑到屏幕外面了怎么办?
- 中文字体在不同平台怎么保证不乱码?
- Windows 打包时图标和资源怎么处理?
这些东西凑在一起,才决定它像不像一个真正能交付、能长期使用的桌面应用。
BlinkSpark 到底做成了什么样?
先说体验层面。
启动之后,桌面上会出现一个倒计时小窗。默认会根据设定的间隔进行循环提醒,时间到了之后触发系统通知,提醒你遵循 20-20-20 规则:
每 20 分钟,看向 20 英尺以外的地方,持续 20 秒。
默认命令很简单:
blinkspark如果你想切换成中文:
blinkspark --lang zh如果你想调整提醒间隔:
blinkspark --interval 30如果你只想提醒一次后退出:
blinkspark --once这种体验的核心不是“炫”,而是“顺”。
你打开它,它就在。
你不需要学习成本,也不需要额外管理。
它不会不停抢你的注意力,但它会在该出现的时候出现。
这个项目里,我最满意的不是提醒,而是这些细节
很多人看这种项目,第一反应会是:
这不就是一个倒计时 + 通知吗?
如果只是做 demo,确实是。
但如果目标是“做一个能真的放在自己电脑上长期使用的工具”,你会发现细节才是决定体验的地方。
1. 不同平台分别走原生通知能力
BlinkSpark 不是一套通知逻辑硬怼所有系统,而是按平台分别处理:
- Linux 使用
notify-rust - macOS 使用
mac-notification-sys - Windows 使用
winrt-notification
更关键的是,在 Windows 上我还做了一个兜底逻辑:
如果 Toast 通知失败,就回退到 MessageBox,保证提醒这件事不要无声失效。
这件事很重要。
因为提醒工具最怕的,不是提醒方式不够花哨,而是:
你以为它会提醒,结果它刚好在最需要的时候没提醒。
图片占位 4:这里放一张不同系统通知效果的拼图,或者 Windows 通知 / 弹窗效果图
2. 小窗可以拖动,而且会记住你上次放的位置
我不喜欢那种每次启动都把窗口怼在固定位置的工具。
BlinkSpark 允许你把倒计时小窗拖到任何你顺手的位置,并且会把坐标保存下来,下次启动时直接恢复。
在 Windows 上,我还额外处理了一个很现实的问题:
如果你的显示器布局变了,或者窗口位置已经跑到可视区域外,它会自动把窗口拉回可见范围。
这个功能看起来不起眼,但它能避免一种非常烦人的情况:
程序其实启动了,只是你根本看不见它。
3. 中文显示不是“顺便支持”,而是认真处理
既然要支持中英文切换,中文字体就不能靠运气。
所以在这个项目里,我按 Windows、macOS、Linux 分别做了常见 CJK 字体的读取逻辑,优先加载系统里合适的中文字体,保证界面文本正常显示。
这类细节一般不会出现在宣传页里,但用户一眼就能感受到差别。
因为“能显示中文”和“中文显示得稳定、正常、像个正式产品”,完全不是一个层级的事情。
4. 它不是命令行玩具,而是一个认真做了桌面体验的小应用
虽然 BlinkSpark 启动方式很简单,但内部并不是“命令行参数 + 打印日志”那么粗糙。
我用 Rust 的 eframe/egui 做了桌面小窗界面,把这些信息都放进了一个稳定、清晰的 UI 里:
- 当前提醒模式
- 距离下次提醒的倒计时
- 倒计时进度条
- 中英文切换按钮
- 一键重置计时
- 错误信息反馈
它不是为了炫技做 UI,而是为了让提醒这件事更自然。
这类小工具,最能体现一个程序员的产品感
很多人做项目时,容易一上来就盯着“大系统”“大平台”“大而全”。
但我越来越觉得,真正能看出一个工程师产品感觉和工程感觉的,往往是这种小工具。
因为在这种项目里,你没有复杂业务给自己打掩护,也没有宏大概念帮你抬高预期。
最后拼的就是两件事:
- 你有没有抓住真实需求
- 你有没有把体验细节做到位
BlinkSpark 的价值,不在于它技术上有多夸张,而在于它解决的是一个非常高频、非常真实、但又经常被忽略的问题:
我们天天在用电脑工作,却很少认真为自己的眼睛设计一个低负担的保护机制。
而工具存在的意义,本来就是把“应该做但总做不到”的事情,变得容易发生。
如果你也想做一个真正能落地的 Rust 桌面工具
BlinkSpark 这个项目也给了我一个很深的体会:
Rust 不只适合写底层、写高性能服务、写系统工具。
它同样适合做这种桌面端的小而美应用。
尤其是当你有下面这些需求时:
- 希望跨平台
- 希望足够轻量
- 希望原生体验更稳
- 希望长期运行资源占用低
- 希望对细节有更强掌控力
Rust 其实是一个非常值得认真投入的选择。
你会发现,真正让一个工具变得“可用”的,不只是语言本身,而是语言给你的那种掌控感。
这种掌控感会逼着你去认真处理边界、异常、平台差异和体验一致性。
而这些,恰恰才是一个项目从“能跑”走向“能用”的关键。
最后
我做 BlinkSpark,不是因为世界上缺一个提醒工具。
而是因为我越来越相信一件事:
好的工具,不一定复杂,但一定尊重人的注意力。
它不该成为新的干扰源。
它应该像一个安静但可靠的搭子,在你快忘记照顾自己的时候,轻轻把你拉回来。
如果你也是长期盯屏工作的人,我真建议你别把护眼这件事继续往后排了。
因为很多时候,效率的代价不是时间,而是身体。
而一个真正好用的小工具,能帮你把这笔账,提前算清楚。
如果你愿意,我后面也可以继续把这篇内容扩展成两个方向:
- 一个偏技术复盘版本,专门讲 Rust 跨平台桌面开发细节
- 一个偏产品拆解版本,专门讲为什么“小而轻”的工具反而更容易长期留在用户桌面上






评论功能
当前站点为 GitHub Pages 镜像版本,不支持评论功能。
如需发表评论,请访问主域名版本:
🚀 前往 主域名 版本评论