專案
這是整理我至今為止進行過的專案的頁面。從個人專案到開源貢獻、學校作業全都收錄在這裡(...) 比想像中還多呢。
開源貢獻
雖然沒有想透過開源貢獻獲得什麼榮華富貴.. 但用各種開源工具的時候,意外地會發現一些不能正常運作的東西。與其等別人來修,不如自己修還比較快,所以每次有需要時就會自己動手修好並提交 PR。
2025
- rustfs/rustfs #1018 — 把 Helm chart 中的 storageSize 拆成 data/log 各自獨立的參數。資料儲存空間設成 2TB 的話日誌也會變成 2TB(...) 拜託請拆開來吧,我這樣請求的。
- thuliteio/doks #1356 — 把 Hugo 版本升級之後本來能用的東西不能用了.. 所以修好了。
- Jaydee94/kubeseal-webgui #278 — 本來用得好好的,結果 Secret 剪貼簿複製功能壞了.. 所以修好了。
2024
- opensearch-project/helm-charts #618 — 在 Helm 升級版本後部署不起來,一查發現預設的 opensearch.yml 跟 security plugin 有衝突。
2023
- minio/operator #1910 — existingSecret 沒有套用上去,一查發現 YAML 縮排寫錯了。
- getsentry/sentry #60571 — 讀文件的時候看到一個錯字,順手就改了.. 大家知道嗎,錯字修正的 PR 很快就會被合併喔?這是在大型開源專案中蹭一腳的最佳方式。
- stepci/stepci #66 — 新增 CLI 預設指令的輸出。這是我第一次向開源專案提 PR!
2026
2025
2024
2023
2022
2021
2017
lemon-design-system
GitHub ↗對 AI agent 友善的個人設計系統
我在 GeekNews(韓國技術資訊網站)上看到了 awesome-design-md ,雖然我不喜歡把其他網站的設計拆下來當作預設提供的做法,但「讓 AI 擁有一致設計系統」這個想法本身我覺得很棒。
我本來就會做許多專案,所以一直希望能擁有自己的設計系統,讓人光看設計就能認出「啊這是 LemonDouble 的專案!」。
因此我曾實際委託認識的設計師用 Figma 接案製作過,但.. 我畢竟是伺服器開發者.. 有些東西實作起來很困難,而且每個專案都會持續需要新元件,總不可能每次都委外,所以一直沒能真正套用。
但這個方法論也許可行,於是我從自己 favicon 的 logo 開始,先抽出 Primary / Secondary 顏色,再針對各色調整彩度/明度產出多個草稿,肉眼一張張檢視並反覆調整到滿意為止。
從部落格到所有有前端頁面的地方都套用了。
結果還挺不錯的。
hayakoe
GitHub ↗ONNX 最佳化的日語 TTS 函式庫
TTS 領域有 Bert-VITS → Style-Bert-VITS2 這條譜系。
Bert-VITS 是 Fish-Speech 團隊以前的模型,現在他們已經轉向 autoregression 方式的 Fish-Speech 倉庫,那邊的更新就停了。
在這之上加一層 style 相關的 layer、訓練更多日語資料以提供日語強化的 Pretrained 模型,就是 Style-Bert-VITS2 的倉庫。
另外還做了各種改進。
但 Style-Bert-VITS2 的函式庫更新大概在八個月前就停了.. 既然已經停了,乾脆趁機整理一下程式碼,讓它更好用,所以我就動手做做看。
已完成的內容
- pyopenjtalk-prebuilt 函式庫已經停止更新,在 Python 3.12 以上無法使用。我把它 fork 出來修改成最新版也可以建置的 lemon-pyopenjtalk-prebuilt 函式庫並改用之
- 修正 TTS 文字中若包含英文會被當成靜音處理的問題。利用 loanwords_gairaigo 的資料自動支援約 22 萬個英文→片假名映射,並簡化自訂字典登錄功能
- 對 BERT weight 進行動態量化,記憶體使用量約減少 50%
- 把 Synthesizer 透過 ONNX 最佳化,在 CPU 上達成約 1.6 倍的速度提升
- 將 BERT 與 Synthesizer 模型載入分離,讓 BERT 可被共用,每個說話者只需另外載入 Synthesizer,做到每位說話者只需約 200MB 記憶體
- 發布為 PyPI 套件,整理成
pip install hayakoe後 3 行程式碼即可使用 - 在純 CPU 環境下無需安裝 PyTorch,僅靠 ONNX Runtime 即可推論,改為雙後端結構
- 支援句子級的串流 TTS(
stream())。不需要一次處理整段長文字,而是按句逐一生成,可用於即時回應 generate()對長文字自動以句子為單位分割處理,速度提升約 37 倍(400 字基準 143 秒 → 3.8 秒)- 將
weight_norm遷移為parametrizations.weight_norm,確保 PyTorch 2.x+ 的相容性
開發中的內容
- 正在實作預處理流水線,將想抽取資料的影片自動轉成訓練資料。影片上傳 → 抽取音訊 → 分離背景音 → Whisper 字幕生成 → 自動建立資料集,全程一條龍
- 正在實作互動式訓練 CLI,可從資料集預處理、模型訓練到品質報告生成全部一條龍進行
super-arona
與 Arona 對話 - 基於 LLM 的 3D MMD 角色檢視器
這是一個可以跟蔚藍檔案的 Arona 對話的 3D 角色檢視器。
- 使用 Babylon.js + babylon-mmd 進行 PMX 模型渲染
- 支援 16 種表情 morph target、14 種 VMD 動作
- 透過 Bullet WASM 進行頭髮/衣物物理模擬
- 預計接入基於 LLM 的對話功能
以前有個叫 arona 的專案,那只是一個簡單的聊天介面,把 query parameter 傳入文字後顯示。
super-arona 是它的續作,名副其實是更野心勃勃的版本。
shiroko
告訴我天氣
這是為了透過 HomeAssistant 用 ADB 投放到電視上而做的天氣 app。
會根據氣象廳預報的降水類型,顯示雨/雪等天氣動畫。
因為是個人用沒什麼特別的,但每天早上做一次天氣 briefing 就能決定要不要騎腳踏車上班,所以挺方便的。
haruna
週五美食會的問卷工具
這是一個美食評價系統。
每週五都會跟朋友們去探訪美食,既然要吃,順便打個分數應該也不錯吧.. 所以做成了匿名投票系統。
- 輪盤抽選
- 星級評分
- Google Maps URL 自動複製
- QR code 生成
claude-dashboard
我自己要看而做的 Claude Code 專用網頁儀表板
這是一個解析 ~/.claude/projects/ 中的 JSONL 檔,並把 Claude Code 使用量(費用、token、session、模式)視覺化的網頁儀表板。
用 Docker Compose 啟動就完事了。
可以一眼看出我把 Claude 操了多兇(…)。
Style-Bert-VITS2
GitHub ↗基於 Style-Bert-VITS2 的日語 TTS 函式庫
正在把原專案重新打包成函式庫,讓人能直接用 pip install style-bert-vits2 安裝。
以 ONNX runtime 在 CPU 上也能即時推論,計畫做到下載套件後 3 行程式碼就能推論。
kepco_powerplanner_ha_addon
GitHub ↗韓國電力公社 PowerPlanner 的 Home Assistant 附加元件
原本的附加元件是透過 HA REST API 建立 sensor 的方式,沒辦法指定 Entity ID alias。
- 改成 MQTT Discovery 方式,賦予
unique_id,並讓 sensor 名稱也能在 HA UI 中改名與管理 - 透過 Supervisor API 自動偵測 MQTT broker,使設定更為簡便
claude-slack-bridge
GitHub ↗Claude Code ↔ Slack 雙向橋接 MCP 伺服器
這是為了讓 Claude Code 在做事的時候我能離開座位而做的 MCP 伺服器。
相比原本擴展了不少,主要功能如下:
- MCP 工具 4 種:
ask_on_slack(送出問題並等待回答)、notify_on_slack(只送通知)、upload_to_slack(上傳檔案)、download_slack_file(下載 Slack 附件) - Slack → Claude:在 Slack 中 mention bot 後會列出專案清單,選擇後就會在該專案啟動 Claude session。也可以直接在 Slack 中建立新專案。
- 即時進度:Claude 每次使用 Read、Edit、Bash 等工具時,Slack 訊息都會即時更新。
- 訊息排隊:Claude 在工作時若在 Slack 討論串裡留言,等工作結束後就會接著處理剩下的內容。
- 以 emoji 反應取消:加上 ❌ 反應就會中斷工作。
- 模型/effort 設定:可透過 thread 內指令變更模型(sonnet/opus/haiku)與 effort 等級,全域預設值也能保存。
- 顯示 token 使用量:回覆完成時會自動顯示模型名稱、token 數量、cache 命中率、費用、耗時。
ble_controller
GitHub ↗基於 BLE GATT Write 的通用 Home Assistant 控制器
我在 AliExpress 買了個便宜的 TV 連動背光,雖然官方 app 能用,但沒有第三方整合.. 順便趁機學一下 BLE HCI dump,於是開了這個專案。
這是一個通用控制器,對於沒有專屬 HA integration 的 BLE 裝置,只要在 UI 中指定 Service UUID/Characteristic UUID/hex payload 就能控制。
也寫了 開發過程的部落格文章 。
extended_graph_agents
GitHub ↗LangGraph 風格的視覺化 multi-agent 工作流編輯器
受 LangGraph 啟發而做的專案。
Home Assistant 的 Entity 越來越多,要讓單一 Agent 處理全部太吃力,能不能拆成適當的 subagent?這是出發點。
光是現在我家就有大約 300 個 entity。
一開始是用 React Flow canvas 拖拉 node 來自行組合工作流,但用 Claude Code 用得多了之後,我有了個體悟。
其實大家幾乎不會想自己畫 graph。
要怎麼組起來,老實說也得實際跑過一次才能抓到感覺..
所以從 v2 開始改採像 Claude Code 一樣,用自然語言不斷更新工作流,最後只在實在不行的部分手動微調的方向。
只要用自然語言說明,AI 就會自動生成/修改 LangGraph 風格的工作流,儲存後即可作為 HA Conversation Agent 直接註冊。
lemon_tts
GitHub ↗多語言輸入→日語 TTS 的 Home Assistant 整合
反正 BERT-VITS 伺服器我都長期開著.. 抱著「順便讓認識的人一起用」的想法做了這個 HA 整合。
- 輸入韓文/英文等,會先自動翻譯成日文後以日語語音輸出
- 從 API 伺服器抓取 speaker 清單,自動為每位 speaker 建立 TTS entity
kanban
GitHub ↗Obsidian 看板外掛
我管理個人工作會用看板.. Jira 在公司用要付費,Notion 又慢又不順手,其他的也都覺得少了點什麼,所以乾脆自己做。
- 卡片是
.md檔,可以用 LLM 自動處理 - 歸檔之後可以當作個人工作筆記使用
- 因為基於 Obsidian,資料完全保存在本機
write-helper
GitHub ↗基於 LLM 的寫作輔助 Obsidian 外掛
這個外掛在筆記儲存時會自動由 LLM 推薦標籤,並能透過 YAML 定義表單範本,為各欄位設定 LLM prompt。
本來是想用來寫東西的,但因為太忙最後沒怎麼用上(…)。
image-manager
GitHub ↗Obsidian 圖片自動最佳化外掛
Vault 中佔最多容量的就是圖片.. 所以在剪貼簿貼上或加入 vault 時,會自動把 JPG/PNG/HEIC 轉成 WebP/AVIF。
剪貼簿貼上時有時會出現外部連結圖片,之後會壞掉,這個外掛也會防止那種情況。
git-sync
GitHub ↗Obsidian Git 同步外掛
雖然原本就有 git 外掛.. 但每天離開 vault 前我都會忘記同步,所以做了這個。
按下 X 鈕就會自動 commit→push,忘記的次數就大幅減少了。
lemon-pyopenjtalk-prebuilt
GitHub ↗pyopenjtalk 的預建 wheel 套件
因為 pyopenjtalk 不支援 Python 3.10 以上版本,所以我自己 build 後公開的套件。
不需要 CMake/C++ 編譯器,光用 pip install 就能安裝。
lemon-protocol
基於 Cloudflare R2 的個人檔案分享服務
這是以前做到一半就 drop 的 RabbitProtocol 的續作。
要分享大型檔案時找不到適合的服務,所以乾脆自己做。
- 使用 S3 multipart upload 上傳大型檔案(chunk 10MB~500MB 自適應)
- 密碼保護、下載次數限制、IP 過濾(CIDR)
- TTL 1~90 天到期設定
- Drop Link:別人可以上傳檔案給我的一次性接收連結(24 小時到期)
- 下載 log 追蹤與 Web Push 通知
- 與 lemon-auth 整合
lemon-vitepress-theme
GitHub ↗套用 LemonDouble 設計系統的 VitePress 主題套件
做了不少函式庫想公開時,發現 docs 頁面也想統一風格,所以做了這個。
這是把 lemon-design-system 的色彩/字體套用到 VitePress 上的主題套件。
hayakoe docs 就是用這個主題做的。
lemon-auth
GitHub ↗用於 auth-server 整合的 Next.js 認證函式庫
隨著 auth-server 的功能越來越多(個人檔案設定、passkey、TOTP 2FA、稽核 log、裝置管理等等…),整合流程變得相當複雜。
每次新服務都要從頭寫一次認證整合實在太麻煩,所以做了這個 Next.js 專用函式庫,讓人能以標準化的方式接入。
hass-kakao-map-changer
GitHub ↗把 Home Assistant 地圖換成 KakaoMap 的 HACS 整合
openrouter_monitor
GitHub ↗OpenRouter credit 監控 Home Assistant 整合
skopeo-setup-action
GitHub ↗在 GitHub Actions 中設定 skopeo
這是在 GitHub Actions runner 上安裝 Skopeo 的 action。
自架的 OCI 相容 registry 光靠 docker buildx 沒辦法更新 layer.. 需要的 action 卻找不到合適的,所以乾脆自己做了一個來用。
misskey
GitHub ↗自架的微網誌平台
在 sns.lemondouble.com 上已經營運約 1 年的 Misskey 站點。
在 lemon branch 中做圖示變更等客製化,同時持續與 upstream release 保持同步。
fastapi-tdd
GitHub ↗FastAPI TDD 課程實作
HateGuard
瀏覽器內基於 ML 的仇恨言論自動過濾系統
我設想了一個系統:類似 AdBlock,在瀏覽器 DOM 中用 ML 自動過濾掉仇恨言論。
架構是用 PyTorch 訓練模型後轉成 ONNX,再透過 Transformers.js 在瀏覽器中推論。
因為資料集公開有疑慮所以以非公開方式進行,做到了「在 DOM 中偵測到仇恨言論時用紅框標記」的程度..
但資料集難以強化、Transformers.js 支援還很弱、要在 DOM 中處理的資料量太大需要極致最佳化,加上一個人不可能涵蓋所有網站,所以暫時 drop 了。
project-arona
基於 on-device ML 的自訂喚醒詞 + Arona 智慧音箱
原本想用 OpenWakeWord 訓練自訂喚醒詞,做出叫「Arona」就會回應的智慧音箱。
雖然完成了喚醒詞訓練.. 但要寫韌體實在頭大,內建麥克風效果也不好,加上不確定方向是否正確,於是 drop 了。
其實我想要的是能在動態畫面中看到 Arona。
misskey-geeknews-webhooks
GeekNews → Misskey 自動發文 bot
這是接收 GeekNews(韓國技術資訊網站)提供的 Google Chat webhook,並用 Misskey bot 帳號自動轉貼的 Cloudflare Workers。
從 2023 年 7 月起,已經運行約 3 年了。
兩個月前 GeekNews 增加了 domain 檢查導致整合中斷,我抱著姑且一試的心情向 GeekNews 詢問,結果他們真的非常友善地幫我加了例外,於是又恢復正常運作了。
lemon-k8s-cluster
家用 K3S homelab 叢集
家用 K3S 叢集的 GitOps Config 倉庫。
以 ArgoCD Apps-of-Apps 模式管理,由 mini PC(Ryzen 3750H)與 GPU 工作站(Ryzen 5600x/RTX 3090/64GB)兩個節點運行中。
在這個叢集上運行的服務:
- auth-server:用 Go 寫的 SSO 伺服器(Traefik ForwardAuth 整合)
- search-server:基於 OpenSearch 的搜尋 API 伺服器
- ml-server:TTS/ML 相關伺服器(使用 RTX 3090)
- Immich:自架照片/影片備份
- LibreChat:多 LLM 聊天 UI
- Ollama:本機 LLM 推論伺服器(KEDA HTTP 擴縮)
- OpenSearch:搜尋/日誌 DB + dashboard
- RustFS:S3 相容物件儲存
- Zot:OCI 相容容器映像 registry
- CloudNative PG:PostgreSQL 叢集(pgvector、S3 備份)
- Argo Workflows:cron 工作流(追蹤者檢查、Misskey cache 清理等)
- Longhorn:分散式 block storage(SSD/NVMe/HDD 三層)
- 其他基礎建設 stack:Traefik、MetalLB、cert-manager、KEDA、Sealed Secrets、Beszel 等
lemon-talkgpt
基於 talking-head-anime-3 的虛擬角色聊天
只要有一張動畫角色圖片,就能在瀏覽器中與該角色對話的專案。
把 talking-head-anime-3-demo 部署到 ML 伺服器上產生上半身動畫,並用 MediaPipe 抽取臉部 landmark 後映射到角色上。
管線相當長:語音錄製→STT→ChatGPT 生成回答→翻譯→TTS 語音合成→talking-head-anime-3 生成影像,全部一氣呵成。
細節也都顧到了:對左右眨眼用平均值做校正使其同步、對話結束後讓嘴巴閉上、讓角色根據頭/身體方向看向我等等。
為了瀏覽器相容,連影像 codec 都從 VP9→H.264(PyAV)改了過來,挖了不少坑。把翻譯與 TTS 生成做成非同步並行,也縮短了推論時間。
雖然挺認真做的,但現在已經沒在用,所以是 archived 狀態。
chatgpt-serverless-discord-bot
GitHub ↗ChatGPT API + Lambda Serverless Discord Bot 範本
這是利用 ChatGPT API 與 AWS Lambda 做出 Serverless Discord Bot 的範本。
每次只為了跑一個 bot 就開伺服器太貴了嘛~
chatgpt-serverless-slack-bot
GitHub ↗ChatGPT API + Lambda Serverless Slack Bot 範本
lemon-chatgpt-translator
GitHub ↗在 ChatGPT 搜尋時自動把 prompt 翻譯成英文
這是個 Chrome 擴充功能,會在使用 ChatGPT 搜尋時把韓文 prompt 自動翻成英文。
當時韓文表現遠不如英文,用英文提問也算是個小技巧。
就算機翻的英文有點生硬,也比直接用韓文問得到的回答好太多了。
twitter-remove-doge
GitHub ↗把 Twitter logo 換回 Larry 的 Chrome 擴充
某天 Elon Musk 突然在 Twitter 上把 logo 換成 Doge 幣的圖示(…) 我實在很想把它弄掉,於是第一次寫了 Chrome 擴充。
這是把 Twitter logo 還給原本主人 Larry 的擴充功能。
Lemon Twitter Toolbox
基於 Twitter 的 BERT 聊天機器人服務
當時為了求職作品集,想著「順便做點有趣的東西吧 + 做個會吸引大量流量的服務,把 AWS 帳單附在履歷上應該會很搶眼吧?」於是規劃了這個野心勃勃的專案。
這是把使用者推文 mention 對(問/答)以 BERT embedding 訓練後,做成個人化聊天機器人的服務。
以 AWS Lambda + SQS pipeline 將 ML 處理並行化,並由家用 Spring 伺服器負責認證/DB,做成混合架構。
上線當天 Spring 的 SQS 消費瓶頸與 Twitter API rate limit 同時爆發,吃了不少苦頭,詳細內容寫在回顧文裡了。
在 LLM 已經氾濫的現在,BERT 看起來像老古董,但當時對學部生而言是相當新潮的技術。
RabbitProtocol
綜合檔案管理程式
Beacon_based_Automatic_visitor_check_program (GBPL)
GitHub ↗基於藍牙 beacon 的訪客日誌自動化
疫情期間有段時間每個人進出都要寫日誌,所以做了這個用 BLE「人經過就自動寫好」的專案,這樣彼此都方便嘛?
這是學校的全球協力計畫(GBPL),跟日本、中國、台灣、越南的朋友一起進行的,能跟各國朋友協作真的是非常新奇的經驗。
藍牙 beacon 我也親手做了,雖然完全不懂 Android,但還是想盡辦法讓它跑起來(…)。
Audio_processing_practice
GitHub ↗語音處理腳本集
第一次實習時進了一家做音樂處理的新創,這是當時為了學習而建的倉庫。
mel spectrogram 之類的東西就是在這時學的,現在玩 VITS 時還挺派得上用場。
學起來終究都會有用處的。
Socket_Order_Program
GitHub ↗基於 C++ socket/thread 的點餐 server/client
大學網路 socket 程式設計課程的作業,記得是發表前一天熬夜趕工才勉強完成的(…)。
第一次用 C++ 做 low-level socket 通訊,還自己設定封包大小做了客製化通訊,挺有趣的。
C_minus_compiler
GitHub ↗C minus 編譯器實作
大學編譯器課程的作業。
做到了 Scanner 跟 Parser,本來想繼續做下去,但學部一個學期太短,只能到這裡了..
有機會的話,我也想做做看屬於自己的語言。
因為真的很有趣。
Simple_IR
GitHub ↗基於 TF-IDF 的簡易資訊檢索引擎
大學資訊檢索(搜尋引擎)課程的作業。
會讀取文件後做成 TF-IDF weight dictionary,並計算與 query 的相似度,輸出前 10 筆結果。
python_architecture
GitHub ↗Architecture Patterns with Python 書籍實作
這是讀「Architecture Patterns with Python」(Cosmic Python)一書時,學習 DDD、Repository pattern、Unit of Work、CQRS、event-driven architecture 等的倉庫。
學到了很多,但實際應用又是另一回事,這是我工作後才體會到的。
Omok / Snake_Game / Simple_SQL
GitHub ↗大一時期的專案們
這是大一學 C/C++ 時做的東西。
- 五子棋遊戲
- 基於 System Call 的貪食蛇遊戲
- 模仿 MySQL 基本功能的簡易 SQL 實作
畢竟是大一做的,請可愛地看待(…)。當時對我來說真的很難..