feat(art): replace all 72 posts' artwork with the v2 pipeline
Deploy / build (push) Successful in 17s

Every post now carries one unique local-ComfyUI/Ideogram 4 base frame, composited
into EN + ZH share cards, a banner and list thumbs.

- the shipped prompts_catalog held only 21 distinct metaphors for 72 posts (16
  shared one visual), so all 72 were rewritten as unique object+state metaphors
  and 10 frames re-rolled after OCR found pseudo-text rendered at legible size
- render_from_art.mjs emits JPEG by default (558 KB PNG -> 84 KB mozjpeg q85);
  the ZH 1200x630 card did not exist before this batch
- 288 frontmatter fields migrated; the 144 v1 PNGs are gone
- PostList's thumb helper keys off the base slug (a ZH card is zh-<slug>.jpg while
  the thumb is <slug>-800.webp, which 404'd the whole ZH listing)
- [...slug].astro's <picture> regex accepts .jpg
- the repo now carries the art inputs (metaphors.json, captions/<slug>.json,
  refreshed prompts_catalog.json) so a frame is reproducible from git alone
This commit is contained in:
hoelee committed 2026-10-19 04:18:59 +08:00
1 parent 72a9a2af6f
commit 327d516ed9
802 files changed
+1289 -519

No files matched your search

