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

把履歷交給一個免登入的網站,多數人腦袋裡會同時浮現三個疑問:我的個資真的不會被送到伺服器嗎?匯出來的 PDF 能不能被公司的履歷解析系統正確讀懂?還有,資料存在瀏覽器裡,換電腦或清快取是不是就全沒了?這篇就把這三個問題逐一回答,並把 OpResume 這款標榜純本地、MIT 開源的線上履歷產生器,放回它真正能勝任的位置。 OpResume(官方名「優派簡歷」)是開發者 oopooa 以 React
用 AI 摘要這篇文章:
把履歷交給一個免登入的網站,多數人腦袋裡會同時浮現三個疑問:我的個資真的不會被送到伺服器嗎?匯出來的 PDF 能不能被公司的履歷解析系統正確讀懂?還有,資料存在瀏覽器裡,換電腦或清快取是不是就全沒了?這篇就把這三個問題逐一回答,並把 OpResume 這款標榜純本地、MIT 開源的線上履歷產生器,放回它真正能勝任的位置。
OpResume(官方名「優派簡歷」)是開發者 oopooa 以 React 18 加 TypeScript 加 Vite 打造的免費線上履歷工具,原始碼託管在 GitHub oopooa/opresume,正式站部署在 Cloudflare Pages 的 opresume.pages.dev。它主打四件事:免登入、資料只在瀏覽器 localStorage、原生 PDF 匯出、隱私打碼模式。我實際 clone 了原始碼、讀到關鍵檔的行號,也到官方站操作一遍,這篇的結論會以程式碼證據為準。

