# Journal Partner 一款陪你写日记的 Obsidian 插件。自动识别并高亮 Journal 区域的时间戳,让每一条记录的时间一目了然;配套一个**快速记录**面板,让你随时把想法、图片、语音、待办丢进今天的日记;还能**收藏**值得重温的条目、**随机回顾**过去的日记,并在同一个面板里集成**全量统计**,用热力图回顾一年的坚持。 ![Obsidian plugin](https://img.shields.io/badge/Obsidian-Plugin-7c3aed?style=flat-square&logo=obsidian&logoColor=white) ![Version](https://img.shields.io/github/manifest-json/v/zhaohongxuan/journal-partner?style=flat-square&color=7c3aed&label=version) ![License](https://img.shields.io/github/license/zhaohongxuan/journal-partner?style=flat-square&color=7c3aed) --- ## 效果预览 在 `## Journal` 区域下,每行行首的 `HH:MM` 时间戳会被渲染为醒目的胶囊徽标;带 `[ ]` 的行会被识别为待办任务: ``` ## Journal - 06:42 把我的工作笔记从 Obsidian 工作流中移出去 - 07:31 成功安装并配置了 OpenClaw! - 08:10 多花点时间做自己的事情,跑步、读书、练字都行 - 09:20 [ ] 完成周报 - 18:05 [x] 跑步 5 公里 ``` ↓ 渲染后时间戳高亮显示,颜色可自定义。 image --- ## 功能 ### 🌐 多语言 插件支持 **英文(默认)** 和 **中文** 两种界面语言,可在 **设置 → Journal Partner → 其他 → Language** 切换,切换后立即生效(无需重启)。 - **默认英文**:所有 UI 文本、设置项、提示、日期格式均为英文 - **第二语言中文**:切换到中文后,设置页、快速记录面板、统计页、Notice 提示全部变为中文 - 日期 / 星期 / 月份 / 数字格式随语言联动(英文 `Aug 29, 2026 · Sat` / 中文 `2026年8月29日 · 周六`) ### ✍️ 时间戳与编辑增强 - **时间戳高亮**:在编辑器(Source / Live Preview)和阅读视图中均生效 - **自定义颜色**:在设置中用拾色器分别设置文字色和背景色,**白天 / 深色主题各一套**,改动实时生效 - **自定义作用范围**:指定目标标题名称(如 `Journal`)和层级(如 `##`),插件只在该区域内生效 - **时间戳只读**:开启后无法在编辑器中修改已有时间戳,防止误删或误改 - **回车自动插入时间戳**:在 Journal 区块内按回车时,新行自动以当前 `HH:MM` 起头 - **Tab 缩进保留时间戳**:在条目首部按 Tab 时,时间戳与内容一起缩进,光标停在新位置 - **自定义正则**:默认匹配 `HH:MM` 格式,可修改为任意正则表达式以适配其他时间格式 ### 🪶 快速记录面板 打开「快速记录」面板(羽毛笔图标或命令面板),即可在同一个面板里完成**速记**和**统计回顾**。底部是一个浮动 dock,四个按钮切换:`记录` / `随机回顾` / `收藏` / `年度统计`。 #### 📝 记录 Tab - **基于 Daily Notes**:自动写入今天日记的 `## Journal` 区段;若文件或区段不存在则自动创建(依赖 Obsidian 内置「Daily Notes」核心插件) - **多行输入框**:支持系统语音输入法、回车换行;写入时自动保留 markdown 软换行结构 - **自定义提交快捷键**:可选 `Shift+Enter`(默认)/ `Ctrl+Enter` / `Alt+Enter` / `Ctrl+Shift+Enter` - **粘贴图片**:在输入框内直接 `⌘V` 粘贴剪贴板里的图片,插件自动保存到附件目录并**内联追加**到条目文字之后(不另起一行);也支持把图片文件**拖拽**到输入框 - **图片按钮**:点击输入框下方的图片图标,从本地选择图片插入 - **麦克风录音**:一键录音,录音时实时显示对称胶囊波形 + 时长;停止后自动保存为附件(优先 `m4a`,不支持则 `webm`)并以 `![[audio.m4a]]` 嵌入,时间线上会渲染为可播放的音频条 - **实时语音转文字**:配置转写接口后,录音时**边说边出字**(VAD 在停顿处切句 + 跨段上下文,像语音输入法),停止时再用完整音频整段重转替换草稿,兼顾实时与准确。详见下方 [语音转文字](#️-语音转文字) - **待办任务**:点输入框下方的 ✓ 按钮进入任务模式,提交的内容会写成 `- HH:MM [ ] 文字`;时间线中任务以蓝色标识,已完成的显示删除线与半透明 - **快捷标签**:点标签按钮从预设标签中多选,选中项以 chip 形式显示在输入框上方,提交时自动写入;标签列表可从全库日记中出现过的标签中选取(按频率 + 最近使用排序) - **气泡时间线**:每条记录以「时间胶囊 + 内容气泡」呈现,带有平滑的连接弧线,颜色与时间戳样式同源 - **跨天无限滚动**:今天置顶;向下滚动自动加载更早有内容的日子,直到 365 天前为止 - **实时同步**:在主编辑器里改动当天日记,面板对应日的时间线会就地刷新 - **Markdown 渲染**:支持双向链接、嵌入图片、加粗斜体等,所有原生 Obsidian 渲染特性均可用 - **日期栏排序按钮**:每个日期标题卡片的右上角都有排序切换按钮,按当日时间正序 / 倒序展示 - **筛选**:工具栏提供**类型筛选**(全部 / 仅任务 / 仅备忘)与**标签筛选**两个独立按钮 - **右键管理 memo**:右键(或移动端长按)任意气泡,可复制原文、编辑正文、删除当前 memo;若该条 memo 附带录音,还会出现「删除 memo 和录音文件」与「仅删除录音文件」两个选项,录音走 Obsidian 回收站可恢复。可在设置中关闭「删除前确认」跳过对话框 image #### 🎲 随机回顾 Tab 从过去的日记中随机抽取一天展示,配合收藏功能可以用来挖掘值得回味的旧记录。 - **兼容无时间戳日记**:用纯段落写的旧日记同样能被回顾到,不依赖 `- HH:MM` 格式 - **可直接收藏**:回顾到的旧条目同样可以点爱心收藏 #### ❤️ 收藏 Tab hover 任意时间线条目,点爱心即可把该**单条记录**收藏起来。 - **四种模式通用**:日常 / 搜索 / 随机回顾 / 标签模式下渲染的条目都可收藏 - **收藏列表**:扁平列表展示,最新收藏在前;点击行跳转到当日日记,点爱心取消收藏 - **状态同步**:同一条目在任意模式、任意视图(侧边栏 / 小窗)下爱心状态一致 - **自动清理失效收藏**:打开列表时自动校验并清理「日记被删 / 条目被改」的收藏,并提示清理数量 - **数据存储**:存于插件 `data.json`,不产生额外文件;老用户升级零迁移 #### 🔍 搜索与标签 工具栏的搜索按钮进入内联搜索模式,可按关键字检索所有日记条目;标签筛选用独立的标签按钮,可从日记中出现过的标签里筛选。 #### 📊 统计 Tab 和记录 Tab 共享同一个面板,点击 `年度统计` 即可切换。第一次打开会扫描所有 Daily Notes,之后改动日记会自动 300ms 防抖刷新。 - **全量 Hero**:顶部一张紧凑卡片展示**全部年份累计**的总字数(万位自动转换),副标题显示覆盖年份范围(如「2022–2026 年」) - **4 项核心 KPI**:写作天数 / 总条数 / 录音数 / 最长连续,与 Hero 卡片内嵌显示,不再独立成卡 - **按年热力图**:每年一张 GitHub-style 热力图,7×53 网格、周一开头,5 档紫色浓度(按当日 memo 条数),鼠标悬停显示「YYYY年M月D日 · X 条 · Y 字」,点击非空格子在新 Tab 打开对应 Daily Note - **兼容无时间戳日记**:用纯段落写的旧日记同样会被统计进字数 / 条数 / 写作天数 —— 不依赖 `- HH:MM` 格式 - **优雅降级**:没有时间戳时,「写作天数」仍能正确计数;「最常记录时段」类的指标仅在有时间戳的日记中显示 ### 🔗 URL 协议(Action Button / Shortcuts 集成) 插件注册了 `obsidian://journal-partner` URL 协议,可以从任何能打开 URL 的地方(iOS Shortcuts、macOS Shortcuts、命令行 `open`)一键写入今天的日记,**无需打开 Obsidian 主界面**: ``` obsidian://journal-partner?text= obsidian://journal-partner?text=&audio= ``` **参数:** | 参数 | 必填 | 说明 | |---|---|---| | `text` | text/audio 至少一项 | 条目文字内容(URL 编码) | | `audio` | text/audio 至少一项 | vault 内的音频附件相对路径,例如 `Assets/audio/2026-06-21_153012.m4a`,会以 `![[...]]` 嵌入,渲染成可播放的音频条 | | `time` | 否 | `HH:MM` 格式,默认使用当前时间 | **搭配 iPhone Action Button**:在 iOS Shortcuts 里创建一个捷径—— - 「听写文本」→「打开 URL」(仅文字) - 「录音 → 听写文本 → 保存录音到 `Assets/audio/` → 打开 URL(text + audio 两个参数)」(文字 + 录音双轨) 把捷径设为 Action Button,按一下手机侧键就能听写并自动落到今天的日记,全程不打断当前操作。 > 💡 **一键导入**:插件设置面板提供了「获取捷径」按钮,或直接点这里 → [iCloud 捷径模板](https://www.icloud.com/shortcuts/2b5bbc7c721a4010807c4ed337245360),添加到「快捷指令」app 即可使用。 --- ## 安装 ### 通过 BRAT 安装(推荐) [BRAT](https://github.com/TfTHacker/obsidian42-brat)(Beta Reviewer's Auto-update Tool)能自动跟随本仓库的 release 升级,是目前推荐的安装方式: 1. 在 Obsidian 社区插件中搜索并安装 **BRAT**,启用它 2. 打开命令面板(⌘P)→ 执行 **BRAT: Add a beta plugin for testing** 3. 粘贴本仓库地址:`https://github.com/zhaohongxuan/journal-partner` 4. BRAT 会自动下载最新 release,并在 **设置 → 第三方插件** 中显示 **Journal Partner**,启用即可 5. (快速记录功能)确保 Obsidian 内置「Daily Notes」核心插件已启用 之后每次本仓库发布新版本,BRAT 都会在 Obsidian 启动时自动更新。 ### 手动安装 1. 前往 [Releases](https://github.com/zhaohongxuan/journal-partner/releases) 下载最新版本的 `main.js`、`manifest.json`、`styles.css` 2. 将三个文件复制到你的 Vault 的 `.obsidian/plugins/journal-partner/` 目录下 3. 在 Obsidian 设置 → 第三方插件 中启用 **Journal Partner** 4. (快速记录功能)确保 Obsidian 内置「Daily Notes」核心插件已启用 --- ## 使用快速记录 1. 点击左侧栏的羽毛笔图标,或在命令面板(⌘P)中执行 **「打开 Journal Partner 侧边栏」** 2. 默认进入「记录」Tab:在输入框中写下任何想法,按提交快捷键写入 3. 内容会以 `- HH:MM 文字` 的形式追加到今天日记的 `## Journal` 区段 4. 时间线顶端始终是今天,向下滚动可继续浏览历史日记 5. 底部 dock 可切换到 `随机回顾` / `收藏` / `年度统计` > 多行输入会被保存为带 markdown 软换行的列表项,渲染时保持段落结构。粘贴图片 / 录音后会自动保存到 Vault 附件目录(路径默认取自 Obsidian「附件文件夹」设置,也可在插件设置中分别指定)。 ### 🖥️ 独立小窗(桌面端) 桌面端可以把记录面板**直接拖出**成独立的悬浮小窗(Obsidian 原生能力,把面板标签拖到空白处即可),小窗可独立于主窗口使用,适合当作随手记录的常驻浮窗。 - **小窗宽度自适应**:窄窗下输入卡片与时间线自动适配 - **矮窗自动隐藏 dock**:窗口高度低于阈值时底部 dock 自动隐藏,避免遮挡内容,拉高后恢复 - **粘贴图片 / 标签选择器可用**:事件监听绑定在面板自身的 document 上,小窗中同样生效 --- ## 🎙️ 语音转文字 在「快速记录」面板点麦克风按钮开始录音,插件会在输入框上方显示实时波形与时长。配置好转写接口后,支持两种模式: - **实时转写(默认开启)**:边说边出字。插件用 VAD(静音检测)在你说完一句话的停顿处切分音频,每段独立转写后追加到输入框;并把上一段末尾文本作为 `prompt` 喂给下一段,解决跨段同音词和断词问题。停止时再用完整音频做一次整段转写,替换掉实时拼出的草稿,得到既实时又准确的最终文本。 - **整段转写(关闭实时转写)**:录完整段后一次性转写,准确但无实时反馈。 转写完成后,文本与音频 embed(`![[audio.m4a]]`)会一起插入光标处。录音格式优先 `m4a`(`audio/mp4`),浏览器不支持时自动降级为 `webm`。 > 接口地址 / API Key 留空时,转写自动关闭,麦克风按钮仅作纯录音用。 --- ## 设置说明 打开 Obsidian 设置 → 插件选项 → **Journal Partner**: ### 📍 时间戳设置 | 设置项 | 说明 | 默认值 | |---|---|---| | 目标标题名称 | 插件生效的标题文字(不含 `#`) | `Journal` | | 标题层级 | 目标标题的层级 | `H2` | | 时间戳只读 | 防止在编辑器中修改已有时间戳 | 开启 | | 回车自动插入时间戳 | 在 Journal 区块内按回车时自动插入当前时间 | 开启 | | 时间戳匹配正则 | 识别时间戳的正则表达式 | `\d{2}:\d{2}` | | 时间线排序 | 条目展示顺序:倒序(新→旧)或 正序(旧→新) | 倒序 | ### 🏷️ 标签设置 | 设置项 | 说明 | 默认值 | |---|---|---| | 预设标签 | 快捷标签选择器里展示的标签,可增删 | `#log/fitness`、`#log/code` | | 默认标签 | 每次打开输入框时自动选中的标签(须为预设标签的子集) | 无 | | 日记标签上限 | 标签菜单中最多展示多少个「来自日记的标签」(按频率 + 最近使用排序),`0` 表示不限 | `15` | ### 🎨 颜色设置 文字色与背景色**分别提供白天 / 深色两套**,主题切换时自动生效;每项带「恢复默认」按钮。 | 设置项 | 说明 | 默认值(白天 / 深色) | |---|---|---| | 文字颜色 | 时间戳徽标前景色(同时影响时间线弧线、内容气泡底色) | `#7c3aed` / `#a78bfa` | | 背景颜色 | 时间戳徽标背景色 | `#ede9fe` / `#2e1065` | ### 🎙️ 语音转文字 录音转文字使用 OpenAI 兼容的 `/audio/transcriptions` 接口,接口/Key 留空则关闭转写(仅保留纯录音)。 | 设置项 | 说明 | 默认值 | |---|---|---| | 转写接口地址 | OpenAI 兼容的音频转写地址,留空关闭转写 | 空 | | API Key | 以 Bearer 形式发送的密钥 | 空 | | 模型 | multipart 中的 `model` 字段 | `whisper-1` | | 语言 | ISO-639-1 语言提示(如 `zh`、`en`),留空自动识别 | `zh` | | 实时转写 | 录音时边说边出字,停止后整段重转替换草稿 | 开启 | | 录音保存目录 | 录音附件的保存目录;留空使用 Obsidian「附件文件夹」设置 | 跟随附件设置 | **国内推荐(免费、可直连)** —— 硅基流动 SiliconFlow 的 `FunAudioLLM/SenseVoiceSmall`: ``` 转写接口地址: https://api.siliconflow.cn/v1/audio/transcriptions 模型: FunAudioLLM/SenseVoiceSmall 语言: zh ``` 到 [siliconflow.cn](https://siliconflow.cn) 注册并实名后生成 API Key 填入即可,该模型常驻免费。也可填 OpenAI、Groq 或自建 faster-whisper 服务(OpenAI 兼容格式即可)。 ### ⚙️ 其他 | 设置项 | 说明 | 默认值 | |---|---|---| | Language | 界面语言,`English`(默认)或 `中文`,切换即时生效 | `English` | | 移动端从侧边栏打开 | 移动端在右侧滑出抽屉中打开记录面板;关闭则占据主编辑区全屏展示。桌面端不受影响(始终从右侧栏打开) | 关闭 | | 打开时自动聚焦输入框 | 打开 Journal Partner 时自动聚焦记录输入框(移动端同时弹出系统键盘),无需再手点输入框 | 开启 | | 提交快捷键 | 输入框中提交日记的快捷键组合 | `Shift+Enter` | | 图片保存目录 | 粘贴 / 上传图片的保存目录;留空使用 Obsidian「附件文件夹」设置 | 跟随附件设置 | | 获取捷径 | 一键导入 iOS 快捷指令模板(见下方 URL 协议) | — | --- ## 开发 ```bash # 安装依赖 npm install # 开发模式(保存自动重建) npm run dev # 生产构建 npm run build # 部署到本地 Obsidian Vault(需在 deploy.sh 中配置 VAULT_PATH) npm run deploy ``` 构建产物为 `main.js`,与 `manifest.json`、`styles.css` 一起复制到插件目录即可。 --- ## License MIT