@@ -5,8 +5,8 @@ pubDate: 2025-05-06
updatedDate: 2026-10-16
category: notes
tags: ["email", "dns", "mailcow", "smtp", "deliverability"]
ogImage: /og/adding-a-domain-to-someone-elses-mail-server.png
banner: /banners/adding-a-domain-to-someone-elses-mail-server.png
ogImage: /og/zh-adding-a-domain-to-someone-elses-mail-server.jpg
banner: /banners/adding-a-domain-to-someone-elses-mail-server.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2025-06-11
updatedDate: 2026-09-29
category: engineering
tags: ["i18n", "nginx", "vue", "javascript", "self-hosting"]
ogImage: "/og/adding-english-mode-to-a-chinese-only-web-app.png"
banner: "/banners/adding-english-mode-to-a-chinese-only-web-app.png"
ogImage: "/og/zh-adding-english-mode-to-a-chinese-only-web-app.jpg"
banner: "/banners/adding-english-mode-to-a-chinese-only-web-app.jpg"
draft: false
---
@@ -4,8 +4,8 @@ description: "用 fal.ai FLUX.1 Kontext 把家具产品照合成到风格化房
pubDate: 2026-09-11
category: case-studies
tags: [fal-ai, flux, ai-image, javascript, canvas, ecommerce]
ogImage: /og/ai-furniture-compositing-with-flux-kontext.png
banner: /banners/ai-furniture-compositing-with-flux-kontext.png
ogImage: /og/zh-ai-furniture-compositing-with-flux-kontext.jpg
banner: /banners/ai-furniture-compositing-with-flux-kontext.jpg
---
一位家具客户带着一个每个小电商卖家最终都会撞上的问题来找我:他们的产品图都是**孤立的产品照**——一张白底桌子、一张白底椅子——但顾客不会从一片白茫茫的虚无里买家具,他们买的是*房间*。给每个产品、每种室内风格都拍一次实体棚拍,对一个人的生意来说根本不可能。
@@ -5,8 +5,8 @@ pubDate: 2026-09-20
updatedDate: 2026-10-16
category: devops
tags: ["authentik", "css", "self-hosting", "debugging", "browser"]
ogImage: /og/authentik-css-greater-than-bug.png
banner: /banners/authentik-css-greater-than-bug.png
ogImage: /og/zh-authentik-css-greater-than-bug.jpg
banner: /banners/authentik-css-greater-than-bug.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-08-12
updatedDate: 2026-09-29
category: devops
tags: ["authentik", "forward-auth", "cloudflare", "nginx", "docker", "self-hosting"]
ogImage: /og/authentik-forward-auth-gate-wasnt-live.png
banner: /banners/authentik-forward-auth-gate-wasnt-live.png
ogImage: /og/zh-authentik-forward-auth-gate-wasnt-live.jpg
banner: /banners/authentik-forward-auth-gate-wasnt-live.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "一年份的 authentik 大版本升级踩坑记录:存储挂载
pubDate: 2026-09-09
category: devops
tags: [authentik, sso, docker, portainer, self-hosting, oidc, upgrade]
ogImage: /og/authentik-major-upgrade-gotchas.png
banner: /banners/authentik-major-upgrade-gotchas.png
ogImage: /og/zh-authentik-major-upgrade-gotchas.jpg
banner: /banners/authentik-major-upgrade-gotchas.jpg
---
我把 authentik 当作自托管体系前面的单点登录闸门——邮箱、仪表盘、Synology
@@ -4,8 +4,8 @@ description: "CyberPanel v2 砍掉了有文档的 JSON API,只留下 Angular
pubDate: 2026-09-09
category: devops
tags: [cyberpanel, api, reverse-engineering, automation, django, self-hosting, curl]
ogImage: /og/automating-cyberpanel-without-the-ui.png
banner: /banners/automating-cyberpanel-without-the-ui.png
ogImage: /og/zh-automating-cyberpanel-without-the-ui.jpg
banner: /banners/automating-cyberpanel-without-the-ui.jpg
---
我在家庭实验里的一台 Ubuntu 虚拟机里跑着 CyberPanel 2.4.4.1,用来托管几个小站,
@@ -4,8 +4,8 @@ description: "对比 2026 年最好的 AI 视频生成器——免费与付费
pubDate: 2026-09-11
category: ai
tags: [ai-video, video-generation, ltx, open-weights, pricing, veo]
ogImage: /og/best-ai-video-generators-2026.png
banner: /banners/best-ai-video-generators-2026.png
ogImage: /og/zh-best-ai-video-generators-2026.jpg
banner: /banners/best-ai-video-generators-2026.jpg
---
2026 年,你究竟该用哪个 AI 视频生成器?其中又有多少是真免费的?
@@ -5,8 +5,8 @@ pubDate: 2026-10-14
updatedDate: 2026-10-16
category: tutorials
tags: ["ffmpeg", "hevc", "qsv", "transcoding", "video"]
ogImage: /og/calibrating-intel-quick-sync-hevc-quality.png
banner: /banners/calibrating-intel-quick-sync-hevc-quality.png
ogImage: /og/zh-calibrating-intel-quick-sync-hevc-quality.jpg
banner: /banners/calibrating-intel-quick-sync-hevc-quality.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2024-12-10
updatedDate: 2026-09-29
category: web3
tags: [solidity, chainlink, vrf, foundry, hardhat, blockchain]
ogImage: /og/chainlink-vrf-v2-lottery-contract.png
banner: /banners/chainlink-vrf-v2-lottery-contract.png
ogImage: /og/zh-chainlink-vrf-v2-lottery-contract.jpg
banner: /banners/chainlink-vrf-v2-lottery-contract.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "NAS 上的容器不停「意外停止」,而 Docker 报的是 ex
pubDate: 2026-10-16
category: devops
tags: ["docker", "oom", "traefik", "synology", "crawlers"]
ogImage: /og/docker-reported-exit-0-the-oom-killer-disagreed.png
banner: /banners/docker-reported-exit-0-the-oom-killer-disagreed.png
ogImage: /og/zh-docker-reported-exit-0-the-oom-killer-disagreed.jpg
banner: /banners/docker-reported-exit-0-the-oom-killer-disagreed.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "在真实文件上对 HEVC 编码器做的实测对比:NVENC cq2
pubDate: 2026-10-08
category: tutorials
tags: [ffmpeg, hevc, x265, nvenc, video]
ogImage: /og/does-hevc-actually-shrink-your-files.png
banner: /banners/does-hevc-actually-shrink-your-files.png
ogImage: /og/zh-does-hevc-actually-shrink-your-files.jpg
banner: /banners/does-hevc-actually-shrink-your-files.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2025-01-22
updatedDate: 2026-10-16
category: engineering
tags: ["pdf", "fonts", "mpdf", "typography", "php"]
ogImage: /og/embedding-fonts-so-a-pdf-looks-the-same-everywhere.png
banner: /banners/embedding-fonts-so-a-pdf-looks-the-same-everywhere.png
ogImage: /og/zh-embedding-fonts-so-a-pdf-looks-the-same-everywhere.jpg
banner: /banners/embedding-fonts-so-a-pdf-looks-the-same-everywhere.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "同一个 HEVC 文件,在 VLC、Chrome 和 iPad 上(离线)
pubDate: 2026-10-08
category: devops
tags: [ffmpeg, nvdec, hevc, transcoding, video]
ogImage: /og/every-player-stuttered-the-file-was-fine.png
banner: /banners/every-player-stuttered-the-file-was-fine.png
ogImage: /og/zh-every-player-stuttered-the-file-was-fine.jpg
banner: /banners/every-player-stuttered-the-file-was-fine.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "AI 五步学习路线(基础、提示词、RAG、Agent、微调
pubDate: 2026-10-13
category: ai
tags: ["llm", "rag", "agents", "self-hosting", "whisper", "mem0"]
ogImage: /og/five-step-ai-roadmap-what-i-actually-run.png
banner: /banners/five-step-ai-roadmap-what-i-actually-run.png
ogImage: /og/zh-five-step-ai-roadmap-what-i-actually-run.jpg
banner: /banners/five-step-ai-roadmap-what-i-actually-run.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2024-10-08
updatedDate: 2026-09-29
category: web3
tags: [solidity, foundry, erc721, nft, svg, base64, onchain]
ogImage: /og/fully-on-chain-svg-nfts.png
banner: /banners/fully-on-chain-svg-nfts.png
ogImage: /og/zh-fully-on-chain-svg-nfts.jpg
banner: /banners/fully-on-chain-svg-nfts.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2025-12-10
updatedDate: 2026-09-09
category: devops
tags: [tor, docker, security, self-hosting, networking]
ogImage: /og/hardening-a-tor-onion-service.png
banner: /banners/hardening-a-tor-onion-service.png
ogImage: /og/zh-hardening-a-tor-onion-service.jpg
banner: /banners/hardening-a-tor-onion-service.jpg
---
我对暗网产生了好奇。不是集市那一面,而是无聊的那一半:人们像注册商和云控制台出现之前那样自托管——跑自己维护的软件,用一个自己掌控的地址就能访问。
+2 -2
View File
@@ -5,8 +5,8 @@ pubDate: 2024-09-24
updatedDate: 2026-09-05
category: notes
tags: [intro]
ogImage: /og/hello-world.png
banner: /banners/hello-world.png
ogImage: /og/zh-hello-world.jpg
banner: /banners/hello-world.jpg
---
欢迎。这里写下我构建与学习的东西——主要是工程、DevOps 和自托管,中间也会
@@ -4,8 +4,8 @@ description: "一个全天候解答顾客问题、并在 Telegram 和 WhatsApp
pubDate: 2026-09-06
category: case-studies
tags: [telegram, docker, cloudflare, litellm, typescript, ai]
ogImage: /og/how-i-built-the-digikedai-telegram-bot.png
banner: /banners/how-i-built-the-digikedai-telegram-bot.png
ogImage: /og/zh-how-i-built-the-digikedai-telegram-bot.jpg
banner: /banners/how-i-built-the-digikedai-telegram-bot.jpg
---
Digi Kedai 销售数字产品——在线课程、电子书、模板——每一单都会带来一连串同样的顾客问题:*「这门课有免费试看吗?」「我怎么拿到账号?」「我该买哪个套餐?」*。对一个人的生意来说,人工回复根本忙不过来。于是我打造了一个 AI 客服机器人,全天候解答这些问题,甚至能在无人介入的情况下自动发放免费试用账号。
+2 -2
View File
@@ -4,8 +4,8 @@ description: "这篇文章完整拆解了这个网站背后的构建与部署管
pubDate: 2026-09-04
category: case-studies
tags: [astro, gitea, ci-cd, self-hosting, docker, cloudflare]
ogImage: /og/how-i-host-this-blog.png
banner: /banners/how-i-host-this-blog.png
ogImage: /og/zh-how-i-host-this-blog.jpg
banner: /banners/how-i-host-this-blog.jpg
---
这个博客本身,就是我用来说明「我到底会做什么」的一个项目。下面是完整的
@@ -4,8 +4,8 @@ description: "自己写词、调风格提示词,用 Suno AI 做出七首原创
pubDate: 2026-09-11
category: case-studies
tags: [suno, ai-music, music, lyrics, prompting, ai]
ogImage: /og/how-i-made-my-own-songs-with-suno-ai.png
banner: /banners/how-i-made-my-own-songs-with-suno-ai.png
ogImage: /og/zh-how-i-made-my-own-songs-with-suno-ai.jpg
banner: /banners/how-i-made-my-own-songs-with-suno-ai.jpg
---
我做自己的歌。不是靠弹奏乐器——而是写歌词、打磨风格提示词,让 Suno AI
@@ -5,8 +5,8 @@ pubDate: 2025-11-12
updatedDate: 2026-09-09
category: case-studies
tags: [ai-orchestration, subagents, due-diligence, hosting, devops]
ogImage: /og/how-i-vetted-20-vps-providers-with-parallel-subagents.png
banner: /banners/how-i-vetted-20-vps-providers-with-parallel-subagents.png
ogImage: /og/zh-how-i-vetted-20-vps-providers-with-parallel-subagents.jpg
banner: /banners/how-i-vetted-20-vps-providers-with-parallel-subagents.jpg
---
## 为什么这很重要
@@ -5,8 +5,8 @@ pubDate: 2025-11-26
updatedDate: 2026-09-09
category: tutorials
tags: [hosting, vps, due-diligence, whois, devops]
ogImage: /og/how-to-verify-a-hosting-provider-before-you-buy.png
banner: /banners/how-to-verify-a-hosting-provider-before-you-buy.png
ogImage: /og/zh-how-to-verify-a-hosting-provider-before-you-buy.jpg
banner: /banners/how-to-verify-a-hosting-provider-before-you-buy.jpg
---
每家主机服务商的首页都是一串承诺:_「自 2005 年起运营」_、_「保证在线率」_、
@@ -5,8 +5,8 @@ pubDate: 2025-07-08
updatedDate: 2026-09-29
category: ai
tags: [ai-agent, shopee, automation, human-in-the-loop, ecommerce, cron]
ogImage: /og/i-let-an-agent-manage-my-shopee-vouchers.png
banner: /banners/i-let-an-agent-manage-my-shopee-vouchers.png
ogImage: /og/zh-i-let-an-agent-manage-my-shopee-vouchers.jpg
banner: /banners/i-let-an-agent-manage-my-shopee-vouchers.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "网络挂载盘对我的转换流水线撒的三种谎:一次 40
pubDate: 2026-10-08
category: devops
tags: [storage, smb, verification, ffmpeg, python]
ogImage: /og/it-reported-success-nothing-had-changed.png
banner: /banners/it-reported-success-nothing-had-changed.png
ogImage: /og/zh-it-reported-success-nothing-had-changed.jpg
banner: /banners/it-reported-success-nothing-had-changed.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "在 REST + JPA 的读-改-写流程里,两个编辑同时保存
pubDate: 2026-08-19
category: engineering
tags: [java, spring, jpa, hibernate, rest, testing]
ogImage: /og/jpa-version-field-lost-update.png
banner: /banners/jpa-version-field-lost-update.png
ogImage: /og/zh-jpa-version-field-lost-update.jpg
banner: /banners/jpa-version-field-lost-update.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "Loop engineering 是 2026 年对「设计让 agent 自己反复跑
pubDate: 2026-10-01
category: case-studies
tags: ["loop-engineering", "ai-agents", "cron", "self-hosting", "automation", "monitoring"]
ogImage: "/og/loop-engineering-without-a-coding-agent.png"
banner: "/banners/loop-engineering-without-a-coding-agent.png"
ogImage: "/og/zh-loop-engineering-without-a-coding-agent.jpg"
banner: "/banners/loop-engineering-without-a-coding-agent.jpg"
draft: false
---
@@ -4,8 +4,8 @@ description: "我把一个 17,000 行的 CodeIgniter 4 应用从 Windows IIS 搬
pubDate: 2026-09-27
category: engineering
tags: [codeigniter, php, openspeedway, cyberpanel, iis, migration, litespeed, linux]
ogImage: /og/migrating-codeigniter-iis-to-openlitespeed.png
banner: /banners/migrating-codeigniter-iis-to-openlitespeed.png
ogImage: /og/zh-migrating-codeigniter-iis-to-openlitespeed.jpg
banner: /banners/migrating-codeigniter-iis-to-openlitespeed.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-10-15
updatedDate: 2026-10-16
category: notes
tags: ["rclone", "backup", "google-drive", "oauth", "restic"]
ogImage: /og/my-backup-was-using-someone-elses-api-quota.png
banner: /banners/my-backup-was-using-someone-elses-api-quota.png
ogImage: /og/zh-my-backup-was-using-someone-elses-api-quota.jpg
banner: /banners/my-backup-was-using-someone-elses-api-quota.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "我的自建 n8n 从 1.x 升级到 2.40.1,一次性暴露出七
pubDate: 2026-09-18
category: devops
tags: [n8n, docker, upgrade, self-hosting, debugging, automation]
ogImage: /og/n8n-v1-to-v2-upgrade-gotchas.png
banner: /banners/n8n-v1-to-v2-upgrade-gotchas.png
ogImage: /og/zh-n8n-v1-to-v2-upgrade-gotchas.jpg
banner: /banners/n8n-v1-to-v2-upgrade-gotchas.jpg
---
n8n 是我整个自建技术栈的自动化中枢——它负责文件交付权限、数据库备份,还有一套阅读应用依赖的语音合成 API。它一直停留在 `1.123.x` 版本线上快一年了,默默干活,没出过什么问题。
@@ -4,8 +4,8 @@ description: "NocoDB 的 OIDC 环境变量是真的,启动时也会校验,
pubDate: 2026-09-29
category: notes
tags: ["nocodb", "sso", "oidc", "self-hosting", "licensing", "docker"]
ogImage: /og/nocodb-sso-is-a-licensed-feature.png
banner: /banners/nocodb-sso-is-a-licensed-feature.png
ogImage: /og/zh-nocodb-sso-is-a-licensed-feature.jpg
banner: /banners/nocodb-sso-is-a-licensed-feature.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "埋点必须公开,仪表盘绝不能公开。我用 authentik
pubDate: 2026-09-30
category: devops
tags: ["umami", "authentik", "sso", "nginx", "docker", "privacy"]
ogImage: "/og/one-hostname-public-tracker-sso-dashboard.png"
banner: "/banners/one-hostname-public-tracker-sso-dashboard.png"
ogImage: "/og/zh-one-hostname-public-tracker-sso-dashboard.jpg"
banner: "/banners/one-hostname-public-tracker-sso-dashboard.jpg"
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-07-29
updatedDate: 2026-09-29
category: case-studies
tags: [prometheus, grafana, unraid, synology, dsm, cadvisor, monitoring, homelab]
ogImage: /og/one-prometheus-for-unraid-synology-and-a-vps.png
banner: /banners/one-prometheus-for-unraid-synology-and-a-vps.png
ogImage: /og/zh-one-prometheus-for-unraid-synology-and-a-vps.jpg
banner: /banners/one-prometheus-for-unraid-synology-and-a-vps.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-01-07
updatedDate: 2026-09-13
category: devops
tags: [passbolt, docker, gpg, smtp, reverse-proxy, portainer]
ogImage: /og/passbolt-hang-three-failure-modes.png
banner: /banners/passbolt-hang-three-failure-modes.png
ogImage: /og/zh-passbolt-hang-three-failure-modes.jpg
banner: /banners/passbolt-hang-three-failure-modes.jpg
---
我在 Synology NAS 上用 Docker 跑 Passbolt——一个开源的团队密码管理器,前面
@@ -4,8 +4,8 @@ description: "MySQL Workbench 26.7.0 能连上 MySQL 8.4,却在 MariaDB 上报
pubDate: 2026-09-19
category: devops
tags: [mysql, mariadb, workbench, debugging, electron, mysql-sh, cyberpanel, self-hosting]
ogImage: /og/patching-workbench-26-for-mariadb.png
banner: /banners/patching-workbench-26-for-mariadb.png
ogImage: /og/zh-patching-workbench-26-for-mariadb.jpg
banner: /banners/patching-workbench-26-for-mariadb.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2025-06-24
updatedDate: 2026-10-06
category: devops
tags: ["nginx", "docker", "self-hosting", "seo", "branding"]
ogImage: "/og/putting-a-front-door-on-an-app-you-cant-modify.png"
banner: "/banners/putting-a-front-door-on-an-app-you-cant-modify.png"
ogImage: "/og/zh-putting-a-front-door-on-an-app-you-cant-modify.jpg"
banner: "/banners/putting-a-front-door-on-an-app-you-cant-modify.jpg"
draft: false
---
@@ -4,8 +4,8 @@ description: "把 NocoDB 直接指向另一台机器上的 MySQL/MariaDB,一
pubDate: 2026-09-29
category: devops
tags: ["nocodb", "mysql", "mariadb", "docker", "networking", "dashboard"]
ogImage: /og/read-only-nocodb-dashboard-for-a-remote-database.png
banner: /banners/read-only-nocodb-dashboard-for-a-remote-database.png
ogImage: /og/zh-read-only-nocodb-dashboard-for-a-remote-database.jpg
banner: /banners/read-only-nocodb-dashboard-for-a-remote-database.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2025-10-01
updatedDate: 2026-09-26
category: notes
tags: [docker, openapi, api, documentation, debugging, reverse-engineering]
ogImage: /og/reading-a-containers-own-api-docs.png
banner: /banners/reading-a-containers-own-api-docs.png
ogImage: /og/zh-reading-a-containers-own-api-docs.jpg
banner: /banners/reading-a-containers-own-api-docs.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "我把付费的 RDPGuard 7.8.7 换成了开源的 IPBan 4.1.0,
pubDate: 2026-09-19
category: devops
tags: [windows, security, rdp, ipban, rdpguard, brute-force, firewall, self-hosting]
ogImage: /og/replacing-rdpguard-with-ipban.png
banner: /banners/replacing-rdpguard-with-ipban.png
ogImage: /og/zh-replacing-rdpguard-with-ipban.jpg
banner: /banners/replacing-rdpguard-with-ipban.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "一个人、三台主机、78 个 compose stack 里的 162 个容
pubDate: 2026-10-06
category: case-studies
tags: [docker, traefik, monitoring, infrastructure, devops]
ogImage: /og/running-production-infrastructure-solo.png
banner: /banners/running-production-infrastructure-solo.png
ogImage: /og/zh-running-production-infrastructure-solo.jpg
banner: /banners/running-production-infrastructure-solo.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "一个阅读应用需要 TTS,而云服务免费版的 token 十
pubDate: 2026-09-18
category: ai
tags: [n8n, tts, azure, google-cloud, docker, automation, sidecar]
ogImage: /og/running-tts-as-a-service-with-token-sidecars.png
banner: /banners/running-tts-as-a-service-with-token-sidecars.png
ogImage: /og/zh-running-tts-as-a-service-with-token-sidecars.jpg
banner: /banners/running-tts-as-a-service-with-token-sidecars.jpg
---
我自建了一个电子书阅读服务器。它有个「朗读」功能,内置的引擎能用但很机械。所以我把它接到了真正的神经网络语音上——Azure Speech 和 Google Cloud TTS——通过我的 n8n 实例。
@@ -4,8 +4,8 @@ description: "为一位做二手手机生意的客户:爬取有反爬墙的电
pubDate: 2026-09-13
category: engineering
tags: ["scraping", "cdp", "headless-chrome", "anti-bot", "shopee", "python"]
ogImage: "/og/scraping-bot-walled-marketplace-warm-browser-session.png"
banner: "/banners/scraping-bot-walled-marketplace-warm-browser-session.png"
ogImage: "/og/zh-scraping-bot-walled-marketplace-warm-browser-session.jpg"
banner: "/banners/scraping-bot-walled-marketplace-warm-browser-session.jpg"
draft: false
---
@@ -4,8 +4,8 @@ description: "我如何用五个工作流搭出一套权限系统,自动授予
pubDate: 2026-09-18
category: case-studies
tags: [n8n, nocodb, alist, access-control, docker, automation, digital-goods]
ogImage: /og/self-healing-digital-goods-entitlements.png
banner: /banners/self-healing-digital-goods-entitlements.png
ogImage: /og/zh-self-healing-digital-goods-entitlements.jpg
banner: /banners/self-healing-digital-goods-entitlements.jpg
---
我卖数字产品——文件、美术素材、授权资源——并通过一个自建的文件门户交付。真正的难题从来不是存储,而是**授权**:确保客户在购买时拿到恰好他们买下的目录,拿到恰好他们付费的时长,并且在停止付费时访问权限真的被收回。
@@ -4,8 +4,8 @@ description: "我用一台带 GPU 的电脑自建了语音转文字 API。Window
pubDate: 2026-09-19
category: case-studies
tags: [whisper, cuda, stt, n8n, nginx, self-hosting, ai]
ogImage: /og/self-hosted-speech-to-text-api.png
banner: /banners/self-hosted-speech-to-text-api.png
ogImage: /og/zh-self-hosted-speech-to-text-api.jpg
banner: /banners/self-hosted-speech-to-text-api.jpg
---
打字的办公效率里面,它是最慢的一环。一般人打字速度约每分钟 40 个字,但
@@ -4,8 +4,8 @@ description: "一套私有、自托管的 AI 助手记忆层——mem0 API + Lit
pubDate: 2026-09-16
category: case-studies
tags: [mem0, docker, postgres, pgvector, litellm, ai, sharing]
ogImage: /og/self-hosting-mem0-memory-stack.png
banner: /banners/self-hosting-mem0-memory-stack.png
ogImage: /og/zh-self-hosting-mem0-memory-stack.jpg
banner: /banners/self-hosting-mem0-memory-stack.jpg
---
一个每次对话后都忘光一切的 AI 助手,就是一个每轮都要你重新自我介绍的工具。我的 AI 助手(就是驱动这个博客工作流的那个)曾经每场会话都从零开始——直到我给它加了一层**记忆**:一套自托管的 [mem0](https://mem0.ai) 栈,负责存储它学到的事实、按语义检索、并跨会话存活。
@@ -4,8 +4,8 @@ description: "从单个 HTML 文件到一个真正上线的 WordPress 插件:f
pubDate: 2026-09-18
category: case-studies
tags: [wordpress, php, fal-ai, docker, ai-image, javascript]
ogImage: /og/shipping-an-ai-photo-editor-as-a-wordpress-plugin.png
banner: /banners/shipping-an-ai-photo-editor-as-a-wordpress-plugin.png
ogImage: /og/zh-shipping-an-ai-photo-editor-as-a-wordpress-plugin.jpg
banner: /banners/shipping-an-ai-photo-editor-as-a-wordpress-plugin.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-04-14
updatedDate: 2026-09-29
category: notes
tags: [smart, smartctl, unraid, monitoring, bash, disks, homelab]
ogImage: /og/smartctl-exit-code-32-skips-the-disks-that-matter.png
banner: /banners/smartctl-exit-code-32-skips-the-disks-that-matter.png
ogImage: /og/zh-smartctl-exit-code-32-skips-the-disks-that-matter.jpg
banner: /banners/smartctl-exit-code-32-skips-the-disks-that-matter.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-10-14
updatedDate: 2026-10-16
category: devops
tags: ["synology", "btrfs", "snapshots", "storage", "nas"]
ogImage: /og/space-reclamation-wasnt-stuck-it-was-waiting.png
banner: /banners/space-reclamation-wasnt-stuck-it-was-waiting.png
ogImage: /og/zh-space-reclamation-wasnt-stuck-it-was-waiting.jpg
banner: /banners/space-reclamation-wasnt-stuck-it-was-waiting.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "我有一个定时任务连续失败 29 次,原因是我在一
pubDate: 2026-10-01
category: notes
tags: ["loop-engineering", "cron", "ai-agents", "automation"]
ogImage: "/og/stop-writing-agent-prompts-for-deterministic-work.png"
banner: "/banners/stop-writing-agent-prompts-for-deterministic-work.png"
ogImage: "/og/zh-stop-writing-agent-prompts-for-deterministic-work.jpg"
banner: "/banners/stop-writing-agent-prompts-for-deterministic-work.jpg"
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-02-18
updatedDate: 2026-09-11
category: case-studies
tags: [hermes, git, gitea, ai-agents, devops, sync]
ogImage: /og/syncing-a-self-improving-ai-agent-across-machines.png
banner: /banners/syncing-a-self-improving-ai-agent-across-machines.png
ogImage: /og/zh-syncing-a-self-improving-ai-agent-across-machines.jpg
banner: /banners/syncing-a-self-improving-ai-agent-across-machines.jpg
---
我的 agent 会学习。每当我带它走一遍不平凡的工作流程——如何发布到 Gitea、如何排查一个时好时坏的 Docker 容器、如何写一条 Shopee 商品列表——它就会把过程存成一项 *skill*:一个下次遇到同类任务时自动加载的可复用流程。几个月下来,它累积了 172 项技能,横跨二十个分类。它们就是我的第二大脑。
@@ -5,8 +5,8 @@ pubDate: 2025-09-10
updatedDate: 2026-09-26
category: notes
tags: [synology, dsm, rest-api, tls, 2fa, debugging, authentication]
ogImage: /og/synology-api-401-with-the-correct-password.png
banner: /banners/synology-api-401-with-the-correct-password.png
ogImage: /og/zh-synology-api-401-with-the-correct-password.jpg
banner: /banners/synology-api-401-with-the-correct-password.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2025-08-20
updatedDate: 2026-09-26
category: devops
tags: [synology, dsm, docker, portainer, rest-api, spreadsheet, debugging, self-hosting]
ogImage: /og/synology-spreadsheet-api-is-a-container.png
banner: /banners/synology-spreadsheet-api-is-a-container.png
ogImage: /og/zh-synology-spreadsheet-api-is-a-container.jpg
banner: /banners/synology-spreadsheet-api-is-a-container.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-09-16
category: devops
tags: [unraid, sata, ssd, storage, troubleshooting, smart, fio, cable]
draft: false
ogImage: /og/that-dying-ssd-was-just-a-bad-sata-cable.png
banner: /banners/that-dying-ssd-was-just-a-bad-sata-cable.png
ogImage: /og/zh-that-dying-ssd-was-just-a-bad-sata-cable.jpg
banner: /banners/that-dying-ssd-was-just-a-bad-sata-cable.jpg
---
所有存储指南都告诉你:先看 SMART,再信事件日志。我也照做了,两者都指向同一个结论:这颗 SSD 要死了。而我距离把一颗健康硬盘送去 RMA 只差一步。
@@ -4,8 +4,8 @@ description: "两周前 btrfs RAID1 阵列在看似健康的 NVMe 盘上静默
pubDate: 2026-09-18
category: devops
tags: [unraid, btrfs, trim, ssd, raid, data-loss, smart, troubleshooting, seagate]
ogImage: /og/the-cause-was-trim-not-the-ssds.png
banner: /banners/the-cause-was-trim-not-the-ssds.png
ogImage: /og/zh-the-cause-was-trim-not-the-ssds.jpg
banner: /banners/the-cause-was-trim-not-the-ssds.jpg
---
两周前我写了一篇文章,讲一个 btrfs RAID1 阵列如何在两块看起来完全健康的三星 PM9A3 NVMe 盘上静默损坏 Windows 虚拟机——读出来的全是**全零**数据块,单靠一块坏盘根本无法解释。那次调查以一句诚实的「不确定」收尾:两块盘测试都干净,最大嫌疑是它们共用的 M.2 转接卡。
@@ -5,8 +5,8 @@ pubDate: 2026-02-04
updatedDate: 2026-09-10
category: notes
tags: [nocodb, backfill, python, regex, data-pipeline]
ogImage: /og/the-nocodb-attachment-that-wouldnt-update.png
banner: /banners/the-nocodb-attachment-that-wouldnt-update.png
ogImage: /og/zh-the-nocodb-attachment-that-wouldnt-update.jpg
banner: /banners/the-nocodb-attachment-that-wouldnt-update.jpg
---
在 NocoDB 里回填 300 行数据的经历,暴露了两个小坑,每一个都耗掉了我一段时间。
@@ -4,8 +4,8 @@ description: "我线上跑的阅读服务,依赖的镜像官方仓库已经 40
pubDate: 2026-10-06
category: devops
tags: ["docker", "self-hosting", "upstream", "maintenance", "registry"]
ogImage: "/og/the-upstream-was-deleted-then-came-back-rewritten.png"
banner: "/banners/the-upstream-was-deleted-then-came-back-rewritten.png"
ogImage: "/og/zh-the-upstream-was-deleted-then-came-back-rewritten.jpg"
banner: "/banners/the-upstream-was-deleted-then-came-back-rewritten.jpg"
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2025-02-20
updatedDate: 2026-10-16
category: engineering
tags: ["javascript", "i18n", "debugging", "frontend"]
ogImage: /og/two-ways-a-javascript-file-stops-working-and-looks-fine.png
banner: /banners/two-ways-a-javascript-file-stops-working-and-looks-fine.png
ogImage: /og/zh-two-ways-a-javascript-file-stops-working-and-looks-fine.jpg
banner: /banners/two-ways-a-javascript-file-stops-working-and-looks-fine.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "Unraid 停止阵列时一直卡在卸载磁盘:btrfs RAID1 上
pubDate: 2026-09-15
category: devops
tags: [unraid, swap, btrfs, zram, docker, user-scripts]
ogImage: /og/unraid-stop-array-hangs-on-swapfile.png
banner: /banners/unraid-stop-array-hangs-on-swapfile.png
ogImage: /og/zh-unraid-stop-array-hangs-on-swapfile.jpg
banner: /banners/unraid-stop-array-hangs-on-swapfile.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "CodeIgniter 4.7 官方升级指南列了八项破坏性变更。
pubDate: 2026-09-27
category: notes
tags: [codeigniter, php, upgrade, composer, breaking-changes, config, framework]
ogImage: /og/upgrading-codeigniter-46-to-47.png
banner: /banners/upgrading-codeigniter-46-to-47.png
ogImage: /og/zh-upgrading-codeigniter-46-to-47.jpg
banner: /banners/upgrading-codeigniter-46-to-47.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "从马来西亚使用中国大模型 API(GLM-5.3、DeepSeek V4
pubDate: 2026-09-11
category: ai
tags: [llm, api, deepseek, glm, alipay, malaysia]
ogImage: /og/using-chinese-llm-apis-from-malaysia.png
banner: /banners/using-chinese-llm-apis-from-malaysia.png
ogImage: /og/zh-using-chinese-llm-apis-from-malaysia.jpg
banner: /banners/using-chinese-llm-apis-from-malaysia.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-09-28
updatedDate: 2026-09-29
category: engineering
tags: [php, codeigniter, pdf, css, print, testing]
ogImage: /og/verifying-a-pdf-report-page-by-page.png
banner: /banners/verifying-a-pdf-report-page-by-page.png
ogImage: /og/zh-verifying-a-pdf-report-page-by-page.jpg
banner: /banners/verifying-a-pdf-report-page-by-page.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "六项检查,专门抓出「文档说得漂亮、代码里其实
pubDate: 2026-09-29
category: devops
tags: ["open-source", "due-diligence", "oidc", "self-hosting", "docker"]
ogImage: "/og/vetting-an-open-source-dependency-before-you-bet-on-it.png"
banner: "/banners/vetting-an-open-source-dependency-before-you-bet-on-it.png"
ogImage: "/og/zh-vetting-an-open-source-dependency-before-you-bet-on-it.jpg"
banner: "/banners/vetting-an-open-source-dependency-before-you-bet-on-it.jpg"
draft: false
---
@@ -4,8 +4,8 @@ description: "两块看起来完全健康的 NVMe 组成的 btrfs RAID1 阵列
pubDate: 2026-09-16
category: devops
tags: [unraid, btrfs, nvme, raid, storage, data-loss, troubleshooting]
ogImage: /og/when-smart-says-healthy-but-your-raid-is-corrupting-data.png
banner: /banners/when-smart-says-healthy-but-your-raid-is-corrupting-data.png
ogImage: /og/zh-when-smart-says-healthy-but-your-raid-is-corrupting-data.jpg
banner: /banners/when-smart-says-healthy-but-your-raid-is-corrupting-data.jpg
---
所有存储指南都告诉你同一件事:相信 SMART、检查事件日志、相信你的文件系统。我的硬件不这么想。2026 年 9 月,一个 btrfs RAID1 阵列——两块企业级 NVMe 盘镜像,我用每个能想到的工具查它都说**「健康」**——却在悄悄地把我的 Windows 11 虚拟机喂成全零字节。不是看得见的故障,是静默损坏。
@@ -4,8 +4,8 @@ description: "过去 30 天,自主编程 Agent 在 5 个仓库中累计新增
pubDate: "2026-10-18"
category: "engineering"
tags: ["ai", "git", "devops", "testing", "refactoring"]
ogImage: "/og/why-500000-lines-of-commit-churn-only-left-230000-in-production.png"
banner: "/banners/why-500000-lines-of-commit-churn-only-left-230000-in-production.png"
ogImage: "/og/zh-why-500000-lines-of-commit-churn-only-left-230000-in-production.jpg"
banner: "/banners/why-500000-lines-of-commit-churn-only-left-230000-in-production.jpg"
---
上周我做了一件平时几乎不会做的事:数了数自己的提交。不是数我记得写过的那些,而是数仓库里真实记录下来的那些。自建 Gitea 上 5 个生产仓库、三十天、一个人:865 次 Commit、新增 518,233 行、删除 130,892 行。
@@ -4,8 +4,8 @@ description: "Chrome 的「继续上次浏览」在 Docker 容器里根本不会
pubDate: 2026-09-29
category: devops
tags: [docker, chrome, cdp, persistence, synology, self-hosting]
ogImage: /og/why-chrome-forgets-its-tabs-in-a-container.png
banner: /banners/why-chrome-forgets-its-tabs-in-a-container.png
ogImage: /og/zh-why-chrome-forgets-its-tabs-in-a-container.jpg
banner: /banners/why-chrome-forgets-its-tabs-in-a-container.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "Claude Opus 和 GPT 確實比我能在本地跑的任何模型都
pubDate: 2026-09-21
category: ai
tags: [local-llm, gpu, llama-cpp, lm-studio, agents, self-hosting, cost]
ogImage: /og/why-i-still-bought-a-local-gpu.png
banner: /banners/why-i-still-bought-a-local-gpu.png
ogImage: /og/zh-why-i-still-bought-a-local-gpu.jpg
banner: /banners/why-i-still-bought-a-local-gpu.jpg
draft: false
---
@@ -4,8 +4,8 @@ description: "为什么我在 Windows 上克隆后链上 NFT 的图像变了:c
pubDate: 2026-08-19
category: web3
tags: [foundry, solidity, svg, base64, git, windows, crlf]
ogImage: /og/why-my-on-chain-nft-art-changed-on-windows.png
banner: /banners/why-my-on-chain-nft-art-changed-on-windows.png
ogImage: /og/zh-why-my-on-chain-nft-art-changed-on-windows.jpg
banner: /banners/why-my-on-chain-nft-art-changed-on-windows.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-03-25
updatedDate: 2026-09-09
category: devops
tags: [docker, telegram, python, dns, ipv6, debugging, portainer]
ogImage: /og/why-telegram-bot-notifications-die.png
banner: /banners/why-telegram-bot-notifications-die.png
ogImage: /og/zh-why-telegram-bot-notifications-die.jpg
banner: /banners/why-telegram-bot-notifications-die.jpg
---
我跑着一个小监控机器人,专门盯着 Carousell 上新上架的商品,一旦有新品就通过
@@ -5,8 +5,8 @@ pubDate: 2025-03-19
updatedDate: 2026-09-29
category: devops
tags: [cdp, chrome, react, browser-automation, debugging, python]
ogImage: /og/why-your-cdp-clicks-silently-fail.png
banner: /banners/why-your-cdp-clicks-silently-fail.png
ogImage: /og/zh-why-your-cdp-clicks-silently-fail.jpg
banner: /banners/why-your-cdp-clicks-silently-fail.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-05-17
updatedDate: 2026-09-29
category: devops
tags: [grafana, prometheus, dashboards, monitoring, promql, observability]
ogImage: /og/why-your-grafana-dashboard-shows-no-data.png
banner: /banners/why-your-grafana-dashboard-shows-no-data.png
ogImage: /og/zh-why-your-grafana-dashboard-shows-no-data.jpg
banner: /banners/why-your-grafana-dashboard-shows-no-data.jpg
draft: false
---
@@ -5,8 +5,8 @@ pubDate: 2026-01-21
updatedDate: 2026-09-10
category: case-studies
tags: [scraping, playwright, browserless, docker, goofish, carousell, anti-bot]
ogImage: /og/why-your-headless-browser-cant-scrape-everything.png
banner: /banners/why-your-headless-browser-cant-scrape-everything.png
ogImage: /og/zh-why-your-headless-browser-cant-scrape-everything.jpg
banner: /banners/why-your-headless-browser-cant-scrape-everything.jpg
---
我在短短几周里,分别在两个不同的二手交易平台上撞上了同一堵墙,而这组对照
@@ -5,8 +5,8 @@ pubDate: 2026-06-24
updatedDate: 2026-09-29
category: devops
tags: [monitoring, alerting, prometheus, grafana, storage, capacity, observability]
ogImage: /og/your-disk-full-alert-is-lying.png
banner: /banners/your-disk-full-alert-is-lying.png
ogImage: /og/zh-your-disk-full-alert-is-lying.jpg
banner: /banners/your-disk-full-alert-is-lying.jpg
draft: false
---