Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

JadeAI 是一款掛著私有化部署與本地優先招牌的開源 AI 履歷工具,Apache-2.0 釋出、1832 顆星。我把它從 GitHub 複製下來讀原始碼,發現它其實是一套要你自架的 Next.js 伺服器應用,履歷內容、職缺分析、AI 對話與整段模擬面試逐字稿都寫進伺服器端的 SQLite 資料庫,與純靜態前端的 OpResume 是兩條不同的路。本文逐層驗證 BYOK 金鑰的後端轉發路徑、來源漏報的 AI 模擬面試模組,以及自架與公開 demo 的隱私斷裂。
用 AI 摘要這篇文章:
JadeAI 是一款掛著「自架部署」「本地優先」招牌的開源 AI 履歷工具。把它從 GitHub 複製下來讀原始碼會發現,它其實是一套要你自架的 Next.js 伺服器應用:你的履歷內容、貼上的職缺描述、AI 對話,甚至整段模擬面試的逐字稿,都寫進伺服器端的 SQLite 資料庫。它的隱私優勢建立在伺服器由你自己掌控這件事上,和純靜態前端的 OpResume 架構完全不同。Apache-2.0 授權、1832 顆星,還附帶一套來源沒怎麼提起的 AI 模擬面試模組。
先別急著把它歸進「又一個線上履歷產生器」那個抽屜。JadeAI 和我們之前實測過的 OpResume 履歷產生器 看似同一類,兩者都開源、都讓你自己帶 AI 金鑰、都能匯出 PDF 履歷。不過只要各抓一份原始碼攤開來比,差別就出來了:OpResume 是一份純靜態前端,打開瀏覽器就能跑,履歷存在 localStorage,背後沒有伺服器;JadeAI 卻是一套得用 Docker 架起來的 Next.js 應用,後面掛著一個真的資料庫。這個差別,決定了你輸入的資料究竟存在哪裡。
目錄
很多開源履歷工具被一股腦兒塞進「本地優先」這個標籤,但底層架構差很多。OpResume 是純前端架構,整套程式就是一堆靜態檔案,丟上 Cloudflare Pages 就能用,你的履歷欄位寫進瀏覽器自己的儲存空間,AI 功能也是瀏覽器直接打電話給模型供應商。JadeAI 則是完整的伺服器應用,有前端、有後端、有資料庫,你得自己找一臺機器把它跑起來。兩種做法都把資料留給你自己,但信任的對象完全不同。
| 項目 | OpResume(純前端) | JadeAI(自架伺服器) |
|---|---|---|
| 部署形態 | 靜態檔案,免伺服器 | Docker 架起 Next.js 應用 |
| 履歷存放 | 瀏覽器 localStorage | 伺服器 SQLite 或 PostgreSQL |
| AI 呼叫路徑 | 瀏覽器直接打給供應商 | 瀏覽器先送自家伺服器再轉發 |
| PDF 匯出 | 瀏覽器原生病印表機 | 伺服器端無頭瀏覽器算圖 |
| 授權 | MIT | Apache-2.0 |
把這張表記在心裡,後面 JadeAI 每一條「隱私」設計才看得準。它所有的隱私承諾都建立在一個前提上:那臺伺服器是你自己架的。這個前提一旦換掉,例如你貪方便直接用官方放的公開 demo,整件事的性質就跟著變。

