docs: 落库博客重设计调研报告 v1.8 与视觉样板 v2

调研收官产物入库:主报告(架构 C''=Astro SSG+gitea 双写作流、
Artalk 评论、分片 webfont、双语预译管线、多端适配规格、
Phase 0-5 实施规划)+ 五份侦察原稿 + 可交互单文件样板
(三路线×明暗×五页型,命令面板/终端/热力图/masonry)。

Co-authored-by: GLM-5.3
This commit is contained in:
wait4xandGLM-5.3 committed 2026-10-24 21:48:11 +08:00
commit 0fbb023375
8 files changed
+2404

No files matched your search

@@ -0,0 +1,143 @@
# 博客重设计调研:现状诊断 + 极简开发者风标杆研究
> 侦察员 @agent-5959fa | 2026-10-24
> 证据来源:本地博客截图(/tmp/c4ai-fetch/shot-1792813179593-9l86id.png)+ 本地 HTML/CSS 实抓;5 个标杆站经 crawl4ai(markdown 模式)+ 原始 HTML + CSS 文件三重实抓。**所有结论均基于真实抓取内容**,无凭印象推测。
---
## 任务 A:现状视觉诊断(wait4x.online,本地 127.0.0.1:18090)
### A1. 技术底座(HTML head 实测)
- Halo 2.24 + **howiehz-higan 主题 v1.64.1**(资源路径 `/themes/howiehz-higan/assets/1.64.1*.css`)
- `<html data-color-scheme="auto" theme="auto-blue">`,`theme-color: #fafafa`
- DaisyUI 风格变量体系,CSS 实测取值:
- `--color-primary: #6cf`(#66ccff 天蓝)、`--color-secondary: #6cf / #b6f1ff`
- `--color-accent: #c5b6ff`(淡紫)
- 亮色底 `--color-base-100: #fafafa / base-200: #f5f5f5 / base-300: #e4e4e4`
- 暗色底 `--color-base-100: #212326 / base-200: #1c1c1c / base-300: #181818`
- 字体:未声明品牌字体,走系统无衬线兜底(CSS 中无 LXGW/Noto/Inter 等显式 @font-face)
### A2. 截图视觉描述(首页)
**布局结构**
- 单列内容区,但**偏左不居中**:内容列约占视口宽 60%,起于约 19% 处,右侧大面积空白无内容承接
- 顶部:方形深色头像(黑底金环,日蚀图案)→ 右侧粗体站名 `wait4x` + 太阳图标(主题切换)
- 导航行:**10 个平级入口横排**——首页|文章|分类|标签|瞬间|相册|链接|关于|搜索|登录,细竖线分隔,链接呈蓝紫色
- 下方 tagline「拥抱开源,热爱开源」+「与我联系」+ 邮件/GitHub 图标
- 「近期发布」浅蓝色大字标题
- 文章列表项:左侧灰色小字日期(四月 28 2026),右侧自上而下堆叠——加粗黑标题「CS各类配置」→ 元数据行(📁 Linux 分类、🏷 #Linux 绿色标签、👁 42 浏览量)→ 等宽字体观感的摘要(含两条裸 URL)→ 蓝色「阅读全文」链接
**字体气质**:中文系统黑体 + 摘要呈等宽字体观感(CJK 回退 + latin mono 混排),节奏生硬;日期用灰色小号字,层级弱。
**卡片式样**:无卡片、无分隔线、无悬浮效果——列表项是"裸堆叠",项与项之间仅靠空白区分。
**导航组织**:纯文字 + 竖线分隔的平铺长条,无分组、无图标、无当前页高亮(截图中无法分辨所在页)。
### A3. 可能让人「不喜欢」的点(8 条具体猜测)
1. **导航过载且老派**:10 个平级入口 + 竖线分隔是 2010 年代论坛/网志范式;「登录」暴露在公共导航里,破坏"作品"感,瞬间/相册/链接这类 Halo 功能页全量外露,显得杂。
2. **主题出厂配色未定制**:`#66ccff` 天蓝 + `#c5b6ff` 淡紫是 higan 的默认蓝(theme 名就叫 auto-blue),多主题色并存(标题浅蓝、导航蓝紫、标签绿、链接蓝)无主次,像没换过设置的默认模板。
3. **色彩系统不统一**:一屏内出现 ≥4 种强调色(浅蓝标题/蓝紫导航/绿色标签/蓝色链接),没有"一个签名色 + 灰阶"的纪律。
4. **字体气质与内容错位**:内容是中文文学书评长文,但界面是技术工具味的系统黑体 + 等宽摘要;文学感为零,书评与 Linux 笔记在视觉上无任何区分。
5. **信息层级弱、扫读负担大**:日期、分类、标签、浏览量、摘要、"阅读全文"六类信息平铺堆叠,全靠加粗标题一个锚点;浏览量「42」外露在列表页是"后台思维"。
6. **布局重心失衡**:内容列偏左、右侧大片空白,既不是居中窄栏也不是双栏,空白没有被设计利用(标杆站全部是真正居中的 640–720px 窄栏)。
7. **头像与品牌感弱**:黑底方块头像与 #fafafa 页面硬冲突,站名+头像组合无排版设计,首屏没有一句有性格的自我介绍。
8. **列表缺乏节奏与识别度**:所有文章长得一样(无每文主题色/无摘要一句话提炼/无年分组),文学长文和技术笔记混排时更显得单调。
---
## 任务 B:极简/开发者风标杆博客分析
> 抓取方式:crawl4ai `/md`(静态渲染 markdown)+ curl 原始 HTML + 主 CSS 文件。leerob.io 已 301 → leerob.com,分析基于跳转后内容。**5/5 站抓取成功。**
### 1. antfu.me(Anthony Fu — Vite/Vitest/UnoCSS 作者,Vercel/Nuxt)
- **布局结构**:单列窄栏居中。首页 = 个人档案页(自我介绍 → 项目名墙(行内链接密集排列)→ Sponsor 区);`/posts` = 按年份分组(2026/2025/2024 大字分节)的纯文字列表,每条 = 标题 + 日期 + 阅读时长(`· 15min`)+ 语言徽章(`日本語`);顶部 **icon-only 导航**(GitHub/Bluesky/Twitter/Podcasts/Talks/Demos/Photos/Blog/RSS/Sponsors 实测 title 属性)+ "Toggle Color Scheme" + "Scroll to top" 悬浮按钮
- **配色与明暗**:中性灰白底,几乎无彩色;`.dark` class 级暗色切换(CSS 实测 `.dark{`、`.dark\:bg-blue-500` 等 UnoCSS attributify 写法)
- **字体排印**:**Inter**(正文)+ **DM Mono**(实测 stack `DM Mono,Input Mono,Fira Code,monospace`)做 mono 点缀;层级靠字号与留白,另有手写体 Bad Script 做个性签名
- **动效与交互**:标志性的 **slide-enter 错峰入场动画**(实测 h1 带 `slide-enter-50` 类,元素依次滑入);hover 反馈细腻;滚动回顶按钮
- **独有亮点**:双语文章语言徽章、阅读时长、Sponsor 自动转发机制、100.antfu.me 生成艺术实验区
- **值得借鉴的 3 个做法**:
1. **按年份分组的纯文字文章流**——零卡片零封面图,扫读效率极高,天然适合"长文写作者"的年刊感
2. **slide-enter 错峰滑入**——纯 CSS 可实现,成本低、质感高,首屏立即建立"被设计过"的印象
3. **icon-only 顶部导航 + 悬浮主题切换/回顶**——把 10 个导航入口压缩为一行图标,彻底解决导航过载
### 2. leerob.io(Lee Robinson — 前 Vercel VP / Next.js,现 SpaceX)→ leerob.com
- **布局结构**:极简单列;`h1.site-title`(链到 X 主页)+ Bio 段 + 三个分节 **Notes / Blogs / Projects**(实测 `h2 id="notes-heading"` 等);文章行 = 标题 + 右缀「月份 年份」,纯文字无边框
- **配色与明暗**:Tailwind v4 体系(CSS 实测 oklab/color-mix、`--color-blue-400`、`dark *` 选择器);底色中性白,暗色下用 blue-400/emerald-500 做细节色
- **字体排印**:正文系统栈(`ui-sans-serif,system-ui,...` 实测);**文章正文用本地衬线 Iowan Old Style**(实测 `font-family:Iowan Old Style Local`)+ SF Mono 系等宽(`SF Mono,Monaco,Inconsolata,Fira Code`)+ **Caveat 手写体**(实测 `--font-caveat:"Caveat"`)做标题点缀
- **动效与交互**:近乎零动效——层级全靠留白与字重,是"负动效"路线的极简
- **独有亮点**:手写体分节标题注入"个人笔记"气质;Notes(短想法)与 Blogs(长文)分轨
- **值得借鉴的 3 个做法**:
1. **"标题 + 日期"两栏对齐的文章行**——无边框无卡片,一行一篇,密度与呼吸感平衡的教科书
2. **界面无衬线 + 正文衬线的双字体制**——阅读场景切换到衬线,直接服务长文沉浸(中文可映射为思源宋体/霞鹜文楷)
3. **Notes 与 Blogs 分轨**——短想法/碎片与技术长文分开呈现,正好匹配"文学书评 + Linux 技术"双内容线
### 3. brianlovin.com(Brian Lovin — Notion 产品设计师)
- **布局结构**:`<main class="relative isolate mx-auto flex min-h-svh w-full">` 居中全高布局(实测);顶部 **60×60 头像**(实测 `width="60" height="60"`)+ `h1 text-2xl font-semibold` 一句身份陈述 + Writing/Projects 分节;项目行 = 名称 + 一句话灰字描述
- **配色与明暗**:白底 + **四级灰阶语义色**(实测 `text-quaternary dark:text-tertiary`——primary/secondary/tertiary/quaternary 层级);`.dark` class 级暗色 + `dark:bg-amber-900/30` 等语义色
- **字体排印**:**Inter**(UI)+ **Source Serif 4**(长文正文衬线,实测 `"Source Serif 4","Source Serif 4 Fallback"`)+ **JetBrains Mono Nerd Font**(代码)
- **动效与交互**:克制——`group-hover:text-primary transition-colors`(实测):灰字 hover 变深即可
- **独有亮点**:四级灰阶建立"标题深→正文中→元数据浅→装饰最浅"的干净层级;/hn、/til、/stack 小工具矩阵扩大人格半径
- **值得借鉴的 3 个做法**:
1. **语义化多级灰阶系统**——不动用彩色就解决全部层级问题,是治愈"多色并存"的特效药
2. **正文衬线字体**(Source Serif 4 类)——为中文书评长文选一款宋体/文楷级衬线是最重要的一次投入
3. **60px 头像 + 一句身份陈述的名片式开场**——替代 banner 和 tagline 口号,第一屏即人格
### 4. paco.me(Paco Coursey — Linear 网站负责人,前 Vercel 设计系统)
- **布局结构**:裸 `<main>` 单列(实测无任何布局 class),分区 Building/Projects/Writing/Now/Connect;Writing 每条 = 标题 + 一行灰字摘要(如 "React Hook Getter Pattern — Simple, efficient React state hook in 50 lines.")
- **配色与明暗**:纯 CSS 变量(实测 `--bg:#fff` 亮 / `--bg:var(--gray1)` 暗,`--fg`/`--mono6`/`--border`);**`prefers-color-scheme` 自动暗色** + `color-scheme:dark` 声明——跟随系统、无手动开关、无闪烁
- **字体排印**:**Inter**(无衬线)+ **Newsreader**(衬线+斜体点缀)+ **Söhne**(实测同站混用)+ system mono;斜体强调词(*_Crafting interfaces_*)是签名手法
- **动效与交互**:近乎静态(`data-animation-controller` 属性暗示局部微动画);层级全靠字重/斜体/灰阶
- **独有亮点**:全站自动明暗零开关;文案极短——每项一句话,写作区即"标题+副标题"诗性排版
- **值得借鉴的 3 个做法**:
1. **`prefers-color-scheme` 自动暗色**——维护成本最低的暗色方案,对 Halo 主题选型是硬指标
2. **"标题 + 单行灰字摘要"Writing 范式**——一篇文章在列表页只需两行,克制到极致
3. **衬线斜体强调词**——中文语境可用楷体/仿宋承担这个角色,给书评文字注入"手批"气质
### 5. overreacted.io(Dan Abramov — React 核心团队前成员)
- **布局结构**:`<body class="mx-auto max-w-2xl px-5 py-12">` = **672px 窄栏正居中**(实测);header = 站名(`text-2xl font-black` 文字渐变)+ 右侧链接;列表 = 置顶新文(`text-[40px] font-black` 大标题)+ 按年份的标题流(`text-[28px] font-black leading-none`,实测)
- **配色与明暗**:CSS 变量双套实测——亮色 `--bg:white / --text:#222`;暗色 **`--bg:rgb(40,44,53)` 深蓝灰 / `--text:rgba(255,255,255,0.88)`**。签名特性:**每篇文章标题一个独立随机色**(lab() 色彩空间计算,如 `--lightLink:lab(62.991 59.315 -1.483)`,明暗各一套,实测多篇文章色值各不相同)
- **字体排印**:**Montserrat**(font-black 标题,实测 `Montserrat Fallback`)+ 系统无衬线正文 + ui-monospace 代码;层级靠字重(700/900)而非颜色
- **动效与交互**:header 文字 linear-gradient 悬停变色;入场淡入带延迟(实测 `transition:transform 0.2s ease-in-out, opacity 0.2s 0.4s linear`)
- **独有亮点**:每文一色的标题色彩系统(极简框架里的游戏感);深蓝灰暗底而非纯黑
- **值得借鉴的 3 个做法**:
1. **每篇文章独立情绪色**——对中文文学书评是绝配:每篇书评一个"情绪色",列表即画廊,Halo 可在文章元数据加一个 color 字段实现
2. **大字重纯标题流列表**——28px/900 字重的标题本身即视觉,无卡片无摘要也有极高辨识度
3. **暗色用深蓝灰 #282c35 而非纯黑**——护眼且高级,可直接抄的色值
---
## 汇总:「极简开发者风」的共同设计语言
| 维度 | 共识 |
|---|---|
| 布局 | 单列窄栏(640–720px)**真正居中**;首页 = 名片式自我介绍 + 分节列表;文章流 = 纯文字按年分组;导航 icon 化或 ≤4 项 |
| 配色 | 底色只有白/近白 + 深灰蓝两档;正文 1 个主文字色 + 2–4 级灰阶;彩色仅做点缀(链接 hover、每文一色)——**绝无多色平铺** |
| 字体 | UI 无衬线(Inter/系统栈)+ 正文可选衬线(Source Serif 4 / Newsreader / Iowan Old Style)+ 代码等宽(DM Mono / SF Mono / JetBrains Mono);层级靠**字重**(400/600/900)而非颜色 |
| 明暗 | 5/5 全支持暗色:两条路线——`.dark` class 手动切换+记忆(antfu/brian/overreacted),或 `prefers-color-scheme` 自动跟随(paco/leerob 细节色) |
| 动效 | 三件套:入场错峰滑入/淡入、hover 颜色过渡、回顶按钮;总量克制,无大面积动画 |
| 人格 | 第一句自我介绍、Now 页、项目墙、每篇一句话摘要——表达"写作的个人",而非"内容媒体" |
### 适合什么内容与人格
适合**以写作者个体为中心、长文阅读优先、更新频率低但单篇质高**的博客。设计语言的本质是:把装饰预算从"框"(卡片/边框/底色块)转移到"字"(字重/字号/留白/每文情绪色),让内容排版本身成为视觉主体。
### 对本书店(中文文学书评 + Linux 技术文)的直接映射
1. **衬线正文**是文学书评的第一优先级(Source Serif 4 的中文对位:思源宋体 / 霞鹜文楷),技术文走无衬线+等宽代码块——双字体制一个系统通吃双内容线(brianlovin/paco/leerob 已验证)
2. **每文情绪色**(overreacted)给书评列表"画廊感",技术文保持中性色,两种内容天然区分
3. **四级灰阶 + 字重层级**(brianlovin)替换现有"浅蓝标题/蓝紫导航/绿标签"的多色平铺
4. **导航从 10 项砍到 ≤4 项**(文章/关于/搜索 + icon 化社交链接),登录/瞬间/相册收进角落或移除
5. **672px 居中窄栏 + 自动暗色**(paco 方案成本最低)作为新主题选型的硬性基线
### 抓取可靠性说明
- 5/5 标杆站全部抓取成功(crawl4ai markdown + 原始 HTML + CSS 文件三源交叉)
- leerob.io 实测 301 → leerob.com(CSS 从正确域名重抓,数据有效)
- 本地博客:截图诊断 + CSS 变量实测双重验证;higan 主题部分 CSS 分片极小(160B–2.4KB),字体声明未见品牌字体,判断为系统字体兜底
+202
View File
@@ -0,0 +1,202 @@
# 获奖创意个人站设计手法侦察报告
> 侦察员:@agent-6f4929 | 抓取时间:2026-10-24 | 为博客重设计调研组提供
> 目标博客定位:中文文学书评 + Linux 技术长文,以长文阅读为核心
---
## 0. 方法与真实性声明(先说清楚哪些是实测、哪些抓不到)
**抓取手段**:本子代理无 `web_search` 工具,替代方案 = `curl` 直接拉 HTML/CSS/静态资产(失败走本机 7897 代理)+ `r.jina.ai` 渲染 JS 重页面 + Wayback Machine 历史快照 + Bing 搜索 + **Awwwards 官方目录页**(`awwwards.com/websites/personal-blog/`,经 jina 抓取成功)。
**诚实声明(4 个指定站里 2 个已"死亡")**:
| 站点 | 实时抓取状态 | 处理方式 |
|---|---|---|
| cassie.codes | ✅ 200,但站主已主动退役,现为一页告别卡 | 按现状实测分析 |
| bruno-simon.com | ✅ 200,正常 | 实测分析 |
| danielspatzek.com | ✅ 200,Nuxt CSR 壳,经 jina 渲染出全文 | 实测分析 |
| julesforrest.com | ⚠ **HTTPS 证书自签(ERR_CERT_AUTHORITY_INVALID);HTTP 200 返回的是"天津开云集团"中文企业垃圾站(页脚挂赌博友链)——域名已易主,原站已死** | 改用 Wayback 2022-05-24 快照分析原站 |
| pedrobelleza.com(补充) | ⚠ 实时 HTTP 522(源站宕机) | 改用 Wayback 2026-07-17 快照 + Awwwards 官方页 |
| tlb.betteroff.studio(补充) | ✅ 200(876KB SSR HTML) | 实测分析 |
| stateofaidesign.com(补充) | ✅ 200(1.5MB HTML) | 实测分析 |
---
## 1. cassie.codes(Cassie Evans,GSAP 团队)——已退役的"终端告别卡"
### 实测现状
站点已 `noindex`,正文是她本人告别信:*"It was a joy to maintain a personal site… It feels different now and it no longer nourishes me. I'll be hanging out offline, painting, reading…"*(2026-10-24 抓取原文)。
### 布局与视觉冲击点
- 纯黑背景(`html{background-color:black}`)+ 全屏 overflow:hidden
- 居中一张 **终端风卡片**:`rgba(8,8,8,0.92)` 底、`#2a2a2a` 细边框、`Courier New` 等宽字体、0.8rem 小字号
- 链接带 **`> ` 终端提示符前缀**,颜色为暖琥珀 `rgb(255,223,167)`,hover 变 `rgb(221,175,153)`
- 背景一层 `.flowers` 容器装全屏 canvas
### 动效技术(实测内联代码)
- `<head>` 内联 **28KB Three.js 模块**(`THREE`×42 处、`WebGLRenderer`):把 `flowers.jpg` 变成可交互的 WebGL 画布,参数面板暴露 `interaction_mode: 'Point: Directional Stretch'`、`tool_size/tool_strength/tool_falloff`、`warp_strength/warp_frequency`、`smear`、`chromatic_aberration` 等——即**"图像涂抹/拉伸"玩具**:手指/鼠标在花照片上拖出液态变形
- canvas `opacity:0` + `transition: opacity 3s ease-out` 缓慢淡入,无滚动动效
### 配色与排版
黑底 + 等宽字 + 终端隐喻 + 单一暖色强调。极简到只有一屏。
### 对长文博客的可迁移 / 不可迁移
- ✅ **可迁移**:终端/等宽美学与 Linux 技术长文天然契合(代码块、输出块用黑底等宽 + `>` 前缀几乎是现成方案);"一屏小卡片 + 暖色链接"的克制感;把一张图做成可涂抹 canvas 小玩具(hero 彩蛋,几十行代码级别)
- ❌ **不可迁移**:WebGL 涂抹玩具对"读字"零帮助;更要紧的是**这个站本身就是反面教材的正面示范**——连顶级动效工程师都选择把重维护的个人站退役,说明重互动站 maintenance 成本极高
- 📌 背景注(非本次抓取,仅历史口碑):她 2021-2023 年的旧版以手绘涂鸦风 + GSAP SVG 描边动画闻名,已无法抓取验证
---
## 2. bruno-simon.com("Bruno's")——3D 游戏即简历的天花板
### 布局与视觉冲击点
- **整个网站就是一辆可以开的 3D 小车**:世界数据为大型 GLB 模型(实测资产 `respawnsReferences-compressed.glb`)+ KTX 压缩纹理(`stars.ktx`、`palette.ktx`、`intro/sound.ktx`)
- 2D SVG HUD 叠层:`ui/map.svg`(小地图)、`home/gear/close/gamepad` 图标——3D 世界之上盖一层扁平 UI
- title 就一个词 "Bruno's";description "Bruno Simon's creative portfolio"
### 动效技术(实测信号)
- Three.js + **Rapier 物理引擎**(HTML/资产中 `rapier`、`physics` 信号),全部逻辑打包进单个 `assets/index-ORr3L4no.js` bundle
- **手柄支持**(gamepad UI 图标 + controls 目录)、"respawn"重生系统(`respawns/` 目录)、GTM 统计
### 配色与排版
- Google Fonts:**Amatic SC**(手写铅笔感标题)+ **Nunito**(圆润正文,400/700/900)
- 主色 `#ffceca` 粉白暖调——玩具感、卡通、圆润
- 📌 背景注(非本次抓取):上一版(开保时捷车那版)是 Awwwards 年度站级名作,现版为其精神续作
### 对长文博客的可迁移 / 不可迁移
- ✅ 可迁移:**手写感展示字体做个人品牌点缀**(书评站可用手写体只作用于 Logo/引语,绝不进正文);"游戏化彩蛋页"做记忆点(如 `/terminal` 彩蛋终端);SVG HUD 思路 → 固定角落的返回顶部/目录按钮
- ❌ **不可迁移(明确不推荐 3D)**:几十 MB 加载、数月开发、移动端发热、SEO 零收益;读者带着"来读长文"的意图,任何"先开车再进门"都是流失;且 3D 场景与 three.js 大版本升级强绑定,维护是持续税。**结论:这是"看一次 wow"的站,不是"每天来读"的站,方向性不适配文字博客**
---
## 3. danielspatzek.com(Portfolio IV "dnlsptzkIV")——滚动叙事 + 人设文案的教科书
### 实测技术栈
- Nuxt.js **纯客户端渲染壳**(HTML 仅 4KB,`window.__NUXT__={...serverRendered:!1}`,SEO 弱)+ **Storyblok CMS**(图片走 `img2.storyblok.com`)——其 FAQ 自述:"Many of my websites were one man projects built with Nuxt.js + Storyblok CMS"
- 三套自托管字体预加载:**dnlsptzk.woff2(自制字标字体)** + Suisse Int'l(瑞士无衬线)+ SangBleu OG Serif(衬线)
### 布局与视觉冲击点
- 整站铺在一幅 **2560px 宽的老彼得·勃鲁盖尔名画**上,画上被刻意"涂鸦"(资产名就叫 `bruegeltzek.jpg`)
- 自嘲戒律跑马灯贯穿全站(原文节选):*"Thou shalt not use effects for no reason. Thou shalt keep it clean and simple. Thou shalt not write vertical. Thou shalt not choose UI over UX…"*
- 章节式滚动长页:自我介绍 → 60 个 Vimeo 过程视频(Video 41-59)→ Selected Works 2016-2022(Bugatti/Viita/六缸伏特加/Degenesis…每个项目 NEXT/PREVIOUS/CLOSE 全屏切换)→ Awards → 6 步流程 → 对话体 FAQ → 底部 3D 香蕉跑马灯 + *"Don't scroll further down - it only gets worse."*
- **隐藏章节**(键盘可达的彩蛋,FAQ 里自嘲"大概是最重要的部分")
### 荣誉(页面自述)
Awwwards:1× Site of the Month、19× Site of the Day、13× Developer Award、12× Mobile Excellence;CSS Design Awards:4× Designer of the Year;FWA:8× FWA of the Day。
### 配色与排版
名画暖棕油画底 × 现代瑞士排版的大字号对比;他自己把"竖排文字"列为戒律之一(反讽业内套路)。
### 对长文博客的可迁移 / 不可迁移
- ✅ **可迁移(他真正获奖的是"叙事人格"而非技术)**:
- **有性格的文案**:把"关于我"写成对话体 FAQ、加自嘲戒律——书评博客完全可以有"毒舌书评人设"
- 隐藏章节彩蛋(彩蛋 = 记忆点 + 最低成本)
- CSS 原生 marquee 做"最近更新"横条
- "过程视频"思路降维 = **"文章背后的草稿/批注"栏目**(书评晒原书划线、技术文晒 debug 过程)
- ❌ 不可迁移:名画底图+涂鸦对阅读是持续干扰;**CSR 空壳首屏(书评站吃搜索流量,必须 SSG/SSR,绝不能学)**;60 个视频的内容维护量
---
## 4. julesforrest.com(Jules Forrest)——⚠ 原站已死,以下基于 Wayback 2022-05-24 快照
### 现状警告(实测)
HTTPS 证书为自签(浏览器直接报错);HTTP 返回的是与本人无关的"开云集团"中文国企站,页脚塞满赌博友链——**域名过期后被抢注做 SEO 垃圾站**。
### 原站布局与视觉(快照实测)
- **Gatsby + Netlify** 静态站(`page-data.json`、cloudfront bundle),Tailwind 风原子类
- 结构:个人简历式单页——自我介绍 → Credit Karma 设计系统负责人经历 → Women Who Design 项目(开源目录站)→ 演讲/奖项/报道列表(`grid col-2 / col-3 / col-5`)→ 22 处 SVG 内联图标
- **零重型动效**:无 canvas/three/gsap 任何信号;他还有 `css-grid-experiments/` 实验页和 CSS variables 技术笔记——**排版本身就是全部设计**
### 配色与排版(快照 CSS/类名实测)
- 白底黑字 + **桃色(text-peach)单一强调色** + 绿色(bg-green)头部色块
- **虚线边框(border-dashed)**、rounded-sm 小圆角、font-display 大标题、max-w-2xl 阅读列宽
### 对长文博客的可迁移 / 不可迁移
- ✅ **★★★ 全场最值得文字博客抄的一站**:内容优先、排版即设计;单强调色只给链接/标签;**虚线边框做"批注/手记"框(与文学书评的评注气质绝配)**;grid 卡片做书评索引页;SVG 内联小图标不引图标库
- ❌ 不可迁移:几乎没有动效层面的坑;唯一教训是**基建寿命**——好站也会死于域名没续费。给用户博客的行动项:域名自动续费 + HTTPS 自动化 + 内容定期导出留档
---
## 5. 补充:2026 年 Awwwards 最新获奖个人站(2-3 个,真实检索)
检索路径:`awwwards.com/websites/personal-blog/` 分类页(jina 抓取成功,2025-11 至 2026-09 条目齐全)→ 选出 2026 年个人站获奖者 → 官方站点页拿外链 → 抓真身。
### 5.1 Pedro Belleza's personal website — Honorable Mention(2026-07-23)
- **pedrobelleza.com**(实测当前 522 宕机,用 2026-07-17 快照)
- **概念**(Awwwards 官方页原文):*"A personal website disguised as a time machine, imagining the web from 1986 to 2046 through past aesthetics, present culture, and future interfaces."* ——把个人站做成**网页史时间机器**:1986/1996/2006/2016/2026/2036/2046 七个年代各一套"当年代美学"界面
- **技术**(快照实测):Next.js + React(76 处 react / 23 处 next 信号)+ 大量 canvas(56 处)+ three(5 处)——每个年代是一个 canvas 场景
- ✅ 可迁移:**"纪元/皮肤"叙事降维**——默认阅读主题不变,做一个 90s GeoCities 风或终端风彩蛋皮肤(学习他"用界面年代感讲故事");个人页做时间线
- ❌ 不可迁移:多套并行整站界面 = N 倍维护 + 交互一致性灾难;对持续更新的博客不现实
### 5.2 The Lookback — SOTD + Developer Award(2026-03-27,评分 7.45)
- **tlb.betteroff.studio**(Better Off® 工作室的"数字时间胶囊",官方描述:*"Digital capsule… to document what inspired them and what they created"*)
- **布局**:Timeline(月度档案:Inspire/Showcase 封面流)+ Surf + Index(全量索引)+ About;巨大逐字母竖排字标
- **动效技术**(CSS 实测):`@keyframes marquee`(20s linear infinite,`.is-paused` 可暂停)、**`@keyframes noise`(1s steps(2) infinite 的电视雪花噪点)**、页面 slide 转场用 `cubic-bezier(.19,1,.22,1)`(easeOutExpo 系)、菜单 0.35s 线性颜色过渡、15 处 cursor 信号(自定义光标)
- **技术栈**:Nuxt 3 SSR + DatoCMS + `/_payload.json` 增量加载
- **配色**:灰 `#bebebe` 系 × 黑白 + 粉 `#facac8`/`#d98d91`
- ✅ 可迁移:**marquee(CSS 原生 + 可暂停,做"最近更新"条)**;**噪点/纸纹覆盖层(一个 keyframes 给文学书评加"纸质颗粒感",性能近零)**;全站统一一支缓动曲线 + 统一时长;月度档案 + Index 的内容组织
- ❌ 不可迁移:逐字母大字标(中文长文场景是"读进去"不是"被镇住");封面视频流带宽
### 5.3 AI in Design Report 2026 — SOTD + Developer Award(2026-08-26)
- **stateofaidesign.com**(Designer Fund × Foundation Capital 年度报告;案例含 Sierra/Linear/Shopify/Stripe/Anthropic/Notion/Framer)
- **布局**:章节化长报告(**Tools 01 / Craft 02 / Teams 03**)+ "Read the Report" + "Scroll to read" + **Editorial Chart(编辑风图表)** + 案例全屏卡
- **技术**(实测):**整站 Framer 构建**(HTML 内 18000+ framer 信号、`data-framer`×3276、`--frame` 动画变量×5202、appear 入场动画×32、scroll- 触发×21、sticky×5);字体 **Fragment Mono + Geist Mono + Inter**(等宽×无衬线的编辑-科技混搭);webm 视频
- **配色**:黑底(#000×103 处)+ 主橙 `#fe7141` + 分章功能色(sage `#d1ddd3` / acid 黄 `#f0ff1c` / lilac `#cdabfe`)
- ✅ 可迁移:**章节化长文结构**(01/02/03 章节导航 + 每章一个功能色)——Linux 系列长文连载直接可用;等宽字体做数据/标签/图表标注;"编辑风图表"用 SVG/CSS 手绘而非截图;黑底长报告证明暗色主题下读长文可行
- ❌ 不可迁移:**Framer 全家桶**(月费绑定、代码不可导出、深层页 SEO 弱——博客要活十年,工具必须可迁移);webm 头图视频(LCP 杀手)
---
## 6. 汇总
### 6.1 获奖站共性(基于以上 7 站实测)
1. **一个"一眼记住"的核心概念**(开车简历 / 名画涂鸦 / 时间机器 / 时间胶囊 / 年度报告),技术全部为概念服务——没有一个是"堆特效"
2. **排版即品牌**:每站 1-3 套非默认字体(等宽/手写/衬线混搭),字号对比大胆,但正文列宽都很克制(如 jules 的 max-w-2xl)
3. **统一的动效语言**:动效数量不重要,**全站一致的一支缓动曲线 + 统一时长**才显高级(lookback 全站 0.35s + expo 曲线)
4. **强约束配色**:黑/白底 + 单强调色(琥珀/粉/桃/橙),最多加 2-3 个章节功能色
5. **微交互密度 > 大特效密度**:hover、光标、marquee、噪点、页面转场——小而全站一致
6. **文字本身就是获奖武器**:Spatzek 的戒律、Cassie 的告别信、Belleza 的年代叙事——好文案不要钱
7. **创意站寿命很短**:4 个指定站 2 个已死(主动退役 / 域名被赌博站劫持)+ 1 个宕机;获奖 ≠ 长寿
### 6.2 「降维」可用清单(文字长文博客,按性价比排序)
**Tier 1 —— 纯 CSS/几十行 JS,1-2 天可落地**
1. 阅读进度条 + 章节 sticky 小标题(AI Report 章节导航的降维)
2. 全站统一微交互:链接下划线动画、卡片 hover 抬升,**只用一支缓动曲线、一个时长**(0.35s + easeOutExpo)
3. CSS marquee"最近更新"横条(lookback 方案:`animation: marquee 20s linear infinite` + `.is-paused` 暂停)
4. noise 纸纹噪点覆盖层(`@keyframes noise{…steps(2)}`,给书评区加"纸质颗粒",近零成本)
5. 单强调色系统 + **虚线边框批注框**(jules 桃色 + 虚线 = 书评"批注"的现成视觉语言)
6. 暗色终端风代码块/输出块(cassie 的黑底等宽 + `>` 前缀,直接服务 Linux 长文)
**Tier 2 —— 少量 JS / View Transitions,约一周**
7. 文章↔列表页转场(lookback 的 slide + 统一曲线;现代浏览器可用 CSS View Transitions API,降级无副作用)
8. 文章内 scroll-driven 渐显插图(CSS scroll-timeline,渐进增强,不支持则静止)
9. 书评索引页(lookback Index 思路:全量网格 + 年代/分类筛选)+ 一套 90s/终端彩蛋皮肤(pedro 降维:默认主题永远是阅读优先)
**Tier 3 —— 谨慎、可砍**
10. 自定义光标(lookback 有 15 处 cursor 信号)——**文字站正文光标必须是标准 text/I-beam**,最多在标题/封面区玩
11. hero 区一个 canvas 小玩具(cassie 花房降维:一张可涂抹的书封/封面图,做好 `prefers-reduced-motion` 与移动端降级)
### 6.3 坑清单(明确不要做)
1. **3D 世界 / 全屏 WebGL(bruno 路线)**:数月开发、几十 MB 加载、移动端发热、SEO 零收益;读者意图是"读",多一步都是流失——**明确判定:3D 不适合本博客**
2. **纯客户端渲染壳(spatzek 现状)**:书评站吃搜索流量,必须静态生成/SSR + 服务端可抓取的全文
3. **多套并行界面(pedro 全量版)**:维护成本指数级、交互一致性灾难
4. **逐字母大字标 / 竖排标题**:中文长文可读性杀手(spatzek 自己都把 vertical 列为戒律)
5. **Framer/重建站工具绑定**:内容要活十年,工具必须可导出可控
6. **自动播放视频 / 巨图 hero**:LCP 杀手,直接毁 Core Web Vitals
7. **动效的可访问性税**:所有动效包 `prefers-reduced-motion`;marquee/noise 必须可暂停(光敏与注意力障碍)
8. **中文字体陷阱**:获奖站 3-4 套展示字体的玩法在中文不成立(webfont 动辄 MB 级)——中文字族最多两套(如思源宋/黑做子集化),展示字体用拉丁字体只作用于数字/英文
9. **基建寿命**:cassie 主动退役、jules 域名被赌博站劫持——**域名自动续费、HTTPS 自动化、内容定期导出,比任何特效都重要**
---
## 7. 抓取凭证与残留风险
**实测凭证**(均 2026-10-24 抓取,留存于 `/tmp/recon/`):cassie.html(39KB,内联 Three.js 模块)、bruno.html(58KB,GLB/KTX/rapier 信号)、danielspatzek.com 经 jina 渲染全文(含 Awards 自述与 FAQ)、julesforrest.com 现状(自签证书 + 劫持站)+ Wayback 2022-05-24 快照(Gatsby/peach/dashed 类名)、awwwards personal-blog 分类页 jina 抓取(2026 年 SOTD/HM 全名单)、pedro 2026-07-17 快照(Next.js/canvas 信号)、tlb.betteroff.studio HTML + default.css(marquee/noise keyframes)、stateofaidesign.com HTML(Framer 信号/字体/配色)。
**残留风险**:
- 视觉实况(动效手感、3D 交互、光标样式)无法用 curl 验证,技术判断基于 HTML/CSS/资产信号与官方描述,各节已标注"实测"vs"背景知识(历史口碑)"
- bruno/cassie 的打包 JS 未逐字节反编译,栈判断基于资产与内联代码信号(置信度高:GLB/KTX/Rapier/THREE 关键字直接命中)
- pedrobelleza.com 抓取时宕机(522),恢复后可复核
- Bing/DDG 搜索质量差(DDG 反爬 challenge),补充站改由 Awwwards 官方目录锁定,权威性反而更高
@@ -0,0 +1,237 @@
# 中文排版与阅读体验调研报告(博客重设计 · 侦察任务 3)
> 调研员:@agent-08671f | 日期:2026-10-24
> 对象:中文文学书评长文 + Linux 技术文(含代码块)的博客重设计
> 方法:直连抓取各站 HTML + CSS **源码**并逐条提取排版参数(非渲染截图);crawl4ai 容器辅助渲染;权威排版文献取 W3C《中文排版需求》(clreq) 与 sparanoid《中文文案排版指北》原文。
---
## 0. 数据来源与可信度说明
| 来源 | 状态 | 说明 |
|---|---|---|
| howiehz.top | ✅ 实抓 | 首页 + 文章页 + 8 个主题 CSS 文件逐条分析 |
| kaix.in | ✅ 实抓 | 首页 + 文章页 + 全站单文件 CSS |
| wangyurui.com(太隐) | ✅ 实抓 | 文章页 + Typlog UI css + snow.css 主题文件 |
| cbc688.com(CRIVU) | ✅ 实抓 | typography.css + style.css(自研 academic 主题) |
| innei.ren(静かな森) | ⚠️ 半实抓 | 线上是 JS SPA(首屏为歌词开屏页),curl 拿不到正文;排版参数改从其开源主题仓库 **Innei/Shiro**(main 分支源码文件)取证,报告中已标注 |
| W3C clreq | ✅ 实抓 | w3c.github.io/clreq(570KB 双语原文,摘录关键条目) |
| 中文文案排版指北 | ✅ 实抓 | sparanoid/chinese-copywriting-guidelines @ master README.zh-Hans.md |
| 候选站发现渠道 | ⚠️ 变通 | DuckDuckGo / Bing / Google 直连与经 crawl4ai 渲染均未返回有效搜索结果(反爬);改用 GitHub「中文独立博客列表」(timqian/chinese-independent-blogs,实抓 156KB) 按 读书/文学/书评/随笔 标签人工筛选 |
抓取失败如实记录:鵝庵筆記 (white-ceiling.bearblog.dev) 返回 404;所谓空想 (alxh.page) 返回 403。
---
## 1. 对照组:howiehz.top(higan 主题作者站)
**平台**:Halo + 自研 `howiehz-higan` 主题(CSS 变量 + Tailwind 工具类构建,产物经 lightningcss 处理)。
**实测参数**(均摘自主题 CSS 原文):
| 维度 | 值 | 出处 |
|---|---|---|
| 正文字号 | `--text: 1rem`(16px),另有 0.875/0.9375rem 辅助档 | components-text-size-normal |
| 正文行高 | `line-height: 1.725`(全局 body) | global-G8hHJbZv.css |
| 版心 | `.max-width`: 100% → 48rem → 56rem → **64rem(1024px)** 随断点放大 | global-G8hHJbZv.css |
| 标题字阶 | h1 1.75rem / h2 1.5rem / h3 1.375rem / h4 1.25rem;h1 `letter-spacing: .01em` | text-size-normal + global |
| 字体栈 | `--higan-font-family: "Meslo LG S", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif` | global-G8hHJbZv.css |
| 中文字体 | **完全没有声明**——Meslo LG S 的 @font-face 仅按 unicode-range 覆盖拉丁字母与符号分片,汉字全部落到系统默认(PingFang/微软雅黑),黑体渲染 | @font-face 系列 |
| 配色(light) | bg `#fafafa`、正文 `#333`、primary `#6cf`(青)、accent `#c5b6ff`(浅紫) | theme-light-blue |
| 配色(dark) | bg `#212326`、正文 `#d5d7d8`,light/dark/auto 三态 + 多套主题色 | theme-dark-blue |
| 引文 | `blockquote`:**整段加粗** + secondary 色 + `quotes:"“" "”"`;出处行 cite 前缀 "—" | article css |
| 段落处理 | 无 `text-indent`、无 justify、正文字距 0 | 全局检索确认 |
**阅读体验评价**:工程师的务实配置——等宽字体作身份标识、代码友好、暗色体系完整、60fps 级特效克制(其站内《中文博客倡议》还提出对比度至少 WCAG AA、禁自动播放等社区规范)。但放到「中文长文阅读」标尺下有四处硬伤:
1. **中文零字体设计**:字形气质完全交给操作系统抽奖(macOS 苹方 / Windows 微软雅黑 / Linux 文泉驿);
2. **行长失控**:64rem=1024px 版心 × 16px 字号 → 桌面每行约 **60–64 个汉字**,远超中文舒适区(约 35–45 字),扫读时易串行;
3. **16px + 1.725 行高**对持续阅读偏小偏密(该行高比率本身够宽裕,但字号拖了后腿);
4. 引文整段加粗、无书摘层级设计,与文学内容气质不符。
**对本次重设计的启示**:用户「不喜欢 higan」与实测数据吻合——问题不在工程实现,而在它根本不是为中文长文设计的。重设计应把「中文正文字号—行高—行长」三角作为第一决策,而非后置微调。
---
## 2. 标杆站 A:KAIX.IN(读书 · 咖啡 · 随笔)
老牌阅读向个人博客,**五站中「书页感」最强**。
| 维度 | 实测值 |
|---|---|
| 纸感配色 | 页面底 `#F6F5F3`(米白纸色),正文衬底 `#fff`,链接/引文条 `#090` 墨绿 |
| 正文字体 | 衬线栈:`Georgia, "Nimbus Roman No9 L", "Songti SC", STSong, "Noto Serif CJK SC", "AR PL New Sung", …, NSimSun, SimSun, serif`——macOS 宋体-简、Linux 思源宋、Windows 回退宋体 |
| 字号 | `html { font-size: 16px }`,大屏断点提升为 **18px**(rem 基准整体放大,全站等比) |
| 行高 | 正文 `1.8` |
| 行长 | 版心 `max-width: 40.5rem`(648px ≈ **36 汉字**,教科书级 measure) |
| 对齐 | `text-align: justify`(两端对齐,配 overflow-wrap 防止空隙拉爆) |
| 引文 | `border-left: 2px solid #090` + `padding-left: 1.25rem`,衬线延续 |
| 暗色模式 | **无**(`prefers-color-scheme` 检索为零)——纸感定位,明确放弃暗色 |
**评价**:把「衬线 + 米白纸底 + 两端对齐 + 36 字窄版心」四个变量做满,是中文读书博客的经典解法。代价是完全没有暗色模式、视觉变化少。适合作为**书评正文的气质基准**,暗色诉求则要从别处补。
---
## 3. 标杆站 B:太隐 wangyurui.com(随笔 · Typlog 托管 snow 主题)
| 维度 | 实测值 |
|---|---|
| 正文 | `.e-content { font-size: 18px; line-height: 1.62; }`(body 18px/1.42) |
| 行长 | `.e-content { max-width: 760px; padding-inline: 18px }`(≈ **42 汉字**) |
| 字体栈 | `var(--en-sans), var(--cjk-sans), sans-serif` **中西文分离变量**设计;cjk 栈 = `"PingFang SC","Hiragino Sans GB","Droid Sans Fallback","Microsoft YaHei"`(typlog.css) |
| 主色 | `--primary: #b91903`(深红),只用于边框/导航点缀 |
| 引文 | `blockquote { border-left: 4px solid 主色; padding: 0 1em; color: #000000ad }`;主题另备装饰款:62px 巨型 “ 低透明度水印 + `.96em` 字号(适合金句) |
| 暗色模式 | 无自动暗色 |
**评价**:现代简洁黑体派。「18px / 1.62 / 760px」是舒服的默认三角;深红主色克制点缀;中西文用双变量分治的思路值得抄(英文 sans 与中文黑体各自的字重气质更好)。缺点:无暗色、无阅读增强功能。
---
## 4. 标杆站 C:CRIVU cbc688.com(阅读 · 小说 · 京剧 · 自研 academic 主题)⭐
**五站中中文长文排版体系完成度最高**,其 `typography.css` 就是一份可直接抄的 token 清单(下述全部为源码原文):
```css
:root {
--font-serif: "Iowan Old Style", "Songti TC", "Songti SC", "STSong",
"Noto Serif CJK TC", "Noto Serif CJK SC", "PMingLiU", "SimSun", serif;
--font-sans: -apple-system, BlinkMacSystemFont, "Helvetica Neue",
"PingFang TC", "PingFang SC", "Microsoft JhengHei", "Microsoft YaHei", sans-serif;
--type-body: 16px; /* 列表/UI 正文 */
--type-body-reading: 20px; /* ★ 文章阅读模式正文 */
--leading-body: 1.7;
--leading-reading: 1.75; /* ★ 阅读模式行高 */
--type-article-title: 27px; --type-page-title: 32px; --type-section: 24px;
--leading-heading: 1.3; /* 标题行高 */
--tracking-title: 0; /* 中文标题字距 0 */
}
:root:lang(en) { --tracking-title: -.03em; } /* 英文才上负字距 */
.article-reading:lang(en) { max-width: 65ch; } /* 英文按 ch,中文按 px */
.article-page:has(> .article-reading) { --measure: 800px; } /* 版心硬上限 */
```
| 维度 | 值 |
|---|---|
| 纸墨配色 | `--paper: #fff` / `--paper-2: #f1f1ef` / `--ink: #171716` / 正文 `--text: #2c2b28` / 弱化 `--muted: #77736b` / 墨线 `--line: rgba(23,23,22,.14)`;标题 `#285a80`、链接 `#0066cc` |
| 暗色 | `--paper: #191d23`(蓝黑)/ `--ink: #f5f5f7`,配 `color-scheme` 声明 |
| 阅读模式 | 移动端正文降到 18px、`.article-reading` 页面 19px(**按容器动态调阶**) |
| 细节 | 标题 `text-wrap: balance`;文章 deck(导语)15px muted;`.article-meta` 11px;有 reading-dock 阅读控制面板(字号/目录) |
| 引文 | 学术极简款:`padding-left: 1.35em; color: var(--muted); border-left: 1px solid var(--line-strong)`,字号行高与正文一致 |
**评价**:「纸墨」隐喻贯穿全部 token;20px/1.75/800px 阅读模式 + 中英文字距分治 + 容器感知字阶,三个设计决策都可直接移植。开源自研主题也证明这类体系在静态站完全可落地。
---
## 5. 标杆站 D:静かな森 innei.ren(Shiro 主题 · 开源)⚠️ 参数取自源码仓库
线上为 React SPA(首屏歌词开屏),curl 拿不到渲染后正文;以下取自 **Innei/Shiro** main 分支源码(`apps/web/src/styles/`)。
| 维度 | 实测值(源码原文) |
|---|---|
| sans 栈 | `--font-sans: var(--app-font-sans), system-ui, -apple-system, "PingFang SC", "Microsoft YaHei", "Segoe UI", Roboto, Helvetica, "noto sans sc", "hiragino sans gb", sans-serif` |
| serif 栈 | `--font-serif: "Noto Serif CJK SC", "Noto Serif SC", var(--app-font-serif), "Source Han Serif SC", source-han-serif-sc, SongTi SC, SimSun, …`(**思源宋体全平台名都进了栈**,供正文切换) |
| 自托管 webfont | 仅代码字体:Operator Mono SSml Nerd(jsDelivr)、JetBrains Mono/Fira Code(Google Fonts)——**中文一律不上 webfont** |
| 暗色 | `[data-theme='dark'] { --color-root-bg: rgb(28,28,30) }`(iOS 系统灰,非纯黑);`::selection` 用 `oklch(from accent l c h / 0.3)` 半透明;边框 `#3f3f46` |
| 代码高亮 | Shiki **双主题变量**:`html[data-theme='dark'] .shiki span { color: var(--shiki-dark) }`——一套标记两种主题,暗色无需重新解析 |
| 其他细节 | noise 纹理层(暗色下透明度 0.04→0.01)、`print.css`、主题切换 view-transition 动画 |
**评价**:工程化现代派范本。值得抄的不是排版数值(黑体通用型),而是**暗色模式的三件套做法**:系统灰底色、半透明 selection、Shiki 双主题变量——对「技术文含大量代码块」的本博客尤其对症。
---
## 6. 中文网络排版最佳实践清单(可直接落地)
来源:W3C clreq 原文 + 中文文案排版指北原文 + 上文五站实测交叉验证。
### 6.1 字体栈
- **行业现实**:五个站无一给中文加载 webfont,全部系统字体栈(性能优先,中文字体动辄 MB 级)。
- **书评正文推荐衬线栈**(kaix.in × CRIVU 实测组合):
`Georgia, "Iowan Old Style", "Songti SC", STSong, "Noto Serif CJK SC", "Source Han Serif SC", SimSun, serif`
⚠️ 把 `Noto Serif CJK SC` / `Source Han Serif SC` 排在 `SimSun` **前面**——Windows 老宋体(中易宋体)小字号点阵发虚,有思源宋就用思源宋(CRIVU 做法;kaix.in 没这么做是其短板)。
- **UI / 技术文 sans 栈**:`system-ui, -apple-system, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", sans-serif`。
- **代码块**:`ui-monospace, "JetBrains Mono", Consolas, "Courier New", monospace`;等宽 webfont 只需拉丁/符号子集(higan 的 unicode-range 分片、Shiro 只托管代码字体,都是这个思路)。
- **思源宋体/黑体 webfont 使用场景**:只有当「跨平台一致的衬线正文」是硬需求时才上,且必须子集化(unicode-range 分片或 cn-font-split)+ `font-display: swap`;折中方案是**仅标题/金句用 webfont,正文系统回退**。书评站若接受「不同系统宋体略有差异」,纯系统栈是最稳的。
### 6.2 字号 · 行高 · 行长(核心三角)
| 参数 | 推荐值 | 实测依据 |
|---|---|---|
| 正文字号 | **18–20px**(阅读模式 20px;移动端 18px) | CRIVU 20/18、太隐 18、kaix 18;16px 仅 UI 正文(higan 反例) |
| 正文行高 | **1.75–1.8**(下限 1.7) | CRIVU 1.75、kaix 1.8、太隐 1.62、higan 1.725 |
| 行长(版心) | **640–760px ≈ 35–42 汉字**;硬上限 800px;英文另设 65ch | kaix 648px/36 字、太隐 760px/42 字、CRIVU 800px 上限 |
| 标题行高 | 1.3,并 `text-wrap: balance` | CRIVU |
| 标题字阶 | 文章题 26–27px / 章节 24px / h3 20px(约 1.15–1.35 倍率,中文标题不需要大跳阶) | CRIVU 27/24/20 |
| 字距 | 中文正文与标题 **0**(最多 0.01em);英文标题才用 -0.03em | CRIVU `:lang(en)` 分治、higan h1 .01em |
| 对齐 | 正文 justify 可选(需配 `overflow-wrap: break-word`);不用 break-all(会破坏避头尾) | kaix 实用案例 |
| 段落 | 网文惯例 = **无首行缩进 + 段间距 1em 内**;首行缩进 2em 仅适合纯文学章节体,二选一不混用 | 五站共性(全部用段间距) |
### 6.3 中西文混排间距
- clreq 原文规则:**汉字与西文字母/阿拉伯数字之间,空隙不超过四分之一个汉字宽;西文出现在行首行尾时则不加**。
- 内容层(现在就做):中英文、中文与数字之间敲真实半角空格;全角标点与其他字符之间**不加**空格;数字用半角;「示例:在 LeanCloud 上花 5000 元买 10 Gbps」——sparanoid《中文文案排版指北》全部为这类可执行条目。
- CSS 层(渐进增强):新属性 `text-autospace` / `text-spacing`(Chromium 已在推进)可自动补 ¼em 间隙,写进样式做渐进增强即可,未支持的浏览器不受伤。
- 结构层:中西文各用独立字体变量(太隐 `--en-sans/--cjk-sans`、Shiro `--font-sans/--font-serif` 均为西文在前、中文跟随的栈序——西文字形自己出,汉字自动落到中文字体)。
### 6.4 标点处理
- **行尾点号悬挂:不必做**。clreq 原文:「绝大多数的中文出版物没有悬挂行尾点号的惯例」,还可能导致前行字距不一——过去 CSS 圈流行的 hanging-punctuation 技巧在中文语境属于过度设计。
- **避头尾(行首行尾禁则):必须保**。浏览器默认换行规则已处理(,。》不能出头等),危险动作是 `word-break: break-all`——技术文正文禁用,代码块内才允许。
- 引号:横排用弯引号 "" ''(大陆规范;clreq 确认直排才用直角引号「」)。书评站内容规范:作品名用《》,篇名/章节可用〈〉。
### 6.5 暗色模式排版调校
- **不用纯黑/纯白**:三站实测全是系统灰系——底 `#212326` / `rgb(28,28,30)` / `#191d23`,字 `#d5d7d8`–`#f5f5f7`。目标对比度约 10–13:1(AA 要 4.5:1,纯黑白 21:1 刺眼),CRIVU 的蓝黑 `#191d23` 最有纸墨延续感。
- 别忘了 `color-scheme: dark` 声明(原生表单控件、滚动条跟随)——CRIVU 有、多数站漏。
- 正文不必加粗补偿;衬线体暗色下发虚优先调字号而非字重。
- **代码块**:Shiki 双主题变量(`--shiki-dark`,Shiro 做法)或 highlight.js 双样式表,一篇页面两套配色,暗色切换零重排。
- 图片:暗色下降低亮度/提高透明度,或像 higan 那样准备 `div.light` / `div.dark` 双份图由主题态切换(其 CSS 原文方案)。
- `::selection` 用 accent 色加 alpha(Shiro: oklch 30% 透明度),避免刺眼实心块。
### 6.6 引文 / 书摘样式(书评站的重点组件)
四种实测模式,按气质选:
| 模式 | 样式 | 适合 | 出处 |
|---|---|---|---|
| A 学术极简 | 1px 细墨线左边框 + muted 色,字号行高与正文一致 | 长段原文引用、多段书摘 | CRIVU |
| B 现代强调 | 4px 主色左边框 + 主色淡化文字(60–68% 黑) | 中短引用 | Typlog snow |
| C 传统书卷 | 2px 彩色(墨绿等)左边框 + 1.25rem 缩进,衬线延续 | 常规书摘 | kaix.in |
| D 装饰金句 | 62px 巨型 “ 水印(低透明度)+ 0.96em 字号 + 2.2em 左缩进 | 每篇一句的「金句卡」 | Typlog snow |
- 反例(higan 现状):blockquote **整段加粗**——长书摘可读性差,重设计应弃用加粗。
- **出处行**:小一号(0.875rem)+ muted 色 + "—" 或 "——" 前缀 + 作品名《》(higan 的 cite 方案可用,去掉加粗即可)。
- 书评特供:给「原文摘录」与「我的评论」做视觉分层(如引文无底色 + 评论带 `--paper-2` 底色),CRIVU 的 `--line` 墨线体系足够搭出这种层级。
---
## 7. 给本博客(书评长文 + Linux 技术文)的落地参数建议
综合以上,一套可直接开工的组合:
```
正文(书评/散文): 20px / line-height 1.75 / max-width 720px(≈36 字)
衬线栈(6.1 推荐栈,Noto Serif CJK SC 前置于 SimSun)
技术文正文: 19px / 1.7 / 同版心;内联 code 用等宽 0.875em
代码块: 16px(0.8em)/ 1.6 / overflow-x: auto / 禁 break-all
等宽栈 + Shiki 双主题变量(暗色免重排)
段落: 无缩进,段间距 0.9em;标题 text-wrap: balance
标题: 文章题 27px / 章节 22px / h3 19px / 行高 1.3 / 中文零字距
混排: 中英文间手敲空格(写作规范)+ text-autospace 渐进增强
暗色: 底 #191d23 系蓝黑 / 字 #f0f0ef 系 / color-scheme: dark
代码双主题、图片降亮度、selection 半透明
引文: 长书摘 = 模式 A;金句 = 模式 D;出处行 0.875rem muted
阅读增强(可选): 参照 CRIVU:字号切换 dock + 目录面板 + 阅读进度
```
**优先级排序**:① 正文字号/行长(20px/720px,直接解决 higan 最大痛点)② 衬线正文栈 ③ 引文组件重做 ④ 暗色按 6.5 调校 ⑤ 阅读增强锦上添花。
---
## 8. 残留风险与未竟事项
1. 搜索引擎(DDG/Bing/Google,直连+渲染两路)均未返回有效结果,「标杆站发现」靠 GitHub 中文独立博客列表人工筛选,可能错过更优样本;列出的 4 站 + 对照组均为真实抓取。
2. 所有分析基于静态源码,未做浏览器渲染截图;「每行字数」由 px 与字号换算估算。
3. innei.ren 的行高/字号未取到线上实测(SPA 渲染失败),其报告数值仅为字体栈/配色等源码级事实。
4. `text-autospace` 的浏览器落地进度未逐一验证(Chromium 支持推进中),上线前建议按目标浏览器实测。
@@ -0,0 +1,146 @@
# 照片管线与管理界面 · 四路线实测论证报告
> 侦察员 @agent-4f37d7 | 2026-10-24 | 博客架构 = Astro SSG + 自建 gitea;照片库存 21 张;需求 = **上传管理界面 + 图库按宽高比自适应**
> 所有结论基于 2026-10-24 实抓的官方源码 / OpenAPI spec / GitHub API / README,标注「推断」处为合理推理而非实抓。
---
## TL;DR
| | P1 gitea 原生 + 构建时处理 | P2 自建/现成管理端 | P3 Immich | P4 自托管图床 |
|---|---|---|---|---|
| 上传体验(手机) | ⭐⭐⭐ 拖拽+多选,手机走系统相册(推断) | ⭐⭐⭐⭐⭐ Sveltia 移动支持(自述)/自写可 PWA | ⭐⭐⭐⭐⭐ App 自动备份(但不是进博客仓) | ⭐⭐⭐ 网页上传 |
| EXIF/缩略图 | 构建时 exifr + sharp,宽高比天然可得 | 入库前处理完(自写)/ Sveltia 无 EXIF 提取 | ⭐ API 直出全套 EXIF | 部分自带,非结构化 |
| 数据归属/版本控制 | ✅ git 仓 | ✅ git 仓 | ❌ Immich DB | ❌ 图床自有存储 |
| 新增运维组件 | **零** | 零(Sveltia 纯前端)或 1 个小服务 | 重型全家桶 | 1 个 PHP 应用 |
| 工作量 | 半天(一个 loader 脚本) | 0~3 天 | 1 天(仅当已有 Immich) | 1 天部署 + 长期割裂 |
**推荐**:P1 起步(当天可用)→ 管理面先用 Sveltia CMS 试水(Gitea 后端已是一等公民)→ 不合手再自写照片专用小服务(可开源)。P3 仅当本来就部署 Immich;P4 不推荐。
---
## P1 · gitea 原生上传 + 构建时处理
### 上传能力(实抓 gitea main 分支源码)
- **Web UI 上传页存在且走 dropzone**:`templates/repo/editor/upload.tmpl` 定义 `repo-file-upload` 表单,内嵌 `templates/repo/upload.tmpl` 的 dropzone 容器(`data-accepts` / `data-max-file` / `data-max-size`);`web_src/js/features/repo-editor.ts:64-65` 对 `.repository.editor.upload .dropzone` 调 `initDropzone`。
→ **拖拽 ✅、多文件 ✅**(dropzone 标准能力);入口 = 仓库页「Add File → Upload Files」,需选目标目录+写 commit message。
- **默认限制(`modules/setting/repository.go` 约 170-177 行,实抓)**:
```go
Upload: struct { Enabled bool; AllowedTypes string; FileMaxSize int64; MaxFiles int }{
Enabled: true, AllowedTypes: "", FileMaxSize: 50, MaxFiles: 5,
}
```
→ 默认**单次 5 个文件、单文件 50MB、不限类型**;`[repository.upload]` 可调大(照片场景建议 `MAX_FILES` 调到 20+)。
- **手机浏览器**:dropzone 底层是标准 `<input type=file>`(可多选),手机 Safari/Chrome 弹系统相册、支持多选——**推断**(未实机测)。
- **API 上传(实抓 swagger.v1.json,953KB)**:
- 单文件:`PUT/POST /repos/{owner}/{repo}/contents/{filepath}`,内容 base64;
- **多文件批提交:`POST /repos/{owner}/{repo}/contents`**(summary: *Modify multiple files in a repository*),body = `ChangeFilesOptions{ files: [{operation: create|update|upload|rename|delete, path, content(base64), from_path}], branch, author/committer, dates }`——脚本化上传/搬移/删除全覆盖,且一次 commit 完成多文件。
- 仓库 webhook:官方文档站有 `/usage/repository/webhooks/` 页(目录实抓),可触发构建。
### 构建时 EXIF + 缩略图(实抓 Astro 官方文档与源码)
- **astro:assets 默认 image service = sharp**(官方 images 指南 L670-672),`<Image />` 构建时转换尺寸/格式/质量,**自动推断宽高写进 `<img>` 防 CLS**(L211/214)——缩略图多尺寸(`srcset`/responsive layout)**官方原生,零自写**。
- **宽高比能力(关键,正中需求)**:导入图片的 `ImageMetadata = { src, width, height, format, orientation }`(images.mdx L497-503);源码 `packages/astro/src/assets/utils/metadata.ts` 实证:用内置 image-size 探测,**orientation ≥ 5 时自动交换 width/height** → 拍竖片时宽高比正确。masonry 组件构建时直接读 `width/height` 算 `aspect-ratio`,零运行时 JS。
- **能力边界(如实)**:astro:assets **只给尺寸/格式/方向,不吐相机/镜头/光圈等 EXIF**。这一层要 `exifr`(npm v7.1.3,**零依赖**,npm registry 实查)在 content collection loader 或 prebuild 脚本里提,写入数据层(20 行级别代码)。
- **public/ 与未授权远程图不处理**(images.mdx L16/36/49):照片必须放 `src/` 下(或经 `image.domains` 授权)才享受缩略图管线。
- **Astro 生态现成「照片上传→EXIF」集成**:npm 搜 `astro exif` 无官方/主流插件;GitHub 上仅有小模板(如 hant121/memori ★9 静态相册模板)。**没有一等公民现成集成,但缺的部分(exifr 提取)是 20-50 行的事。**
### 评估
- 上传体验:能用但纯 gitea——无缩略图预览、无 caption/alt 编辑、无分组管理;commit message 手写。
- 数据归属:✅ 21 张原图进 git 仓(21 张对仓库体积无压力;数百张后再谈 LFS)。
- 新增运维组件:**零**;构建时间 += sharp 处理 21 张(秒级,可忽略)。
- 工作量:**半天到一天**(photo collection loader + exifr + masonry 组件)。
---
## P2 · 自建上传/管理端点
### 现成开源「git-based 媒体管理器」搜索结果(GitHub API 实查)
**没有专精「git 照片管线」的主流项目**(搜 `git media manager upload`、`gitea cms` 等只出 teabag ★6——Static CMS 的 gitea 认证 shim,2023 停更;nbg ★1 等)。**但存在重要降维解**:
- **Sveltia CMS(sveltia/sveltia-cms,★2990,2026-10-24 仍在推提交)**:自称「Netlify/Decap CMS 后继,feature complete」(README 实抓 + discussions #957)。badge 自述:Fast / Git-based / Headless / Modern UX / **Mobile Support** / i18n。
- **Gitea 后端是一等公民(源码级实锤)**:GitHub contents API 列出 `src/lib/services/backends/git/providers/` 下 **`gitea` `github` `gitlab` 三目录并列**。
- 活跃度佐证:v0.251.0(2026-10-23)release notes 原文 "…approves its pull/merge request on GitHub, GitLab, **Gitea or Forgejo**"。
- 风险如实记录:Gitea 后端相对新——#1031(2026-10-01 才关闭)曾因 "Gitea 28 被误识别为 Forgejo 导致拉文件 404";#721(已关)涉 token 认证。**self-host gitea + Sveltia 的组合需实测后才能定案**(本次未能实机验证;sveltia-cms.app 文档站 SSL 握手失败,抓取未遂,已如实标注)。
- 能覆盖:图片上传(media folder 入 git 同 commit)+ markdown/frontmatter 编辑(caption/分组/alt 可做成字段)→ **「管理界面」需求的开箱即用候选**。不覆盖:EXIF 自动提取、缩略图预览策略定制。
### 自写小服务成本评估(基于 P1 实抓的 API 面)
管线 = 拖拽上传 → 服务端 exifr 提 EXIF + sharp 出缩略图预览 → 元数据表单(caption/分组)→ 组装 frontmatter + 原图 → gitea `POST /contents` 多文件一次 commit → webhook 触发构建。
- 技术面全部有实抓依据(contents 多文件 API、webhook、exifr、sharp),无未知阻塞;
- 工作量:**Node/Go 约 300-600 行,2-3 天到「自用够用」**;真正成本不在上传而在管理面(列表/编辑/删除/分组/精选标记);
- 手机:标准 `<input capture>` + PWA manifest 可达「拍照→直接进仓」;
- **自写最大红利:这个工具本身就是开源作品**(用户热爱开源 + 博客本就开源在 gitea 的定调),且可按自己的 21 张照片的真实工作流打磨。
---
## P3 · Immich 集成
### API 能力(实抓 immich-openapi-specs.json,973KB,199 路径)
- 认证:`x-api-key` header(securitySchemes 实查);
- `GET /albums`、`GET /albums/{id}`、`GET /assets/{id}` → `AssetResponseDto` **内含 `exifInfo`**;
- `ExifResponseDto` 字段全:make / model / **lensModel** / iso / fNumber / exposureTime / focalLength / dateTimeOriginal / GPS 经纬度 / orientation / city/state/country —— **EXIF 直出,结构化,比自提还全**;
- `GET /assets/{id}/thumbnail`(preview 尺寸)+ `/assets/{id}/original` 原图下载;
- `POST /search/smart`、`/search/metadata`(按相册/标签/日期筛);`/shared-links` CRUD(公开分享面)。
- 生态:eleventy-immich(★6,2026-10-21 仍活跃)、若干 astro+immich 小项目(★0-1)——**模式真实存在但都小众,无大一统方案**。
### 代价评估(如实)
- **数据不在 git**:精选集 = Immich 里的相册状态,改精选不改博客仓;缓解办法 = 构建时把拉到的元数据 JSON 提交进 content collection(照片本体仍可 gitignore),得到「元数据版本化 + 原图在 Immich」的折中;
- 构建时强依赖 Immich 在线(静态站本身不受影响,发布链路受影响);
- **新增运维组件最重**:Immich 全家桶(server + ML + Postgres + Redis),为 21 张照片引入纯属杀鸡用牛刀——**除非本来就部署 Immich 管理手机相册**(若已有,P3 成本骤降为 1 天集成);
- 公开图库还需管理 API key / shared link 暴露面。
---
## P4 · 自托管图床(Lychee / Chevereto / EasyImages)
### 实抓现状
| 项目 | 状态(2026-10-24 实查) | 要点 |
|---|---|---|
| LycheeOrg/Lychee | 活跃,**v7.0**(7.0 docker 镜像有 breaking change,README 升级公告),PHP 8.4/8.5,MIT | 功能完整的相册管理;**与静态博客集成的真实案例:未找到**(如实标注) |
| chevereto/chevereto | 活跃(pushed 2026-10-21,★1002,默认分支 4.5,**AGPL-3.0**,README 自述 "pro edition" 商业功能分层) | 老 chevereto-free 已退役(README 挂 Legacy 徽章指向 rodber/chevereto-free);为 21 张照片过重 |
| icret/EasyImages2.0 | README 实抓:PHP 5.6-8.0、**无数据库**、GPL-2.0,支持 API/多文件上传/在线管理/水印/压缩/格式转换,定位「游客上传和个人使用」 | 无版本控制;无结构化 EXIF 输出;PHP 上传类工具历史上有上传绕过类漏洞记录(**评估性提醒,未逐一核 CVE**),若用必须隔离部署 |
### 共同问题
- **版本控制缺失**:图片在图床自有存储(文件系统/DB),文章与图的关系无 git 级完整性——图床端误删/误改,博客构建照样成功、线上静默坏图;备份责任独立于博客仓;
- 唯一优点 = 构建不依赖图床在线(引用 URL 即可);
- 与「数据可控、全自托管、最少外部依赖」的选型轴相悖度最高(多一个有状态服务,且该服务只服务照片这一条内容线)。
---
## 推荐分阶段路径
**阶段 0(当天可用)— P1 全家桶**
1. 照片进仓:`src/assets/photos/`(或 `content/photos/` collection),gitea web 上传页拖拽(先把 `[repository.upload] MAX_FILES` 调到 20+);API 通路 `POST /contents` 多文件批提交留给脚本;
2. 构建时:content collection loader 用 **exifr** 提 EXIF(相机/镜头/参数/拍摄时间)进数据层;**sharp**(astro:assets 默认)出多尺寸缩略图 + `srcset`;
3. 宽高比自适应图库:masonry 组件从 `ImageMetadata.width/height`(已处理 orientation)算 `aspect-ratio` + grid row-span,零运行时 JS;lightbox 用原生 `<dialog>`。
→ 交付物 = 能用的图库页;新增代码约一个 loader + 一个组件。
**阶段 1(要管理界面时)— 先 Sveltia 后自写**
1. 零成本试 **Sveltia CMS**(纯前端 SPA,无新运维组件,Gitea 后端一等支持):把照片目录配成 media folder、caption/分组配成 frontmatter 字段;**验收点:self-host gitea 登录认证 + 媒体库上传 21 张照片实测**(Gitea 后端 2026-10 初还有兼容 bug 修复记录,需过一遍真机);
2. Sveltia 不合手(比如要「上传即预览缩略图+EXIF 自动回填」的照片专用体验)→ 自写 **photo-pipe** 小服务(上传→EXIF→缩略图预览→元数据表单→`POST /contents` 一次 commit→webhook 构建,PWA 手机可用),**作为独立开源项目发布**——这是「热爱开源」的最自然表达,且有 P1 打底保证任何时刻可退回纯手工流程。
**不推荐**:P4(数据归属最弱、与 git 哲学相悖);P3 仅在「本来就部署/计划部署 Immich 管手机相册」时启用,届时构建时拉精选相册 + EXIF 直出是省力方案。
---
## 未验证项与残余风险(如实标注)
1. gitea 上传页**手机浏览器实机**未测(理论上标准 file input 可用);
2. **Sveltia × self-hosted gitea** 未实机验证(认证流、媒体库体验、#1031 类兼容问题是否复发);sveltia-cms.app 文档站本次抓取失败(SSL),功能细节以 README/issues/release notes 为据;
3. homelab gitea **当前运行版本**未知——contents API 与 upload 页均为老牌功能(1.x 早期即有),风险低,但 `[repository.upload]` 可调项以实际版本 config cheat sheet 为准(main 分支源码与文档站页面结构本次均核过,cheat sheet 内容段未单独核);
4. Immich 版本迭代快、API breaking change 风险未逐一考证(API 面本身已实抓确认);
5. EasyImages 安全记录未逐一核 CVE,仅有泛化提醒;
6. astro-imagetools 仓库 API 查询未返回(疑改名/迁移),生态备选项未深究——不影响主方案(astro:assets 原生已够)。
## 抓取物存档
`/tmp/scout-photos/`:gitea(upload.tmpl / repo-editor.ts / dropzone.ts / setting-repository.go / swagger.v1.json)、astro(images.mdx / assets metadata.ts)、immich(openapi specs)、p4(lychee / easyimages / chevereto README)、sveltia(README / releases)。
@@ -0,0 +1,236 @@
# task-2 · 极客交互设计侦察报告(极客精神设计语言:真实案例 × 可落地实现)
> 侦察员 @agent-aeff1b · 2026-10-24
> 方法:所有案例均于本次用 curl 实际抓取验证(HTTP 状态 / 页面源码标记 / 开源仓源码 / npm registry / caniuse 官方数据),命令面板与终端站深挖到 JS bundle 与命令表。**抓不到、不命中的一律如实标注为负发现**。技术基线:Astro SSG + 自托管 Gitea,视觉路线「灰阶骨架×分轨正文」。
---
## 1. 命令面板 Ctrl+K
### 实测案例
| 站点 | 抓取证据 | 说明 |
|---|---|---|
| **Starlight / Astro 官方文档** starlight.astro.build | HTTP 200;页面源码含 `aria-keyshortcuts="Control+K"` ×1 + `pagefind` ×3 | **静态站 + Pagefind + 自定义模态的官方参考实现**,MIT 源码:`withastro/starlight` → `packages/starlight/src/components/Search.astro`(已实抓源码头 25 行:按钮 `aria-keyshortcuts="Control+K"` + pagefind 翻译注入 + `data-open-modal`) |
| **spectre.lou.gg**(louisescher/spectre,164★) | HTTP 200;**服务端 HTML 直接含** `<input id="search" placeholder="Search (Ctrl+K)">`,且 HTML 内有 `pagefind-ignore=` 属性、`pagefindInitialized = false`(首次聚焦才懒加载 Pagefind) | **Astro 原生终端风主题**,与本博客技术栈同源,Ctrl+K 搜索框静态可抓,是「静态站 Ctrl+K + Pagefind」最佳抄写对象 |
| **paco.me**(Paco Coursey,cmdk 作者本人站) | HTTP 200;源码含 `⌘K`、`command menu`、`cmdk` 字样 | cmdk 生态的活样本 |
| **blog.maximeheckel.com**(Maxime Heckel 博客) | 开源仓 `MaximeHeckel/blog.maximeheckel.com` package.json 实抓:依赖 `cmdk ^1.1.1` | 个人博客用 cmdk 的实证 |
**未验证(如实说明)**:leerob.com / rauchg.com / kentcdodds.com / brianlovin.com / joshwcomeau.com 首页静态 HTML 均无面板标记(客户端懒渲染),未继续深挖各自 bundle,不作案例引用。kentcdodds/kentcdodds.com 与 sreetamdas/sreetamdas.com 的 package.json 中均无 kbar/cmdk。
### 库与取舍(npm registry 实抓数据)
- **cmdk**:React 无样式 primitive(UI 全自理),周下载 **26,647,174**。适合已有 React 岛的站。
- **kbar**:即插即用 React 面板(自带动画/快捷键注册/持久化),周下载 **226,077**;README 实抓:「plug-n-play React component…built in animations and fully customizable components」。
- **静态站推荐:自写 vanilla TS(~150–200 行,零运行时框架)**。Pagefind 官方 JS API 文档实抓(pagefind.app/docs/api/,HTTP 200):`pagefind.search()` ×8、`pagefind.debouncedSearch()` ×3、`pagefind.options()` ×3、`pagefind.filters()` ×1 —— 程序化搜索接口完备,就是为自定义 UI 准备的。
### Pagefind 聚合进面板的实现路径
1. `astro build` 后跑 `pagefind --site dist` 出索引(或用 `astro-pagefind` 集成,567★,README 实抓:构建时自动建索引 + **官方声明支持 Astro View Transitions**)。
2. 自写模态:全局 `keydown` 监听 Ctrl/Cmd+K 与 `/` → 打开 `<div role="dialog">`(或 `<dialog>`)。
3. 面板数据三层:**动作项**(静态数组:切主题、跳 gitea、复制 RSS)+ **页面/文章**(Pagefind `search(query)` 返回 pages + 文内摘要)+ **分组渲染**。
4. spectre 的懒加载模式值得抄:`pagefindInitialized=false`,首次打开面板才 `import('/pagefind/pagefind.js')`,不拖首屏。
### 对本博客的适配建议
Astro 零框架站**不要为面板引 React**(cmdk/kbar 都会把 React runtime 拖进来)。抄 Starlight `Search.astro` 的结构 + spectre 的懒加载,自写 ~200 行 vanilla 模态。灰阶骨架下,面板天然「一整层黑底等宽字浮层」,视觉零违和。
---
## 2. 键盘快捷键惯例
### 实测案例(GitHub 官方文档页逐字取证)
`docs.github.com/en/get-started/accessibility/keyboard-shortcuts`(HTTP 200)HTML 表格实抓:
- `<kbd>S</kbd> or <kbd>/</kbd>` → "Focus the search bar"(**/ 聚焦搜索**实锤)
- `<kbd>G</kbd> <kbd>N</kbd>` → notifications;`<kbd>G</kbd> <kbd>C</kbd>` → Code tab;`G P` → PRs;`G A` → Actions;`G W` → Wiki(**g-chords 和弦导航**实锤)
- `<kbd>?</kbd>` → "brings up a dialog box that lists the keyboard shortcuts available"(**? 帮助浮层**实锤)
- `<kbd>Esc</kbd>` → 关闭悬浮卡
**未验证(如实说明)**:Gmail(support.google.com/mail/answer/6594)与 Linear(linear.app/keyboard-shortcuts 与 /docs/shortcuts 404)键位页均为客户端渲染,静态抓取零命中,不能引用为抓取实证;GitHub 证据已足够作键位锚点。
**负发现**:「t 切主题」「g h 回首页」**未找到可验证的个人博客公开实例**——这反而是原创空间:惯例来自 GitHub/Gmail,移植到博客即成特色。
### 实现路径
- **自写(推荐,~120–150 行)**:一个 `keydown` 监听 + 200ms 和弦缓冲(识别 `g h`)+ 输入框聚焦时旁路 + `?` 帮助浮层。无依赖。
- 或配 **tinykeys**(jamiebuilds,周下载 193,770,约 400B)管绑定,自写部分只剩 chord 逻辑与浮层。
- 主题切换若想配 View Transitions 圆形扩散动画:**ocavue/astro-theme-toggle**(62★,"ripple-style theme toggle animation to your Astro project",GitHub API 实抓)。
### 对本博客的适配建议
P0 键位集:`/` 聚焦搜索、`?` 帮助浮层(**可发现性的关键,务必做**)、`t` 切主题、`g h` 回首页、`Esc` 关一切浮层。键位表数据与 `?` 浮层同源生成,永不失同步。灰阶骨架 + 等宽字提示角标(如导航项旁的 `g h` 小字)本身就是极客视觉语言的一部分。
---
## 3. 构建透明化(页脚 commit hash · 构建时间)
### 实测案例
| 站点 | 抓取证据 |
|---|---|
| **sreetamdas.com**(sreetamdas/sreetamdas.com,Next.js,MIT) | 仓内 `scripts/generate-build-info.mjs` **全文实抓**:`WORKERS_CI_COMMIT_SHA / CF_PAGES_COMMIT_SHA / GITHUB_SHA / git rev-parse HEAD` 四重回退 → 写 `src/build-info.json`,字段 `{branch, commit(前7位), commitUrl, time: ISO时间}`。注:其站静态 HTML 页脚未见 hash(该信息主要供 CI 冒烟/接口用),展示环节未验证 |
| **mldangelo.com**(mldangelo/personal-site,**1695★** 个人站模板,Next 静态导出) | sourcegraph 实抓源码:`src/components/Stats/Site.tsx` 含 `built_commit: builtCommit()`;配套测试断言页面上存在 `'Built from commit'` 行 —— **个人站模板直接内置「构建透明化」区块**,live 站 HTTP 200 |
**负发现**:gwern.net、survivejs.com、search.nixos.org、notes.eatonphil.com、drewdevault.com、mxb.dev、darekkay.com、fasterthanli.me、joshfinnie.com、stefanjudis.com 十个极客向站首页/页脚抓取均**无** commit hash —— 说明这在主流个人站里**罕见,做了反而差异化**。
### Astro 实现路径
1. **零依赖自写(推荐,~20 行)**:`astro.config.mjs` 里
```js
vite: { define: {
'import.meta.env.GIT_COMMIT_SHA': JSON.stringify(execSync('git rev-parse HEAD').toString().trim()),
'import.meta.env.GIT_COMMIT_DATE': JSON.stringify(execSync('git log -1 --format=%cI').toString().trim()),
}}
```
页脚组件读 `import.meta.env.GIT_COMMIT_SHA.slice(0,7)`。sreetamdas 的四重回退模式(CI 环境变量优先)值得照抄。
2. 现成包(npm registry 实证存在,但体积/维护一般):`vite-plugin-git-revision-info`@1.1.0、`git-revision-vite-plugin`、`@jinixx/vite-plugin-git-revision`。
3. CI 注意:Gitea Actions 的 checkout 步骤默认浅克隆也能拿到 HEAD sha(或直接用 `gitea.event.head_commit.id` 注入环境变量)。
### 对本博客的适配建议
页脚一行灰字:`built from a1b2c3d · 2026-10-24 18:51 UTC`,hash 链接到自托管 gitea 的 commit 页。半小时代价,极客气质浓度极高。
---
## 4. 贡献活动图(自托管 Gitea 数据从哪来)
### 核心实测结论:Gitea/Forgejo 原生就有热力图 API
- `gitea.com/swagger.v1.json` 实抓:存在**唯一**热力图路由 `GET /api/v1/users/{username}/heatmap`,schema `UserHeatmapData = {contributions, timestamp}`。
- **真实数据双验证**:`gitea.com/api/v1/users/lunny/heatmap` 与 `codeberg.org/api/v1/users/6543/heatmap` 均 HTTP 200,返回 `[{"timestamp":1760616000,"contributions":6},…]`(事件级 Unix 秒粒度,前端自行聚合到日/周格子)。
- **CORS 实测**:gitea.com 与 codeberg.org 对 API 请求均返回 `access-control-allow-origin: *` → 静态站**构建时**拉没问题,甚至浏览器运行时直拉也通。
### GitHub 工具能否指过来?
**不能直接换标**。github-readme-stats / contribution-graph 类方案依赖 GitHub GraphQL 的 `contributionsCollection`(REST 根本没有贡献端点),无法指向 Gitea。生态佐证(GitHub 搜索实抓):`oliver-drewing/forgeheat`(Forgejo 热力图挂件)、`BenevolentFutures/forgejo-github-sync`(反向把自托管提交同步养 GitHub 图)——「自托管后贡献图怎么办」是真实普遍痛点,各自造轮子。
### 自建数据源方案(git log 统计 → JSON)
```bash
git -C /path/repo log --all --pretty=format:'%ad' --date=unix \
| awk -v d=$(date +%s) '{day=strftime("%Y-%m-%d",$1); c[day]++} END {for(k in c) print k, c[k]}' > contrib.json
```
- 多仓循环合并即可;**优点**:算本地全历史(含从 GitHub 迁移来的仓、heatmap 端点统计不到的活动)、无网络依赖、CI 里必成。
- 也可和 heatmap API 并用:API 为主、git log 兜底。
### 对本博客的适配建议
构建时 fetch `https://<自家gitea>/api/v1/users/<user>/heatmap` → 聚合成 53×7 格 SVG/CSS grid,**灰阶色阶恰好是热力图的完美配色**(从 #ececec 到 #111 的七档)。失败时回退 git log 本地统计。~120 行 + 一个聚合函数。
---
## 5. 终端彩蛋页
### 实测案例(GitHub search "terminal portfolio" + 首页/JS bundle 抓取)
| 站点 | 抓取证据 |
|---|---|
| **terminal.satnaing.dev**(satnaing/terminal-portfolio,**824★**,React+TS) | bundle(277KB)实抓,命令表坐实:`help` ×3、`whoami`、`pwd`、`history`、`echo`、`about`、`projects`、`clear`、`welcome` —— 真·可交互终端站 |
| **codenerve.github.io**(CodeNerve,188★,纯 vanilla) | `index.js` **全文仅 2,999 字节**:keydown 监听 + `ls` ×10 等命令 —— **自写 switch 方案极轻的活实证** |
| **term.fathi.me**(m4tt72/terminal,**1564★**,"Terminal style website") | SPA 壳站,31KB bundle 未能静态取证命令表(如实注明);star 数佐证品类成熟度 |
| **spectre.lou.gg**(louisescher/spectre,164★) | Astro 原生终端风主题(见 §1,还带 Ctrl+K),**与技术栈同源**,可整主题借鉴或只借 its CSS |
### 实现路径
1. **自写 switch(推荐,~150–300 行,零依赖)**:隐藏 input 捕获 + 命令注册表(`{help, whoami, ls, cat, clear, exit…}`)+ 上下历史。codenerve 的 3KB 证明下限极低。
2. 库:jQuery Terminal(jcubic,老牌全功能,自带多级命令/表单支持,风格偏 jQuery 时代)、react-terminal(需 React)、xterm.js(真终端模拟器,VS Code 同款——能跑、但过重,用于彩蛋页杀鸡用牛刀)。
### 对本博客的适配建议
`/terminal` 路由作彩蛋:不进主导航,藏在 `?` 帮助浮层提示一句 `hint: try /terminal`(极客自己会发现的秘密)。命令组:`help` / `whoami`(输出个人签名档)/ `ls blog` / `cat about.txt` / `gpg --recv-key <指纹>`(真指纹,链接到 key 文件)/ `exit`(动画后跳回首页)。CRT 扫描线 + 琥珀色单色可选(灰阶骨架里允许一处 CRT 绿或琥珀做点睛)。
---
## 6. 页面转场(Astro View Transitions)
### 实测案例
| 站点 | 抓取证据 |
|---|---|
| **mazipan.space**(mazipan/mazipan.space,**102★** 个人站+博客) | 线上 HTML 实抓(HTTP 200):含 `ClientRouter` ×1 + `view-transition` 标记 ×3 —— **个人博客真实用例** |
| **astro-theme-reimu**(D-Sketon,79★,demo: d-sketon.github.io/astro-theme-reimu) | sourcegraph 全网代码检索命中该仓 `.astro` 文件含 `ClientRouter` —— 中文圈在用的博客主题实证 |
| 官方文档 docs.astro.build/en/guides/view-transitions/ | 实抓:`ClientRouter` ×45、**`prefers-reduced-motion` 独立章节** ×12、`transition:animate` ×13、不支持的浏览器的 `fallback` 行为章节 |
### 浏览器兼容(caniuse 官方数据实抓,`view-transitions.json`)
- Chrome **111+** ✅、Safari **18.0+** ✅、Firefox **144+** ✅(143 仍在 flag 后)。
- 2026 年现状:三大引擎全绿。Astro 的 `ClientRouter` 用的是同文档转场(MPA 导航模拟),落在上述支持范围内;更老浏览器走 `fallback`(默认 animate 模拟 / 可设 none 直切)+ reduced-motion 降级,**无破坏性**。
### 对本博客的适配建议
`<ClientRouter />` 一行接入 + 一段保险 CSS:
```css
@media (prefers-reduced-motion: reduce) {
::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) { animation: none !important; }
}
```
转场动画克制:正文区轻微 fade/slide(呼应「分轨」——轨道间的内容流动),骨架(顶栏/页脚)用 `transition:persist` 常驻不闪。主题切换想加圆形扩散可参考 ocavue/astro-theme-toggle 的 ripple 方案与 VT 打配。
---
## 7. 开源项目墙(自托管 Gitea 动态拉卡片)
### 数据面实测(codeberg.org / gitea.com 同源 API)
`GET /api/v1/repos/search?limit=2` 实抓返回字段(Forgejo/Gitea 通用):
```json
{ "full_name": "...", "description": "...", "website": "...", "language": "C",
"stars_count": 1, "forks_count": 0, "html_url": "...", "avatar_url": "", "updated_at": "..." }
```
**主语言、star、描述、网站全有**,卡片所需字段一次到位。`GET /api/v1/users/{user}/repos` 同理。CORS `*`(§4 实测)→ 构建时拉、运行时拉皆可。
### 消费者案例(诚实负发现 = 差异化机会)
- sourcegraph 全网代码检索 `api/v1/repos/search`:消费者仅 **linuxserver/Heimdall-Apps**(应用目录元数据脚本),无个人博客。
- `gitea lang:astro` 全网:仅 **RayLabsHQ/gitea-mirror**(镜像工具,API 用法可参考)。
- **结论:个人博客从自托管 git 动态拉项目墙,没有现成公开案例** —— 没得抄,但也意味着做出来就是独一无二的开源自证。
- 语言颜色:Gitea API 不带色值;用 github-linguist/linguist 的 `languages.yml` 作映射(实抓样本:Go `#00ADD8`、TypeScript `#3178c6`)。
### Astro SSG 实现路径(~80 行)
```astro
---
// src/pages/projects.astro(frontmatter 在构建时执行)
const GITEA = 'https://git.example.com';
const repos = await fetch(`${GITEA}/api/v1/users/me/repos?limit=30`)
.then(r => r.json()).catch(() => JSON.parse(cachedFallback)); // 失败读上次缓存 JSON
---
```
构建时执行 = 零 CORS 问题、零客户端 JS;Gitea Actions 上 push 触发重建保证新鲜度;`pinned` 置顶仓用手动数组覆盖排序。
### 对本博客的适配建议
`/projects` 分轨页:卡片 = 语言色点(灰阶骨架里唯一允许的品牌色点缀,恰与「开源」语义互文)+ star 数 + 一行描述 + `updated_at`。页脚 `built from <hash>`(§3)→ 点击即达同源 gitea commit——**构建透明化与项目墙共享同一自托管源,叙事闭环**。
---
## 极客设计语言清单(性价比分级)
| 级别 | 项 | 实现方式 | 工作量 | 实证锚点 |
|---|---|---|---|---|
| **P0** | 键盘基础集:`/` 搜索、`?` 帮助浮层、`t` 主题、`g h` 回首页 | 自写 vanilla(keydown+chord buffer+浮层) | ~120–150 行,半天 | GitHub 键位表逐字实抓 |
| **P0** | 页脚构建信息(hash+时间+commit 链接) | vite.define 注入或抄 sreetamdas 脚本 | ~20 行,半小时 | sreetamdas/mldangelo 源码实抓 |
| **P0** | View Transitions + reduced-motion 降级 | `<ClientRouter />` + 5 行 CSS | 半小时 | mazipan.space 实抓;三引擎全绿 |
| **P0** | 开源项目墙 | 构建时 fetch gitea API 渲染卡片 | ~80 行,半天 | API 字段/CORS 实测 |
| **P1** | Ctrl+K 命令面板(搜索+动作聚合) | 自写 vanilla 模态 + Pagefind JS API(懒加载) | ~200 行,一天 | Starlight Search.astro / spectre 实抓 |
| **P1** | Gitea 贡献热力图 | heatmap API(或 git log 兜底)→ 灰阶 SVG 格 | ~120 行,一天 | heatmap 端点双站 200 实测 |
| **P2** | `/terminal` 终端彩蛋页 | 自写命令 switch | ~200–300 行,一天 | codenerve 3KB 实证;satnaing 824★ |
| **P2** | 全 g-chords 体系(g p 项目 / g b 博客) | 扩展 §2 chord 表 | +30 行 | GitHub G+N/C/P 模式移植 |
**协同叙事**:所有键位汇聚在 `?` 浮层(可发现性)→ 面板是极客动线中枢(搜索+动作+彩蛋入口)→ 页脚 hash 与项目墙共享自托管 gitea 源(开源自证闭环)→ 热力图是这套语言里唯一的「数据可视化」,用灰阶色阶呈现正好。「艺术文学的美观」由灰阶骨架承担,「极客精神」由这层可交互的等宽字神经系统承担——两者不抢戏。
## 未验证/存疑清单(全部如实声明)
1. leerob.com / rauchg.com / kentcdodds.com / brianlovin.com / joshwcomeau.com 的面板:静态 HTML 无标记(客户端渲染),未逐一深挖 bundle。
2. Gmail / Linear 键位官方页:JS 渲染无法静态取证(GitHub 证据已足为键位锚点)。
3. term.fathi.me 的命令表:bundle 未能静态取证。
4. 「t 切主题」「g h 导航」在**个人博客**上:未找到可验证公开实例(属 GitHub/Gmail 惯例移植,无先例包袱)。
5. 「个人博客动态拉自托管 git 项目墙」:全网无现成公开案例(负发现,同时是机会点)。
6. sreetamdas.com 的 build-info:生成脚本实抓确凿,但页脚展示环节未在静态 HTML 验证到。
+375
View File
@@ -0,0 +1,375 @@
# 博客重设计 · 调研报告(供审阅)
> 2026-10-24 | 主会话综合三路侦察(子 agent:现状诊断+极简标杆 / 获奖创意站 / 中文排版)+ 主会话架构调研
> 原始报告:`docs/research/01-现状诊断与极简开发者风标杆.md`、`02-获奖创意站研究.md`、`03-中文排版与阅读体验.md`(所有结论基于实抓 HTML/CSS/截图,非印象推测)
---
## 0. TL;DR
1. **不喜欢 higan 的原因找到了,且可量化**:它根本不是为中文长文设计的——版心 1024px(每行 60+ 汉字,远超 35–45 舒适区)、16px 小字、中文零字体设计(系统黑体兜底)、引文整段加粗、出厂蓝紫配色未定制、10 项平级导航过载。
2. **内容决定气质**:博客是「阅读(书评)× 技术(Linux · coding · 技术分享)× 摄影」三内容线 + 瞬间生活流(2026-10-24 确认)。视觉主推 **丙:极简灰阶骨架 × 分轨正文**(已审阅样板认可)。
3. **设计哲学升级(2026-10-24 用户定调)**:**「既要有艺术文学的美观,又要有极客的精神蕴含其中」**——丙的灰阶骨架×分轨正文提供艺术层,新增「开源极客层」:命令面板、键盘导航、终端彩蛋、贡献热力图、构建透明化、开源项目墙(详见 §4c);博客本身在 gitea 开源。
4. **照片模块新需求**:要有上传管理界面 + 图库按照片宽高比自适应——管线方案见 §4b,组件方案 = CSS Grid + 构建时 aspect-ratio 驱动的 masonry(零运行时 JS)。
3. **架构推荐 A 或 B**(都保留 Halo):A = 给 Halo 写全新自定义主题(写作流不变、发布即生效);B = Halo 当 headless CMS + Astro 前端(设计自由度最大、性能最好,代价是多一条构建链)。C(弃 Halo 纯静态)不推荐——会毁掉你现有的 Console 写作流和评论/瞬间/图库数据。
4. **红线先立好**:ICP 页脚保留、URL 结构不变、生产容器与数据不动(开发用独立实例)、切换前备份、动效全部包 `prefers-reduced-motion`、中文不上全量 webfont。
---
## 1. 现状诊断:为什么不喜欢它
实测(截图 + CSS 源码双重验证,higan v1.64.1):
| # | 问题 | 实测证据 |
|---|------|---------|
| 1 | **版心过宽,行长失控** | `.max-width: 64rem`(1024px)× 16px 字号 → 桌面每行约 60–64 汉字,舒适区是 35–45 字(KAIX.IN 36 字 / 太隐 42 字) |
| 2 | **中文零字体设计** | CSS 无任何中文 @font-face,`Meslo LG S` 只覆盖拉丁分片,汉字全靠系统抽奖(苹方/雅黑/文泉驿),文学气质为零 |
| 3 | **字号偏小** | 正文 16px;标杆站阅读模式 18–20px(CRIVU 20px / 太隐 18px / KAIX 大屏 18px) |
| 4 | **出厂配色未定制** | `#66ccff` 天蓝 + `#c5b6ff` 淡紫就是主题默认值(theme 名 `auto-blue`),一屏 ≥4 种强调色平铺,无主次 |
| 5 | **导航过载** | 10 个平级入口 + 竖线分隔(2010 年代范式),「登录」外露破坏作品感;标杆站全部 ≤4 项或 icon 化 |
| 6 | **引文样式反文学** | blockquote 整段加粗——长书摘可读性差,higan 的 cite 方案可用但要去掉加粗 |
| 7 | **布局重心失衡** | 内容列偏左(起于 19% 处),右侧空白无设计承接;标杆站全部是真正居中的 640–720px 窄栏 |
| 8 | **列表信息过载** | 日期/分类/标签/浏览量/摘要/阅读全文六类信息平铺,浏览量「42」外露是后台思维 |
| 9 | **字体质感与内容错位** | 摘要呈等宽字体观感(CJK 回退 + latin mono 混排),节奏生硬;书评和 Linux 笔记视觉上零区分 |
| 10 | **品牌感弱** | 黑底方块头像与 #fafafa 硬冲突,首屏没有一句有性格的自我介绍 |
**结论**:问题不在工程实现(higan 工程质量不差),在于它不是为「中文长文阅读」设计的。重设计第一决策 = **字号–行高–行长三角**,不是配色。
---
## 2. 设计方向:三选一(或推荐混搭)
### 路线甲:纸墨书卷风(KAIX.IN / CRIVU 系)
- 米白纸底 `#F6F5F3`、正文衬线(宋体栈)、墨线/墨绿点缀、两端对齐、36 字窄版心
- 最贴文学书评气质;缺点:默认无暗色、现代感弱、Linux 技术内容会显得「穿越」
### 路线乙:极简灰阶风(antfu / brianlovin / paco 系)
- 白/蓝黑双底、四级灰阶层级、icon-only 导航、按年分组纯文字流、衬线正文 + 无衬线 UI 双字体制
- 现代工程师气质;缺点:直接用会丢掉书卷气,书评内容显得冷
### 路线丙(**推荐**):骨架乙 × 正文分轨 的混搭(三内容线版)
- **UI 骨架**(导航/列表/页脚):极简灰阶 + 单强调色 + ≤4 项导航(文章/图库/关于/搜索 + icon 社交),登录/瞬间收进角落
- **正文按内容线分轨**:
- 书评 = 衬线宋体栈、20px/1.75/720px 版心、纸色底、**每篇一个情绪色**(overreacted 每文一色,列表即画廊)+ 虚线批注框引文(julesforrest 批注气质)
- 技术文(Linux/coding/分享)= 无衬线正文 + 暗色终端风代码块(黑底等宽 + `>` 前缀,cassie.codes 手法)+ Shiki 双主题高亮
- 摄影图文 = image-first 版式(大图/双图并排/全幅断点图),图片优先排版,文字为图服务
- **列表页**:leerob 式「标题 + 日期」两栏对齐 + 按年分组(antfu)+ 按内容线内部分节(阅读/技术/摄影),书评行带情绪色小标、技术行带 mono 标签、摄影行带缩略图
- **图库页**(摄影主场):影像墙(masonry 或规整网格)+ 分组 + EXIF(Halo 图库插件自动读取)+ lightbox 大图浏览
- **首页**:brianlovin 名片式开场(头像 + 一句身份陈述)+ 分节:最近写作 / 最新影像一格(图库入口)
### 获奖站的「降维」点缀(按性价比,全部 Tier 1/2)
1. 阅读进度条 + 章节导航(阅读增强)
2. 全站一支缓动曲线 + 一个时长(0.35s + easeOutExpo 系)——动效纪律
3. CSS marquee「最近更新」横条(The Lookback,可暂停)
4. noise 噪点纸纹覆盖层(`steps(2)` keyframes,纸质颗粒感,近零成本)
5. 入场错峰滑入(antfu slide-enter,纯 CSS)
6. 彩蛋页(终端风 `/terminal` 或 90s 皮肤,pedro 时间机器降维)
7. **明确不做**:3D/WebGL 世界(bruno 路线,判定:不适合读字)、纯 CSR 壳(SEO 自杀)、逐字母大字标、自动播放视频、自定义正文光标
---
## 3. 中文排版参数(可直接开工,全部有实测依据)
```
书评正文: 20px / 1.75 / max-width 720px(≈36 汉字)
技术文正文: 19px / 1.7 / 同版心;内联 code 等宽 0.875em
代码块: 16px / 1.6 / overflow-x: auto / 禁 break-all / Shiki 双主题变量
衬线栈: Georgia, "Iowan Old Style", "Songti SC", STSong,
"Noto Serif CJK SC", "Source Han Serif SC", SimSun, serif
(思源宋必须排在 Windows 老宋体前面)
sans 栈: system-ui, -apple-system, "PingFang SC", "Hiragino Sans GB",
"Microsoft YaHei", "Noto Sans SC", sans-serif
段落: 无首行缩进 + 段间距 0.9em;标题 text-wrap: balance,中文零字距
标题字阶: 文章题 27px / 章节 22px / h3 19px / 行高 1.3
暗色: 底 #191d23 蓝黑系 / 字 #f0f0ef 系 / color-scheme: dark 声明
图片降亮度、::selection 半透明、代码双主题免重排
引文组件: 长书摘 = 1px 墨线左框 + muted 色(学术极简);
金句 = 62px 巨型 " 水印 + 0.96em;
出处行 0.875rem muted + "——" 前缀 + 《》
混排: 中英文/数字间手敲空格(写作规范)+ text-autospace 渐进增强
标点: 弯引号 "" '';避头尾靠浏览器默认(禁用 break-all 即可);行尾点号悬挂不必做
```
**字体策略(2026-10-24 定案:自托管分片 webfont,响应「跨平台一致 + 艺术美观」需求)**:
| 轨道 | 字体 | 许可 |
|---|---|---|
| 书评正文 | **霞鹜文楷 LXGW WenKai(Screen 屏读优化版)**,楷体气质、文学感最强;若实际长读偏软,备选思源宋体 Noto Serif SC | OFL |
| UI / 技术文 | **思源黑体 Noto Sans SC**,现代中性 | OFL |
| 代码 | **JetBrains Mono**(仅拉丁子集,极小) | OFL |
- **分发**:`cn-font-split`(中文网字计划)→ **官方支持 Astro/Vite**(vite-plugin-font,实抓:按需加载、按实际用字优化首屏、纯 CSS 零运行时、自动减 CLSS)→ 分片 woff2 **自托管**于 /fonts/(哈希名 + immutable + ESA 缓存),零第三方依赖,与 gitea/Artalk 同一数据自控哲学
- 体积事实:中文原字 5-10MB,分片后按 unicode-range 按需拉,首屏典型几百 KB,后续命中缓存;`font-display: swap` 防白屏
- 样板 v2 用的是系统字体(零依赖约束),文楷/思源的真实笔触要到真实构建时才能感受到
---
## 4. 功能清单
### P0(必须有)
- 明暗模式:自动跟随系统 + 手动切换 + 不闪烁(paco 的 `prefers-color-scheme` 是底线,antfu 的 class 切换+记忆是增强)
- 文章页:目录 TOC、阅读进度条、阅读时长、代码高亮(Shiki 双主题)、引文组件、脚注支持
- 列表页:按年分组、按内容线(阅读/技术/摄影)分轨呈现、去掉浏览量外露
- **图库页**(摄影是核心兴趣,从 P1 提升):影像墙 + 分组 + EXIF + lightbox;Halo 图库插件有公共 REST API 且自动读 EXIF
- 归档 / 分类 / 标签页、RSS(Halo 自带)、搜索(Halo 搜索插件,匿名 API)
- 移动端适配(中文读者主力是手机)
- ICP 备案页脚(陕ICP备2026014860号-1 → beian.miit.gov.cn)
- 性能:Lighthouse ≥90;图片懒加载 + 缩略图(Halo thumbnail Finder)+ blur-up 占位;不上全量中文字体
### 4c-旧框架占位(内容已并入下方正式版)
<!-- 旧框架版已删除:交互项并入正式版表格;内容丰富化独有条目:关于页 /now+/stack+/colophon、书评索引页(二期:书封+情绪色+一句话画廊网格)、摄影图文模板(image-first 大图/并排/全幅断点图) -->
### P1(最好有)
- 瞬间页(现有 1 条,公共 REST API;摄影快照 + 生活流,可做瀑布流时间线)
- 摄影文章模板:image-first 图文志版式(大图/并排/全幅断点图组件)
- 关于页:名片式重写(一句身份陈述 + 兴趣版图时间线)
- 阅读字号切换 dock(CRIVU reading-dock 模式)
- 相关文章、OG 图自动生成、404 彩蛋
### P2(锦上添花,可砍)
- marquee 最近更新、噪点纸纹、终端彩蛋页、书评索引网格页(年代/分类筛选)
### 功能红线
- 评论:详见 §4a 论证——**结论:Artalk 首选**(完全自托管、Go 单二进制+sqlite、管理后台三强最完善、维护活跃);Waline 备选(生态最大);Giscus 需 GitHub 登录排除;Twikoo 维护放缓淘汰
- 瞬间/相册/链接:视为可选增强设计,未启用时不留死导航(随架构 C'',这三项改为自建 collection 实现)
### 4a. 评论系统论证(2026-10-24,基于实测评价源交叉验证)
选型轴 = 你拍 gitea 的同一价值观:**数据可控、全自托管、最少外部依赖**。
| 维度 | **Artalk(首选)** | Waline(备选) | Twikoo(淘汰) |
|---|---|---|---|
| 技术形态 | Go 单二进制服务端 + 40KB 原生 JS 客户端(无框架) | Node.js 服务端 | Node.js 服务端 |
| 存储 | SQLite(最省)/MySQL/PG,站点隔离 | SQLite/PG/MySQL | **json 文件**(默认),查询/关联弱 |
| 数据自控 | ★★★ 完全自托管,导出完善,多站点隔离(未来可扩第二个站) | ★★ 自托管但后台账户管理弱(实测吐槽:邮箱改不了、空账户删不掉) | ★★ 文件备份直观 |
| 管理后台 | 三强最完善:现代 UI + 多站点 + **通知中心**(邮件之外多一层站内提醒) | 有但简单 | 中规中矩(评论区登录进面板) |
| 匿名中文读者 | ✅ 匿名+昵称邮箱+Gravatar;IP 属地显示需自下 GeoIP 库(可选项) | ✅ 匿名+表情;图片上传转 base64 存库是实测痛点 | ✅ 且有 QQ 号自动补全昵称头像(唯一亮点) |
| 防垃圾 | 验证码/频控/敏感词/审核 | 内置反垃圾 + IP 限速(这块最成熟) | 基础 |
| 维护活跃 | 持续发版(GitHub ArtalkJS/Artalk) | 活跃(lizheming) | 近年放缓 |
| 迁移双向 | 支持导入 Waline/Twikoo(将来退出成本低) | 支持导入 | 支持导入 |
**判定**:Artalk 与 gitea 同价值观(单容器 + sqlite 卷挂载 + nginx 反代一个路径,与现有基建零冲突);Waline 在「生态最大/反垃圾最成熟」上占优,若你更看重社区规模可换;Twikoo 的 json 存储与维护状态不推荐。风险对冲:Artalk 若停更,数据可导出迁往 Waline,锁死风险低。(2026-10-24 用户已确认按此建议执行 ✅)
### 4b. 照片上传与管理管线(2026-10-24,证据见 docs/research/04,全部实抓源码/API spec)
用户需求:照片要有上传**管理界面**,且图库组件按照片宽高比自适应。
**关键实测发现**:
- gitea web 上传页实存(dropzone 拖拽+多文件,源码 `templates/repo/editor/upload.tmpl` 实抓);默认限单次 5 文件/50MB,`[repository.upload]` 可调;API 侧 `POST /repos/{owner}/{repo}/contents` 支持**多文件一次 commit**(swagger 实抓)
- Astro `astro:assets` 默认 sharp,构建时自动出多尺寸缩略图 + srcset,**ImageMetadata 含 width/height,orientation≥5 时自动交换**(竖片宽高比正确,源码实抓)——masonry 的 aspect-ratio 数据源零成本;但相机/镜头/光圈等 EXIF 需 `exifr`(零依赖 npm 包)补 ~20 行
- **Sveltia CMS**(★2990,2026-10 仍活跃):Netlify/Decap 后继,纯前端零运维,**Gitea 后端是一等公民**(源码目录 gitea/github/gitlab 并列实锤)——媒体库上传 + frontmatter 编辑开箱即用;风险:Gitea 后端较新(10-01 刚修过兼容 bug),需真机验收
- Immich API 直出全套 EXIF(含镜头/GPS),但数据不在 git + 全家桶运维重——仅当本来就部署 Immich 才值
- 自托管图床(Lychee/Chevereto/EasyImages):版本控制缺失、图床误删→博客静默坏图,不推荐
**定案分阶段路径**:
1. **阶段 0(当天可用)**:照片入 git 仓(gitea web 拖拽,MAX_FILES 调 20+)→ 构建时 exifr 提 EXIF + sharp 出缩略图 + 宽高比驱动 masonry(零运行时 JS)
2. **阶段 1(要管理界面时)**:先试 **Sveltia CMS**(零新运维组件)→ 不合手再自写 **photo-pipe** 小服务(上传→EXIF+缩略图→元数据表单→gitea contents API 一次 commit→webhook 构建,PWA 手机可拍照直传;**作为独立开源项目发布**——热爱开源的最自然表达,且任何时刻可退回纯手工流程)
**图库自适应(masonry)**:CSS Grid + `grid-auto-rows: 8px` + 构建时由照片 width/height(含 orientation 修正)算 aspect-ratio + row-span → 零运行时 JS 的真·按片自适应;lightbox 用原生 `<dialog>` + 键盘导航(样板 v2 已可预览)。
### 4c. 开源极客层:案例与实现(2026-10-24,证据见 docs/research/05,全部实抓验证)
设计哲学:**艺术层(丙视觉+分轨正文)打底,极客层由「等宽字神经系统」承担**——两者不抢戏。样板 v2 已全部可交互预览。
| 级别 | 项 | 实现 | 工作量 | 关键实证 |
|---|---|---|---|---|
| P0 | 键盘基础集:`/` 搜索、`?` 帮助、`t` 主题、`g h/e/t/g` 导航 | 自写 vanilla(chord buffer) | ~120 行,半天 | GitHub 键位表逐字实抓 |
| P0 | 页脚构建信息(hash+时间→链 gitea commit) | vite.define 注入(CI 环境变量四重回退) | ~20 行,半小时 | sreetamdas/mldangelo 源码实抓 |
| P0 | View Transitions 页面转场 | `<ClientRouter />` + reduced-motion CSS | 半小时 | 三引擎全绿(caniuse 实抓) |
| P0 | 开源项目墙(**双源**:GitHub wait4xx + 自家 gitea,构建时并行 fetch 合并去重;pinned 手选 + star/语言/描述自动刷新,见下方分工说明) | 构建时 fetch 两家 GitHub 风格 API | ~80–120 行,半天 | gitea API 字段/CORS 实测;GitHub REST /users/{u}/repos 同构 |
| P1 | Ctrl+K 命令面板(搜索+动作聚合) | 自写 vanilla 模态 + Pagefind JS API(首次打开才懒加载) | ~200 行,一天 | Starlight Search.astro / spectre 模式实抓 |
| P1 | 贡献热力图 | **Gitea 原生 `/api/v1/users/{user}/heatmap` 端点**(双站 200 实测,CORS `*`)→ 构建时聚合 53×7 灰阶格 | ~120 行,一天 | 意外发现:原假设无此端点,实测坐实 |
| P2 | `/terminal` 终端彩蛋 | 自写命令 switch(codenerve 3KB 实证下限) | ~200 行,一天 | satnaing 824★ 同类 |
| P2 | 全 g-chords 体系扩展 | 扩 chord 表 | +30 行 | GitHub G+N/C/P 模式移植 |
**协同叙事闭环**:页脚 hash 与项目墙共享同一自托管 gitea 源;热力图数据也来自它——「这个博客本身是开源的」由三层元素互相印证;博客源码仓在 gitea 公开。
### 4d. 中英双语:全站实时切换(2026-10-24 新增需求,方案待认可)
需求:读者一键切换,全站内容(文章/瞬间/图库 caption/关于页/UI)即时变英文。
**推荐方案:构建时 LLM 预翻译 + 双语预构建**(「实时」由预构建达成——切换是毫秒级的 URL 跳转,无运行时翻译延迟、无运行时成本)
```
写作(中文)→ git push → 翻译管线(检测变更的 .zh.md → LLM 译出 .en.md 入仓)
→ astro build 双语全站(/ 原文 + /en/ 译文)→ 读者切语言 = 瞬时切 URL
```
| 关注点 | 方案 |
|---|---|
| 翻译执行器 | 你 homelab 已跑 **new-api 网关**(LLM API 中转)——翻译脚本走它调 GLM 等,**零新增服务** |
| 成本控制 | 译文以文件入仓:未改动的文章永不重译;一篇长文翻译成本分币级 |
| 质量策略 | AI 译稿 git 化 → 可随时人工润色(下次构建生效);文学内容可选标注「AI 译文,欢迎指正」;润色过的段落可锁定不重译(frontmatter 标记) |
| 路由与 SEO | Astro 内置 i18n 路由(defaultLocale zh + /en/ 前缀);hreflang 双向声明;双语 RSS/sitemap |
| UI 文案 | 中英字典(导航/页脚/按钮/阅读时长文案),Astro i18n 原生 |
| 评论 | Artalk 页面键设为同一 slug——中英页面共用一条评论流,不分裂 |
| 先例 | Astro 官方 i18n + content collections 双语配方;jangwoook.net 用 AI 辅助管线给 40 篇存量文章加中/英/日/韩多语(2025-11 实例) |
**为何不用运行时翻译**:第三方翻译挂件(translate.zvo.cn 类)质量不可控且引入外部依赖;运行时 LLM 翻译对公网访客开放 = 成本与滥用风险。预翻译两者皆无。
**降级容忍**:某篇未译(新建/失败)→ /en/ 侧回退中文原文并标注(Astro fallbackLocale),全站不因单篇失败阻塞构建。(2026-10-24 用户已认可方案 + AI 译文小标注 ✅)
### 4e. 多端适配规格(2026-10-24 新增硬性需求:桌面/平板/手机显示均无问题)
**原则:每个键盘能力都有触屏等价物**(快捷键是增强不是唯一入口);移动端不是缩小版而是同一设计系统的响应式重排。
| 维度 | 规格 |
|---|---|
| 断点体系 | 与样板一致:≥1120 宽屏(TOC 侧栏常驻)/ 820 笔电/横屏(TOC 收起)/ 760 平板竖屏 / 560 手机;容器查询优先,媒体查询兜底 |
| 排版 | 桌面阅读 20px → 手机 18px(§3 已定);版心随断点收缩;正文永不横向滚动(代码块独立 overflow-x) |
| 导航 | 桌面 ≤4 项横排 + icon 社交;手机同行紧凑排(不 hamburger 化——项少到不需要抽屉);命令面板手机可见(浮层自适应软键盘) |
| 图库 masonry | 3 列 → 2 列(平板/手机);lightbox 手机加左右滑动手势(桌面键盘 ←→) |
| 触屏 | 可点目标 ≥44×44px;safe-area-inset(刘海屏);100dvh 代替 100vh(地址栏收缩 bug) |
| 明暗 | 跟随系统 + 手动切换;theme-color 双套 meta |
| 性能 | **Lighthouse 移动端 ≥90 同为验收线**;字体分片对手机流量友好;srcset + lazy + blur-up;JS 总量目标 <30KB |
| 实测矩阵 | Chrome/Firefox/Safari 桌面 + iOS Safari 真机 / Android Chrome 真机 / **微信内置浏览器**(中文读者主要入口:OG 卡片、字体分片、暗色逐项验)+ iPad Safari |
| 验收方式 | 每页型×每断点结构走查 + 真机抽检;上线前预发布域名全矩阵过一遍 |
---
## 5. 架构选项(2026-10-24 v1.2 重写:写作流是第一分叉变量)
> 用户实测反馈推翻了「Console 不动」前提:Halo 管理不够好用,**Markdown 支持不完善、中途不能换编辑器扩展**。这是结构性问题:Halo 文章创建时绑定编辑器,默认富文本存 HTML、插件编辑器各存各的格式,旧文换编辑器打开就乱——编辑器锁定是格式层的,不是设置能解决的。
### 第一分叉:你的理想写作流是哪种?
**(2026-10-24 用户已拍板:本地与浏览器都要能写)** → 架构定为 **C'':Astro SSG + git 仓为唯一事实源 + 双编辑入口**(见下节)
原分叉保留备查:
- 流 a(仅本地 markdown)→ C' Astro SSG
- 流 b(仅网页写作)→ A(Halo+自写主题,接受编辑器终身锁定)或 Ghost 二选一
### C'':双写作流方案(本地 + 浏览器都最优,2026-10-24 定案)
**核心思想:git 仓里的 markdown 文件是唯一事实源,两个编辑入口都写它。**
```
入口 1(本地): VS Code / Obsidian / Cursor ──┐
├─→ git push → 构建 → 静态输出 → nginx → ESA → 读者
入口 2(浏览器): GitHub web 编辑 / gitea web ──┘ (webhook/Actions,秒级完成)
```
| 需求 | 方案 |
|---|---|
| 本地写作 | 任意编辑器写 markdown + frontmatter,git push |
| 浏览器写作 | **GitHub 私库 web 编辑器**(github.dev 按 `.` 进入 VS Code Web,体验最佳,手机可用)或 **homelab 自建 gitea**(全自主、国内访问稳,web 编辑 + commit 够用) |
| 手机改错字 | GitHub mobile app / gitea 移动页编辑 md + commit |
| 发布链 | push → webhook/Actions → `astro build` → rsync 到 nginx 静态目录 → ESA 全站缓存 |
| 图库(21 张+EXIF) | content collection + 脚本批提 EXIF 进 frontmatter |
| 瞬间 | 短 markdown collection;可选 P2:homelab 上一个 mini 发布端点(手机 PWA 表单 → 服务端 commit + 触发构建),补齐「随手发」 |
| 评论 | **Artalk**(docker + sqlite 卷挂载,nginx 反代 /artalk;现有评论数=0,迁移成本≈0;论证见 §4a) |
| 搜索 | Pagefind(构建时索引) |
| RSS/OG/sitemap | Astro 官方集成 |
**为什么 Ghost 出局**:Ghost 的浏览器编辑器确实最佳,但它的真相源是自家数据库——本地 markdown 流只能靠 Admin API 脚本单向推,Ghost 里改的内容不回写 md 文件,**本地流是二等公民**,不满足「双流都最优」。
**诚实代价**:
1. 浏览器编辑体验是「够用」而非「最佳」(GitHub web 编辑 ≈ VS Code Web,比 Halo Console 略筒但比它可控)
2. 瞬间「随手发」默认要过 git(低频可忍;重度可用 P2 mini 端点补)
3. 图片进 git 仓库会变胖(git-lfs 或目录外挂可解)
4. 迁移工作量:6 文导出转 md、21 图搬目录、URL 保持/301
**Halo 优雅退役路径**:迁移验收后,Halo 容器停用、`~/docker_apps/halo/halo2` 归档备份(不舍得删就先停);评论用 Artalk 独立存储,与 Halo 彻底解耦;postgres 可继续服务其它容器。
**窗口期事实**:6 文 + 21 图 + 1 瞬间 + 0 评论——数据量处在迁移成本最低点。
### 管理界面横向对比(保留备查)
| 方案 | 管理界面/写作 | Markdown 完整性 | 编辑器锁定 | 三轨功能面 | 判定 |
|---|---|---|---|---|---|
| **C':Astro SSG + git** | 本地编辑器(自由) | ✅ 文件即真相 | ✅ 永久免疫 | 图库/瞬间自建 | 流 a 首推 |
| **A:Halo + 自写主题** | Console | ⚠️ 插件级支持 | ❌ 锁定(选定即终身) | ✅ 官方插件全有 | 流 b 备选 |
| **B:Halo headless + Astro** | Console 写作 | ⚠️ 同上 | ❌ 同上 | ✅ | 编辑器痛点未解,降位 |
| Ghost | 业界最佳编辑器 | ✅ 原生 | ⚠️ 单一编辑器 | ❌ 无瞬间/图库 | 流 b 备选 |
| WordPress | 生态最大 | 插件支持 | ⚠️ Classic/Block 割裂 | ✅ | ❌ PHP 世界 |
| Typecho | 极简 | ✅ 原生 | 单一 | ❌ 功能少于 Halo | ❌ 降级 |
| Notion/飞书 CMS | SaaS 编辑器 | ✅ | ✅ | ❌ | ❌ 所有权风险 |
| 全自研 | 自己造轮子 | — | — | — | ❌ 过度工程 |
### 5.1 若流 b 选 A:重写范围详解(备查)
Halo 架构事实:**Console(管理界面)与主题(访客前端)是解耦的部署物**——重写主题对 Console 零影响。
**复用(不动)**:Halo 服务端 + postgres + 部署链;Console 全部管理功能;公共 API、RSS、搜索、评论组件、URL 结构。
**重写(仅主题层)**:`theme.yaml` + ~10 个 Thymeleaf 模板(index/post/category/tag/archive/author/404 + moments/photos 集成);设计系统 tokens(独立 CSS 变量层,可平移到未来任何架构);Vite + TS 构建链;前端交互 JS(明暗切换、TOC、进度条、lightbox)。
**版本注**:生产 Halo 为 2.24,Finder API 自 2.0 起稳定;升级 Halo 与主题工作解耦,可独立进行(升级前照例备份)。
---
## 6. 执行约束(红线清单)
1. **合规**:ICP 备案页脚与工信部链接永久保留;不引入第三方追踪/统计需用户同意
2. **数据安全**:生产 Halo 容器(18090)与 postgres 不动;开发用独立实例(新容器 + 独立端口 + 独立数据卷);任何对生产的操作前先 `pg_dump` + 备份 `~/docker_apps/halo/halo2`
3. **URL 与 SEO**:保留 `/archives/{slug}` 结构;若变更必须 301;ESA(阿里云)切换后刷新缓存
4. **切换策略**:Halo 支持多主题并存——新主题在独立实例验收后再生产切换,可秒级回滚(换回 higan)
5. **可访问性**:对比度 WCAG AA(higan 作者自己也倡议);所有动效包 `prefers-reduced-motion`;marquee/噪点可暂停;正文光标保持标准 I-beam
6. **性能预算**:Lighthouse **桌面与移动端均 ≥90**;首屏无阻塞 JS;图片懒加载 + 缩略图 + blur-up 占位;中文字体分片自托管(见 §3)
6a. **图片暗色策略分场景**:正文插图暗色下降亮度/降饱和;**图库与摄影图文页暗色下保持原图亮度、底色可加深至近黑**(摄影社区共识:黑底看片)——两者规则不同,实现时区分
7. **动效纪律**:全站一支缓动曲线 + 统一时长;动效不进正文阅读区
8. **基建寿命**(julesforrest 域名被赌博站劫持的教训):域名自动续费、证书自动化、内容定期导出 markdown 留档
9. **安全头**:Halo 现有 CSP(upgrade-insecure-requests)不破坏;不内联第三方脚本
---
## 7. 待你拍板的决策清单
0. **内容分轨确认**:三轨 = 阅读 / 技术(Linux·coding·技术分享合并)/ 摄影 + 瞬间生活流——待确认
1. ~~视觉路线~~ ✅ 已拍板:**丙(灰阶骨架×分轨正文)**,并叠加「开源极客层」(命令面板/键盘/终端彩蛋/贡献图/构建透明,见 §4c);样板 v2 交互升级版预览中
2a. ~~写作流分叉~~ ✅ 已拍板:本地 + 浏览器双流 → 架构定 **C''**(Astro SSG + git 唯一事实源)
2b. ~~浏览器入口~~ ✅ 已拍板:**gitea**(数据可控全在自己手里);发布链 = push → webhook → homelab 构建 → nginx 静态目录
2c. ~~Halo 编辑器锁定~~ 随架构 C'' 作废;Halo 迁移验收后停用归档,双跑期长短待定
3. ~~评论~~ ✅ 已拍板:**Artalk**(§4a)
4. **照片管线**:推荐 **阶段 0 = gitea 上传+构建时处理(当天可用)→ 阶段 1 = 先试 Sveltia CMS(零新运维)→ 不合手再自写 photo-pipe(可开源)**(§4b,证据已实抓坐实)——认可分阶段,还是直接上 Sveltia/自写?
5. ~~书评情绪色~~ ✅ 样板已预览(待最终确认,不阻塞)
6. ~~中文字体~~ ✅ 已拍板:**自托管分片 webfont**(霞鹜文楷 + 思源黑 + JetBrains Mono,cn-font-split 官方支持 Astro,详见 §3 字体策略)
6a. ~~中英切换~~ ✅ 已认可:构建时预翻译方案 + AI 译文小标注(文学内容标「机器翻译,欢迎指正」)
6b. ~~多端适配~~ ✅ 新增硬性需求已入规格(§4e)与红线(§6-6)
7. ~~首屏身份陈述~~ ✅ 定案:留空待用户后续撰写(组件预留槽位)
8. ~~内容三轨~~ ✅ 已确认:阅读 / 技术 / 摄影 + 瞬间生活流
**调研阶段收官(2026-10-24):全部决策已定,进入实施(见 §8)。**
## 8. 实施规划(2026-10-24,按红线分期、每期可验收可回滚)
> 工作量按 agent 主执行、你只做关键验收估算;日历时间合 1–2 周。
**Phase 0 · 基建与备份(半天–1 天,不动生产)**
- [ ] 红线备份:pg_dump + ~/docker_apps/halo/halo2 归档
- [ ] gitea 容器部署(独立数据卷;git.wait4x.online,nginx 反代+TLS)
- [ ] Artalk 容器部署(sqlite 卷,nginx /artalk 反代)
- [ ] new-api 网关确认可用模型(翻译引擎就绪)
- 验收点:gitea 建仓/上传可用;Artalk 评论页可达
**Phase 1 · Astro 项目骨架 + 设计系统(2–4 天)**
- [ ] repo 结构(content/{posts,moments,photos},i18n 配置,tokens.css)
- [ ] vite-plugin-font 字体分片管线(文楷+思源黑+JBMono 自托管)
- [ ] 核心页:首页(名片+分轨列表)/ 书评、技术文双模板(排版按 §3)/ 图库 masonry+lightbox / 瞬间时间线 / 关于(身份陈述槽位留空)
- [ ] 明暗模式、Pagefind、RSS、sitemap、Artalk 集成、ICP 页脚
- [ ] 响应式按 §4e 全断点实现
- [ ] 极客层 P0 四件套:键盘+? 帮助、页脚构建信息、View Transitions、项目墙双源
- 验收点:样板 v2 能力在真实构建全部复现,多端走查过
**Phase 2 · 内容迁移(半天–1 天)**
- [ ] Halo API 导出 6 文 → md(frontmatter 含分类/标签/情绪色/slug)
- [ ] 21 图迁移 + EXIF 构建验证;1 瞬间迁移
- [ ] URL 1:1(/archives/{slug} 路由直接实现,零 301)
- 验收点:逐篇人工比对清单
**Phase 3 · 双语管线(1 天)**
- [ ] 翻译脚本(走 new-api)+ .en.md 入仓约定 + 润色锁定机制 + AI 标注组件
- [ ] hreflang / 双语 RSS
- 验收点:存量 6 文英文版人工抽检
**Phase 4 · 极客层 P1 + 上线切换(1–2 天)**
- [ ] Ctrl+K 命令面板、gitea 热力图
- [ ] 发布链闭环:gitea webhook → homelab 构建 → rsync → nginx
- [ ] 预发布域名全端验收(§4e 实测矩阵)
- [ ] 切换:nginx upstream 改静态目录 → ESA 刷新 → 观察(秒级可回滚:改回 18090)
- 验收点:线上全功能 + Core Web Vitals 绿
**Phase 5 · 退役与二期(按需)**
- [ ] Halo 停用归档(双跑期由你定)
- [ ] 二期候选:Sveltia 试装/photo-pipe 自建、/terminal 彩蛋、书评索引画廊、瞬间 PWA 上传端点、/stack·/colophon 页