Show HN: Files.md —— Obsidian 的开源替代品
摘要
Files.md 是一款免费、开源的 Markdown 笔记应用,运行于浏览器中,文件存储在本地,支持同步功能,并配有 Telegram 聊天机器人,方便随时随地访问。
查看缓存全文
缓存时间: 2026/05/18 15:56
zakirullin/files.md 来源:https://github.com/zakirullin/files.md
Files.md
一个简单的 .md 文件管理应用。你可以用它存储生活中的一切:
- 📌 笔记
- 📝 文档、项目
- 💚 日记、习惯
- ✅ 清单、任务
所有内容均为纯 .md 文件,本地优先。对 LLM 友好。
试试看:app.files.md (https://app.files.md)(Beta)
我和朋友们已经为此项目开发了 5 年。希望你喜欢!
在 GitHub 上赞助 💚 (https://github.com/sponsors/zakirullin)
又一个笔记应用?也许吧。但这次:
- 只保留必要功能,限制激发创造力
- 无需安装任何东西,只需要一个浏览器
- 可离线使用
- 本地优先,文件归你所有
- 免费且开源,你可以随意定制
- 代码极其简单,一个人或一个 LLM 就能掌握整个项目
- 可移植,无需构建系统,直接打开
web/index.html即可 - 开箱即用的同步功能
- 服务器只是一个二进制文件(也可用 iCloud/Dropbox/Google Drive 同步)
- 支持 Telegram 聊天机器人,随时访问你的文件
使用方法
- 在 Chrome 浏览器中打开 app.files.md (https://app.files.md)
- 点击地址栏右侧的“安装 files.md”:
- 打开一个本地文件夹以持久化更改
- 偶尔强制刷新(
Cmd+Shift+R)以获取最新更新。
快速记录想法
你可以使用聊天功能快速记录想法。这些内容会在所有设备间同步。
打开聊天并发送消息:
选择保存位置(可以稍后决定):
通过这种方式,你可以快速保存笔记、日记和清单。
在聊天机器人中保存内容
打开聊天,输入内容,按 Enter:
就这么简单。
Telegram Bot (https://t.me/FilesMDBot)
其他即时通讯工具即将支持
如何扩充知识库
连接想法。让它们产生复利。深入思考。
- 我使用 app.files.md (https://app.files.md) 来扩充关于大脑和软件开发的知识
- 我将新笔记添加到
brain或dev文件夹。每条笔记一个想法 - 我在 Web 应用中关联相关笔记(输入
[[) - 所有内容都像我们的大脑一样相互连接
- 我花时间浏览笔记并深入思考
- 到了某个阶段,
brain和dev的笔记变得非常相关 - 领域间的相互联系产生了新的洞见
- 我根据那个洞见写了一篇文章:Cognitive Load in Software Development
所有这些活动帮助我:
- 深度思考(这在 AI 时代非常重要)
- 系统性思考,看到更大的图景
- 写出有洞见的文章
要实现这些,你需要动用自己的大脑,而不是依赖高级模板或 AI 工作流。
- 从完全没有结构开始,0 个文件夹
- 每条笔记一个想法
- 每条笔记都应该在不依赖上下文的情况下被理解
- 立即应用新知识,不要留给未来的自己
- 关联相关笔记
- 重新浏览你的笔记并深入思考
我和朋友们使用这个简单的设置已经五年,效果很好。
第二大脑?
我会引用《我删除了我的第二大脑》(https://www.joanwestenberg.com/i-deleted-my-second-brain-692aa40d59d5f06dd5131e43/) 中的话:
Obsidian 是一款出色的软件。我非常喜欢它。但像任何事物一样,没有节制,它也可能是一个陷阱。嵌套文件夹中的 Markdown 文件。跟踪你生产力的插件。暗示全知的知识图谱视图。看着你的笔记网络变成星座,有一种掌控的错觉。但星座是投影。它们讲述故事。它们并不保证理解。
当我刚开始使用 PKM 工具时,我以为我在解决遗忘的问题。后来,我以为我在解决整合的问题。
最终,我意识到我创造了一个新的问题:拖延。我的系统越庞大,我就越是把思考的工作推迟给未来的自己——那个会整理、标记、提炼、提取精华的未来自己。
那个自己从未到来。
第二大脑令人兴奋。高级大师模板、插件和 AI 工作流……你想要汲取整个互联网的智慧。这个整洁的系统有其美妙之处。每一条新笔记都带来多巴胺。第二大脑越来越好。
然而,第一大脑实际上从未变得更聪明。 这是个问题——在 AI 时代,你的第一大脑仍然宝贵如初。用你的大脑去思考这些笔记。
笔记可能阻碍体验
- 阅读和做笔记很容易让我们误以为自己理解了文本
- 我们以为自己理解了,但实际上我们只是知道
- 在某些时候,我们的“知道”如此完美,以至于我们开始觉得自己实际上已经做到了(或至少尝试过)
最糟糕的是,我们不允许新的经验出现,因为我们“已经知道”了。这是知识的障碍。生活给予我们经历新体验的机会,但我们拒绝了,因为“我们已经知道”。
通过阅读和做笔记来自我疗愈?
🧘 情感层面受到的伤害,必须在情感层面愈合。 而不是通过智力工作和记笔记。没有行动的阅读只是娱乐。一种拖延形式。再多的自助书籍也无法治愈情感创伤。 真正有帮助的是心理治疗、重写和空椅子技术。冥想。疗愈是通过感受发生的。
什么时候该记笔记
如果你的目标是:
- 对某件事建立更深入、更有结构的理解
- 进行研究
- 写一篇文章或一本书
那么记笔记完全没有问题。
文件结构
你不需要考虑结构,它已经预定义好了。不过,你可以自由使用任何你喜欢的结构。
- 聊天:
Chat.md - 笔记:
brain/Note.md,/*.md - 清单:
Read.md,Watch.md,Shop.md,MyChecklist_.md - 日记:
journal/2024.08 August.md - 任务:
Later.md - 习惯:
habits/Ate consciously.md,habits/*.md - 图片:
media/*(png, jpg, webp, gif) - 归档:
archive/*.md - 配置:
config.json
方案也可在 files.md/llms.txt (https://files.md/llms.txt) 获取。你可以将其复制粘贴到 CLAUDE.md 或 AGENTS.md 中,这样你的 AI 代理就能理解这个结构。
快捷键
| 快捷键 | 操作 |
|---|---|
[ | 插入指向文件的链接 |
Cmd+P / Ctrl+P | 打开文件搜索对话框 |
Cmd+N / Ctrl+N | 新建文件 |
Cmd+M / Ctrl+M | 移动文件 |
Cmd+D / Ctrl+D | 删除文件 |
Cmd+Enter / Ctrl+Enter | 打开聊天 |
Cmd+Shift+Enter / Ctrl+Shift+Enter | 切换聊天对话框 |
Cmd+[ / Ctrl+[ | 前往上一个文件 |
Cmd+] / Ctrl+] | 前往下一个文件 |
Cmd+~ / Ctrl+~ | 切换侧边栏 |
Cmd+B / Ctrl+B | 切换粗体 |
Cmd+I / Ctrl+I | 切换斜体 |
Cmd+Y / Ctrl+Y | 插入复选框 |
Cmd/Ctrl + 单击 | 复制内联文本 / 打开链接 |
Ctrl+Cmd+空格 | 插入表情符号 (macOS) |
用于文件的实用脚本
所有脚本都在 cmd 目录下,可以在你的文件目录内运行。请先安装 Go (https://go.dev/doc/install)。
将 Whoop 指标添加到日记
go run /abs/path/to/files.md/cmd/whoop/whoop.go
将维基链接转换为 Markdown 链接
将 [[wiki链接]] 转换为标准的 [名称](/路径.md)(支持 --dry-run):
go run /abs/path/to/files.md/cmd/tomdlinks/tomdlinks.go .
插入反向链接
向引用文件添加返回链接(支持 --dry-run):
go run /abs/path/to/files.md/cmd/backlink/backlink.go
调整日记时间戳
将日记文件中的时间戳按 N 小时移动(在时区变更后有用):
go run /abs/path/to/files.md/cmd/shifttime/shifttime.go
文档
仓库结构
web- Web 应用 (PWA),index.html是入口web/lib- 前端库cmd/server- 服务器入口cmd/*/- 用于.md文件的实用脚本server/bot.go- 机器人server/sync/- 同步 API 服务器代码vendor- 后端库tests- E2E 测试,测试 Web 应用和服务器
如何贡献
- 初级开发者应该能理解代码
- 理想情况下,每个 PR 都应该删除或简化代码,而不是添加代码
- 代码越少,灵活性越高
- 所有依赖都是我们的代码和责任。因此,尽可能避免依赖
- 代码应该自包含,所以
vendor和web/lib文件夹包含在仓库中 - 我们真的需要这个功能吗?它能帮我们完成实际工作,还是只是带来多巴胺?
请参考此指南 (https://github.com/zakirullin/cognitive-load) 了解更多详细的规则。
后端指南
- 我们编写测试
- 方法不使用 get* 前缀
- 没有 panic,错误是业务逻辑的一部分
- 如果忽略错误,则留下 WHY 注释
- 始终包装错误,应添加方法上下文
- 不为客户端代码提供迭代器
- 我们更喜欢真实实现,或者至少是 fake,而不是 mock 和 stub
- 导入仅在与其它导入重名时才重命名
- 出于可移植性考虑,所有内容都存储在纯
.md文件中
前端指南
- 如果就地修改库,请使用
PATCHED关键字 - 如果有一天我们能用自己微小的实现替换
CodeMirror,那就太棒了 - 没有构建系统,十年后我们打开
/web/index.html它应该还能直接工作 - 别忘了,在锁检查和锁获取之间的 await 可能导致竞态条件
- 避免脆弱的 e2e 测试。先出现负面情绪,然后我们就不再运行所有测试了
- 大多数 bug 是由竞态条件引起的,即异步流程在过程中被打断
术语表
filename- 带扩展名的文件名,如 “note.md”(以此作为 ID)header- 去掉扩展名并首字母大写的文件名,如 “Note”body- 文件内容dir- 用于按类别存储笔记的目录,如 “happiness”userID- chatID。大多数情况下我们仅使用 chatID 作为 userID(与机器人的私聊)ctime(文件)- 数据块或元数据变更时间:文件所有权、位置、文件类型和权限设置更改时间。父文件夹重命名不影响,移动文件会影响,重命名文件会影响。我们需要此信息来跟踪文件位置变化,例如了解文件何时被移动到归档,跟踪任务的“愤怒等级”等mtime(文件)- mtime(修改时间)指文件内容最后被修改的时间。与 ctime 不同,它不受文件元数据(如所有权、权限、重命名)变化的影响。我们依赖它进行同步。ctime(目录)- 添加或删除文件或子目录(类似于mtime加上 inode 变化,如文件重命名)
任何文件都可以通过文件名和目录唯一标识。我们只支持一级嵌套。
性能
该项目速度极快 :) 如果你担心因为性能原因而不必要地使用文件或互斥锁,请看这里:
互斥锁加锁/解锁 = 25 ns
从 SSD 随机读取 4K = 150,000 ns
1 ms = 1,000,000 ns
ADR(架构决策记录)
06.05.2026从 Today.md 迁移到 Chat.md。客户开发显示用户难以理解“聊天”概念。而且,“打开聊天”这句话在机器人和 Web 应用中都已有含义。02.05.2026现在 hide-token 每次更改时同步运行,之前有 100ms 去抖动,导致链接和格式化文本中逐字删除时出现抖动。06.05.2026将 Inbox.md 和 Today.md 合并为 Today.md。“Inbox”这个名称太抽象、与生产力相关且类似 GTD。我想要平静和简单。Today 就像“我生活在聊天中的页面”。23.04.2026从 API_HOST, APP_HOST 改为 API_URL, APP_URL。对于不同环境,最好在配置中提供更多信息,比如期望的 schema。22.04.2026机器人中的 Inbox 条目现在通过稳定的内容哈希(去除- [ ]/- [x]标记后块的fs.Hash)而不是位置索引来识别,这样即使其他条目被添加/删除/完成,按钮也能指向正确的行。06.05.2026看到两个按钮/消息“到收件箱”和“到聊天”在精神上很费力,仅仅为了给聊天丢一个任务,在精神上并不像看起来那么容易。因为它去了收件箱,还需要再点击一次。那一次点击就是添加新任务变得令人沮丧的原因。我放弃了两条不同的流程,现在所有内容都进入收件箱,收件箱中的每个项目都是一个 markdown 清单项。作为奖励,PWA 应用现在默认显示聊天的任务,非常方便。另外,也许“收件箱”在精神上是一个过载的术语,“聊天”听起来更好。等着看吧。11.04.2026尽管我想将链接存储为普通的 markdown 链接,但视觉上我想像使用最小的 [链接] 一样处理它们。为此,我决定当光标在该行时隐藏 (…) 部分。只有 markdown 文件链接才隐藏 (…) 部分。11.04.2026恢复标准的 Markdown 链接。我希望知识库是跨平台的。它应该在 GitHub 中也能工作。05.04.2026尝试将 web/* 的内容移到根目录以简化。坏主意——应该有一个明确的目录,我们可以将其用作服务器上的公共 DOCROOT。19.04.2026切换为 [link] 作为链接。[link](full%20path)语法过于冗长笨重,而且我们不想处理路径变化。21.09.2025移除了 WASM。我遇到一个 bug:一条消息从 Inbox.txt 中删除,但没有添加到文件中(我按了“移动到文件”按钮)。我无法重现该问题,但我发现了很多复杂性。JS -> Go (writeFile) -> Go 等待 JS 的 promise -> JS Golang 运行时在中间某处 -> JS (writeFile) -> Go (从 promise 返回) -> 将结果发送回 JS。而且这必须在单独的 goroutine 中完成,因为 WASM 和 JS 都在同一个线程中运行。另外,Golang 的 WASM 仍然是实验性的。我们有太多组件,涉及很多不确定性。当时我不想在 JS 中重新实现相同的功能,这个方案服务了一段时间。现在是时候在 JS 中重新实现该功能并放弃所有这些复杂性了。此外,inbox.wasm 大约 8MB,而我希望应用程序非常小。11.07.2025决定使用 OPFS 作为文件系统的初始驱动。更好的浏览器支持,用户更省心。应用默认使用 OPFS 驱动,如果需要,用户可以通过打开本地目录替换为本地文件系统 API。在这种情况下,DirHandle 会保存到 IndexedDB 并每次重用。08.07.2025根目录现在是 ‘/’,而不是 ‘’。Web 应用中的所有文件都通过路径标识,而不是通过 ‘dir’ + ‘filename’,限制为 1 级嵌套。11.04.2026Dropbox 会更改新创建文件的某些元数据,因此 ctime 会改变。我曾考虑改用 mtime 进行同步,但这不允许我们检测重命名(不过我们通过另一种机制检测重命名),所以 mtime 可能更可靠。而且同步不会被权限/所有权变更等触发。迁移到了 mtime。Mtime 用于基于内容的同步,ctime 用于仅追加的同步日志(重命名/删除)。我们还可以从 .git/archive 恢复 mtime,而 ctime 不行。30.06.2025决定将所有流程迁移到 Chat.md,甚至包括待办事项列表。新增:使用此流程无法处理多行任务,我们可能希望同时支持文件和索引。我们有两种方法:以统一方式编码参数,使用带 IF 的相同命令处理器;或者使用不同的命令处理器来处理聊天/文件移动。我决定使用不同的命令处理器。新增:如果使用不同的命令,移动到按钮配置会很复杂。新增:也许我们可以在“文件移动”时将文件移回 Chat.md,并重用已有的内容。
相似文章
@indigox: 强烈推荐 Markdown 专用编辑器 cogito.md!简洁优雅快速,所有项目可以按文件夹组织在左侧导航,能在文件和项目维度调用 Claude Code or Codex 作为 Agent 服务集成,可视化搭建知识库的利器!比 Obs…
cogito.md 是一款简洁优雅的 Markdown 专用编辑器,支持文件夹组织项目,可集成 Claude Code 或 Codex 作为 Agent 服务,适合可视化构建知识库,被认为比 Obsidian 更适合 Agent 工作流。
note.md
note.md 是一个本地优先、基于 Markdown 的工作空间,专为研究写作设计,提供无干扰的环境。
Show HN: OpenBrief – 本地优先的视频下载与摘要工具
OpenBrief 是一款开源桌面应用,让用户下载视频、转录音频、生成有依据的摘要,以及与媒体内容对话,所有操作都在本地计算机上进行。
开源、沙盒化的Obsidian Agent CLI,用于音频转录、思维导图和深度研究
一个开源的Obsidian命令行工具,提供沙盒化的AI代理,用于音频转录、深度研究和思维导图,旨在加速笔记记录,同时不修改用户的知识库。
[发布] Nexidion – 一个拥有自主本地AI后台工作器的私有知识库。
Nexidion 是一款开源的层次化 Markdown 笔记应用,内置自主运行的本地 AI 后台工作进程,可利用本地 LLM 对笔记进行重组、摘要和提取待办事项,并配备内置版本控制以确保安全。