這是整套工具裡最值得拆開看的一段。JadeAI 的資料庫結構寫在 src/lib/db/schema.ts,用的是 Drizzle ORM,預設接 SQLite(檔案落在 ./data/jade.db),也支援 PostgreSQL。把這份 schema 欄位一條條讀下去,會看到一個和「本地優先」印象不太一樣的畫面。
履歷本身拆成兩張表。resumes 存每份履歷的中繼資料,欄位包含標題、模板、分享用的 token、是否公開,甚至一個 share_password 分享密碼欄位。resumeSections 則存履歷的實際內容,每一個段落(學經歷、技能、專案)的正文都進到一個 JSON 欄位裡。這代表你輸入的每一行經歷,都落在伺服器的資料庫檔案裡。
不只履歷。jdAnalyses 這張表會把你貼進去的整段職缺描述(job description)連同分析結果、整體分數、ATS 分數一起存下來;chatMessages 把你和 AI 的對話一來一往記下來;面試模組的 interviewMessages 更把你模擬面試時的問答全文留下。這些全部是伺服器端的持久化資料,重開容器、換瀏覽器,資料都還在伺服器上。
所以「私有化部署」這四個字要正確理解。它的意思是這臺伺服器由你架、資料庫檔案在你自己機器的磁碟上,相對於把履歷交給某家履歷 SaaS 的雲端,主控權確實在你手裡。但它終究是一個伺服器加資料庫的架構,跟 OpResume 那種「關掉瀏覽器資料就跟著你、伺服器根本不存在」的純前端做法,完全是兩回事。這點你得先搞清楚,它決定了信任邊界在哪裡。
JadeAI 採用 BYOK(自帶金鑰)模式,支援 OpenAI、Anthropic、Google 三家供應商,金鑰在你本機的瀏覽器設定裡填入。到這裡為止,和它對外宣稱的差不多。金鑰接下來的去向才是重點。
在前端的 src/stores/settings-store.ts 裡,金鑰確實存在 localStorage,欄位名是 jade_api_key。但同一份程式碼的 getAIHeaders() 函式,會把金鑰連同供應商、端點、模型名稱,塞進 x-api-key、x-provider 這幾個請求標頭,跟著每一次 AI 呼叫送到伺服器。伺服器端的 src/lib/ai/provider.ts 裡,extractAIConfig() 就是負責把這些標頭讀回來,再用 Vercel AI SDK 去呼叫真正的模型。
這套做法和我們在 考搭子 KaoBuddy 看到的「後端轉發」是同一種設計:請求會先到你自架的那臺 JadeAI 伺服器,再由伺服器轉發給模型供應商,而不是從瀏覽器直奔供應商。在你自己架、自己用的情境下,這通常不是問題,金鑰只是經過你自己的伺服器。settings-store.ts 對金鑰欄位留了一句「stored locally only, never sent to server」的註解,但實際行為明明就會透過 x-api-key 標頭送出,註解和程式碼對不上,這點讀原始碼時別被誤導。
JadeAI 在 GitHub 上的功能比多數介紹文寫得更寬。它的 API 路由清單裡有一整個 /api/interview 家族,對應到一套完整的 AI 模擬面試模組,這在原本的來源介紹裡幾乎沒被提起。
從資料庫結構能看出它的規模。interviewSessions 開一場面試,帶有職缺、職位、你挑選的面試官類型;interviewRounds 把面試拆成多個回合,每回合換一種面試官、有最大題數上限;interviewMessages 記下你跟 AI 面試官的問答全文;最後 interviewReports 產出總分、各維度分數、總評與一份改善計畫。整套等於把你「照著這份履歷去應徵這個職缺」的練習流程化,可以反覆跑。
除了面試模組,還有幾個來源同樣沒提的功能:一個 AI 專業大頭照產生器(/api/linkedin-photo,能從普通照片生成證件照風格的頭像)、把履歷包成分享連結並可加上密碼與瀏覽次數統計(resumeShares 表)、AI 文法檢查搭配一鍵修復,以及把圖片履歷直接解析成可編輯欄位的能力。這些加起來,JadeAI 的定位已經超過履歷排版器,更接近一套求職輔助套件。
JadeAI 有一個官方放出的公開實例,網址是 jadeai.cturing.cn,實測連得上去、回應正常。這個 demo 對想先試用的人很方便,但它背後藏著一個容易被忽略的前提。
前面說過,JadeAI 的隱私前提是「伺服器在你手上」。一旦你用的是 jadeai.cturing.cn 這個公開 demo、沒有自己架,情況就整個翻過來:你填的履歷、貼的職缺、模擬面試的逐字稿、AI 金鑰,全部都會經過 demo 背後那臺由別人掌管的伺服器。同樣的程式碼,跑在你自己的機器和跑在陌生人的機器上,意義完全不同。要享受它標榜的資料自主,前提就是乖乖用 Docker 在自己這邊架一份。

