跳到正文
Hina
预览 功能 定价 文章
中文
English 简体中文
下载

文章

赏月怎样把一天记成一段段会话

时间记录 · 2026年10月19日 · 约 11 分钟

赏月记下一天的办法,是每 3 秒看一次当前最前面的应用,把按键、点击和滚动各记成一个次数,不保存你按下的字符,再把这些采样收成一段段会话,写进这台 Mac 上的一个 SQLite 文件。事后能打开的是这条时间线。屏幕画面和你打进去的文字都不在里面,窗口标题、终端历史、AI 会话和本地 git 都要另外打开,日报用数据库里的会话加上这些读取拼出来。

一次采样读到什么

菜单栏里的赏月一直开着的时候,主线程上有一个定时器,每 3 秒走一拍。这一拍通过 NSWorkspace 拿当前最前面的应用,留下 bundle id 和系统给出的应用名,它不去数这个应用后面还开着哪些窗口,所以终端里没聚焦的那一格、浏览器里没在前台的那个窗口,都不会成为这一拍的记录。

输入次数来自 CGEventSource 在 HID 系统状态上的累计计数,赏月保存的是距离上一拍的增量,按键只计 key down,点击把左键、右键和其他鼠标键的按下加在一起,滚动只计滚轮。这个计数器从登录起累加,里面没有哪一个键,提交说明和邮件正文都还原不出来。空闲是同一套接口上的另一次读取,取最近一次按键、修饰键变化、鼠标按下、鼠标移动、滚动或拖拽距现在的最短时间,指针动一下空闲就清零,但鼠标移动本身不会作为次数写进库。

窗口标题和文档要等你在设置的隐私页打开「窗口标题」才会读,走的是辅助功能,macOS 27 在系统设置里把这项权限写成「设备控制和数据访问」,更早的系统写成「辅助功能」。赏月读的是焦点窗口的标题和文档,http 或 https 的文档在入库前只留协议、主机和路径,问号后面的查询、井号后面的片段,以及地址里的用户名和密码都会去掉。密码管理器不会去读标题。没有这项权限时,应用名仍然从 NSWorkspace 记下。辅助功能调用超过半秒没有回应,这一拍就当没读到窗口,下一拍再试。

采样怎样收成一段会话

库里不是每一拍一行。新的一拍如果 bundle id、标题、文档、麦克风和摄像头状态都和当前这一行相同,而且距离这一行的结束不超过 12 秒,就延长这一行,结束时间往前推,按键、点击和滚动的次数累加上去。其中任何一项变了,或者间隔超过 12 秒,这一行就结束,另起一行。标题开关关着的时候,标题和文档都是空的,同一个应用里换文件不会切开,要等应用本身变了,或者麦克风、摄像头的状态变了,才会新开一段。

连续 3 分钟没有输入,不会把应用那一行越记越长。空闲到 180 秒,这一拍不再读窗口,改写一行离开,bundle id 是 hina.idle,并把还开着的应用行结束时间收回最后一次输入的时刻,安静的那几分钟就不算在那个应用上。时间线上要点「显示 N 段离开」,这一行才以「离开」出现。锁屏查的是当前会话字典里的 CGSSessionScreenIsLocked,睡眠来自系统的 will-sleep 通知,两者写的也是这种离开行,只是上下文里分别带上锁屏或睡眠的标记。先锁屏再睡眠的同一段会把两个标记都留着,这一天的合计把它算进睡眠,不算进锁屏。

麦克风和摄像头的状态变化也会把会话切开,免得通话和前面的写作粘成一段。麦克风要连续两拍读数一致,记录里的状态才翻转。摄像头每 4 拍探一次,大约 12 秒,还要再有两拍一致,所以这个切口有时会晚大约 20 秒。菜单栏里选「暂停记录」期间什么都不写,输入计数的基准也会重置,暂停时敲的键不会加到恢复后的下一个应用上。被忽略的应用同样是空白,这一拍仍然把计数器读掉,只是不写行。

