每月情书
Web App
Next.js
Notion API
在 Notion 中写信,发布为受密码保护的网页,一信一密。
每月情书 (Monthly Love)
这是一个小巧私密的信件网站,用来给特别的人每月写一封信。信件在 Notion 中撰写,发布到网页后受密码保护:每封信有自己的密码,信件目录页则另有一个单独的密码。网站基于 Next.js、TypeScript 和 Notion API 构建。
(入口密码:missu)
可以把它想象成一个极简的私人博客,每篇文章都封在自己的信封里:未解锁的页面只渲染密码输入框,在输入正确密码之前,信件正文不会从 Notion 获取,因此也不会出现在 HTML 或任何 HTTP 响应中。
核心功能
- 以 Notion 作为 CMS —— 在 Notion 中写好信、勾选 Published,一分钟内即可在
/p/<slug>上线(ISR 每 60 秒重新验证),无需重新部署。 - 一信一密 —— 每封信有独立密码,使用
crypto.timingSafeEqual校验以抵御枚举攻击,未解锁的页面绝不泄露正文。 - 保持解锁 —— 信件解锁后,其 slug 会存入经签名加密的
iron-sessioncookie(有效期 30 天),再次访问无需重复输入密码。 - 丰富的信件排版 —— Notion 区块在服务端转换为 Markdown,支持 GFM 表格、任务列表、折叠块、图片和代码块,并配有带滚动定位的悬浮目录。
- 双语界面 —— 站点界面可在中英文之间切换。
- 评论回流 Notion —— 访客评论以 Notion 原生页面评论的形式保存,回复就在写信的地方进行。
- 隐私优先 —— 所有响应均携带
X-Robots-Tag: noindex, nofollow,信件不会被搜索引擎收录。
使用方法
写一封信只需三步:
- 在 Notion 数据库中新建页面撰写信件,填写
Title、Slug、Password、Date和Excerpt属性。 - 勾选 Published 复选框。
- 把短链接和密码发给收信人,就这么简单。
在读者一侧,打开信件时会先看到密码输入框;解锁之后,页面会在 30 天内记住这位读者。
技术栈
| 层级 | 技术 |
|---|---|
| 框架 | Next.js 16 (App Router, Server Components, Server Actions) |
| 语言 | TypeScript |
| UI | React 19 + Tailwind CSS v4 |
| CMS | Notion API (@notionhq/client) |
| Markdown | notion-to-md + react-markdown |
| 会话 | iron-session |