真要自架,部署本身不算太難。官方提供 Docker 映像檔,一行 docker run 帶上環境變數就能跑起來,預設用 SQLite 不必額外裝資料庫。有兩個細節值得記下:一是 GitHub 上的原始碼已經從 twwch/jadeai 改名到 LingyiChen-AI/JadeAI,舊連結會自動轉址,但 Docker Hub 上的映像檔名稱仍是 twwch/jadeai(累計三萬多次下載),所以來源文章裡那行 docker 指令還是有效的,別因為 GitHub 改名就以為映像檔也跟著搬了。
二是授權。JadeAI 的授權是 Apache-2.0,這在開源履歷工具裡算是乾淨且對商用友善的選擇,package.json 裡標了 private: true 只是表示這個套件不打算發布到 npm,不影響倉庫本身以 Apache-2.0 釋出的事實。相較於一些 README 宣稱 MIT、倉庫裡卻找不到授權檔案的專案,這裡的授權狀態是明確的。
介面語言是另一個比較實際的門檻。JadeAI 的多語系檔案只有兩份:zh.json 與 en.json,預設語言是 zh,而那份 zh 是簡體中文,並沒有繁體中文(zh-TW)版本。也就是說,你打開來看到的不是簡體中文介面,就是英文介面,沒有熟悉的繁中介面可選。功能能用,但這點對在意操作體驗的人要先有心理準備。
與隱私有關的設計還有兩處。預設情況下(AUTH_ENABLED=false)系統不開正規登入,改用 FingerprintJS 產生的瀏覽器指紋來辨識使用者,這在多人共用同一個自架實例時,是它區分誰是誰的方式;這套指紋技術本質上是一種追蹤手段,用在這裡是當作替代登入的折衷。PDF 匯出則是在伺服器端用 Puppeteer 開一個無頭瀏覽器來算圖,所以匯出中文履歷碰到字型錯位時,問題出在伺服器容器裡沒裝中文字型,得回到宿主機或映像檔去補字型,這也呼應了它「伺服器端處理」的本質。
把這些條件擺在一起,JadeAI 適合什麼樣的人就很清楚了。如果你是那種會自己開 Docker 架服務、想把整段求職流程(從履歷欄位、貼進去的職缺描述、到模擬面試的逐字稿)都留在自己機器上的人,JadeAI 就是為這套工作流設計的;順手的話,它 Apache-2.0 的授權也讓你想 fork 來改就改。相對地,如果你只想打開網頁、五分鐘產出一份履歷就走,OpResume 那種純前端、免架站的工具會順手得多。
幾個限制也要講明白。JadeAI 的 JD 匹配分數、ATS 分數都是 AI 估算出來的參考值,不是任何徵才系統的官方標準,同一份履歷換個模型、換個時間點跑,數字會浮動,把它當絕對指標會誤判。ATS 友善的模板能降低被系統誤判的機率,但不能保證一定通過某家公司的篩選。AI 模擬面試的評分同理,它是練習的回饋,不等於真正面試官會給的評價。至於 AI 產生的專業大頭照,涉及把你的照片送進模型,產出影像的使用權限與風險也要自己把關。求職工具能幫你整理與練習,但錄取與否,從來不是一份履歷或一個工具能決定的事。
若你在意 BYOK 模式的成本與選擇邏輯,AI coding 方案對比一文裡對自帶金鑰的計費思路有詳細整理;想看另一種把敏感文件留在自己機器處理的工具,可以參考 Secure PDF Editor 的本地處理驗證,那份工具同樣在伺服器端處理檔案,但走的是不同的本地化路線。
自架 JadeAI 值得嗎,還是直接用公開 demo?如果你重視它標榜的隱私與資料自主,就值得自架,因為這個前提只在伺服器是你架的時候才成立。用公開 demo 等於把履歷和模擬面試內容交給 demo 背後的伺服器。只是想快速試用功能,demo 夠了;要長期拿來處理真實求職資料,建議自己架。
它說本地優先,我的資料真的都在自己手上嗎?資料確實在你自己手上,但「自己手上」指的是你那臺自架伺服器的磁碟,不是瀏覽器。履歷內容、職缺分析、面試逐字稿都寫進伺服器的資料庫檔案。你掌控這臺伺服器,就等於掌控資料;但這和「資料只存在瀏覽器、伺服器不存在」的純前端工具是兩回事。
它和 OpResume 怎麼選?兩者都開源、都 BYOK。差別在架構:OpResume 是純靜態前端,免架站、資料在瀏覽器、AI 由瀏覽器直連供應商,適合輕量使用;JadeAI 是自架伺服器應用,有資料庫、有模擬面試模組、有分享連結,功能更完整,代價是要會架伺服器。要輕便選 OpResume,要整套求職練習流程且能自架,選 JadeAI。
沒有繁體中文介面怎麼辦?目前官方多語系只有簡體中文和英文,沒有繁中。你能用英文介面操作,或勉強看簡體中文。若你具備開發能力,因為它是 Apache-2.0 開源專案,可以自己 fork 一份、補上繁中語系檔再自架,這也是開源自架工具常見的好處。
判斷 JadeAI 值不值得架,其實只要回答一個問題:你願不願意為了「求職資料整套留在自己機器」這件事,去養一臺 Next.js 伺服器。願意,它是一套少見把履歷、職缺比對、模擬面試做進同一個資料庫的求職套件;不願意,OpResume 那個免架站的選擇一直都在。