最近看到少楠还在认真维护自己的个人博客《少楠的松节油》,我愣了一下。

大概 2016、2017 年的时候,我也用 Hexo 搭过博客。那时候会为了一个主题折腾半天,会买域名,会研究 GitHub Pages,也会真的往上面写东西。现在回想,那时的表达欲好像比后来强。

后来这些年,表达没有消失,只是散落了。有的在微信里,有的在飞书和工作文档里,有的在和 AI 的对话里。真正属于自己、能长期留下文字的公开空间,反而没有了。

所以这次重新搭 zefeng.me,我一开始就给自己定了一个很简单的目标:别把它再做成一个技术项目。

先给自己定了三个原则

动手之前,我先跟自己确认了三件事。

一,国内能直接打开。手机、公司、家里的网络都不用科学上网,也不依赖 Google Fonts 这类跨境资源。这是第一优先级。

二,维护成本尽量低。不维护服务器,不维护数据库,不长期追插件兼容性。

三,文章必须永远属于自己。内容全用 Markdown 保存,版本用 Git 管,Hugo 只是展示层,Cloudflare 只是托管层。哪怕哪天换主题、换生成器、换托管平台,文章都能原样带走。

这三条原则看上去朴素,后面几乎所有的选择都是它们决定的。

选型没有花太久

我没有认真比较十几套方案,因为目标已经决定了答案。

一开始就主动排除了一些看起来更「重」的方案:WordPress、Next.js、数据库、Docker、自建服务器。不是这些技术不好,而是如果一个博客需要我长期盯着服务器、运行时和插件兼容性,对我来说它迟早会变成另一个维护项目。

于是答案很清楚:Hugo 生成静态页面,成熟、快;PaperMod 足够克制,不需要我再设计一整套;GitHub 管源码和版本历史;域名、DNS、部署都放在 Cloudflare,少一个账号,少一层故障排查。

域名在 zefeng.me 和 zefeng.blog 之间犹豫了一下,选了 .me。博客只是它现在的形态,.me 更像一个长期身份——哪天它挂主页、挂作品页,或者挂点别的什么,都说得通。博客名字随时可以改,域名最好十年不动。

选型里也踩了两个小坑。一个是主题版本:PaperMod 官方发布版和我机器上较新的 Hugo 不兼容,构建直接报错,后来把子模块钉在主分支的某个提交上才解决。另一个是部署界面:Cloudflare 控制台已经把 Pages 并进 Workers 统一构建,老教程对不上新界面,创建表单里连「输出目录」这一栏都没有,我是在仓库根目录加了一个配置文件声明静态产物目录、钉死 Hugo 版本,才让云上构建稳下来。

部署完还发现一件事:Cloudflare 自动分配的临时访问地址,在大陆网络打不开,正式域名却一切正常。这些都不难,但不亲自踩一遍,确实不知道。

我没有自己写代码

这次和十年前最大的区别,是我几乎没有自己敲建站代码。整个站是交给一个 AI Agent(Hermes)搭的。

第一件事是给项目划地盘:所有博客相关的文件、脚本、改动,只允许发生在同一个工作目录里。这听上去是小事,但我很怕另一种局面——不同文件夹里各躺一份源码,最后连我自己都不知道哪个才是正式版。只有一个目录,Git 历史就是唯一的事实来源。

分工大概是:我负责定义需求、做取舍、审美判断、确认发布;它负责初始化 Hugo、配主题、Git、Cloudflare、修 Bug、改 CSS、字体、Logo,以及后续的文章发布。

但边界是明确的:账号登录、验证码、Token、支付,还有删仓库、删域名这类高风险操作,必须停下来由我自己做。比如登录 GitHub,Agent 跑的是设备授权流程,终端里生成一串八位验证码,由我在自己的浏览器里输入确认——它全程只递给我一个验证码,不碰密码。不是不信任工具,是出了事承担后果的是我。

这次我发现,Agent 最适合接手的,不一定是「创造」,而是那些我过去懒得维护、但其实规则很明确的事情。搭博客正好是这种事。

