One source. Two surfaces.

让 GitHub 替你的内容
负重前行。

Issue 负责内容、SEO、评论与备份。你的独立站只负责建立品牌。

CONTENT PIPELINEREADY FOR ISSUE
I
GitHub IssueMarkdown + comments
II
Build FetchREST API + frontmatter
III
Search IndexGitHub authority
IV
Independent SiteBrand + analytics
#28我在字节跳动实习的三个月
SEO ENTRY0%
BRAND ENTRY0%
COMMENTS0

把每件事交给最擅长它的系统。

不是再造 CMS,而是重新分配责任。

github.com

内容基础设施

  • 高权重索引
  • 原生 Markdown 编辑
  • 评论、订阅与通知
  • 版本记录与公开备份
yourdomain.com

品牌展示层

  • 独立视觉与排版
  • 完整分析能力
  • 自由的交互组件
  • 回链 Issue 的评论入口

一次发布,双倍入口。

构建时获取带有 post 标签的 Issue,将正文写入站点。Issue 更新时触发重新部署。

GET /repos/OWNER/REPO/issues
labels=post
        ↓
frontmatter + issue.body
        ↓
/posts/ARTICLE-SLUG
以 GitHub Issues 作为博客内容源
同一篇文章在 GitHub 获得搜索权重,在独立站获得品牌表达。

内容流动,所有权不丢失。

搜索流量从 GitHub 进入,品牌印象在独立站沉淀,讨论再回到 Issue 增加热度。

保留本地导出、转存图片、用 draft 标签管理未发布内容。

Complete article

完整原文

文字、链接、图片、表格与代码均保留 开始阅读

最近偶然刷到一个仓库 izackwu/blog,点进去一看——

这哥们的博客文章,全部以 Issue 的形式发在 GitHub 仓库里。

我当场愣住,然后忍不住笑出声:这居然真的可行,而且还相当聪明。

一、先看看他到底是怎么玩的

打开他的 Issues 列表:

每一篇都是一个 Issue,标题就是文章标题,正文就是 Markdown 内容,下面挂着读者的评论。

izackwu/blog 的 Issues 列表

更骚的操作是:在 Google 里搜 字节实习 博客,他那篇 我在字节跳动实习的三个月 #28 直接霸占了第一条,把一众 CSDN博客园力扣 等老牌平台都挤了下去。

Google 搜索结果中 GitHub Issue 排在第一

二、为什么这是个天才方案?

我第一反应是好笑,第二反应是——卧槽,这思路真是赢麻了。 让我们冷静地拆一下它到底强在哪。

1. SEO 权重:站在巨人的肩膀上

自建博客最痛的痛点是什么?搜索引擎不收录,或者收录了排在第 8 页。

你辛辛苦苦写的文章,发在自己 xxx.com 的小站上,Google 甚至懒得多看一眼。而 github.com 是什么权重?全球技术内容的圣地之一,PageRank 高到离谱。

把内容塞进 github.com/<user>/<repo>/issues/<id>,相当于直接用 GitHub 这个超级域名给你的内容背书。搜索引擎一看到 github.com 就两眼发光,收录速度和排名权重几乎是降维打击。

2. 原生评论系统:白嫖一套完整 UGC

自建博客想加评论,方案无非这几种:

而 GitHub Issues 自带的评论系统:

你写一行代码都不用,就拥有了一套世界级的评论系统。

3. 内容托管:版本控制 + 永久备份

Issue 本身就是带版本历史的:

GitHub 帮你把内容强制公开 + 永久托管 + 全球分发,这是任何自建方案都做不到的稳定性。

4. 写作体验:Issue 编辑器其实很顺手

GitHub 的 Issue 编辑器其实非常成熟:

比起在本地折腾 Hexo / Hugo / Astro 配置 + git push + Vercel 部署的链路,写一篇 Issue 几乎是零门槛

三、那”漂亮的个人站”怎么办?

这才是最妙的一步。

既然 Issues 已经搞定了 内容、SEO、评论、备份,那我自建的博客站还剩什么用?

答:用来好看。

