# Changelog All notable changes to ClipMate will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [1.2.1-beta] - 2026-11-07 ### Added - **Seeing the Next Fragment** - While Exploding PowerPaste runs, ClipMate shows which fragment your next paste will give, as ClipMate 7 does. The fragment is selected in the clip's text, and the window title and tray icon's tooltip end with **[Fragment [...]]**. They go back to normal when PowerPaste stops. ### Changed - **PowerPaste Shield Keeps Clips From Background Programs** - With PowerPaste Shield on (the default), only pasting into the program you're working in moves PowerPaste on. Programs that read the clipboard in the background, such as clipboard history, Remote Desktop and WSL clipboard sharing, and other clipboard managers, can't read the clip until PowerPaste stops, so they can't make it skip ahead. You don't need to turn off Windows clipboard history: it doesn't record the clips PowerPaste offers. The separate **Hide Clips From Other Programs** option added in 1.2.0-beta.1 is gone, and its saved value is ignored. - **Clicking Another Clip During PowerPaste** - As in ClipMate 7, clicking a clip outside the sequence now stops PowerPaste and copies that clip, and the status bar says "Cancelled - Clip Outside of Original PowerPaste Range." In 1.2.0-beta.1 it took PowerPaste back to the start of the sequence. - **PowerPaste Delay** - The default is now 250 milliseconds (it was 100). Word and Excel read the clipboard again just after a paste, and until the delay ends they get the clip you pasted, so PowerPaste doesn't skip one. If you used an earlier version, your settings keep 100. Change it under **Advanced** in Options if PowerPaste skips clips in Word or Excel. ### Fixed - **PowerPaste Moving On by Itself** - A program reading the clipboard in the background just after you clicked or typed counted as a paste, so PowerPaste could move to the next clip without you pasting. ([#32](https://github.com/Tsabo/ClipMate/issues/32)) - **Exploding PowerPaste on One Clip** - With **Loop** on, the fragments of a single clip pasted over and over. As in ClipMate 7, they now paste once, and then PowerPaste stops. ## [1.2.0-beta.1] - 2026-11-05 ### Added - **Hide Clips From Other Programs** - A new option on the Pasting options page, off by default. While PowerPaste is on, programs in the background get nothing from the clipboard, so they can't make it repeat a clip or make a paste put in nothing. Clipboard history, other clipboard managers, and Remote Desktop and WSL clipboard sharing don't see the clips until PowerPaste stops. ### Changed - **PowerPaste Button** - The button now works as in ClipMate 7. A click starts in the direction you last used (going up the first time), and the next click turns it off. Turning it off without pasting makes the next start go the other way. **PowerPaste Up** and **PowerPaste Down** turn it off if it's already going that way. - **Clicking Another Clip During PowerPaste** - As in ClipMate 7, clicking a clip outside the series takes PowerPaste back to the start of the series. It used to turn PowerPaste off. - **PowerPaste Shield** - The option is back on the Pasting options page, and it now works. It's on by default, so other programs reading the clipboard don't move PowerPaste on. If PowerPaste doesn't advance when you paste into a program, turn it off: then any program reading the clipboard moves PowerPaste on, as in ClipMate 7 with its shield off. ### Fixed - **Case Conversion** - **Edit** > **Case Conversion** opened an empty submenu, and the same commands on the tray menu only reported a future update. It now offers **lower case** (Ctrl+Alt+L), **UPPER CASE** (Ctrl+Alt+U), **Mixed Case** (Ctrl+Alt+M), **Sentence case.** (Ctrl+Alt+S) and **iNVERT cASE** (Ctrl+Alt+I). As in ClipMate 7, each converts the text and title of every selected clip and leaves the clip with only its text. Encrypted clips and clips without text are skipped. - **Clean-Up Text, Remove Linebreaks and Strip Out Non-TEXT Data Formats** - These **Edit** menu commands did nothing but report a future update. They now work on every selected clip, as in ClipMate 7, and leave each clip with only its text. **Clean-Up Text...** opens a new **Text Cleanup Options** window, also used by the editor toolbar, which remembers your choices. Hold **Ctrl** while choosing **Remove Linebreaks** to remove the line breaks between paragraphs too, or **Shift** to join lines without a space. **Remove Line Breaks** on the editor toolbar now joins lines the same way, and no longer leaves stray characters behind in text with Windows line breaks. - **PowerPaste With One Clip Selected** - PowerPaste pasted the clip once and stopped. As in ClipMate 7, it now runs from that clip to the end of the collection, and the clip list follows along. With several clips selected, it still pastes only those. - **PowerPaste in Browsers, Windows Terminal and Store Apps** - Pasting into these programs didn't count as a paste, so PowerPaste never advanced. Now it does. - **PowerPaste Missing Pastes** - A paste soon after the previous one could go unnoticed, and the next paste repeated the clip. This happened most on machines running WSL or in a remote session. - **Pasting Quickly With PowerPaste** - Pastes less than half a second apart repeated the same clip. Pastes about a quarter of a second apart or more now advance. - **Pastes Lost While PowerPaste Is On** - With WSL or Remote Desktop running, their clipboard client could keep reading the clipboard for as long as PowerPaste was on, mostly on a busy computer. That kept the clipboard busy, so a paste could put in nothing, or not move on to the next clip. A program in the background that keeps reading is now refused the clip until PowerPaste next starts, and the clipboard stays quiet. - **Clicking a Clip Right After a Paste** - A click just before PowerPaste moved on to the next clip was ignored, and the next paste used the wrong clip. On a busy computer, the clicked row could also stay highlighted after PowerPaste went back to the start of its sequence. - **PowerPaste Stuck on a Clip** - When another program kept the clipboard open just as PowerPaste moved on, the next clip never came up, and every paste repeated the last one. PowerPaste now keeps trying until the clip is on the clipboard. - **Exploding PowerPaste Going Up** - Each clip's fragments now paste in reading order when going up. They used to paste last to first. - **Reset Buttons Do What They Say** - The **Layout/Font**, **Application Profile** and **Everything** buttons on the Advanced options tab reported success without changing anything. Now **Layout/Font** resets ClipMate Classic's position and size and the editor font the next time ClipMate starts. **Application Profile** clears the Application Profile at once, with no restart. **Everything** clears the Application Profile, turns off **Start with Windows** and resets all other settings the next time ClipMate starts. It keeps your Databases, saved searches and paired Devices. The mention of re-registering is gone from its tooltip, since ClipMate has no licensing. - **Source URL on the HTML Tab** - The **Source** box said "(No source URL found)" for clips that had a source URL, even while the clip list's **Source URL** column showed it. It now shows the clip's source URL, and **Go** opens it. - **Help Links** - **Help** in the encryption key dialog opened a page that doesn't exist, and so did the localization link in **About**. They now open the Options documentation and GitHub Issues. ## [v1.1.0-beta.1] - 2026-11-3 ### Added - **Outbound Filter** - **Filter Outbound Clips** (Tools menu, toolbar, tray menu and the Pasting options) puts clips on the clipboard as plain text only, or as just their image when they have no text, so they paste without formatting. The clip itself keeps every format. **Active** puts a copy made in another program back as plain text right after it is captured, with the Filter sound, and through the active template, as in ClipMate 7. **Passive** does it when ClipMate loses focus. Clips from the programs listed under **Don't filter clips from these programs** (Explorer by default, so files can still be copied) are left whole. - **Search In** - The search dialog's **Search in** box chooses what to search: a Database (yours or a Peer's) or one of its collections or folders, each with its collection tree icon. It starts on what's selected in the collection tree. It replaces the scope list and the **Member of Collection** filter, which did nothing. - **Search All Databases** - **All Databases** in **Search in** searches every Database at once, Peers included. Each Database's **Search Results** gets its own matches, and the status bar shows the total and names any Database that couldn't be searched, with the reason. **Has Shortcut** and **Included Deleted Clips** apply to your own Databases only. - **Collection Column in Search Results** - While a **Search Results** node is selected, the clip list shows each clip's collection (and folder, if it has one). - **Searching Shows Progress** - While a search runs, the dialog says which Database it is searching and **Go!** is disabled. **Cancel** stops the search and leaves the dialog open. ### Changed - **Large Collections Load Without Freezing** - Clicking a collection with thousands of clips no longer freezes ClipMate until they have all loaded. The first clips appear at once and the rest arrive while you keep working. Picking another collection stops the load. In a test with 9,000 clips, the load went from about 6 seconds with the window frozen to about 1 second with it responsive. The first start after updating adds new indexes to each Database, which took about a second for that Database. - The status bar shows how far the load has got, such as "Loading clips… 2,200 of 9,000". - In the Trash, clips with no deletion date now come last. - **Auto-Append Works as in ClipMate 7** - Append with fewer than two clips selected now creates an empty "Append..." clip at once, and each copy's text is added to it. - The text is added even when the copying program's Application Profile wouldn't capture it. - A copy with no text, such as an image, ends Auto-Append and is captured normally. - "Strip trailing line break" removes one line break from the growing clip, not all of them. - **Captures Into a Read-Only Collection** - A capture while a Read-only collection is selected now goes to the first collection that accepts new clips, as with one that doesn't accept new clips, instead of being ignored. If no collection accepts new clips, it goes to the first collection. - **Capture Messages in the Event Log** - Each capture now logs ClipMate 7's message: where it was placed, a Duplicate ignored, nothing captured because of the Application Profile, or a small graphic ignored. - **Manual Filter Filters the Current Clip** - The Manual Filter hotkey puts the Current Clip back on the clipboard with only its plain text (or its image, when it has no text), as ClipMate 7 does, instead of filtering whatever is on the clipboard. When nothing has been captured or picked yet, it does nothing. - **QuickPaste Uses the Template** - QuickPaste now applies the active template, like every other way of putting a clip on the clipboard. - **Peer Protocol 2.0** - Peers now speak version 2 of the Peer protocol, in which sharing Databases, browsing their clips, change notices and Remote Search are always available. A Peer still running 1.0.1-beta or older shows **Update required**, and Pairing with it is refused, until both Devices run the same version. ### Fixed - **Clip List Replaced After a Drag** - After dragging clips to copy or move them, the clip list switched to recent clips from every collection. It now stays on the view you were on and refreshes it. - **Peer Names Stored the Same Way on Both Devices** - The Device that sent a pairing request kept the other Device's Device Name as it arrived, control characters and all, while the approving Device cleaned it. Both now drop control characters, trim it and keep at most 64 characters. - **Copies Dropped Silently by an Application Profile** - When a program's Application Profile kept none of what it copied, the copy vanished without a sound. It now plays the Erase sound and logs why, as ClipMate 7 does. - **Toolbar Buttons Captured as Clips** - A tiny bitmap with no owning program, as when a toolbar button is copied, is now ignored with the Erase sound, as in ClipMate 7. - **Captures Lost Outside Any Collection** - If choosing the collection failed, the capture was saved with no collection and never showed in the tree. It's now not kept, and the error is logged. - **Captures Placed in Another Collection's Folder** - A capture that bounced to another collection could be put in the folder selected in the first one. It now goes to the target collection's Inbox. - **New Clips and Imports Silently Reused Old Clips** - New Clip, saving from the Markdown viewer and XML import returned an existing clip, even one in the Trash or another collection, whenever its content matched, instead of creating one. They now always create. Only a capture is checked for Duplicates, against the newest clip in its collection. - **Capture Special Rejected as a Duplicate** - A Capture Special could be ignored as a Duplicate. As in ClipMate 7, it never is now. - **Importing the Same XML File Twice** - Clips already in the Database are now skipped, and the import says how many. - **Application Profiles Switch Forgotten** - Turning Application Profiles off in Options lasted only until ClipMate restarted. It's now saved. Its checkbox, labeled "Disable…" while checking it turned profiles on, now reads **Use Application Profiles**. - **Application Profiles Lost to a Damaged File** - If the Application Profiles file couldn't be read, the next profile learned replaced every profile in it. The damaged file is now kept beside the new one, renamed `.unreadable-`. - **QuickPaste Now Pasted an Empty Clip** - The QuickPaste Now command could paste the selected clip before its content was loaded. It now loads the clip from its Database first, including the text of a macro. - **Searching a Peer's Database Did Nothing** - The search dialog closed as soon as **Go!** was pressed, and closing it canceled the search, so a Peer never had time to answer. The dialog now stays open until the search finishes. **Help** no longer closes it either. - **Search Searched the Last Database Selected** - The toolbar's **Search** always searched whichever Database was last selected in the collection tree. **Search in** now shows what will be searched and lets you change it. - **SQL Maintenance Closed After a Failed Commit** - When committing changes failed, the window closed anyway instead of staying open so you could try again. - **Missing Database Reported as Corrupt** - A Database whose file is missing or can't be opened (for example on a drive that isn't connected) no longer brings up "Database Corruption Detected" and an offer to repair it at startup. It shows in the collection tree with its error icon, and startup cleanup skips it instead of stopping cleanup for the Databases after it. - **Folders Shown Twice** - A folder inside a collection (one you created, or one imported from ClipMate 7) appeared both under its collection and again at the top of its Database in the collection tree. It now appears only under its collection. - **Why a Database's Clips Didn't Load** - When a Database's file is missing, the clip list now says so in its status line, as it already did for a Peer that is offline. - **Refresh in the Trash and "Show All Clips in Children"** - Refresh reloads the same list. It used to switch to the recent clips or the plain collection. ## [1.0.1-beta] - 2026-10-31 ### Changed - **Signed Installer and Program Files** - The installer, the uninstaller and ClipMate's own program files are now code-signed by Jeremy Brown (Certum), so Windows no longer warns that the publisher is unknown. - **Duplicates Work Like ClipMate 7** - A copy is a Duplicate only when its text matches the newest clip in the collection it is going into. Clips in the Trash or in other collections no longer stop a copy being saved, collections that accept duplicates always get a new clip, and a Manual Capture is always kept. - **Append Works Like ClipMate 7** - Append glues any clips that have text: HTML clips are joined by their plain text, clips without text are left out and named, and fewer than two clips with text append nothing. The new clip becomes the Current Clip, ready to paste. - **Toggle Auto-Capture Has No Default Hotkey** - Its old default, Ctrl+Alt+A, is Append's shortcut, so trying to append switched capture off. ClipMate 7's Win+Shift+C is taken by Windows, so the hotkey is now unset, and the old default is cleared from existing settings. - **Tray Tooltip Shows Only the Clip Title** - The tooltip no longer starts with "ClipMate - "; it shows just the Current Clip's title (or the collection), as ClipMate 7 does. ([#26](https://github.com/Tsabo/ClipMate/issues/26)) - **Tack Hidden** - **Tack (lock) this window onto this collection** is hidden from the clip list's menu until ClipMate has a second clip list for it to pin. ### Fixed - **Dialogs From the Tray Menu** - Options, Text Tools, About and Show Event Log failed to open from the tray icon's menu while no ClipMate window was on screen. ([#27](https://github.com/Tsabo/ClipMate/issues/27)) - **Reset to Defaults** - The **Reset to Defaults** buttons on the Capturing and Editor options tabs did nothing. - **Auto-Append After Deleting Its Clip** - Once the clip Auto-Append was growing had been deleted, every later copy was lost until ClipMate was restarted. A new growing clip is now started. - **Trash Kept Clips Without Content** - Sending a clip to the Trash deleted its content, so restoring it gave back an empty clip. The content is now kept until the Trash is emptied. - **Undelete** - Un Delete failed before showing the collection picker. It now restores clips from the Trash into the collection you pick, and the clip list's own **Un Delete** item is enabled for clips in the Trash. - **Manual Filter Hotkey** - The hotkey now leaves only the clipboard's text and image on it and plays the Filter sound, as in ClipMate 7. - **Clip List Menu Items That Did Nothing** - **Append Clips Together (Glue)**, **Place Source URL On Clipboard**, **Select Another Collection** and **Toggle Macros On/Off For This Clip** now work, as does **View > Select Collection** (F8). The collection picker opens the default database expanded and shows the last collection used. ## [1.0.0-beta.1] - 2026-10-25 ### Added - **Peer Networking** - Browse, search and copy clips between your own computers. Turn networking on in Options > **Devices**, pair two Devices by confirming the same Verification Code on both (Devices on your network are listed; others can be added by address), then tick **Share with Peers** in a database's Properties. Shared databases appear read-only in the collection tree and update live; **Copy to local** or drag stores clips in your own collections. Only paired Devices can connect, nothing outside a shared database is shared, and encrypted clips are decrypted only on your own Device. - **Database ID** - Every database has a permanent ID, shown in Database Properties. - **Capture Special** - **Edit > Capture Special...** lists the formats on the clipboard and captures the ones you tick, whatever the program's Application Profile says. - **Separate Data Folder** - `--data-dir ` runs ClipMate with its settings, databases and logs in another folder, alongside your normal copy. - **Current Clip in the Tray Tooltip** - Hover over the tray icon to see the title of the clip on the clipboard, or choose **System Tray Hint: Collection** in Options > **Appearance** to see the current collection instead. Encrypted clips show only "Encrypted clip". ([#12](https://github.com/Tsabo/ClipMate/issues/12)) - **Clip Popup When Scrolling with Hotkeys** - The Scroll Next / Previous hotkeys show the clip they reach in a popup next to the tray, with its title, collection and a short preview; click it to open ClipMate on that clip. Turn it off with **Show clip when scrolling with hotkeys** in Options > **Appearance**. ([#12](https://github.com/Tsabo/ClipMate/issues/12)) ### Changed - **Clipboard Capture Works Like ClipMate 7** - Capture follows ClipMate 7's rules: one short delay after a program's last clipboard change, the program that copied as the clip's source, Application Profiles created on your first copy from each program with ClipMate 7's defaults, and every format the profile allows kept and offered again on paste. ClipMate's own copies are no longer captured again, and the Manual Capture hotkey and capture at startup behave as in ClipMate 7. A slow program no longer freezes ClipMate while it is captured. - **Power Paste Works Like ClipMate 7** - Image and file clips advance like text, only a paste by the program in front advances the sequence, and the last clip stays on the clipboard when Power Paste ends. - **Auto-targeting Follows the Foreground Window** - The Paste Target is the last suitable window you used, chosen with ClipMate 7's GOOD and BAD rules and a new **BAD Titles** list. - **Encrypted Clips in the ClipMate 7 Import** - The import asks for your ClipMate 7 encryption keys and brings encrypted clips across, still encrypted with the same passphrase. - **Uninstall Removes the Firewall Rule** - Uninstalling offers to remove the firewall rule ClipMate added for networking. - **Unused Options Removed** - **Multi-User, Networked Database?** and **PowerPaste Shield** are gone; existing settings files still load. ### Fixed - **Clipboard Diagnostics Crashed With an Image on the Clipboard** - Opening **Clipboard Diagnostics** while a bitmap, palette or metafile was on the clipboard could close ClipMate without warning. - **Scroll Hotkeys From the Tray** - Scroll Next / Previous did nothing until the ClipMate window had been opened once; they now work as soon as ClipMate starts. - **Search Date Filters** - **Captured After** and **Captured Before** no longer fail with a database error. - **Clipboard Replaced After Every Copy** - ClipMate no longer replaces what you copied with its own copy of the clip, which lost formats it doesn't store. ([#11](https://github.com/Tsabo/ClipMate/issues/11)) - **Screenshots and Cut Files** - A screenshot copied with its file name keeps the image (when its Application Profile has images on), and cut files paste back as a move. ([#14](https://github.com/Tsabo/ClipMate/issues/14)) - **Templates Dropped Rich Formats** - Copying an HTML or RTF clip with a template active keeps every format. - **Capture After Turning Auto-Capture Off and On** - New copies are saved again without restarting ClipMate. - **Capture Sounds** - A single copy no longer also plays the Ignore sound, and emptying the clipboard plays the Erase sound every time. ## [0.1.0-beta.6] - 2026-10-13 ### Added - **Import from ClipMate 7** - A new **Import ClipMate 7...** button on the Database options page brings clips, collections and shortcuts across from an original ClipMate 7.x database. You can import into a new database or merge into an existing one, and running it again skips clips that were already imported. The reader is built in, so nothing extra is needed. Clips encrypted in ClipMate 7 are skipped, and the import says how many. - **Markdown Tab in the Clip Viewer** - Clips copied from web pages, Word and other rich-text apps now get a **Markdown** tab showing the content converted to Markdown. Choose a flavor to match where you're pasting it: GitHub, Slack, Telegram, MultiMarkdown, Pandoc or Default. You can switch to a rendered preview, copy the Markdown, or save it as a new clip. When a clip has both HTML and RTF you can pick which one to convert. Your flavor and options are remembered, and Markdown can be set as the default viewer tab in Editor Options. ### Fixed - **Database Changes Needed a Restart** - Adding, importing or removing a database in Options didn't change the collection tree until ClipMate was restarted. Activating or deactivating a database didn't refresh it either. The tree now updates as soon as you click OK. - **Removed Database Stayed Locked** - A database you'd just removed couldn't be deleted or moved in Explorer, because ClipMate kept the file open until it exited. Removing a database now releases its file straight away. - **Backup Prompt Right After Adding a Database** - A database you'd just added or imported triggered the backup prompt the next time ClipMate started. A database that has never been backed up is now first due one backup interval after it was created. - **Backup Interval Ignored** - The **Database Backup Interval** in Options had no effect, and ClipMate always prompted every 7 days. Your chosen interval is now used. - **Backup Countdown** - The auto-confirm countdown on the backup prompt could start before the dialog appeared, or cancel itself as though you'd clicked something. Changes to the auto-confirm setting made in the dialog weren't remembered for next time. Both are fixed. - **Pasting Expanded File Clips** - Files copied in Explorer while **HDROP Expansion** was on became text-only clips. You could no longer paste them back into Explorer as files. They now keep the file list and paste as files again. ## [0.1.0-beta.5] - 2026-8-22 ### Added - **Dark Mode** - Added a Light/Dark theme option under Appearance settings. Switch anytime and the app (including the text editor) updates immediately. ([#9](https://github.com/Tsabo/ClipMate/issues/9)) ### Fixed - **Annoying Backup Dialog** - The "OK this automatically" option on the database backup prompt didn't actually work, so it never stopped asking even when you'd told it not to. It's now fixed, along with a few related issues that could leave the backup prompt invisible or stuck waiting on a hidden confirmation popup. ([#8](https://github.com/Tsabo/ClipMate/issues/8)) ## [0.1.0-beta.4] - 2026-8-17 ### Fixed - **WinGet Upgrade Blocked** - `winget upgrade` reported "No applicable upgrade found" for anyone on 0.1.0-beta.2 or earlier. The installer used Inno Setup's `{autopf}` directory constant, which resolves to either Program Files or the user's local app data depending on whether setup happens to be elevated. WinGet manifest generation read that as a machine-wide install and published `Scope: machine`, which WinGet then refused to apply over the per-user installs people actually had. The installer is now explicitly per-user and installs to `%LOCALAPPDATA%\Programs\ClipMate`. - **Clip Database Deleted On Uninstall** - Uninstalling ClipMate silently deleted `%LOCALAPPDATA%\ClipMate`, destroying your entire clip database and settings with no warning or opportunity to back them up. Uninstall now keeps your data by default and asks before removing it. ### Note for existing users If you installed 0.1.0-beta.3 from an elevated (Administrator) terminal, ClipMate landed in `C:\Program Files\ClipMate` and WinGet will not upgrade it to this per-user release. Back up `%LOCALAPPDATA%\ClipMate`, uninstall, then reinstall with `winget install Tsabo.ClipMate`. ## [0.1.0-beta.3] - 2026-8-15 ### Fixed - **Manual Cleanup Trigger** - Fixed main menu database cleanup menu item. - **PowerPaste Not Detecting Pastes** - PowerPaste now correctly detects when a clip has been pasted into another application and advances to the next clip in the sequence. - **Clip Selection Highlight During Hotkey Navigation** - Fixed the highlighted clip not following along when moving through clips with the hotkey; the list now scrolls and highlights the correct clip together. - **Append/Glue Clips** - Fixed appended (glued) clips not showing up in the clip list and containing no text. Also added Auto-Append mode, which continuously glues new clips together until turned off. - **Clip Context Menu Commands** - Fixed several right-click context menu commands that didn't work (QuickPaste Tools, Create New Clip, View Clip, Convert File Pointer to Text, Move to Top/Bottom, Show Column Headers), and fixed QuickPaste's Paste Now/Tab/Enter actions not actually pasting into the target application. ## [0.1.0-beta.2] - 2026-1-26 ### Added - **Code Coverage Configuration** - Added `.runsettings` file with exclusion rules for P/Invoke, UI layer, auto-generated code, and simple DTOs - **Unit Test Coverage** - Comprehensive test suites for Platform services including SoundService, DecryptedBlobCacheService, StartupManager, ClipboardDiagnosticsService, SessionMonitorService, HotkeyService, PrintService, and DatabaseMigrationService - **ExcludeFromCodeCoverage Attributes** - Applied to Win32 interop classes and non-testable platform code ### Fixed - **ClipViewer Tack Functionality** - Fixed tack button not preventing viewer from switching clips; viewer now stays pinned to current clip when tacked, allowing cut/paste operations within a single clip without automatic switching to clipboard contents - **Pre-Release Version Comparison** - Improved semantic version parsing to correctly compare pre-release versions ## [0.1.0-beta.1] - 2026-1-24 ### 🎉 Alpha to Beta Transition ClipMate has reached **99% feature parity** with the original ClipMate and is now entering beta status. All major features are implemented and the focus shifts to stability, polish, and bug fixes. This milestone marks the transition from feature development to production readiness. **What Beta Means**: - Feature complete - all core functionality implemented - Focus on stability, performance, and bug fixes - Breaking changes minimized - Ready for broader testing and feedback - Database and configuration formats are stable ### Added - **Printing System** - Complete DevExpress reporting integration with print preview - **Print Configuration** - User preferences for headers, footers, margins (inches/millimeters), printer selection, clip metadata display, and single-item-per-page mode - **Print Preview Dialog** - WPF DocumentPreviewControl with print, export, and page setup functionality - **Responsive Print Layout** - Horizontal anchoring system ensures content fills available width across different margin settings and page orientations - **Comprehensive Integration Tests** - Added 7 new integration tests for backup functionality, bringing total test coverage to 144+ passing tests ### Fixed - **Configuration File Startup Error** - Fixed `TomlException` on first run where `LogLevel` enum was serialized as integer (`log_level = 3`) instead of string (`log_level = "Information"`) - **Backup Dialog Positioning** - Fixed backup dialogs appearing in top-left corner during startup when no owner window was available - **Fresh Install Backup Prompt** - Fixed unnecessary backup prompt on first startup when database is empty; backup prompts now only appear when database contains clips to back up, improving first-run user experience ## [0.1.0-alpha.11] - 2026-1-18 ### Added - **Clip Encryption** - Full encryption support with AES-256-GCM, allowing clips to be encrypted/decrypted individually or in bulk with password protection - **Encryption Key Management** - Secure key dialog with session-based key caching and automatic key expiration on system lock/logout - **Decrypted Blob Cache** - Memory-based cache for decrypted content to improve performance when viewing encrypted clips - **Encryption Configuration** - User preferences for auto-lock on session events, cache timeout, and default encryption settings - **Session Monitoring** - Automatic detection of Windows lock/unlock events to trigger encryption key cleanup - **Integration Tests** - Added 8 comprehensive integration tests for DatabaseManager, ClipboardCoordinator, and encryption workflows - **ClipCacheExpiredMessage** - New event system to notify UI when decryption cache expires ### Changed - **Messaging System** - Switched from WeakReferenceMessenger to StrongReferenceMessenger with proper lifecycle management to prevent memory leaks - **Clip Model** - Extended with IsEncrypted flag and EncryptionMetadata for tracking encryption state - **Blob Storage** - Enhanced to support encrypted content storage and retrieval across all blob types (text, image, binary) ### Fixed - **Memory Leaks** - Implemented IDisposable pattern across ViewModels, services, and windows to properly unregister from messenger and prevent resource leaks - **InteropBitmap Alpha Channel Corruption** - Fixed critical bug where DIB clipboard format images (screenshots from SnagIt, Windows Snipping Tool) had corrupted transparency due to all alpha channels being set to 0; implemented automatic alpha=255 fix for InteropBitmap sources to restore proper image quality - **Image Pixel Data Processing** - Fixed bug in ConvertBitmapSourceToBytes where calling ToArray() created copies of pixel data, causing alpha channel fixes to be discarded before PNG encoding; now uses rented ArrayPool buffer directly for both CopyPixels and WritePixels operations ## [0.1.0-alpha.10] - 2026-1-11 ### Added - **Default Templates** - Installer now includes url.txt and url_date.txt templates deployed to %APPDATA%\ClipMate\Templates - **Delete Key Binding** - Added Delete key shortcut in Classic and Explorer windows for removing selected items - **Configuration Options**: - Alt Key Required for Drag/Drop - Configurable requirement for Alt key during drag/drop operations - Clipboard Capture Settle Time - Configurable delay between clipboard captures to prevent duplicates (default 50ms) - Startup Delay - Configurable delay before clipboard monitoring starts to avoid system startup conflicts (default 2000ms) - **Last Collection Memory** - CollectionPickerDialog now persists and reuses the last selected collection for improved usability ### Changed - **LogLevel Configuration** - User preferences now load log level from configuration file with string values (Debug, Information, Warning, Error) ### Fixed - **Database Loading at Startup** - Fixed issue where ClipList and Collection Tree were blank at startup - **Premature Clip Purging** - Fixed issue where deleted clips were being permanently purged immediately on application restart instead of being retained in trashcan for the configured retention period (default 7 days) - **Clip Deletion UI Updates** - Clip list now updates efficiently when clips are deleted without requiring a full reload, preserving user's current view context and selection state - **Duplicate Sound Notifications** - Fixed double sound playback when capturing new clips ### Removed - **Use DDE for Browser URL Option** - Removed obsolete configuration option for browser URL handling ## [0.1.0-alpha.9] - 2026-1-10 ### Added - **InnoDependencyInstaller Integration** - Installer now uses InnoDependencyInstaller library for robust .NET runtime detection and automatic installation with download progress, retry logic, and better error handling ### Changed - **.NET 10 Migration** - Upgraded entire solution from .NET 9 to .NET 10: - Updated all project files (ClipMate.App, Core, Platform, Data, etc.) to target net10.0/net10.0-windows - Updated package version ranges: Microsoft.EntityFrameworkCore, Microsoft.Extensions, Serilog from [9.0.x,10.0.0) to [10.0.0,11.0.0) - Updated installer script for .NET 10 Desktop Runtime (10.0.1) detection and download - Updated test fixtures and paths for net10.0-windows - **Performance Optimizations in ClipboardService** - Enhanced clipboard operations with zero-allocation span-based operations, ArrayPool for large buffers, cached regex patterns, and guarded debug logging - **Performance Optimizations in ClipViewerControl** - Improved clip loading with LINQ-to-for-loop conversions (40-70% faster), span-based string operations, ArrayPool for image buffers, and cached regex for HTML parsing - **CsWin32 Configuration** - Added CsWin32PublicClass property to ClipMate.Platform.csproj to generate public APIs compatible with .NET 10 ## [0.1.0-alpha.8] - 2026-1-8 ### Added - **PowerPaste Dynamic Icons** - PowerPaste toolbar button now displays state-specific icons (Off/Down/Up) with real-time visual feedback - **IconGlyphToImageSourceConverter** - New WPF converter for binding custom font glyphs to DevExpress BarButtonItem controls - **PowerPaste State Cycling** - Toggle button cycles through Off → Down → Up states with simplified logic (no longer remembers last direction) - **PowerPaste Auto-Stop** - PowerPaste automatically stops when user selects clips outside the active sequence - **Clipboard Retry Logic** - Enhanced clipboard operations with exponential backoff retry (50ms/100ms/200ms) for improved reliability with file and image extraction - **Comprehensive Logging** - Added structured logging across clipboard services, coordinators, and ViewModels for better debugging and error tracking - **Custom Font Icons** - New SVG-based icons added to ClipMate.ttf font (PowerPaste, PowerPasteUp, PowerPasteDown, lightning bolts) ### Changed - **MainMenuViewModel** - Added PowerPasteIcon observable property with IPowerPasteService state subscription - **ClipOperationsCoordinator** - Rewrote PowerPaste toggle logic for Off→Down→Up cycling, added clip selection monitoring with HashSet tracking - **TreeNode ViewModels Organization** - Moved tree node ViewModels to Models/TreeNodes folder for better project structure - **Copyright Year** - Updated to 2026 across installer and documentation - **Clipboard Image Extraction** - Improved retry logic for GetImage operations to handle timing issues with file system clipboard operations ### Fixed - **PowerPaste Direction Toggling** - Fixed issue where PowerPaste direction wasn't changing when toolbar button pressed - **Clip Selection Interference** - PowerPaste now properly stops when clips selected outside the PowerPaste sequence ## [0.1.0-alpha.7] - 2026-1-6 ### Added - **Main Toolbar Buttons** - Completed toolbar implementation for ClassicWindow and ExplorerWindow with all 16 documented buttons (PowerPaste, Delete, Print, Append, Remove Breaks, Move to Collection, Copy to Collection, Search, Switch View, View Clip, Outbound Filtering, Templates, Text Clean-up, Loop PowerPaste, Explode PowerPaste, Event Log) - **CustomFontIconSource Integration** - Toolbar buttons now use custom font glyphs for Delete, Append, CopyToCollection, and MoveToCollection for consistent iconography - **Dynamic Dropdown Menus** - Implemented GetItemData handlers for Collections and Templates dropdowns with cross-database support - **Keyboard Shortcuts** - Added comprehensive InputBindings to both Explorer and Classic windows for menu shortcuts (Ctrl+F, Ctrl+E, Ctrl+N, Ctrl+R, Ctrl+P, Ctrl+O, Ctrl+U, Ctrl+D, Alt+Enter, Alt+R, Ctrl+Alt+A, Ctrl+Alt+B, Ctrl+Alt+T, Ctrl+Alt+P, Ctrl+Alt+N, F5-F8, F12) ### Fixed - **SwitchView Command** - Fixed window switching to properly toggle between Classic and Explorer by closing current window and opening the other - **Clipboard Lock Errors** - Implemented retry logic with exponential backoff (50ms, 100ms, 200ms) for CLIPBRD_E_CANT_OPEN errors using ThrottleDebounce.Retrier.Attempt - **TrayIcon Menu State Updates** - Fixed Auto Capture and Filter Outbound Clips checkboxes in tray icon context menu not updating by adding PopupMenu.Opening event handler to refresh bindings - **Cross-Database Clipboard Operations** - ClassicWindow now properly supports copying and moving clips between databases with ClipData and blob migration ### Changed - **ClipboardService Dependencies** - Added ThrottleDebounce package reference for retry logic implementation - **ClassicWindow Collections Integration** - Added ITemplateService dependency and collection dropdown handlers for full feature parity with ExplorerWindow - **Toolbar Button Order** - Standardized button order across both windows to match main-toolbar-buttons.md specification ## [0.1.0-alpha.6] - 2026-1-5 ### Added - **Blob Data Export Support** - XML export now includes all clip content (TextContent, HtmlContent, ImageData as base64, FilePathsJson) - **LoadBlobDataAsync Method** - New IClipService method to load blob data from database tables (BlobTxt, BlobPng, BlobJpg, BlobBlob) into clip transient properties - **Export/Import Integration Tests** - Comprehensive test suite verifying clips loaded from database can be exported with all blob data intact and successfully re-imported - **Pre-Release Update Check** - About dialog now includes dropdown option to check for pre-release versions from GitHub ### Fixed - **XML Export Missing Content** - Fixed issue where XML export only included clip metadata without actual content (text, images, HTML, file paths), making re-import impossible - **ClipExportDto Serialization** - Added ImageDataBase64 and FilePathsJson properties with proper base64 encoding for binary image data - **Export Workflow** - XmlExportViewModel now calls LoadBlobDataAsync to populate blob data before export - **Update Check Service GitHub URL** - Corrected repository URL from `clipmate/ClipMate` to `Tsabo/ClipMate` to fix 404 errors when checking for updates - **About Dialog Button Bindings** - Fixed DataContext binding issues for DropDownButton in ThemedWindow.DialogButtons using RelativeSource - **Update Check CommandParameter** - Fixed type mismatch by using proper sys:Boolean type instead of string "True" for CommandParameter - **Version Comparison with Build Metadata** - Fixed ApplicationVersion.ParseSemanticVersion to properly strip build metadata (git hash after `+`) when comparing versions, allowing correct detection of newer releases ### Changed - **Test Infrastructure** - Added InternalsVisibleTo for ClipMate.Tests.Integration to access internal repository classes for proper integration testing ## [0.1.0-alpha.5] - 2026-1-4 ### Added - **Clipboard Erase Detection** - Implemented detection for when external applications clear the clipboard with audio feedback - **Database Maintenance Features**: - Automatic integrity checks on startup (PRAGMA integrity_check) - Automatic repair prompt and process for corrupted databases - Old backup file cleanup (14-day retention) - CleanupMethod configuration enforcement: - AtStartup: Runs cleanup during application startup - AtShutdown: Runs cleanup during application shutdown - AfterHourIdle: Runs cleanup during hourly idle maintenance - Never: Disables automatic cleanup - Manual: Cleanup only via user action - **MaintenanceSchedulerService Enhancements**: - Now respects per-database CleanupMethod configuration - Automatic old backup cleanup during idle maintenance - Processes all configured databases independently - **HotkeyBindDialog Redesign** - Complete UX overhaul with toggle modifier buttons (Shift, Ctrl, Win, Alt), special key dropdown menu with 18 media/browser/volume keys, and improved key capture workflow matching ClipboardFusion interface ### Fixed - **Search Results Auto-Selection** - Search results node is now automatically selected after executing a search, with database node expanded for visibility - **Search Results Refresh** - Fixed issue where search results wouldn't refresh when the search results node was already selected - **Clipboard Erase Sound** - Removed incorrect sound playback when deleting clips from ClipMate database (sound now only plays when external apps clear clipboard) ### Changed - **ClipService Dependencies** - Removed ISoundService dependency as clip deletion no longer triggers sound effects - **App Startup** - Added comprehensive maintenance tasks including integrity checks, backup cleanup, and CleanupMethod.AtStartup processing - **App Shutdown** - Added CleanupMethod.AtShutdown processing - **DatabaseMaintenanceService** - Added CleanupOldBackupsAsync and CheckDatabaseIntegrityAsync methods - **Dialog Buttons** - Migrated HotkeyBindDialog and TextToolsDialog to use DevExpress ThemedWindow.DialogButtons for consistent themed appearance - **Special Key Selection** - Replaced ComboBoxEdit with DropDownButton + PopupMenu in HotkeyBindDialog for more native DevExpress implementation ## [0.1.0-alpha.4] - 2026-1-3 ### Added - **StateRefreshRequestedEvent Pattern** - Implemented centralized state synchronization for ViewModels with service-derived properties - **Window Initialization State Refresh** - Explorer and Classic windows now send state refresh events after loading to ensure correct initial UI state - **Update Check Service** - Implemented automatic update checking against GitHub releases with user notifications in About dialog - **ApplicationVersion Value Object** - Added semantic versioning support with structured version representation ### Fixed - **Menu State Indicators** - Auto Capture menu items now show checked/unchecked state across Explorer, Classic, and Tray windows - **ClipViewer Toolbar State** - Toggle buttons (Tack, Word Wrap, Show Non-Printing) now display proper checked state using BarCheckItem bindings - **Service State Synchronization** - ViewModels now receive notifications when underlying service state changes (clipboard monitoring, target lock, go-back state, database count) - **Help Links** - Updated all help links to point to new documentation site (https://jeremy.browns.info/ClipMate) - **DatabaseMaintenanceCoordinator** - Refactored to support multiple databases and show appropriate backup dialogs based on database count ### Changed - **QuickPasteService** - Added IMessenger dependency to send state change notifications - **DatabaseManager** - Added IMessenger dependency to notify when databases are loaded/unloaded - **ClipboardCoordinator** - Sends StateRefreshRequestedEvent instead of AutoCaptureStateChangedEvent for broader state coverage - **MainMenuViewModel** - Now refreshes IsAutoCapturing and HasMultipleDatabases properties on state change events - **QuickPasteToolbarViewModel** - Now refreshes IsTargetLocked and GoBackEnabled properties on state change events - **Clipboard Services** - Changed to transient lifetime for better resource management - **Installer Copyright** - Updated to 2026 ## [0.1.0-alpha.3] - 2026-1-3 ### Added - **Virtual Collection Deletion** - Users can now delete virtual collections through context menu ### Changed - **Application Profile Format Handling** - Updated smart defaults to use "CF_" prefixed format names matching clipboard enumeration - **Bitmap Format Detection** - All bitmap variants (CF_BITMAP, CF_DIB, CF_DIBV5) treated as equivalent when checking application profiles - **Sample Data** - Updated Welcome clip to remove version number and signature, modernized text ### Fixed - **Context Menu Commands** - Fixed XAML bindings for Add/Delete Collection and Activate/Deactivate Database commands using TreeView.Tag approach - **Command Execution** - Implemented proper CanExecute logic for collection commands based on selected node type - **Virtual Collection Organization** - Removed duplicate "Virtual" parent collection from seeder; virtual collections now top-level entities organized by UI - **Cascade Delete** - Collection deletion now properly removes orphaned clips and child collections to prevent foreign key constraint errors - **Application Profile Format Matching** - Fixed format name mismatches between clipboard enumeration (CF_BITMAP) and profile storage (BITMAP) - **Bitmap Format Filtering** - Resolved issue where enabled bitmap formats were still filtered out due to name prefix differences - **Clipboard Suppression** - Fixed ContentHash not being populated when loading clips from database, preventing re-capture of viewed clips - **ClipViewer Display** - Fixed StorageType values in sample clips (changed from 0 to StorageType.Text) so ClipViewer can properly load content ## [0.1.0-alpha.2] - 2026-01-02 ### Added - **About Dialog** - Version information, credits, and third-party attribution - **Docusaurus Documentation** - Initial documentation site setup with essential files ### Changed - **QuickPaste Formatting** - Improved formatting string selection logic for better paste behavior - **README Updates** - Added project acknowledgment and tribute to original ClipMate ### Fixed - **About Dialog XAML** - Cleaned up formatting for better maintainability - **Collection Roles** - Added CollectionRole.Inbox enum for semantic identification - **Duplicate Role Validation** - Repository-level validation prevents duplicate special role assignments - **Initialization Errors** - Fixed "No database is currently selected" when starting minimized - **DatabaseKey Propagation** - ClipAddedEvent now includes DatabaseKey for proper context tracking ### Tests - Enhanced service provider mocks in view model tests - Added IClipboardService mock coverage ## [0.1.0-alpha.1] - 2026-01-01 ### Added #### Core Features - **Clipboard Monitoring** - Real-time capture of text, images, RTF, HTML, and file paths - **Multi-Database Support** - Switch between multiple SQLite databases with independent collections - **Collections & Folders** - Hierarchical organization with Collections, Folders, and Virtual (SQL-based) collections - **Search System** - Full-text search with saved queries and SQL support for advanced filtering - **QuickPaste** - Auto-targeting paste functionality with formatting strings and Good/Bad target lists - **PowerPaste** - Automation engine with macro execution and keystroke simulation - **Templates** - Reusable content with tag replacement (#DATE#, #TIME#, etc.) - **Shortcuts** - Nickname system for quick clip access (e.g., `.s.welcome`) - **Import/Export** - XML format with flat file fallback for large content - **Application Profiles** - Per-application capture filtering and settings - **Retention Management** - Automatic overflow handling with clip cascade (Collection → Overflow → Trashcan) - **Duplicate Detection** - Content hashing with configurable per-collection duplicate handling - **ClipData Architecture** - Multi-format storage supporting simultaneous Text, RTF, HTML, and Bitmap formats #### UI Components - **Three-Pane Explorer** - Collections tree, clip list, and content viewer with resizable splitters - **Monaco Editor** - Code/text editing with syntax highlighting and 40+ themes - **Hex Editor** - Binary content viewing and editing for non-text formats (WpfHexEditor) - **Clip Viewer Window** - Standalone viewer with auto-follow and pinning features - **DevExpress Controls** - Modern themed UI with Office 2019 styles - **Emoji Icons** - Twemoji font integration in context menus, toolbars, and status displays - **Sound Effects** - Audio feedback for clipboard operations (capture, paste, ignore) - **Clip Properties Dialog** - Detailed metadata editing and shortcut management #### Diagnostic Tools - **SQL Console** - Direct database querying with IntelliSense and result grid - **Event Log Viewer** - Real-time application event monitoring - **Clipboard Diagnostics** - Format inspection and raw clipboard data viewing - **Database Schema Viewer** - Interactive table and relationship explorer - **SQL Maintenance Services** - Database optimization and diagnostics #### Data Management - **Setup Wizard** - First-run configuration and database initialization - **Default Data Seeder** - Pre-configured collections matching ClipMate 7.5 structure - **Database Migration** - Automatic schema upgrades with backup creation - **Maintenance Scheduler** - Background optimization and cleanup tasks - **Undo Service** - Transaction-based undo for clip operations - **Centralized Clip Operations** - Unified service layer for all clip manipulations ### Changed - **Architecture** - Layered design with strict separation: UI → Services → Repositories → DbContext - **Database Access** - Entity Framework Core 9.0 with Dapper for performance-critical queries - **MVVM Pattern** - CommunityToolkit.Mvvm for relay commands and observable properties - **Logging** - Structured logging with Serilog (file and debug output) - **Configuration** - TOML format for user settings with type-safe models - **Unit Tests** - Migrated to in-memory SQLite connections and IDatabaseContextFactory pattern - **RTF Viewer** - Replaced with DevExpress RichEditControl for enhanced functionality - **HTML Viewer** - Integrated HtmlRenderer.WPF for improved rendering ### Fixed - **AcceptDuplicates Enforcement** - Collections properly reject duplicates based on configuration - **TUnit Compatibility** - Updated to version 1.7.7 for improved testing - **Property References** - Corrected ColumnBase to BaseColumn in DataGrid methods - **Font Icons** - Updated SVG resources and font mappings - **Test Assertions** - Improved backup progress and search functionality tests ### Infrastructure - **Build System** - Cake build automation with version stamping and artifact management - **CI/CD Pipeline** - GitHub Actions for automated builds and installer generation - **Versioning** - MinVer for semantic versioning from Git tags - **Installers** - Inno Setup with dual strategy (standard installer + portable ZIP) - **WebView2** - Fixed Version runtime bundled for offline portable installations - **Code Signing** - SignPath integration configured (pending certificate approval) - **Testing** - TUnit framework with 100+ unit and integration tests - **Font Pipeline** - nanoemoji and fonttools for color emoji font generation - **LibMan Integration** - Automated client-side library management - **.NET 10 Upgrade** - Migrated from .NET 9 to .NET 10 preview ### Known Limitations - Encryption not yet implemented (planned for future release) - Printing functionality pending - Help documentation in progress - Installers unsigned (awaiting SignPath certificate approval) --- ## Release Notes Format Each release should include: ### Added New features and capabilities ### Changed Changes to existing functionality ### Fixed Bug fixes ### Deprecated Features that will be removed in upcoming releases ### Removed Features that have been removed ### Security Security-related changes --- ## Version History | Version | Date | Type | Notes | |---------|------|------|-------| | 0.1.0 | TBD | Pre-alpha | Initial development release | --- **Note:** This project is in active development. Breaking changes may occur between pre-release versions.