378d55c3c8e64084064ef5d203131d7065f12771
Deploy / build (push) Successful in 22s
1) the-upstream-was-deleted-then-came-back-rewritten (devops, pubDate 2026-10-06) docker pull hectorqin/reader -> 404; the repo was re-initialised 2026-09-16 and now carries 233 commits, a TypeScript/Node rewrite, port 5888, SQLite /data, config moved into the admin UI, and an image on cnb.cool with no tags or releases. Covers telling dead from rewriting, the migration boundary, and keeping the front door outside the app image. Facts re-verified live 2026-10-06. 2) putting-a-front-door-on-an-app-you-cant-modify (devops, pubDate 2025-06-24 backdated into the empty 2025-06 window, updatedDate 2026-10-06 so lastmod stays honest) The reader-gateway pattern: a second nginx container owning the public port, the request-time resolver, why a proxy body rewrite cannot touch a client-rendered SPA, the gate-bounce injection with its pass token, the app's own CSS hook for branding, and the silent-failure check to run after every app upgrade. Both: EN + ZH twins, TERMINALS/BANNERS entries appended via append_generator_entries.py (additive, deletions 0, node --check OK), og/banner generated and measured PASS (og rows=1 overflow=0 missingHash=0; banner 8 rows, delta 2, overflow 0).
hoelee-blog
My personal technical blog — where I write about what I build and learn.
Built with Astro 5 + Markdown, deployed via self-hosted Gitea CI/CD to an nginx container on my unRaid server, served through Cloudflare tunnel + CDN. Live at blog.hoelee.com.
Purpose (read this first)
This blog exists so that when a recruiter, hiring manager, or freelance client Googles "Lee Teong Hoe", they land on a stream of concrete technical work that proves I can build things — plus a clear, trustworthy picture of who I am. It backs the job hunt and the freelance funnel (Upwork / Fiverr / Codeable).
- 67% of hiring managers check a candidate's online presence before deciding (Stack Overflow 2025).
- SEO is a long game — while posts rank, the blog doubles as a portfolio and inbound-lead magnet.
Every decision below optimizes for credibility + discoverability + speed of shipping, not monetization or vanity traffic.
Stack
- Framework: Astro 5 (static output, zero runtime JS by default)
- Content: Markdown + MDX, versioned in git
- i18n: English (default) + Chinese (
zh) — English-first - CI/CD: Gitea Actions →
act_runneron unRaid → nginx container - Host: nginx on unRaid → Cloudflare tunnel → Cloudflare CDN
Structure
src/
content/
posts/ # English posts (flat)
zh/ # Chinese posts (subfolder -> /posts/zh/<slug>/)
pages/
index.astro # homepage
posts/[...slug].astro # post template
about.astro
layouts/
BaseLayout.astro
lib/
lang.ts # derives en/zh from folder path
docs/
content-guide.md # what to write, what to avoid (READ before writing a post)
post-guideline.md # HOW to write it: title case, locale, frontmatter, publish flow
design-guide.md # what the design must have, what to avoid (READ before touching UI)
seo-reference.md # E-E-A-T / name identity, SEO + GEO checklist, syndication
ops-runbook.md # pipeline, publish steps, build pitfalls, health checks
project-state.md # enhancement backlog (Tier 1/2/3) — work through one by one
Knowledge guides (my rules of thumb)
| Doc | When to read |
|---|---|
docs/content-guide.md |
Before writing/planning any blog post — categories, post types, the "hard job → post" template, and the anti-patterns. |
docs/post-guideline.md |
Before writing/editing a post — title case, locale folder structure, frontmatter, publish flow. |
docs/design-guide.md |
Before changing theme, layout, typography, color, or SEO markup. |
docs/seo-reference.md |
Before adding posts/<head> markup or debugging search visibility. |
docs/ops-runbook.md |
Before debugging CI/CD, deployment, or hosting. |
docs/project-state.md |
To see what's next — the prioritized enhancement backlog. |
Write a post
- Create
src/content/posts/<slug>.md(English) orsrc/content/posts/zh/<slug>.md(Chinese) with frontmatter (see content guide — nolang:field, it's derived from the folder). - Push to
main. - CI builds and deploys automatically.
Categories
engineering · devops · ai · web3 · tutorials · case-studies · notes
Conventions
- Repo publishing order: push to git.hoelee.com (Gitea) first, then GitHub. (My standing convention.)
- Language: English posts flat in
posts/; Chinese posts inposts/zh/; no Malay. - Theme: defaults to dark mode (light is opt-in via the toggle).
- No overclaiming — especially Web3 (learning projects, not production DeFi).
- Name identity is consistent everywhere: "Lee Teong Hoe" / "Mr Hoelee" + same photo + same
sameAshandles across blog, LinkedIn, GitHub, git.hoelee.com.
Description
Personal technical blog of Lee Teong Hoe (Mr Hoelee) - full-stack engineering, DevOps & self-hosting, AI automation, and Web3. Built with Astro 5 + Markdown, deployed via self-hosted Gitea Actions CI/CD. English-first, Chinese under /posts/zh/.
https://blog.hoelee.com
Readme
12 MiB