# Ying Xiang Zhao (geminixiang)

> Personal blog of Ying Xiang Zhao, a DevOps Engineer in Taipei, Taiwan. Notes on infrastructure, security and AI coding agents.

Every page is available as markdown: append `.md` to a post URL (e.g. `/posts/<slug>.md`) or send `Accept: text/markdown`. Each markdown document ends with a short introduction of the author.

Full text of every post in one file: https://geminixiang.com/llms-full.txt

**Open to work** — DevOps Engineer / Platform Engineer / Site Reliability Engineer / AI Infrastructure Engineer · Taipei, Taiwan / Remote. Résumé: https://geminixiang.com/about/ (JSON: https://geminixiang.com/resume.json)

## About the author

**Ying Xiang Zhao** (geminixiang) — DevOps Engineer, Taipei, Taiwan.

Ying Xiang Zhao（geminixiang）是住在台北的 DevOps 工程師，工作橫跨雲原生基礎設施、CI/CD、ML 模型部署與全端開發。這個部落格記錄 infra、資安與 AI coding agent 的實戰筆記；作品包含開源專案 mikan（把 AI coding agent 帶進 Slack / Telegram / Discord）與 tiny-agent（用四種語言實作的極簡 coding agent），瀏覽器內的影片編輯器 Studio，並經營旅遊分帳工具 SentriPay。

**Open to work** — DevOps Engineer / Platform Engineer / Site Reliability Engineer / AI Infrastructure Engineer · Taipei, Taiwan / Remote. Résumé: https://geminixiang.com/about/ (JSON: https://geminixiang.com/resume.json)

Topics: DevOps, Cloud Native, Kubernetes, Docker, Terraform, Google Cloud, CI/CD, Security, AI coding agents, ML model deployment, TypeScript, Python