Hina 每 3 秒采样一次前台窗口和输入计数,在本机 SQLite 文件里写下会话或离开记录,日报再用这份文件和可选的本机读取生成。
采样收成会话写进本机数据库,日报要等你打开才用这份文件和可选的本机读取拼出来。

库文件放在哪,一天从凌晨四点切开

这些行都在一个 SQLite 文件里,路径是 ~/Library/Application Support/Hina/hina.sqlite,日志模式是 WAL。设置里打开数据页,点「定位文件」,访达会选中这个文件。表名是 sessions,一行里有开始和结束的 Unix 时间戳、bundle id、应用名、标题、文档、是否离开,这一段的按键、点击和滚动次数。同一行里还有麦克风、摄像头、音频播放、全屏和电池供电几个状态位,外接屏数和切换桌面空间的次数,焦点元素的角色,以及浏览器的标签页数。隐私页「使用记录」那一行的「清空记录」会删掉这些行,并且暂停记录,直到你点「继续记录」。它不删 AI 对话文件、代码仓库,也不删已经导出的文件。把应用本身删掉,这个数据库还在。

一天不是从午夜切到午夜。本地时间凌晨 4 点到次日凌晨 4 点才是同一个工作日,时间线、图表和日报用的都是这一刀。凌晨 1 点还在写的那一小时,仍然算前一天。日报标题上的日期,是这个 4 点起点所在的日历日。夜里一段看起来像丢了,常常是落在相邻的那一天上。

打开开关之后多出来的记录

「窗口标题」默认关着,在设置的隐私页里打开之后,辅助功能才会去读标题和文档。标题和裁过的文档路径会进入会话的合并条件,换一个文件或换一条页面路径就会新开一行,并且写进 SQLite。再把开关关掉,只是停止新的标题,已经写下的行要等你清空才会消失。文件名和页面路径能找回多少、找回不了什么,不截屏的工作记录那篇分开写过。

同一页上的「AI 提问」和「终端命令」也是默认关闭,而且都不会把原文复制进 hina.sqlite,只在生成日报时读。AI 对话读的是你自己的提问、会话时间、工作目录和分支。Claude Code 在 ~/.claude/projects,Codex 在 ~/.codex/sessions 和 archived_sessions。Antigravity 在 ~/.gemini/antigravity-cli/history.jsonl。Cursor 只读 ~/.cursor/projects 下对话记录里每条 <user_query> 的原话。Claude Code 还会留下 Edit、Write、NotebookEdit 动过的文件路径,助手的回复和工具输出不留。终端历史只读 ~/.zsh_history,一行必须是 zsh 扩展格式,以冒号、时间戳和耗时开头,否则跳过。留下来的是命令和能识别的子命令,比如 brew install 或 make verify,参数丢掉,命中密钥字样的整行丢掉,以环境变量赋值开头的整行也丢掉,cd、ls 和 git status 不算。如果没有一行带时间戳,数据页的「日报状态」会写终端历史没有时间戳。

本地 git 不在隐私页,而在数据页的「项目目录」。一个文件夹都没选之前,赏月不扫描任何仓库。选好之后,它在同一个凌晨 4 点的窗口里读磁盘上的提交、改过的文件、标签,以及未提交或未推送的状态,不查询 GitHub。git 进程关掉了懒获取,协议允许列表是空的,fsmonitor 也关掉,读日志时不再走外部 diff 和 textconv。最多保留 40 个仓库,多出来的会被略过,并记在「日报状态」里。

日报是打开时才拼出来的

日报不是另一套记录。菜单栏里的「今日日报」,快捷键是 Command-D,会先回到今天,再为这个工作日现拼一份。你已经被记成离开的时候,同一份也可能提前算一次,回来就能打开。活动部分来自那个凌晨 4 点窗口里的 SQLite 会话。AI 对话和终端历史的开关开着,才会在这时并行去读那些文件,读完不写回数据库。git 排在后面,只扫你选过的文件夹,并且优先留下 agent 的工作目录和当天已经出现的项目名,免得你正在做、还没提交的仓库被 40 个的上限挤掉。

