diff --git a/.og/gen/authentik-major-upgrade-gotchas.html b/.og/gen/authentik-major-upgrade-gotchas.html
new file mode 100644
index 0000000..c6b6dd9
--- /dev/null
+++ b/.og/gen/authentik-major-upgrade-gotchas.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
Mr Hoelee · blog.hoelee.com
+
+
+ devops · DevOps
+
+ Authentik 2025.8 to 2026.8: The Breakable
Parts Nobody Warns You About
+
+
+
+
$docker compose pull authentik-worker
+
authorization_flow not found · SSO broken
+
$uptime: 2025.8 → 2026.8fixed ✓
+
+
+
+
+
\ No newline at end of file
diff --git a/.og/gen/authentik-major-upgrade-gotchas.png b/.og/gen/authentik-major-upgrade-gotchas.png
new file mode 100644
index 0000000..8ce5d32
Binary files /dev/null and b/.og/gen/authentik-major-upgrade-gotchas.png differ
diff --git a/.og/gen/hello-world.html b/.og/gen/hello-world.html
new file mode 100644
index 0000000..f7435dc
--- /dev/null
+++ b/.og/gen/hello-world.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
Mr Hoelee · blog.hoelee.com
+
+
+ notes · DevOps
+
+ Hello, World —
About This Blog
+
+
+
+
$git init hoelee-blog · first commit
+
technical writing · self-hosting · build log
+
$about → blog.hoelee.com
+
+
+
+
+
\ No newline at end of file
diff --git a/.og/gen/hello-world.png b/.og/gen/hello-world.png
new file mode 100644
index 0000000..98062f5
Binary files /dev/null and b/.og/gen/hello-world.png differ
diff --git a/.og/gen/how-i-built-the-digikedai-telegram-bot.html b/.og/gen/how-i-built-the-digikedai-telegram-bot.html
new file mode 100644
index 0000000..081c55a
--- /dev/null
+++ b/.og/gen/how-i-built-the-digikedai-telegram-bot.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
Mr Hoelee · blog.hoelee.com
+
+
+ case-studies · DevOps
+
+ How I Built the
DigiKedai Telegram AI Bot
+
+
+
+
$user:"does this course have a free trial?"
+
bot → yes, here's your account ✓ (24/7, no human)
+
$grammY · LiteLLM · Cloudflare tunnel
+
+
+
+
+
\ No newline at end of file
diff --git a/.og/gen/how-i-built-the-digikedai-telegram-bot.png b/.og/gen/how-i-built-the-digikedai-telegram-bot.png
new file mode 100644
index 0000000..545f3b9
Binary files /dev/null and b/.og/gen/how-i-built-the-digikedai-telegram-bot.png differ
diff --git a/.og/gen/how-i-host-this-blog.html b/.og/gen/how-i-host-this-blog.html
new file mode 100644
index 0000000..cad3471
--- /dev/null
+++ b/.og/gen/how-i-host-this-blog.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
Mr Hoelee · blog.hoelee.com
+
+
+ case-studies · DevOps
+
+ How I Host This Blog: Astro,
Gitea Actions, and Self-Hosted CI/CD
+
+
+
+
$git push origin main
+
Gitea Actions → unRaid runner → nginx → Cloudflare ✓
+
$git-as-CMS · zero-downtime deploy
+
+
+
+
+
\ No newline at end of file
diff --git a/.og/gen/how-i-host-this-blog.png b/.og/gen/how-i-host-this-blog.png
new file mode 100644
index 0000000..cab45b3
Binary files /dev/null and b/.og/gen/how-i-host-this-blog.png differ
diff --git a/public/og/authentik-major-upgrade-gotchas.png b/public/og/authentik-major-upgrade-gotchas.png
new file mode 100644
index 0000000..8ce5d32
Binary files /dev/null and b/public/og/authentik-major-upgrade-gotchas.png differ
diff --git a/public/og/hello-world.png b/public/og/hello-world.png
new file mode 100644
index 0000000..98062f5
Binary files /dev/null and b/public/og/hello-world.png differ
diff --git a/public/og/how-i-built-the-digikedai-telegram-bot.png b/public/og/how-i-built-the-digikedai-telegram-bot.png
new file mode 100644
index 0000000..545f3b9
Binary files /dev/null and b/public/og/how-i-built-the-digikedai-telegram-bot.png differ
diff --git a/public/og/how-i-host-this-blog.png b/public/og/how-i-host-this-blog.png
new file mode 100644
index 0000000..cab45b3
Binary files /dev/null and b/public/og/how-i-host-this-blog.png differ
diff --git a/scripts/og-gen/generate.mjs b/scripts/og-gen/generate.mjs
index 0cc0427..f70bcd4 100644
--- a/scripts/og-gen/generate.mjs
+++ b/scripts/og-gen/generate.mjs
@@ -38,6 +38,26 @@ const TERMINALS = {
$docker exec monitor python check_notify.py
telegram sendPhoto failed: 400 nginx/1.30.1
$fix = IPv6 · DNS · multipart→ delivered ✓
`,
+
+ 'hello-world': `
+ $git init hoelee-blog · first commit
+ technical writing · self-hosting · build log
+ $about → blog.hoelee.com
`,
+
+ 'how-i-host-this-blog': `
+ $git push origin main
+ Gitea Actions → unRaid runner → nginx → Cloudflare ✓
+ $git-as-CMS · zero-downtime deploy
`,
+
+ 'how-i-built-the-digikedai-telegram-bot': `
+ $user:"does this course have a free trial?"
+ bot → yes, here's your account ✓ (24/7, no human)
+ $grammY · LiteLLM · Cloudflare tunnel
`,
+
+ 'authentik-major-upgrade-gotchas': `
+ $docker compose pull authentik-worker
+ authorization_flow not found · SSO broken
+ $uptime: 2025.8 → 2026.8fixed ✓
`,
};
const DEFAULT_TERMINAL = `
diff --git a/src/content/posts/authentik-major-upgrade-gotchas.md b/src/content/posts/authentik-major-upgrade-gotchas.md
index 8d0d4fd..857c73c 100644
--- a/src/content/posts/authentik-major-upgrade-gotchas.md
+++ b/src/content/posts/authentik-major-upgrade-gotchas.md
@@ -4,6 +4,7 @@ description: "A year's worth of authentik major-version upgrade pain: storage mo
pubDate: 2026-09-09
category: devops
tags: [authentik, sso, docker, portainer, self-hosting, oidc, upgrade]
+ogImage: /og/authentik-major-upgrade-gotchas.png
---
I run authentik as the single sign-on gate in front of my self-hosted stack —
diff --git a/src/content/posts/hello-world.md b/src/content/posts/hello-world.md
index 580fd22..9f1f420 100644
--- a/src/content/posts/hello-world.md
+++ b/src/content/posts/hello-world.md
@@ -4,6 +4,7 @@ description: "What this blog is for: technical writing, self-hosting experience,
pubDate: 2026-09-05
category: notes
tags: [intro]
+ogImage: /og/hello-world.png
---
Welcome. This is where I write about what I build and learn — mostly
diff --git a/src/content/posts/how-i-built-the-digikedai-telegram-bot.md b/src/content/posts/how-i-built-the-digikedai-telegram-bot.md
index b6304fa..cf0c401 100644
--- a/src/content/posts/how-i-built-the-digikedai-telegram-bot.md
+++ b/src/content/posts/how-i-built-the-digikedai-telegram-bot.md
@@ -4,6 +4,7 @@ description: "A customer-support AI bot that answers questions and provisions fr
pubDate: 2026-09-06
category: case-studies
tags: [telegram, docker, cloudflare, litellm, typescript, ai]
+ogImage: /og/how-i-built-the-digikedai-telegram-bot.png
---
Digi Kedai sells digital products — online courses, ebooks, and templates — and
diff --git a/src/content/posts/how-i-host-this-blog.md b/src/content/posts/how-i-host-this-blog.md
index 8c1e19d..3e98cba 100644
--- a/src/content/posts/how-i-host-this-blog.md
+++ b/src/content/posts/how-i-host-this-blog.md
@@ -4,6 +4,7 @@ description: "A walkthrough of the end-to-end pipeline that builds and serves th
pubDate: 2026-09-04
category: case-studies
tags: [astro, gitea, ci-cd, self-hosting, docker, cloudflare]
+ogImage: /og/how-i-host-this-blog.png
---
This blog is itself a project I built to demonstrate the kind of work I do.
diff --git a/src/content/posts/zh/authentik-major-upgrade-gotchas.md b/src/content/posts/zh/authentik-major-upgrade-gotchas.md
index e85467c..69a3af4 100644
--- a/src/content/posts/zh/authentik-major-upgrade-gotchas.md
+++ b/src/content/posts/zh/authentik-major-upgrade-gotchas.md
@@ -4,6 +4,7 @@ description: "一年份的 authentik 大版本升级踩坑记录:存储挂载
pubDate: 2026-09-09
category: devops
tags: [authentik, sso, docker, portainer, self-hosting, oidc, upgrade]
+ogImage: /og/authentik-major-upgrade-gotchas.png
---
我把 authentik 当作自托管体系前面的单点登录闸门——邮箱、仪表盘、Synology
diff --git a/src/content/posts/zh/how-i-built-the-digikedai-telegram-bot.md b/src/content/posts/zh/how-i-built-the-digikedai-telegram-bot.md
index fda71bf..cbc67bc 100644
--- a/src/content/posts/zh/how-i-built-the-digikedai-telegram-bot.md
+++ b/src/content/posts/zh/how-i-built-the-digikedai-telegram-bot.md
@@ -4,6 +4,7 @@ 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
---
Digi Kedai 销售数字产品——在线课程、电子书、模板——每一单都会带来一连串同样的顾客问题:*「这门课有免费试看吗?」「我怎么拿到账号?」「我该买哪个套餐?」*。对一个人的生意来说,人工回复根本忙不过来。于是我打造了一个 AI 客服机器人,全天候解答这些问题,甚至能在无人介入的情况下自动发放免费试用账号。
diff --git a/src/content/posts/zh/how-i-host-this-blog.md b/src/content/posts/zh/how-i-host-this-blog.md
index 8f9ffe1..f6c3ca5 100644
--- a/src/content/posts/zh/how-i-host-this-blog.md
+++ b/src/content/posts/zh/how-i-host-this-blog.md
@@ -4,6 +4,7 @@ description: "这篇文章完整拆解了这个网站背后的构建与部署管
pubDate: 2026-09-06
category: case-studies
tags: [astro, gitea, ci-cd, self-hosting, docker, cloudflare]
+ogImage: /og/how-i-host-this-blog.png
---
这个博客本身,就是我用来说明「我到底会做什么」的一个项目。下面是完整的