Blog
Updates, notes, and write-ups from the team.

The Discipline Behind All of This
k3s Series #15 — Fourteen posts of incidents. One habit shows up in almost every single one of them.

Containerd Filled the System Disk: A Two-Phase, Minimal-Downtime Migration
k3s Series #14 — Three identical machines. One small decision at join time. Three completely different maintenance bills, years later.

When You Can't Replace the HDD: Buying etcd More Time
k3s Series #13 — I assumed etcd and Longhorn were fighting over the same disk. They weren't even on the same physical drive.

Your k3s HA Might Be Fake: How a Traditional HDD Quietly Undermines etcd
k3s Series 12–3 servers, verified quorum, a VIP, audited N-1 capacity. None of it matters if the disk underneath etcd can’t keep up. Every fix in this series...

Multiple Nodes Isn't the Same as Highly Available: A Full HA Audit
k3s Series 11 — I had 3 servers, replicated storage, a VIP, and no idea whether any of it would actually survive losing a node under real load. So I did the...

One IP to Rule the Control Plane: Adding a VIP to k3s HA
k3s Series 10 — The control plane finally had no single point of failure. My kubectl config still pointed at one. Three servers, one address that doesn’t care...

Alerting Isn't Just Adding Rules: The PromQL Traps I Hit
k3s Series 9 — A PromQL query reads like a sentence. It doesn’t behave like one. Every rule here looked right on the first read. Most of them weren’t. This is...

Prometheus + External Grafana: Wiring Up Monitoring for Production
k3s Series 8 — HA and backups don’t matter if you’re the last to know something’s wrong. This is the plumbing that closes that gap. The metrics were always...

Assume All 3 Machines Die: A Full Disaster Recovery Drill
k3s Series 7 — A backup you’ve never restored from isn’t a backup. It’s a hypothesis. Three empty machines, two backup files, and a procedure I need to...

Off-Site Backup: etcd Snapshots and Longhorn’s Double Insurance
k3s Series 6 — HA answers “what if one machine dies.” This post is about the question HA can’t answer: what if all three die at once? The cluster’s brain and...

From SQLite to a 3-Server etcd Cluster: The Full HA Upgrade
k3s Series 5 — There’s a one-way door in this migration. Cross it, and there’s no going back to the way things were. Three nodes were already running. Only o...

RWO→RWX: Down the Rabbit Hole to a Corrupted Instance-Manager
k3s Series 4 — The error message said “Multi-Attach.” The actual problem was a container that had quietly stopped being able to write to its own disk. What l...

Longhorn PVC Operations: Shrinking and Growing Storage Without Losing Data
k3s Series 3 — Kubernetes won’t let you shrink a PVC. Once you understand why, the same trick fixes two completely different problems. You can’t resize a PVC...

From 1 Node to 3: The Full Story of Building Out Longhorn
k3s Series 2 — Every volume in the cluster said “degraded.” Not one of them was actually broken. Three connected nodes, finally enough room for every replica...

The Moment a Single Node Couldn’t Keep Up: It Started With a Capacity Report
k3s Series 1 — An automated risk report turned my “it’s probably fine” instinct into a red Critical label A single node is a single point of failure — the fi...

Running Production Solo: My k3s High-Availability Journey — Series Overview
Everything I broke, diagnosed, and eventually fixed while self-hosting a k3s production cluster — alone. The full, chronological record of that build.

I Redesigned My App in Claude Design, Then Spent a Weekend Getting Claude Code to Actually Use It
Five attempts, one that finally worked, and a 95% match to the design — using nothing but Sonnet 5.

Duke AI PM 學習筆記(六):AI 模型不是部署就結束,建立可持續演進的 Machine Learning Lifecycle
提到 Machine Learning,許多人第一個想到的是訓練模型。但真正困難的,是讓它在 Production 環境中持續穩定運作——這篇整理一套完整的 Machine Learning Lifecycle。

I Ran Out of Gas Mid-Sprint With Claude Code, So I Built It a Fuel Gauge
Can't see your Claude Code usage until you hit the wall? I built a macOS menu bar app that tracks it live — no private APIs, just the official statusLine.

I Fed My Tech Profile Into a Homepage Generator So I'd Never Have to Write "About My Projects" Again
A few weeks ago I solved the "documentation tax" problem — the tedious hours it takes to turn a codebase into a readable writeup.
Duke AI PM 學習筆記 (五):從模型監控到概念漂移,打造能長期創造價值的 AI 產品
一個 Accuracy 高達 99% 的模型,上線後仍然可能失敗。問題不一定出在模型,而可能來自資料品質、網路延遲、使用流程,甚至是真實世界本身。
Welcome to Our Blog
We're launching a blog to share updates, behind-the-scenes notes, and technical write-ups about building this tool website.
Duke AI PM 學習筆記 (三):從建模流程到演算法選型,構建 AI 產品的技術底座
這份筆記結合了我的個人學習心得與課程教材的核心概念,更有系統地帶大家掌握 ML 的核心機制,以及在實務上如何透過標準化的建模流程與演算法要點,來構建 AI 產品。

How I Built a Claude Code Skill to Instantly Turn Any Codebase Into a Portfolio-Ready Doc
As developers, we spend countless hours building cool projects. But when it comes to showcasing them on our portfolios, resumes, or social media, we run into a universal bottleneck: documentation.
Duke AI PM 學習筆記 (四):從決策樹到 Transformer,拆解演算法地圖與訓練機制
這份筆記整理結合了我的個人筆記與課程教材中的核心概念,期望能有效幫助大家更有系統化地掌握機器學習模型的內部運作、訓練機制與深度學習架構的要點。

訓練模型只是開始:完整解析 Machine Learning Lifecycle
提到 Machine Learning,許多人第一個想到的往往是模型訓練。但在 Production 環境中,訓練模型通常只佔整個 ML 系統的一小部分——本文帶你理解一個完整的 Machine Learning Lifecycle。

SQLZOO I - SELECT basics
SQLZOO 是個免費在線學習 SQL的網站資源,有提供繁體中文版本。採互動式教學,可在上面運行 SQL執行查看,更快的掌握 SQL技能。
Tool Website offers a collection of free, easy-to-use online tools including calculator, unit converter, todo list, password generator, QR code generator, timer, stopwatch, pomodoro timer, and clock. Boost your productivity and simplify your daily tasks.