也就是说——

TEXT
GitHub Issues  →  内容真源(Source of Truth)
       ↓ 构建时 fetch
Astro / Next  →  美观的展示层

你自己的域名 + 极致的视觉设计

每次构建博客时,只需要:

  1. 调用 GitHub REST API:GET /repos/{owner}/{repo}/issues?state=all&labels=Gitalk
  2. 把每个 Issue 转换成一篇 Markdown 文章;
  3. 用你自己的主题、字体、动画、暗色模式渲染出来;
  4. 在文章底部嵌入对应 Issue 的评论区(Giscus 即可)。

一个最小实现的伪代码

TS
// scripts/fetch-issues.ts
import { Octokit } from "@octokit/rest";
import fs from "node:fs/promises";

const octokit = new Octokit({ auth: process.env.GH_TOKEN });

const { data: issues } = await octokit.issues.listForRepo({
  owner: "your-name",
  repo: "blog",
  state: "open",
  labels: "post", // 用 label 区分哪些 issue 是博客
  per_page: 100,
});

for (const issue of issues) {
  const frontmatter = `---
title: "${issue.title.replace(/"/g, '\\"')}"
description: "${(issue.body ?? "").slice(0, 80)}"
pubDate: "${issue.created_at}"
updated: "${issue.updated_at}"
issueNumber: ${issue.number}
tags: ${JSON.stringify(issue.labels.map((l: any) => l.name))}
---

${issue.body}
`;
  const slug = `${issue.number}-${slugify(issue.title)}.mdx`;
  await fs.writeFile(`src/content/blog/${slug}`, frontmatter);
}

然后在 CI 里加一行:

YAML
# .github/workflows/deploy.yml
- name: Fetch posts from issues
  run: pnpm tsx scripts/fetch-issues.ts
  env:
    GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Build site
  run: pnpm build

更进一步,可以监听 issues 事件,Issue 一更新就自动重新部署

YAML
on:
  issues:
    types: [opened, edited, labeled, unlabeled]
  push:
    branches: [main]

写完一篇 Issue,回车一发——几分钟后你的个人站就同步上线了。完全没有”写完文章还要 git commit / push”这一步。

四、双倍收益:流量入口翻倍

最骚的还在后头。

正常博主只有一个入口:自己的域名

而这套方案下,你拥有两个独立的、互相导流的入口

入口优势劣势
github.com/.../issues/NSEO 权重高、原生评论、技术圈传播性强样式丑、不能自定义
yourblog.com/posts/...设计精美、品牌感强、可加分析新域名权重低

你只要在两边互相挂个 link:

SEO 流量从 GitHub 进,品牌印象在自己站上沉淀,评论又流回 Issue 增加热度。 形成一个完美的闭环。

五、有什么坑吗?

当然,理性地说,这套方案不是没有缺点:

六、谁特别适合这套方案?

我想了想,这套方案其实有非常清晰的 target user:

  1. 技术博主 / 开源作者:天然在 GitHub 圈子里,读者本来就有账号,评论无门槛。
  2. 想要 SEO 但不想运营的人:你不需要懂 SEO,蹭 GitHub 的权重就够了。
  3. 写作频率不高的人:低频写作不值得搞复杂的 CMS,Issue 简单到像发朋友圈。
  4. 多端写作的人:手机随时打开 GitHub App 就能写,比打开 IDE 改 mdx 文件爽多了。

七、写在最后

我以前一直觉得,“博客”就该是一个独立的、精心设计的网站。看到 izackwu 的玩法,我才意识到:

博客的本质从来不是”网站”,而是”内容 + 读者”。

既然 GitHub 已经把”内容托管 + SEO + 评论 + 通知 + 备份”这一整套基础设施都免费送给你了,那为什么不站在它的肩膀上?

自建博客负责美感和品牌,GitHub Issues 负责内容和分发——两边各干自己最擅长的事情。

这不是什么炫技,而是一种对工程懒惰的极致追求。能用别人的肌肉就别长自己的,这才是真正的工程师精神。

学到了,下次起新博客我也试试这套架构。