正文是在这台 Mac 上拼出来的 Markdown。开头一行写使用电脑的时长,有本地提交时再写提交数,接着「这一天做了什么」按项目列出本机提交标题、「AI 提问」和「记录到的活动」。「确认完成」和「还在进行或无法确认」来自本地提交和工作区。「当天时间」会把中途的休息、不足 5 分钟的短空档、没有记录的时间,以及采样之间的零碎间隔分开说。「来源明细」里是项目表、「跑过的命令」、动过的文件,以及没有归到所选仓库上的 AI 会话。隐私页还有一个默认关闭的「AI 用量」,打开后日报会补上 Claude Code 和 Codex 本地日志里的模型、项目、时间和 Token 数。这些数字留在这份日报的内存里,不写入 SQLite,也不是请求次数、工作时长或账单,输入一侧的合计含缓存。

某一种来源读失败,日报会写出来,而不是补一段看起来完整的话。数据库、对比用的基线、git、已经打开的 AI 对话或终端历史,有一项读不成,正文里会出现「部分记录未能完整读取,本次日报可能不完整」。数据页的「日报状态」在你生成过之后,会列出同样这些来源,包括终端历史没有时间戳、有几个仓库未扫描,以及哪一次扫描失败。每个开关到底多留下什么,「记录工作时,哪些内容可以不收集」那篇按开关写过。

怎样核对记录,以及哪三次会联网

对着你记得清楚的一段时间,打开那一天的时间线,先找应用名。点「显示 N 段离开」才能看到标成「离开」的那些行。设置的通用页有「运行状态」,最近还有新行时显示「正常」,否则是「已暂停」「缺少权限」「写入失败」「读取失败」或「最近没有新记录」,最后一种是最新一行的结束时间已经超过 5 分钟。隐私页的「记录预览」列出所选那天最近三条,开过标题的话会带上标题和路径。某一段是空白,多半是赏月没在运行、记录暂停了,或者前台应用在忽略列表里。通用页的「开机启动」会在登录后于后台开始记录,不把窗口打开。「日报里少了一段,先检查什么」那篇把这些检查按顺序走过一遍。

记录、搜索、图表和日报本身都不发起网络连接。赏月只在三个地方联网,而且都要你点一下,这三个请求都不带 SQLite 里的使用记录。设置的通用页,「设备授权」那一行点「管理」,弹出面板里的购买按钮会在浏览器里打开 hina.day/api/checkout,随即转到 Dodo 的结账页。同一个面板的「激活」,在你提交授权码时向 live.dodopayments.com/licenses/activate 发一次 POST,正文是授权码和由 Hina 加这台 Mac 的短编号组成的名字。「检查更新」在赏月窗口打开之后的应用菜单里,对 https://hina.day/version.json 发一次 GET,请求里没有活动记录,也没有机器编号,新旧版本的比较在本机做。没有定时检查。你把日报复制或导出之后贴给别的工具,从那一步起适用的是那个工具自己的规则。

要看按钮最后落在哪、一张图裁到哪里,录屏留得下画面,赏月留不下。账单上的那一小时必须是你亲手按下开始、并指定给客户的那一段,手动计时器对得上,这种采样对不上。如果规定这台机器上不能留活动日志,SQLite 文件和那些可选读取都不合适,自己点开始和结束的计时器才符合这条规则。赏月不截屏。

Hina 在本机记下你的一天,不截屏,也不用注册账号,回头看时知道时间花在了哪里。

下载 Mac 版

继续阅读

  • 时间记录Mac 上的时间记录软件,按记录方式分四类来选2026年10月18日 · 约 4 分钟
  • 时间记录想换掉 Timing,先看规则和发票还要不要2026年10月19日 · 约 8 分钟
  • 时间记录想换掉 RescueTime,先想清楚要留下什么2026年10月18日 · 约 4 分钟

Hina · 賞

看清时间,回顾项目,提醒休息

产品 下载 文章 版本记录 购买
支持 购买与激活 隐私 退款
联系 hi@hina.day X Tw93