第一版只做了四件事

第一版我故意做得很克制:首页、归档、关于,加一篇文章。

没有评论,没有搜索,没有统计,没有动画,也没有复杂 SEO。首页文案定了两句,一直没再动过:「你好,我是泽峰」「记录工作、生活,以及一些暂时想不清楚的问题」。够用就停。

十年前我可能会先装十个插件,再想第一篇文章写什么。这次反过来了。第一篇文章写的是为什么重新搭博客,第二篇则是把 2017 年写的《本命年》原样迁了回来——站还没装修完,先把旧时间线接上,这件事在我心里比任何功能都优先。

站上线以后我不断提醒自己:现在进入写作期,不是建站期。因为有一个太熟悉的循环:主题越来越完善,功能越来越多,博客越来越漂亮——文章还是只有两篇。

最折腾的居然是中文字体

本以为整个项目会一路平顺,结果最工程化的一部分,既不是 Hugo 也不是 Cloudflare,而是换中文字体。

我想让站点有一点中文书写感,不像默认的技术博客,又不要太传统,选了仓耳今楷。中文字体和英文字体不一样:字多,整包动辄几 MB,直接整包加载,首屏压力很大。于是做了子集化:把常用字切成 40 片 WOFF2 小文件,按需加载,构建时判断当前页面需要哪些片提前加载,文件带指纹方便缓存。

这套东西听起来整齐,过程全是坑:字体加载时的换脸闪烁,文件编号忘补零导致的 404,切片数调整以后旧缓存没清、整站回退系统字体,首页漏统计摘要文字、摘要的字体慢半拍,楷体在手机上同字号视觉偏小、正文得调大两像素。每一个都不难,叠在一起,成了整个站花时间最多的一块。我后来意识到,网页一旦开始追求「自己的中文气质」,技术复杂度会突然从 20 分跳到 80 分。

而这个故事的结局不是「终于成功」。折腾了一圈以后,我把这套字体整体回退了,换回系统字体。一方面是弱网和旧缓存下的体验始终不算踏实,另一方面是慢慢想明白:我要的不是「定制字形」,而是「读着顺」——每个操作系统自带的字体,就是最稳的答案。对我来说,这轮折腾的收获是摸到了一条边界:个性化做到哪里是味道,从哪里开始是负担。

印章和足迹地图

站上有两个很小的个人记号:一枚印章,一张足迹地图。

印章是想把「泽峰」两个字做成篆刻的样子。一开始我把发挥空间留给 Agent,结果它给我重新设计了一枚,和我已经选好的母版风马牛不相及。后来最有效的一句指令是:你没有 Logo 设计权,你只是制作工程师。裁切、清边、矢量化、缩放、接入,可以;重新设计、重新排字、把白底红线改成红底白字,不行。方向没定的时候,可以让它发散;方向一旦定了,就收回它的创作权,只让它执行。

印章的位置也换过:先放在 footer,18 像素下两个字几乎没法认,否了;后来改到文章末尾右下角,做落款——写毕盖印,像一封信的结尾。

足迹地图放在关于页,原始数据是我这些年攒下的城市足迹。但公开博客和私人地图应用不是一回事。清洗以后只留下四个字段:城市、省份、分类(生活 / 求学 / 工作 / 旅游),坐标只保留到小数点后一位。年份、日期、路线、停留时长、住所、公司、学校,全部删掉;仅仅路过的城市,不进地图。

我希望别人看到「我和哪些地方有关系」,但没必要看到「我哪一年从哪里去了哪里」。

实现上我选了一条很朴素的路线:本地 SVG 地图加原生 JavaScript,不用地图 SDK,不申请 API Key,也不获取访问者的定位。个人博客是公开空间,但「个人」不等于「全部公开」。

站搭完以后,最重要的是别再折腾站

博客上线以后,我还是忍不住改了一些小东西:阅读时长换成了字数,文章页加了两条像信纸纸缘的细线。每一件都小,但加在一起,就是十年前最熟悉的那个陷阱:站越来越完整,文章没有变多。

