几年后,你忽然想起一家面馆。
店名忘了。你只记得靠窗的位置,玻璃上的水痕,还有坐在对面的人说,等雨小一点再走。
你在旧记录里搜了搜「面馆」。一张照片出现了,桌角放着一把还在滴水的伞。照片下面只有一句话:
楼下的面馆,汤很烫。等雨小一点再走。
那场雨,忽然有了日期。
Moment 想留住的,就是这样的日子。
你可以把它放在自己的电脑或服务器上,随手写几句话,放几张照片,也认真写一篇文章。记录沿着时间排列,可以搜索、回看,也可以完整导出,带到下一台机器。
修好了一个缠了两天的 bug,买到最后一袋打折的面包,或者下班时发现,天已经比上个月亮得久了一点。
那时候,你大概不会觉得这些事值得专门写一篇文章。
所以 Moment 把记录的入口放得很近。写一句话,传一张照片,保存一段视频或一个链接,就能留下当下。本地草稿会保留还没发出的文字,等你下一次回来。
先记下来。它的分量,可以以后再知道。
一件事刚发生的时候,你可能只能写两行。过了几天,再读那两行,才知道自己还想说些什么。
Moment 也为长文章留了地方。选一张封面,裁好想留下的画面,改几次标题,把照片、引用和代码放进正文。草稿自动保存,写到一半可以停下;想安静写一会儿,就打开全屏模式。
写完以后,文章会回到时间流里,和那些短短的记录待在一起。以后翻到这里,你能看到一件事发生时的样子,也能读到自己后来怎样理解它。
有时候,你记得一句话,却忘了是谁、在哪一天说的。有时候,你只记得那是某年夏天,刚搬过一次家。
记得词语,就用搜索。记得时间,就从归档里回到某一年、某个月、某一天。
翻着翻着,你会发现,搬家那个月还修过一盏灯,第一次做饭把盐放多了,后来才慢慢记住附近的路。
零散的记录,开始连成一段生活。
有些记录适合分享给朋友。发出一个链接,聊聊照片里的地方,让评论与回复留在那条记录旁边。
也有些话,写下来的时候,只想让自己知道。
Moment 支持公开与仅自己可见的记录。你可以决定一条内容的去处,也可以按自己的阅读习惯,选择浅色、柔和深色、纯黑背景和喜欢的强调色。显示偏好保存在当前浏览器里。
人会换电脑,会搬到另一座城市。多年前搭起的小站,也可能需要迁到新的服务器。
Moment 将文字、媒体原件和站点数据保存在你管理的数据目录里,支持导出、导入与恢复。换一台机器,继续这条时间线。
这是「自托管」对一个记录工具最实际的意义:几年以后,你仍然能够决定这些内容放在哪里。
Moment 也提供 CLI 和 HTTP API。如果你习惯从终端做事,或想把记录接入自己的工作流,这里同样留着入口。
进入项目源码目录,先安装 mise,再运行:
mise install
mise exec -- task setup
MOMENT_USERNAME=writer mise exec -- task run打开 http://127.0.0.1:8080,开始你的第一条记录。
首次启动会用 MOMENT_USERNAME 指定的名字创建管理员账号,并将该账号的初始 API 令牌保存到 .moment-local/account.token。在登录页选择 API 令牌登录,也可以在账号设置中配置密码。后续启动复用已有数据,不要求保存着初始令牌。所有已启用的账号都可以发布内容;管理权限、内容作者和站点展示账号分别设置。
需要部署到服务器、使用容器,或了解媒体处理依赖,可以查看 部署与发布指南 和 媒体处理说明。
技术结构与检查命令
Go + React + TypeScript + SQLite。
前端随 Go 可执行文件一起分发,核心运行时采用单进程、SQLite 和本地媒体目录,无需单独配置数据库服务。图片与视频的处理依赖见上方媒体说明。
如果要参与开发或检查改动:
mise exec -- task ci检查评论交互时,可以使用独立的测试实例和多账号讨论样本:
mise exec -- task playground
mise exec -- task playground:comments样本覆盖评论详情、楼内回复、分页、折叠、文章评论和私密内容;重复运行会复用同一实例的样本。测试账号 xiaoman 的 API 令牌保存在 .moment-local/playground/account.token,重启和 task playground -- reset 都会复用同一个值,方便浏览器记住;重置仍会清空测试内容和登录会话。
今天很普通,但也值得留下。