目錄
這是 OpResume 最核心的承諾,也是我最花時間驗證的一條。官方 README 寫得很直接:「所有資料僅存儲在瀏覽器 localStorage 中,無後端、無資料庫」。這句話在生產環境裡,是不是真的成立?
答案先講:成立,而且比我預期得乾淨。我在原始碼裡追了所有可能發出網路請求的位置,發現 OpResume 在這條軸上的表現,比之前評測過的幾款「本地優先」工具都來得嚴謹。以 Secure PDF Editor 為例,它的塗黑路徑確實零網路呼叫,但網站層級還是包了 Vercel Analytics 與 Speed Insights 在回報流量指標;OpResume 則連這一層都沒有。
具體證據有幾條。第一,vite.config.ts 裡那段 resumeApiPlugin 透過 configureServer 掛了 /api/resume 與 /api/avatar 兩個端點,但這是 Vite 的開發伺服器中介層,只在開發者本機跑 npm run dev 時存在,並不會被打包進正式站。第二,src/services/resume.ts 裡的 saveResume 在 isDev() 為假時直接走 localStorage.setItem(LS_KEY, ...),loadResume 對應讀 localStorage.getItem(LS_KEY),沒有任何對外的 fetch。第三,頭像上傳在 src/components/Editor/AvatarEditor.tsx 裡有一段條件分支,生產環境會把圖片轉成 base64 data URL 直接隨組態存進 localStorage,那條 fetch('/api/avatar') 只在開發模式才會執行。
那有沒有分析或遙測程式碼?這是我最想抓的一條,因為很多靜態站會默默包一份 Google Analytics 或 Vercel Analytics 進來。我把 index.html 從頭到尾看過,並對 src/ 全目錄 grep 了 gtag、google.*analytics、umami、plausible、@vercel/analytics、sentry、cloudflare.*insights 這些常見的流量分析 SDK,結果是零。整個正式站唯一會發出的第三方請求,是 index.html 裡為了載入 Manrope 可變字體而打到 fonts.googleapis.com 的那一趟字型下載,這跟「把你的履歷內容回傳給伺服器」是完全不同層級的事。換句話說,這次的「無後端、無資料庫」陳述,在正式站上是程式碼級成立的,不是行銷話術。
要挑一個但書的話,就是 localStorage 本身的性質。任何在同一個 origin 執行的 JavaScript 都能讀到 localStorage 裡的內容。OpResume 正式站沒有載入任何第三方 script,所以這個風險在它的部署架構下不成立;但如果你選擇自己部署一份,又額外插了統計碼進去,那這條信任鏈就得自己重建。這也是為什麼前面那段比較會把 Secure PDF Editor 的 Vercel Analytics 特別拿出來講,那份遙測不會送出檔案內容,但它確實讓「這個網站零網路請求」這句話不再那麼乾淨。
這題的答案需要分兩層講,因為「ATS 友好」這四個字很容易被過度解讀。OpResume 的 PDF 匯出走的是瀏覽器原生的 window.print(),證據在 src/components/Toolbar/FloatingToolbar.tsx 第 34 行,點下匯出按鈕就是呼叫這個原生 API。使用者接著在瀏覽器的列印對話框裡選「儲存為 PDF」,產出來的檔案是文字型的 PDF,也就是說 PDF 裡的姓名、職稱、經歷都是真正可選取、可複製的文字,而不是把整頁截圖點陣化的影像 PDF。
這件事為什麼重要?因為很多免費線上履歷工具的 PDF 其實是「把版面截圖後嵌進 PDF」的影像檔,對人眼好看,但對企業端的履歷解析系統(Applicant Tracking System,簡稱 ATS)來說是無法讀的。OpResume 因為走原生列印,文字層會被保留,所以「原則上」對 ATS 是相對友善的。但這裡要誠實畫一條線:相對友善不等於保證通過。每家公司採用的 ATS 廠商不同(Workday、Greenhouse、Lever 各家解析邏輯有差異),版面結構、字型嵌入、欄位命名都會影響最終解析結果。OpResume 官方在 index.html 的結構化資料裡也只寫「ATS 友好原生 PDF 匯出」,並沒有承諾百分百通過,這個分寸抓得算誠實,讀者也不要把它當成萬靈丹。
順帶一提,這套工具的列印路徑有個設計上的副產品值得講:因為 PDF 是從當下瀏覽器渲染的 DOM 直接列印出來的,所以你在預覽畫面上看到什麼,PDF 裡就是什麼。這個「所見即所印」的特性,會直接決定下一個段落要討論的隱私打碼模式到底安不安全。
這是 OpResume 這類純前端工具的先天限制,官方也沒有迴避。所有履歷內容都活在瀏覽器的 localStorage 裡,這代表幾件事:第一,換一台電腦,原本打的內容不會跟著你,新機器上是空的;第二,清快取、重灌瀏覽器、某些系統清理工具掃過去,資料會消失;第三,如果你用隱私視窗操作 localStorage 會隨視窗關閉而清空,src/main.tsx 裡甚至有一行註解特別提到「隱私模式等情境下 localStorage 不可寫,忽略即可」。這不是 OpResume 的 bug,是這個儲存機制的本質,但它確實是讀者要清楚知道的事實。
官方的解法是 JSON 匯入與匯出。src/services/resume.ts 裡的 exportResume 會把整份履歷組態(不含內部用的自訂欄位 id)打包成一個 resume.json 讓你下載,importResume 則負責把它讀回來。這個設計本身就擔任了備份與跨裝置遷移的角色,實際使用上會建議每改一個大段落就順手匯出一份 JSON 存起來,別把 localStorage 當長期保存的唯一保險。它也相容於 JSON Resume 這個開源履歷格式,exportAsStandardJSONResume 會把所有 x-op- 開頭的內部欄位過濾掉,輸出符合標準 schema 的 JSON,方便你遷移到其他支援這個格式的工具。
和之前評測過的 純前端音轉字工具 一樣,OpResume 屬於「部署架構上是純前端,但這不代表資料永遠不會離開你的裝置」這個類別裡,相對守得住的一款。差別在於音轉字工具的語音辨識必須把音檔往外送給雲端 ASR 服務,本地這條線守不住;OpResume 的核心履歷編輯與 PDF 匯出則是完全本地,唯一會把內容外送的環節,是下一個段落要談的 AI 功能。
隱私打碼是 OpResume 很有記憶點的功能。工具列上有一個眼睛圖示的按鈕,點下去會把預覽畫面上的姓名、手機、信箱、公司、學校、部門等欄位用星號遮蔽,方便你把預覽畫面截圖丟到 V2EX、微信社群或 PTT 讓朋友 review 履歷內容,又不至於把真實個資一起曝光。實際到官方站操作,打碼效果是真的有作用的,姓名保留首字、手機保留前三碼、信箱本名保留前兩個字,遮蔽規則設計得算合理。

