An Obsidian plugin that brings intelligent reading and annotation features to Markdown files. Highlight text, add underlines, attach comments, and leverage AI to explain, translate, and annotate your content — all directly within Obsidian.
Compared to PDF annotation plugins, FleurAnnotation focuses specifically on Markdown files:
https://github.com/gibsonchan-5/fleur-annotation.obsidian/plugins/fleur-annotation/ in your vaultHighlight Text
Add Underline
Add Annotation
AI Explanation: Select text → Right-click → "AI Explanation"
AI Translation: Select text → Right-click → "AI Translation"
AI Annotation: Click the "AI Annotation" button in the sidebar annotation card
In Obsidian Settings → FleurAnnotation:
FleurAnnotation is offline by default. Highlights, underlines, comments, the sidebar and note export touch nothing but your own vault — annotation data is stored as plain JSON files inside your vault (.obsidian/plugins/fleur-annotation/data/, or a folder you choose for cross-device sync).
The plugin makes network requests only when you trigger them:
chat/completions endpoint you configure under Settings → Base URL — for example api.deepseek.com, api.openai.com, open.bigmodel.cn, api.moonshot.cn or dashscope.aliyuncs.com (Alibaba Qwen). Nothing is sent unless you invoke an AI action, and only the selected passage goes out, never the whole document.dict.youdao.com, JSON API) and the Free Dictionary API (api.dictionaryapi.dev). Only the queried word goes out — never the surrounding text or context. If FleurDict is installed and enabled, lookups are handed to the FleurDict plugin instead, whose own network behavior is documented in its repository.enable_search, Zhipu gets a web_search tool entry. Providers with no supported field — DeepSeek's own endpoint, OpenAI, Moonshot — receive nothing extra. Either way this adds a per-call search fee to that provider's bill.There is no telemetry, no analytics, no usage tracking, no ads, no remote code or assets, and no self-update mechanism. The plugin never contacts the author's servers, and it does not read or write anything outside your vault.
Your API key stays on your device. By default it is kept in the system keychain through Obsidian's SecretStorage, which means it is not written to data.json and does not travel with your vault. If you switch the storage location to data.json, it is stored in clear text inside the vault and will sync with it — that tradeoff is your explicit choice, and the settings page warns you about it. The key is only ever transmitted as a Bearer token to the Base URL you configured.
Because that Base URL decides where the key goes, it is validated before every request: the address must parse, must not embed credentials, and must use HTTPS — plain HTTP is accepted only for loopback hosts (localhost, 127.0.0.1, ::1), so a local proxy such as Ollama or LM Studio keeps working while a cleartext downgrade to a remote host is refused. Any valid HTTPS host is still accepted, since pointing at your own gateway is the point of an OpenAI-compatible setting; the check is a transport-integrity guard, not a host allowlist.
Keys are therefore also bound to the host they were entered for: each host gets its own keychain entry, and the list of bound hosts is kept in data.json (host names are not secret — they are already in your Base URL). If a synced data.json arrives whose Base URL points at a host you never bound, the plugin will not hand an existing key to it; it clears the key and asks you to re-enter it once. Switching back to a previously bound host restores its key automatically. On first launch after upgrading, your existing single key is adopted into the entry for whichever host is configured at that moment, so no re-entry is needed unless you subsequently change host.
One local detail worth knowing: exported annotation notes carry a source: field in their frontmatter with the vault-relative path of the annotated note. That file is written into your own vault and is never uploaded anywhere. The optional local wordbook lives in FleurAnnotation/data/ inside your vault (or syncs through FleurDict if you enable that), and never leaves your device.
git clone https://github.com/gibsonchan-5/fleur-annotation.git
cd fleur-annotation
npm install
npm run build
npm test
npm test bundles every test/*.test.ts with esbuild (obsidian → test/obsidian-mock.ts) and runs it under Node + jsdom: marker-placement and unwrap rules, cross-device store merge, and the desktop zero-impact smoke checks.
MIT License
FleurAnnotation 是一个 Obsidian 插件,为 Markdown 文件提供智能阅读和批注功能。
社区插件安装(推荐)
手动安装
.obsidian/plugins/fleur-annotation/ 目录基本操作
AI 功能
词典查词
侧边栏管理
在 Obsidian 设置 → FleurAnnotation 中:
插件默认完全离线。高亮、划线、批注、侧边栏与导出笔记只读写你自己的 vault——批注数据以普通 JSON 文件形式保存在 vault 内(默认 .obsidian/plugins/fleur-annotation/data/,也可在设置里改到用于跨设备同步的目录)。
插件只在你手动触发时发出网络请求:
chat/completions 接口,例如 api.deepseek.com、api.openai.com、open.bigmodel.cn、api.moonshot.cn、dashscope.aliyuncs.com(阿里千问)。不点 AI 就不会有任何外发,且只发送选中文本,不会上传整篇文档。dict.youdao.com JSON API)与 Free Dictionary API(api.dictionaryapi.dev)。外发的只有被查询的单词本身,不会带上前后文或任何笔记内容。如果安装并启用了 FleurDict,查词会转交给 FleurDict 插件完成,其自身的网络行为以其仓库文档为准。enable_search,智谱带 web_search 工具项。不支持该字段的端点(DeepSeek 官方、OpenAI、Moonshot)不会多发任何字段。无论走哪家,都会在你的对应账单里额外产生每次调用的搜索费用。没有遥测、没有数据统计、没有广告、没有远程代码或资源加载、也没有自我更新机制。插件不会连接作者的任何服务器,读写范围不超出你的 vault。
API Key 始终留在你自己的设备上。默认通过 Obsidian 的 SecretStorage 存进系统钥匙串,因此不写入 data.json,也不会随 vault 同步;如果你把「密钥保存位置」改成 data.json,密钥将以明文存在 vault 内并随其同步——这是你主动选择的取舍,设置页也会给出提示。密钥只会作为 Bearer 令牌发往你填写的那个 Base URL。
由于 Base URL 决定了密钥的去向,插件在每次发请求前都会校验它:地址必须能解析、不得内嵌账号密码、且必须使用 HTTPS;明文 http 只对本机回环地址(localhost、127.0.0.1、::1)放行,这样 Ollama / LM Studio 这类本地代理照常可用,而把流量降级到远端明文地址会被拒绝。任何合法的 https 主机仍然放行——「能指向自建网关」正是 OpenAI 兼容设置的意义所在。所以这一层是传输完整性防护,不是主机白名单。
因此密钥还会与录入它的主机绑定:每个主机在钥匙串里各占一条,已绑定过哪些主机记在 data.json 里(主机名不是机密,它本来就在你的 Base URL 中)。如果同步过来的 data.json 指向一个你从未绑定过的主机,插件不会把已有密钥交给它——而是清空并要求你重新输入一次;切回曾经绑定的主机时,对应密钥会自动恢复。升级到本版后的首次启动,会把原有那把不分主机的密钥收养到「当时所配置的那个主机」名下,因此除非你之后更换主机,否则不需要重新输入。
另外一点本地细节:导出的批注笔记,其 frontmatter 里会有 source: 字段,记录被批注笔记在 vault 内的相对路径。这个文件只写进你自己的 vault,不会上传到任何地方。可选的本地生词本保存在 vault 内的 FleurAnnotation/data/ 目录(或在设置里交给 FleurDict 同步),同样不会离开你的设备。