給 Codex 桌面端換一張臉,而且換得安全一點:不改官方包、不塞腳本、一鍵能回到原樣。
Codex Theme(倉庫 xu-theme + xu-theme-web)是一個非官方的 Codex 主題管理器,macOS 和 Windows 都能用,Tauri 寫的。起因很直白:Codex 只有一套深色外殼,看兩週就膩了。上游 Codex-Dream-Skin 已經解決了「怎麼安全地換皮膚」—— 走 CDP 注入,不碰 .app、不碰 app.asar、不碰 WindowsApps、不動代碼簽名 —— 但它本質是一套腳本加手動流程,主題得自己拼 CSS。於是把「發現主題 → 導入 → 應用 → 驗證 → 恢復」做成一個 App,外面再套一個網頁主題目錄。
這個項目不是 OpenAI 官方產品,也沒有獲得任何認可或授權。

它能做什麼
一句話:選一張圖,或者點一個網頁連結,Codex 就換好臉了;不想要了一鍵還原。
- 主題發現:Next.js 寫的目錄站列主題和詳情,詳情頁用
codextheme://深鏈接把主題交給桌面端 - 導入:深鏈接只帶一份版本化 JSON 清單,桌面端校驗通過才落盤,寫入是原子的
- 本地做主題:Theme Studio 選一張壁紙(PNG / JPEG / WebP,最大 16 MiB),調壁紙焦點、頭像位置和裁切、文字朝向、主題文案,中間是一個實時 Codex 窗口預覽
- 一鍵應用:走上游的固定動作橋 —— 環境檢查、安裝、結果驗證,三段都要過
- 一鍵恢復:還原官方外觀。Codex 正在跑、操作可能觸發重啟時,應用會先彈確認
在安全上跟自己較真的地方
這部分是這個項目真正花時間的地方,不是裝飾:
- 遠程主題不許帶代碼。只接受版本化 JSON 清單和圖片,CSS / JavaScript / Shell / PowerShell 一個字段都沒有
- 導入前六道校驗:公網 HTTPS、拒絕私網地址、許可字段、文件大小、真實圖片格式(看字節不看擴展名)、尺寸和 SHA-256
- 內核是釘死的。
src-tauri/resources/dream-skin/是上游的清理副本,UPSTREAM_REVISION記著提交號,禁止手改;升級只允許跑scripts/sync-dream-skin.sh,然後npm run check:engine校驗版本、權限守衛和運行時閉包 - 自己的視覺層不進內核文件。0.2.2 把 v1.2.0 時期手改的樣式整體搬進
scripts/patches/codex-theme-visual-layer.css(113 行),由同步腳本逐字追加到兩端assets/dream-skin.css。這樣下次升內核不會把手改蓋掉,也不會把上游改動吃掉 - 上游排除在 MIT 之外的人物素材,既不進倉庫也不進安裝包,
THIRD_PARTY_NOTICES.md老老實實記了固定提交、許可和全部下游改動 - 校驗鏈全在 Rust 側,前端只負責顯示
版本記錄
版本號是 App 的 semver,下面的日期是從 git 提交和設計文檔回溯出來的,一條對應一次能跑的改動。
0.2.2 發包。v1.2.0 時期手改在內核裡的視覺層,整體搬進 scripts/patches/codex-theme-visual-layer.css,由同步腳本逐字追加到兩端 —— 手改內核文件意味著每次升內核都要重做一遍。順帶查清「圖片看不清」的真正原因是 Codex 26.924 在窗口圖和外殼之間還壓著三層原生遮罩(整窗 80% 中性暗加側欄 65%),清掉後側欄像素由 (28,33,37) 回到 (46,87,118);上游為帶遮罩內核調的暗色權重相應調淺,會話右側面板改主題面板色加模糊,頭像 polaroid 用兩個定位置偽元素重建,不再依賴 v1.5 已刪除的注入宿主。參數全取自 1920×988 實機截圖。
內核升級到 Dream Skin v1.5.18。修掉一個上游缺陷:寬畫主題的「移除頂部漸變」規則把 data-app-shell-main-content-top-fade 當成漸變元素,而 Codex 是把它作為狀態標記打在會話內容容器上,display: none !important 於是把整個會話列折疊了,輸入框和消息全塌成 0×0。修復以補丁落在 sync-dream-skin.sh 裡,check-dream-skin.sh 會擋住它被同步覆蓋回去。順帶清掉目錄裡的版權素材。
淺色模式可讀性連修三處:終端文字在淺色下必須保持可辨、三級按鈕別被背景吃掉。
macOS 包改 ad-hoc 簽名;Windows 端視覺對齊 macOS;引擎狀態缺字段時容錯。
一天的玻璃攻堅:首頁玻璃控件、右側工具面板、文件查看器、上下文面板全部換成主題色玻璃而不是死黑;文件樹截斷背景清掉;寵物疊層跨路由保持透明;粘性內容滾動時不再被擋。結尾把「我的主題」提成桌面端首頁。所有參數取自 1920×988 實機截圖。
修回主題應用流程和 App 圖標。
項目起步,當天跑通 MVP:平台設計規格 + 實施計劃、Tauri 腳手架、vendored 清理內核、安全主題清單管線、macOS / Windows 動作橋、codextheme:// 深鏈接、已安裝庫裡直接應用,外加主題市場和本地自定義。
技術棧
- 桌面端:Tauri(Rust 後端 + 系統 WebView)、React + TypeScript + Vite,測試走 vitest 和
cargo test - 內核:vendored 的 Codex Dream Skin(MIT),macOS / Windows 兩套 bridge 資源,固定上游提交
- 目錄站:Next.js(App Router)→ OpenNext → Cloudflare Workers;主題原圖和清單單獨走 Cloudflare Pages 項目
codex-theme-assets,發到https://theme-img.xuguopeng.com - 源碼分兩個倉庫:桌面端
xu-theme、目錄站xu-theme-web,倉庫邊界寫死在 README 裡,目錄站不會混進桌面倉庫
還沒解決的問題
不裝:
- 0.2.2 有兩項沒重新移植:xterm 終端文字配色、文件樹與文件查看器表面。v1.2.0 時期這兩處是手改在內核文件裡的,同步 v1.5.18 时被蓋掉,其餘視覺層已經搬進補丁文件回來了,這兩項還欠著 —— 在意它們的話 0.1.0 目前還是好的
- Windows 沒過實機驗證。受管引擎不帶上游的
runtime/node,安裝時要求用戶PATH上有經簽名的 Node.js 22+;包能打,但沒在真機上跑過,不發 - 「從圖片創建」還沒接系統文件選擇器,目前是瀏覽器預覽模式
- 線上導入鏈路沒通。目錄站和資源站都要單獨部署,
codextheme://那條鏈接在線上還喚不起東西 - 沒有開發者簽名和公證,首次打開要在「系統設置 → 隱私與安全性」裡點「仍要打開」
下載
- 0.2.2 · 推薦版 —— CodexTheme-0.2.2-macos-arm64.dmg(24 MB) Dream Skin 內核 v1.5.18,外加把 v1.2.0 時期丟掉的視覺層搬回來的補丁層。Codex 26.924 在窗口圖和外殼之間還壓著三層原生遮罩(整窗 80% 中性暗 + 側欄 65%),這才是「圖片看不清」的真正原因,清掉之後側欄像素由 (28,33,37) 回到 (46,87,118)。同時修掉寬畫主題把會話列折疊、輸入框塌成 0×0 的那個上游缺陷。
- 0.1.0 · 舊內核備用 —— CodexTheme-0.1.0-macos.dmg(14.5 MB) 內核還停在 v1.2.0。0.2.2 有兩項沒重新移植:xterm 終端文字配色、文件樹與文件查看器表面。日常在意這兩處的話,這版還是好的。
兩包都是 macOS Apple Silicon(arm64),自己打的包、沒有開發者簽名:首次打開要在「系統設置 → 隱私與安全性」裡點「仍要打開」。Windows 版還在實機驗證,驗證過再放上來。
SHA-256 校驗:
a8d733d81b57b7d12cc73c6095367d42bed7fdfb93e0f6dd187a711588efe39b CodexTheme-0.2.2-macos-arm64.dmg
b25922b166e8273da89cecf8f5d52ea63b8410701f9146525475d78f18e999c9 CodexTheme-0.1.0-macos.dmg下一個目標:把上面那兩項視覺層補回來,讓 0.1.0 可以真正退役;然後把目錄站的線上導入鏈路跑通 —— 現在它是一個只能本機打開的目錄。