这是一个以 Typst 为主源的静态博客。posts/*.typ 是唯一手写正文,HTML 站点和 Markdown 分发版都由构建脚本生成。
进入固定环境:
nix develop如果仓库还没有首次提交,Nix 可能提示 flake.nix 未被 Git 跟踪;先提交一次,或者临时使用 nix develop path:$PWD。
检查完整构建链路:
python scripts/build.py --check生成站点和 Markdown 分发版:
python scripts/build.py或者直接使用
nix develop -c python scripts/build.py输出目录:
_site/:GitHub Pages 发布目录。dist/md/:Markdown 分发版。_site/downloads/:站点内可下载的 Markdown 版本。
在 posts/ 新增 .typ 文件,并在文件开头放置元数据:
#metadata((
slug: "lowercase-kebab-case",
title: "文章标题",
date: "2026-05-05",
description: "一句话摘要。",
tags: ("标签",),
draft: false,
)) <post-meta>
= 文章标题
正文从这里开始。约定:
slug只能使用小写 ASCII、数字和短横线,会成为文章 URL:/posts/<slug>/。date使用YYYY-MM-DD。draft: true的文章不会发布。- Markdown 是生成物,不要手动编辑
dist/md。
- 在 GitHub 创建仓库,把默认分支设为
main。 - 推送代码后,在仓库 Settings -> Pages 中选择 GitHub Actions 作为发布源。
- 可选:在 Settings -> Secrets and variables -> Actions -> Variables 中设置
SITE_URL,例如https://xmoon.github.io/blog。设置后 RSS、canonical 和 sitemap 会使用绝对 URL。 - 每次 push 到
main都会运行.github/workflows/pages.yml,构建_site并发布到 GitHub Pages。
Typst 的 HTML 导出仍是实验功能,所以这里用 Nix 锁定工具链,并把 Typst 到 HTML、Typst 到 Markdown 的转换都放进 CI 检查。