但這個模式在程式碼層級的真相,值得每位在乎隱私的讀者知道。在 src/utils/privacy.ts 檔開頭的註解寫得很明白:「僅影響渲染層,不修改儲存資料」。整個打碼邏輯只有一個呼叫點,在 src/components/Resume/shared.tsx 第 327 行的 usePrivacyMask hook 裡,這個 hook 從 UI store 讀取 privacyMode 這個 boolean,開啟時把欄位值套上 maskField,關閉時原樣回傳。你的真實個資從頭到尾都沒被改寫過,只是預覽畫面選擇用星號顯示。
這個設計帶來兩個讀者必須搞清楚的延伸後果。第一個是好的:因為 PDF 匯出靠的是 window.print(),而列印會把當下 DOM 的渲染結果送進 PDF,所以只要你在列印前先把隱私模式打開,匯出的 PDF 就會是打碼版。換句話說,「截圖分享」與「PDF 分享」這兩種 review 情境,遮蔽都會生效。第二個則是要留意的:JSON 匯出(exportResume)不會套用打碼,因為打碼只在渲染層。你匯出來當備份用的那個 resume.json 永遠是完整真實資料,否則備份就還原不回來了。這個取捨在工程上是正確的,但如果你以為「我把隱私模式打開,所以分享出去的東西都安全」,然後直接把 JSON 檔也丟到群組裡,那就是個實實在在的隱私漏洞。簡單一句話:打碼顧得到預覽與 PDF,顧不到 JSON 備份。
這也是為什麼我會把 OpResume 與 隱私過濾器類工具擺在不同層級來看。後者處理的是「怎麼把一段既有內容裡的個資真正抹除」,是寫進檔案位元組層級的脫敏;OpResume 的隱私打碼是顯示層的視覺遮蔽,目的不同,能承擔的威脅模型也不同。它適合「我想讓朋友看版面與經歷內容,但不想讓他看到真實聯絡方式」這個情境,不適合「我要把這份檔案交給一個不信任的第三方」這個情境。
這是 OpResume 最需要被講清楚的一塊,也是它在「純本地」這個標籤下最容易被誤解的地方。OpResume 內建兩個 AI 功能:AI 改寫(選取段落後一鍵優化或精簡文字)與 AI 匯入履歷(上傳現有 PDF 履歷,AI 把內容結構化填進欄位)。這兩個功能都會把你選取的履歷內容送到一個第三方 AI 服務,而這個服務預設是中國的 SiliconFlow(硅基流動,官方品牌名以簡體原文呈現)。
但關鍵字是「預設」,而且關鍵前提是「你自己設定」。OpResume 的 AI 採用的是自帶金鑰(BYOK, Bring Your Own Key)架構。src/store/ai.ts 裡用 zustand 的 persist 中介層把 AI 組態存在 localStorage 的 opresume_ai 這個 key 裡,初始狀態 activeProviderId 是 null,也就是沒有任何 AI 功能會主動啟用。src/config/ai-providers/siliconflow.ts 雖然提供了 SiliconFlow 的預設 preset(包括 Qwen 與 DeepSeek 系列的免費模型清單),但你必須自己進到設定頁,選擇供應商、填入你自己的 API Key、通過 src/services/ai.ts 裡 verifyApiKey 對 ${baseUrl}/v1/models 的驗證,AI 功能才會真正啟用。在那之前,OpResume 不會發出任何 AI 相關的網路請求。
這個架構的誠實含量很高,也把幾件事講清楚:第一,OpResume 官方沒有在你背後偷偷幫你打 AI API,所有 AI 用量都計在你自己 SiliconFlow 或其他供應商的帳號上;第二,一旦你啟用了 AI,你選取要改寫的履歷文字、或你上傳要解析的 PDF 內容,就會被送到你所選的那家 AI 服務,這時「資料只在瀏覽器」這句話就不再涵蓋 AI 那段流程;第三,那個 API Key 也是存在 localStorage 裡,跟你的履歷內容放在同一個地方,所以前面討論過的 localStorage 跨裝置、清快取限制,對 API Key 同樣適用。換裝置等於要重新設定一次 AI。
所以「OpResume 是純本地的履歷工具」這句話該怎麼理解才精確?我會這樣拆:核心的履歷編輯、排版、預覽、PDF 匯出、JSON 備份、隱私打碼,這些都是完全本地的,沒有任何後端與分析程式碼;AI 改寫與 AI 匯入這兩個附加功能,是使用者主動設定金鑰才會啟用,啟用後這部分流程的資料會經過你選的 AI 供應商。要享受完全本地的隱私保證,方法很簡單,就是不要設定 AI;要用 AI,就要意識到那段內容已經離開你的瀏覽器。
評測過幾款本地優先類型的工具後,我會把 OpResume 放在一個相對乾淨的位置。對比前面提過的 Secure PDF Editor,它的 PDF 塗黑確實零網路呼叫,但網站包了 Vercel Analytics 在回報流量指標;對比純前端音轉字工具,它的音訊分段雖然在瀏覽器本機完成,但語音辨識必須外送給訊飛雲端 ASR;對比AvePDF 這類雲端 PDF 套件,檔案上傳到對方伺服器處理是基本前提,完全沒有本地選項。OpResume 是這個光譜裡少數「核心功能完全本地、附加功能(AI)走清楚標示的 opt-in 路徑、連流量分析都沒有包進來」的例子。
這不代表它沒有適用邊界。它的單欄版面模板適合工程師、設計師、顧問這類重視內容結構勝過花俏版面的求職者,但如果你需要雙欄、需要圖示化技能條、需要履歷配作品集網站的視覺整合,它內建的幾套模板可能不夠用。它的 AI 改寫功能對已經寫好初稿、想讓文字更精煉的人有幫助,但 AI 不會幫你無中生有生出經歷,也不會幫你校正在職日期的矛盾,那些還是要你自己把關。而它最關鍵的限制,依然是 localStorage 的持久性,這個限制不會因為它實作得乾淨就消失。
適合的人滿明確:想快速生一份乾淨單欄履歷、不想為了排版跟 Word 樣式奮鬥、在乎個資不想註冊又一秒都不想浪費在驗證信上的求職者,尤其是工程與科技類職缺的應徵者,這套工具的版面語彙對你相對友善。也想推薦給會在社群丟履歷求 review 的人,隱私打碼模式在這個情境下真的好用。
相對不適合的,是需要團隊協作、需要雇主端主動接收履歷、需要複雜多欄視覺設計,或想把同一份履歷同時投給需要高度客製化的設計與創意產業的人。OpResume 沒有協作功能、沒有雇主端、模板選擇目前也只有幾套,這些都是它在功能廣度上的真實邊界。另外,如果你完全不能接受任何資料外送的風險,那就連 AI 功能都不要設定,把它當純本地工具用就好。
最後,如果你想找一款「把個資交給它不會出事」的線上履歷工具,OpResume 是目前我在開源免費這個類別裡,原始碼層級最讓我放心推薦的一款。它不是沒有限制,但限制都攤在陽光下,而且寫在你可以自己驗證的程式碼裡。不妨到 opresume.pages.dev 試玩看看,覺得順手再把 JSON 備份習慣建立起來,會用得相當安心。
OpResume 完全免費嗎?是,工具本身是 MIT 授權的開源軟體,免費使用。AI 改寫功能如果你要啟用,則會走到你自己向 SiliconFlow 或其他供應商申請的 API,那部分的費用與額度依供應商計價,SiliconFlow 有提供免費額度的 Qwen 與 DeepSeek 模型可選。
不用 AI 功能,會影響核心使用嗎?完全不會。AI 改寫與 AI PDF 匯入是兩個獨立的附加功能,不設定 AI 的情況下,OpResume 就是一款純本地的履歷編輯器,編輯、排版、預覽、PDF 匯出、JSON 備份、隱私打碼全都能用,而且不會發出任何 AI 相關的網路請求。
清掉瀏覽器快取,履歷會不會不見?會。OpResume 的資料完全存在瀏覽器 localStorage,清快取、重灌瀏覽器、換裝置都會讓資料消失。官方對應的方式是 JSON 匯出與匯入,建議每改完一個段落就順手匯出一份 JSON 存到本機或雲端硬碟裡當備份。
隱私打碼模式打開後,匯出的 PDF 也會打碼嗎?會,因為 PDF 匯出靠的是瀏覽器原生列印,會把當下預覽畫面的渲染結果送進 PDF,所以列印前先把隱私模式打開,PDF 就會是打碼版。但要留意,JSON 匯出不會被打碼影響,匯出的備份檔永遠是真實資料,分享 JSON 時要自己注意。
本文基於截至 2026 年 7 月 7 日的 GitHub 專案 oopooa/opresume(版本 v1.5.1,MIT 授權,218 顆星、34 個 fork、0 個 open issue、2 個封閉 issue 皆為功能請求 #2 與 #3、最後推送 2026 年 7 月 7 日、技術棧 React 18 加 TypeScript 加 Vite 加 Tailwind 加 TipTap 加 zustand),以及官方示範站 opresume.pages.dev 的實際操作與原始碼審計。第一手元素包括 clone 專案讀原始碼到檔案與行號(含網路呼叫與遙測審計、隱私打碼實作審計、AI 功能觸發條件審計)、查 GitHub Issues 與 Releases 的活躍度、以 Python Playwright 到官方站實測並截圖。未涵蓋的範圍包括長期使用的穩定性、你的目標公司的 ATS 實際解析結果、以及你自己部署一份之後的信任鏈重建,這些需要自行驗證。ahhhhhfs 來源頁因站方暫時無法連線(HTTP 000 逾時約四小時,非 anti-bot),本文以 Wayback Machine 2026 年 6 月 19 日快照對照來源角度,所有事實以活著的 GitHub 專案與官方示範站為準。