一套整合便利貼、待辦、行事曆、記事本、專案管理與工作量追蹤的 Windows 桌面生產力套件。由單一開發者從零設計與實作,涵蓋架構設計、資料庫遷移、UI/UX 到打包發佈的完整流程。
QuillNest 是一款以 WPF + .NET 10 打造的 Windows 原生桌面應用,定位為「集中管理日常工作與生活的一站式生產力工具」。專案早期名為 PersonalAssistant,後期重新定位並更名為 QuillNest,同時重構了核心資料模型與部分模組架構。
整個專案由我獨立完成,從需求發想、系統設計、程式實作、資料庫遷移策略,到最終的安裝程式打包與發佈,皆一手包辦。
QuillNest 採模組化設計,整合六大生產力模組於單一應用中,每個模組皆可在設定中獨立開關。模組之間透過統一的 AppLabel 標籤系統串接,取代了早期分散的 Category / Tag / EventCategory 模型。
桌面浮動便利貼,每張可獨立設定顏色、位置、大小、透明度、字級、置頂與摺疊,並提供多段鎖定層級防止誤改誤刪。
任務管理,支援三段優先度、到期日、提前提醒、顏色標記與附件。透過 TodoItemWrapper 統一包裝層,行事曆事件能以「虛擬待辦」形式出現在待辦清單。
事件排程,支援全天與重複事件展開;重複事件的每次發生可個別標記完成/取消/備註(EventOccurrenceStatus),也可「分離」為獨立事件單獨編輯。
長篇筆記,富文本編輯(獨立編輯視窗、插入圖片與表格)並支援 Markdown 模式,可釘選、附加檔案、單選分類搭配多選標籤。
跨模組整合中樞:待辦、事件、筆記、便利貼皆能以多對多方式關聯到專案。含活動時間軸、附情緒標記的手動反思紀錄(1 小時內可編輯)、完成狀態與獨立封存開關。
完全使用者自定義的工作量統計系統:以「範本」為單位,自訂欄位、目標型態、統計週期。與行事曆雙向連動,完成事件時自動帶入紀錄。
可鎖定整個應用或指定模組,含安全問題重設精靈與「記住解鎖」時效模式。
淺色 / 深色主題加自訂強調色,以 DynamicResource 全域即時切換。
首次啟動的設定精靈,搭配遮罩式互動教學(Mask + Callout 雙視窗導覽)。
備份檔內嵌版本 manifest,配合資料庫版本號機制,舊備份匯入時自動升級結構。
系統匣常駐、開機自動啟動、Windows 原生 Toast 通知、單一實例控制(重複啟動時喚醒既有視窗)。
Workload Tracker 從零設計為使用者可自行定義的通用系統,不寫死任何特定業務邏輯。以「範本」為單位,自訂記錄欄位(文字/數字/勾選/日期)、項目列、服務對象與事件關鍵字;目標系統支援總量、分組總量、項目次數三種型態;規則引擎(WorkloadRuleEvaluator)處理頻率限制與前置條件。報表經 ClosedXML 匯出 Excel,含西元 / 民國紀年格式選項。
為了同時支援「全新安裝」與「舊版資料庫升級」兩種情境,設計雙軌 schema 管理:EF Core Migrations 維持遷移快照的有效性;執行期升級路徑透過 IF NOT EXISTS 檢查實際套用 schema 變更,並加入 EnsureLatestSchemaAsync() 作為冪等的安全網。這項設計源於一個實際踩過的坑——遷移記錄被寫入卻未實際執行對應 schema 變更——進而催生出更穩健的防呆機制。
透過 PathHelper 與 .portable 標記檔自動偵測,以獨立的建置組態(Release-Installed / Release-Portable)搭配條件編譯符號與專屬圖示區分。安裝版資料存於 AppData、透過 Inno Setup 打包、採 PrivilegesRequired=lowest;可攜版資料與執行檔放在一起、自包含單檔、隨身碟即插即用。所有資料庫路徑解析統一經 PathHelper.DatabasePath,避免路徑邏輯散落各處。
全應用的彈窗皆透過 DialogHelper / UnifiedDialog 統一處理,並針對 WPF Dispatcher 執行緒問題設計了安全呼叫包裝(SafeInvokeDialog),解決備份匯入流程中的執行緒與對話框結果設定例外。
備份匯出針對 SQLite 的 WAL 模式特別處理:使用 PRAGMA journal_mode=DELETE 並一併處理 -wal / -shm 檔案,避免資料庫損毀。還原時同時相容新舊兩種備份檔名,確保升級使用者的歷史資料不遺失。
App.OnStartup 以 Mutex 實作單一實例控制,第二個實例會透過具名事件喚醒既有視窗後靜默退出;啟動即掛載 UnhandledException / DispatcherUnhandledException 全域例外捕捉並寫入日誌,再依序執行自動遷移檢查、設定載入與首次啟動精靈分流。
Values 為 SQLite 保留字,所有原生 SQL 須以引號跳脫,EF Core 自動處理而原生 SQL 不會,需逐一檢核。
全面採用 AsNoTracking() 搭配 ChangeTracker.Clear(),避免單例 Context 在刪除後讀到過期資料。
BoolToVisibilityConverter 等轉換器必須宣告於各 Window / UserControl,因 DataTrigger 的實例化早於 Visual Tree 建立。
ComboBox、DataGrid 等控制項會吃掉捲動事件,透過 PreviewMouseWheel 重新導向至外層 ScrollViewer。
可見性指派須在建構式中同步設定,確保 ScrollViewer 的 ExtentHeight 在首次版面 pass 即正確計算。
解決 Windows 應用控制政策對未簽章 DLL 的封鎖,提供 Unblock-File 解法。
對於單人維護的本地 SQLite 應用,刻意不導入完整的 DI / 介面抽象,在可維護性與複雜度之間取得平衡。
刪除操作應自動串聯清理關聯資料(例如刪除工作量紀錄時連帶移除對應的事件映射),而非交由使用者手動善後。
所有資料留在使用者裝置的 SQLite 中,不依賴任何雲端服務或帳號。
採方法論式的開發節奏,每次只處理一個問題並在輪次之間進行建置驗證。
| 核心 | .NET 10 · C# · WPF / XAML · MVVM(RelayCommand / AsyncRelayCommand) |
| 資料層 | SQLite · Entity Framework Core 10 · dotnet ef CLI(遷移管理) |
| UI 元件 | MaterialDesignThemes(UI 元件) · WebView2 |
| 內容處理 | Markdig(Markdown 渲染) · ClosedXML(Excel 匯出) · Microsoft.Toolkit.Uwp.Notifications(Toast) |
| 發佈 | dotnet publish 自包含單檔(win-x64) · 安裝版(Inno Setup)+ 可攜版(自包含單檔) |
作為唯一開發者,我負責了:整體系統架構與模組化設計、資料模型設計與多版本資料庫遷移策略(17 個 Migration 的演進管理)、全部前端 WPF / XAML 介面與互動邏輯、備份/通知/主題/密碼保護/跨模組標籤等共用服務、安裝程式打包與雙模式發佈流程,以及從 PersonalAssistant 到 QuillNest 的重構與重新定位。
兩種發佈型態任選:安裝版透過 Inno Setup 安裝至使用者目錄(無需管理員);可攜版自包含單檔,隨身碟即插即用。所有資料一律留在本機。
Unblock-File 或右鍵「解除封鎖」即可。