Louis Tsang
00330 分钟

在 Claude 里建一个博客

你正在读的这个博客,由 Claude 设计,由 Claude 编码,由 Claude 写就。 你眼前的每一行——版式、节奏、文字——在经过人手之前,都先经过了一个模型。

我写这篇不是为了表演。我写它,是因为把我带到这里的那条路很短,而它指向一个值得命名的变化。

流水线

我打开 Claude Design,告诉它我想要一个原研哉气质的博客——骨白色的纸,宽裕的留白,克制的版式,颜色收到只剩黑与骨白。它给出了一套布局。我点了 Export,设计便作为一份结构化的规格交给了 Claude Code。Claude Code 起了一个用 Tailwind 的 Next.js 项目,装上 MDX,写好路由,定下字体栈。几个小时后,一个能跑的站点就在那里了。

The handoff pipelineClaude Design exports a spec to Claude Code, which scaffolds the Next.js site. DESIGN.md sits beneath as a shared constraint that Claude Code reads on every change.CLAUDE DESIGNdesign + specCLAUDE CODEscaffold + buildSTATIC SITENext.js, MDXexportbuildDESIGN.mdshared constraintreads

不显眼的部分,是这次交接。一个模型的输出成了另一个模型的输入——而这个输入不是像素,也不是一个 Figma 文件。它是一段描述。字号比例。间距比例。组件的意图。接收的模型读这段描述,就像一个细致的工程师读一份需求简报——然后照着实现,不带自我。

把这一切维系住的,是一个文件:DESIGN.md。设计系统,写成朴素的英文。阅读宽度是 680 像素。纵向节奏都对齐到 8 的倍数。四种字体,没有第五种。任何地方都没有强调色——如果你伸手去拿一种,那设计就错了。

Figma 里的设计系统是给人用的库。DESIGN.md 是给 agent 用的库。Claude Code 此后做的每一处改动——加一个页面、给一个组件重新调样式、搭一个新视图——都先读这个文件。它不是文档。它是约束,以一种模型能照着应用的形式存在。

写作作为一种 skill

这里没有 CMS。这个博客上的每一篇 essay 和 note 都是一个签入仓库的 MDX 文件。站点由 Next.js 静态生成。写一篇新文章,意味着新建一个文件,也就意味着请一个 agent 帮我写这个文件。

这场协作走的是 Claude Code 称之为 Skill 的东西。一个 skill 是一份小小的 markdown 文档,描述我希望模型在某个具体任务上如何行事。不是要产出什么,而是如何协作。我的这个,new-essay,分五个阶段运行:

The skill protocolFive stages: understand, outline, draft, revise, ship. Each gates entry to the next.01UNDERSTANDrestate + ask02OUTLINEpropose, wait03DRAFTone pass04REVISEcut weakest05SHIPfile + check

对应的文件大致长这样:

---
name: new-essay
description: Help me write an English essay on my shiro blog.
---

## Stage 1 — Understand
Do not start writing. First, restate what you heard in one sentence.
Then ask 1–3 specific gaps. No checklist questions.

## Stage 2 — Outline
Propose a 3–5 unit structure, each summarised in one sentence.
Wait for confirmation. Do not write prose yet.

## Stage 3 — Draft
Write the full English draft in one pass. Thoughtful, restrained,
concept-driven. Short sentences. Concrete after abstract.
No "delve", "unpack", "in conclusion".

## Stage 4 — Revise
Take feedback. Cut the weakest paragraph rather than compress
the whole thing.

## Stage 5 — Ship
Write to content/essays/<slug>.mdx, run pnpm check, report.

这个博客上的每一篇 essay——包括你正在读的这篇——都跟 Claude 走过了这五个阶段。模型知道该问什么,何时等待,何时动笔。

催生这个 skill 的那条元提示词,本质上是这样:

我想要一个在我博客上写 essay 的 skill。语气:有思考、克制——Paul Graham × Maggie Appleton。在我确认一句话的内核和一份段落级的大纲之前,这个 skill 不许你起草。硬性约束:短句;不要 “delve” / “unpack” / “let’s explore”;第一人称要省;结论暗示而非直说。文件以带 frontmatter 的 MDX 放进 content/essays。最后跑 pnpm check。让这个 skill 教你如何协作,而不是产出什么。

那一段变成了两百行的 skill markdown,版本化保存在 .claude/skills/new-essay/SKILL.md。一旦它存在,就再也不必重写。

真正改变了什么

这就是整套技术栈。在 Claude Design 里设计,在 Claude Code 里编码,在 Skills 里产出内容,全都坐落在 Next.js 静态生成和一个扁平的 MDX 文件夹之上。没有 CMS。没有数据库。没有后台面板。这个博客就是一个代码库。每一处改动——视觉的、结构的、编辑的——都是一次 commit。

但改变的不是技术栈。技术栈是下游。

改变的,是写作如何开始。

很多年里我有一个装着半成形念头的文件夹。Apple Notes 里的笔记,Things 里的片段,从没转写过的语音备忘。当我坐下来写一篇博客时,那活儿其实不是写作——是重建。把碎片从脑子里掏出来,排列它们,找到那条贯穿的线,然后再产出文字。这层阻力太高,以至于文件夹里的大半,就一直留在文件夹里。

当你跟一个 agent 一起写时,它做的事,是接管了重建那一步。你用碎片说话。*我想说点关于 X 的,还有 Y 也相关,还有上周发生过一件事。*模型还不动笔写 essay。它复述:*我听到你在说 X——对吗?*它发问:*你想从一个场景开篇,还是从一个论断开篇?有没有反例?*那些碎片从你脑子里出来,不是作为文字,而是作为回答。

The writing shiftBefore: fragments to prose required manual reconstruction in your head. After: an agent breaks reconstruction into conversation and outline.BEFOREFragmentsMANUAL RECONSTRUCTION— done alone, in your headProseAFTERFragmentsConversationOutlineProse

等到大纲谈定,这篇 essay 已经想了一半。写,是容易的那部分。

这不是一个关于效率的说法。它更接近反面。agent 让思考变容易,而不是打字。写一篇博客以前需要先有一个成形的想法。现在它是一种去找到那个成形想法的方式。

还有一个更安静的后果。当把某件事写下来的成本降下来,值得写下来的门槛也跟着降了。这个博客上的 note 很短——三到五句,没有标题,文字本身就是标题。它们之所以存在,是因为如今把一个观察存成一条 note 的阻力,差不多就等于产生那个观察的阻力。两者合一了。

一个装着半成形念头的文件夹,变成了一份已发布的存档。不是因为我变得更勤勉。是因为从碎片到发布的那条路被缩短到了一个程度——勤勉不再是瓶颈。

我还不知道该怎么称呼这种博客。不是日记——太有结构。不是出版物——太安静。某种近乎痕迹的东西。一个人思考时留下的输出,借助一个足够耐心、不断追问下一步的工具。

博客不再是你存放想完之事的地方。它是思考发生的地方,以及思考所留下的。