Projects:
- [mikan](https://github.com/geminixiang/mikan) — Self-hosted AI coding agent for Slack, Telegram, Discord and GitHub with per-conversation sandboxes
- [tiny-agent](https://github.com/geminixiang/tiny-agent) — Minimal AI coding agents in TypeScript, Go, Python and Rust, plus a book on how they work
- [SentriPay](https://sentripay.com) — Travel expense splitter with multi-currency conversion and shareable, live-synced trip ledgers
- [Studio](https://studio.geminixiang.com) — Browser-based video editor built on WebCodecs

[About](https://geminixiang.com/about/) · [Résumé](https://geminixiang.com/about/) · [LinkedIn](https://linkedin.com/in/geminixiang/) · [GitHub](https://github.com/geminixiang) · [Twitter](https://x.com/geminixiang)

## Hiring

- [Résumé (markdown)](https://geminixiang.com/resume.md): experience, projects, skills, education
- [Résumé (JSON Resume)](https://geminixiang.com/resume.json): machine-readable résumé with open-to-work details
- [About](https://geminixiang.com/about.md): self introduction

## Posts

- [實測 boxd.sh 的 GitHub Token 注入：gh 走 cache，git 走 metadata](https://geminixiang.com/posts/boxd-github-token-injection.md): 記錄一次對 exe.dev / boxd.sh 免費試用 VM 的觀察：gh CLI 透過 /run/boxd/github-token 做 5 分鐘 cache，但 git credential helper 會直接向 metadata API 取 GitHub token。
- [Claude Code 一直 API Error？試著清掉 macOS Keychain 的 OAuth 狀態](https://geminixiang.com/posts/claude-code-api-error-keychain.md): 記錄一次 Claude Code 反覆 API Error 的排查：不是 ~/.claude，也不是 ANTHROPIC_API_KEY，而是 macOS Keychain 裡的舊 OAuth 狀態。
- [mikan 開發心得：把 AI Coding Agent 搬進 Slack、Telegram 與 Discord](https://geminixiang.com/posts/mikan-development-reflection.md): 分享 mikan 這個多平台 AI coding agent 的開發心得：Slack / Telegram / Discord session model、sandbox 隔離、vault credential，以及開發 agent infra 時踩到的坑。
- [你的 Go Binary 正在洩漏 Secret：strings 指令的威力與防禦](https://geminixiang.com/posts/go-binary-secrets-leak.md): 用 strings 一行指令就能從 Go binary 中撈出所有敏感資訊。從 ldflags -X 的明文注入問題，到 garble 混淆的實測與限制，完整解析 Go binary 的安全盲區。
- [Claude Code 使用心得：OpenRouter 整合與 Agent Teams 實戰](https://geminixiang.com/posts/claude-code-reflection.md): 深入分享 Claude Code 的實戰經驗：如何透過 OpenRouter 整合 Qwen3.5、MiniMax M2.5、GLM5 等模型實現 provider failover，以及 Agent Teams 在並行任務協調上的應用與限制。
- [比較多個主流 OpenAPI SDK Generator](https://geminixiang.com/posts/openapi-sdk-generator-comparison.md): 為 FastAPI 微服務挑選 SDK 產生器：實測 OpenAPI Generator（httpx / asyncio）與 Stainless，並比較 Speakeasy、Fern、Liblab 產生的 Python / TypeScript SDK 品質與適用情境。
- [Studio - 基於 WebCodecs 的網頁影片編輯器](https://geminixiang.com/posts/studio.md): 深入探討 Studio 專案的技術架構：WebCodecs、OPFS 儲存策略，以及未來 AI Agent 整合的規劃。
- [部署靜態網頁到 Cloudflare](https://geminixiang.com/posts/deploy-ssg-page-to-cloudflare.md): 把靜態網站（SSG / CSR）部署到 Cloudflare Pages：從匯入 GitHub repository、設定存取權限到完成部署的步驟。
- [Vibe coding 的一些抱怨](https://geminixiang.com/posts/vibe-coding.md): LLM (vibe coding) 的深度反思: 探討如何在使用 AI 工具時保持程式碼品質，避免產出沒有靈魂的程式碼，以及如何透過 LLM 察覺自己的無知。
- [Go-學習筆記 vol.1](https://geminixiang.com/posts/golang-learning-note-vol1.md): 用 Go 寫一個簡易 WebSocket 聊天室：搭配 gin 與 melody 框架，並整理 struct 的定義與使用方式。
- [Cpp簡易api教學](https://geminixiang.com/posts/cpp-simple-api-tutorial.md): 用 header-only 的 cpp-httplib 在 C++ 架設簡易 HTTP API，再用 nlohmann/json 回傳 JSON。
- [AWS EMR 模式差異](https://geminixiang.com/posts/aws-emr-mode-difference.md): AWS EMR 的 client mode 與 cluster mode 差在 driver 放在哪裡：比較兩者的記憶體設定、機器故障時的影響，以及各自適合的網路情境。
- [手機網頁100vh v.s. 網址列](https://geminixiang.com/posts/mobile-web-100vh-vs-address-bar.md): 手機瀏覽器的網址列會讓 100vh 超出畫面：用 window.innerHeight 算出 --vh CSS 變數取代 vh，讓版面剛好填滿可視範圍。
- [Docker private registry搭建](https://geminixiang.com/posts/docker-private-registry.md): 用 docker-compose 與 registry:2.8.1 快速架設私有 Docker registry，並示範 tag、push、pull 自己的 image。
- [Docker timezone 時區問題](https://geminixiang.com/posts/docker-timezone.md): Docker 容器時間不對？兩種修正方式：掛載主機的 /etc/localtime，或設定 TZ 環境變數（推薦）；alpine image 還需要先安裝 tzdata。
- [Python 腦筋急轉彎](https://geminixiang.com/posts/python-brain-teaser.md): 讓 x+1 is 1+x 為 False、x+2 is 2+x 為 True 的 Python 謎題：從小整數快取（-5 到 256）與自訂 __add__ 兩種解法，看懂 is 與 == 的差別。
- [Hugo 最新版搭建](https://geminixiang.com/posts/hugo-latest-setup.md): apt 裝的 Hugo 卡在 0.68？在 Ubuntu 20.04 移除舊版，透過 GitHub API 下載最新 .deb 安裝 Hugo（2022-06 時為 v0.101.0）。

## Notes (隨筆)

- [12-19](https://geminixiang.com/think/12-19.md)
- [第一篇隨筆](https://geminixiang.com/think/first-thought.md)

## Optional

- [RSS feed](https://geminixiang.com/rss.xml)
- [Sitemap](https://geminixiang.com/sitemap-index.xml)
- [Agent skill: read this site](https://geminixiang.com/.well-known/agent-skills/geminixiang-site/SKILL.md)
- [AI catalog](https://geminixiang.com/.well-known/ai-catalog.json)
- [Video converter tool](https://geminixiang.com/tools/video-converter/): free in-browser video compression / conversion