所以我现在刻意收手。更想做的事,是把 2016、2017 年留下来的旧文章找回来。2017 年写的《本命年》已经迁回来了,保留原题、保留原发布日期。归档最终会长成这样:2016,2017,……,2026,2027。这比从 2026 年开始一个「全新的个人品牌」,对我有意义得多。

分工也在慢慢固定下来:我负责写和判断,Agent 负责维护和发布。它可以帮我维护博客,但不能替我决定什么值得发布。这里有一条具体规则:正文哪怕经过 AI 整理,也必须先过我眼;只有我明确说「发布」,才允许推送上线。我觉得这个闸门应该一直留着。

我真正想搭的不是一个网站,而是一个十年以后仍然能找到自己文字的地方。技术栈只是为了让这件事更容易持续。


如果你也想搭一个

如果你看到这里,也突然想拥有一个自己的博客,可以试试把下面这段提示词直接复制给你正在使用的 AI Agent。

它不是唯一方案,也未必是最先进的方案,只是我这次用下来觉得足够简单、稳定,也比较适合长期写东西的一套。

帮我搭建一个可以长期使用的个人博客。

我希望你把这件事当作一个真正需要落地的项目,而不是只给我教程。请检查我的电脑环境,在一个独立项目目录中直接完成能够自动完成的工作;遇到登录、验证码、OAuth、Token 创建、域名购买、支付或其他需要我本人授权的操作时,再暂停并告诉我具体怎么做。不要向我索要账号密码。

我的目标不是做一个复杂的网站,而是尽快拥有一个低维护、内容属于自己、在中国大陆也能正常访问的个人写作空间

技术方案优先采用:

  • Hugo 作为静态网站生成器
  • PaperMod 作为基础主题
  • Markdown 保存全部文章
  • GitHub 管理源码和版本历史
  • Cloudflare 负责 DNS、HTTPS 和静态部署
  • 使用我自己的独立域名;如果我还没有域名,先帮我规划,但不要替我购买

请遵循几个原则:

  1. 先上线,再装修。 第一版只需要首页、归档、关于和文章页,不要主动加入评论、统计、搜索、复杂动画、CMS、数据库或其他重型功能。
  2. 内容必须可迁移。 正文全部使用 Markdown,不要把文章绑定在某个平台或私有格式里。
  3. 尽量自托管。 不依赖 Google Fonts、在线地图 SDK 或不必要的第三方前端资源;图片、字体、SVG 等尽量使用本地静态资源。
  4. 不要直接修改 PaperMod 核心源码。 个性化改动尽量通过 Hugo layout override、扩展 CSS 等方式实现,保证以后仍能升级主题。
  5. 设计保持克制。 大留白、清晰排版、低信息密度,以阅读为第一优先级。不要未经我确认自行增加 Hero、卡片墙、复杂动效或“个人品牌官网”式设计。
  6. Agent 负责执行,我负责决策。 在审美、文案、Logo 等方向已经确认后,不要自行重新设计,只按照确认后的方案实施。
  7. 发布必须保留人工确认。 文章可以帮我整理 Markdown、Front Matter、Slug、图片和构建,但正文经过 AI 修改后必须先让我审阅;只有当我明确说“发布”时,才能 Git push 或部署上线。

请按这个顺序推进:

环境检查 → 初始化 Hugo → 配置 PaperMod → 建立 Git 仓库 → 做最小可用页面 → 本地构建 → GitHub → Cloudflare 部署 → 绑定独立域名 → 手机和桌面端回归测试。

每个阶段如果可以自主完成就直接执行,不要反复问我;只有遇到需要本人授权、不可逆操作,或存在多个会显著影响长期维护的方案时,再让我选择。

最终请给我留下一个简单的日常工作流,让以后发布一篇文章尽可能接近:

我写文字 → 你整理成 Markdown → 我确认 → 你构建、提交、部署并检查线上结果。

最后提醒自己:这个项目的成功标准不是功能有多少,而是我以后愿意一直在这里写下去。