fangshoufanji 的头像
个人开发者 · 专注 macOS 原生与智能体工具
SYS_ONLINE · 4 APPS + 4 REPOS
FLAGSHIP SHOWCASE // 01 · MACOS NATIVE
ACTIVE IN WORKFLOW
[THE TENSION // 痛点直击]

终端多智能体(Claude Code、Codex 等)来回切屏心智负担重,运行状态与用量散落各处,背景执行毫无知觉。

[THE CRAFT // 雕琢解法]

与 macOS 刘海屏物理融为一体。悬停展开任务阶段与文件改动,Token 消耗与进程资源抬头一目了然。打开来源只是导航,不代替批准操作。

[THE SPEC // 极简切面]

Rust / Tauri 常驻守护 · 系统级窗口控制与材质 · 轻量低占用 · 深度融合系统辅助功能。

AgentIsland

常驻刘海屏,全局尽在掌控。

⌘
Claude Code 正在检索目录结构并构建依赖拓扑图
4,280 tokens RUNNING
模拟状态演示:
MEMORY FOOTPRINT 24.6 MB
CPU FOOTPRINT 4.8% (ACTIVE)
LATENCY 0.4 ms
ARCHITECTURE APPLE SILICON
// 02 PROJECTS IN PROGRESS

在建项目

持续推进中的原生工具项目,每项都以可测量指标检验成果。

MODULE // 02 · MACOS + ANDROID
02

KnowFlick

把阅读、思考与复习,收拢进同一个工作台。

碎片化阅读易失真,笔记与艾宾浩斯复习常常割裂。KnowFlick 在电脑端深度归纳结构化资料,移动端碎片时间复习卡片,离线加密双端同步。

艾宾浩斯复习进度 85% 已完成
SwiftUI Jetpack Compose Offline-First
MODULE // 03 · MACOS UTILITY
03

MacClean

只做有用功,每一项清理都有理有据。

拒绝商业清理软件的恐吓营销与黑盒删除。专注透视开发缓存、DerivedData、npm 冗余和卸载残留,每项附带清晰依据与安全撤回路径。

扫描已就绪 · 沙盒隔离 18.4 GB 可释放
缓存 (52%) 残留 (28%) 大文件 (20%)
Swift 6 AppKit Zero Telemetry
MODULE // 04
04

haier-ac-mac

抬头点一下,冷暖自知,何须找手机。

写代码时调 1 度空调,何必翻找手机、解锁屏幕、打开臃肿 App。菜单栏常驻微型温度控件,原生全局快捷键秒级调节。

24 °C
制冷模式 自动风速
SwiftUI Cloud Protocol
// 03 ENGINEERING CRAFT & PHILOSOPHY

做工具的三条铁律

DEVELOPER PRINCIPLES CRAFT // 01

从真实问题出发,按工程标准交付。

01
必须源自自己每天遇到的真实痛点

日常在 macOS 上写代码或用电脑时,碰到不顺手、反复折腾的地方,把它记下来。不解决伪需求,自己不想天天用的东西绝不动手写。

02
用最快速度跑顺核心流程,立刻放进日常生产环境

先用最短的时间把最核心的交互和逻辑跑通,不预先设计庞大虚无的架构,第一时间放入日常主力机使用。

03
在日常几千小时高频使用里,慢慢磨出手感与克制

快捷键顺不顺、常驻内存占多大、唤起有没有延迟——极致的软件手感与零负担,都是在真实高频体验里一遍遍打磨出来的。

TOOLCHAIN FACTS SPEC // 02

系统规格与架构偏好

拒绝臃肿框架,按场景选择最高效的原生基建:

  • Rust / Tauri 常驻守护进程、高性能本地监控与工作台
  • Swift / SwiftUI / AppKit macOS 原生深度清理工具与菜单栏系统集成
  • Kotlin / Jetpack Compose Android 原生学习工作台与离线卡库
  • TypeScript / JavaScript DeepSeek Harness 插件与通信契约
  • Python 3 / Shell 网络握手逆向、投屏协议与自动化工具
17 GitHub 公开仓库与深度工程实验
// 03.5 FIELD NOTES

做的时候踩到的坑

这一站本身就是作品。以下都是这个仓库里真实发生过、量出来过的。

012026-10

hidden 不是万能锁

给容器写了 display: flex,它就盖过了浏览器默认的 [hidden] { display: none }。会话入口子栏在「任务执行态」下藏不住, 实测 hidden=true 却仍有 40.5px 高度。 显式补一条 [hidden] { display: none } 才算真收口。

CSS · 属性优先级

022026-10

「永远深色」的块,别用会变色的墨

灵动岛胶囊底恒为黑,里面的强调色却跟着主题走。浅色主题那支 #059669 压在 12% 白罩的黑底上(实际渲染 rgb(31,31,31)),合成后只有 4.39:1,差 4.5 一线。 改用不随主题变化的墨色后达标。

设计令牌 · 对比度

032026-10

过渡还没跑完,别急着读颜色

验证三态指示灯时,三种状态的颜色读出来一模一样,差点当成缺陷去修。 真因是 getComputedStyle 在过渡进行中返回的是插值中间值—— 点击后立刻读,读到的是起点色。等过渡结束再读,三态才各自成立。

测量方法 · 假阳性

042026-10

「元素可见吗」不能只看它自己的 display

getComputedStyle(el).display 不继承祖先的 display: none。父容器已隐藏时,子元素仍报 block, 于是「无 JS 时还有几个死控件」数出来是三个,实际是零。 要用 getClientRects().length 这类真实渲染判据。

可访问性 · 判定口径

052026-10

声明的对比度 ≠ 渲染出来的对比度

上一轮把小字从 1.49:1 修到 4.63:1,结论写「读得清」, 还附了一句「blur(2px) 不改变实测对比度」。 那句话没被验证过,而它是错的——对比度按 CSS 颜色算, blur 改的是渲染像素。11.5px 的中文字笔画约 1px,2px 半径比笔画还宽, 字形直接糊掉。改用逐像素算相对亮度才量得出来。

测量方法 · 自我推翻

062026-10

调 opacity 让内容「退后」,这条路走不通

想让非活跃行淡下去,把 alpha 从 0.30 一路扫到 1.00—— 小字要够 4.5:1,所需 alpha 恰好是 1.00(0.85 时才 4.19:1)。 根因是墨色满强度也只有 5.42:1,没有余量供衰减, 而 opacity 是作用在整行上的。改成明度分档后层次差从「1.49 vs 17.12」变成「5.42 vs 17.12」。

对比度 · 层次设计