这个博客如何实现 IndieWeb

这篇文章从技术层面解释了博客的组织方式,并展示了如何实现各种 IndieWeb 功能,包括结构与部署、静态搜索索引、通过 GitHub Actions 运行脚本、社交媒体联合与“短形式”部分、博客滚动(“我正在阅读的内容”页面)、网页提及与引用外部讨论线程、DOI、死链检查等方面。

动机:今年早些时候将博客从 Wordpress 迁移到 Hugo 静态网站生成器,受社交媒体衰落、IndieWeb 的 POSSE 哲学以及在空间中做更多事情(如嵌入 JavaScript 演示、添加脚注和尾注)的启发,新增“短形式”部分,可自动将其转换为所有平台上的完整线程,并带有回链。主要约束是避免管理持续运行的服务器,依赖 GitHub Actions 运行自动化,Netlify 触发部署 webhooks 和各种第三方服务进行网页提及。

结构与部署:博客是使用 Paperesque 主题的相对标准的 Hugo 站点,有各种自定义设置,存储在私有 GitHub 仓库中,每次推送都会部署到 Netlify。hugo.toml配置了基本信息和数学公式相关设置,netlify.toml配置了构建命令和环境变量等。

静态搜索索引:构建命令使用 Pagefind 初始化静态搜索索引,创建搜索栏和动态体验,未增加显著额外带宽使用。

运行脚本 via GitHub Actions:通过 GitHub Actions 的workflow_dispatch触发器远程触发工作流,修改存储库中的静态文件并触发新部署。各社交媒体联合脚本有共同结构,利用“utils”模块处理 markdown 等,通过加载数据库、判断是否已联合等步骤进行操作,不同平台的脚本略有差异,如 Mastodon 较简单,Twitter 需更多“线程调整”,Bluesky 的 API 更复杂。

社交媒体联合与“短形式”部分:GH Actions 工作流依次运行三个脚本进行数据库更新,最后添加联合链接到文章末尾。为避免短形式文章的第一段被截断,设置了 Hugo 渲染错误。在部署后自动触发此工作流,Netlify 支持构建完成后的 webhooks,发送 POST 请求触发 syndicate 工作流。

博客滚动(“我正在阅读的内容”页面):通过blogroll.txt文件和add_url_to_blogroll.py脚本实现,前者包含 URL 和标题,后者更新文件和模板页面。还制作了 Chrome 扩展,点击图标可触发添加 URL 到博客滚动的 GH Action 工作流。

网页提及与引用外部讨论线程:添加https://webmention.io支持,添加{{ partial "webmentions". }}到模板,添加webmention.js查询网页提及。Bridgy 可发现链接到站点的内容并发送网页提及,但存在缺陷,目前需更多客户端过滤。还添加了查询 HackerNews 链接并发送网页提及的脚本,以及处理 outgoing 网页提及的脚本,但发现发送的网页提及很少。

DOI:使用 Rogue Scholar 提供的 DOI 服务,通过脚本查询博客文章的 DOI,并添加到文章前端内容和模板中。

死链检查:每周运行 Lychee 死链检查器的工作流,排除一些域名的检查,最后创建问题以获取链接损坏的通知。

阅读 36
0 条评论