Repository navigation
2.2.1.2706
Highlights 🌟
-
📋 Floating paste panel
A non-activating floating button lists the clipboard history and
pastes a row into the focused app on click, with a native
right-click menu. It works on macOS, Windows and Linux (X11 and
Wayland, the latter through the RemoteDesktop portal) (#4995 #5039
#5062 #5063 #5064 #5066 #5068 #5076 #5078 #5079). -
⬇️ Background update downloads (Windows portable zip)
A newer release is downloaded, verified and extracted in the
background as soon as the periodic check finds it, throttled to
1 MB/s, with HTTP range resume across restarts and dropped
connections; the prompt then offers a one-click restart. A General
settings switch turns automatic downloads off (#5090 #5091 #5092). -
🔒 Password-manager hints and source exclusion
Copies that password managers mark as "do not record" (Bitwarden,
1Password, KeePassXC and others) are now honored on Windows, macOS
and Linux: they are neither stored nor synced. The Clipboard sources
page was redesigned so excluded apps can be picked from the running
apps or browsed for, and match rules skip any source whose name
contains a given text (#5013 #5015 #5017 #5020). -
📁 Large-file destination
The large-file Downloads switch is replaced by a destination path:
files above the backup size limit go to the folder you choose, or
to the system Downloads folder when it is empty. Receive-side
same-name conflicts now persist the renamed record correctly and a
retry can no longer truncate an existing file (#5007 #5038 #5045
#5047 #5051). -
⚙️ Settings information architecture
The Advanced group became Clipboard with Recording, Sync and
Storage pages, size limits moved into one Storage section, Clipboard
sources moved to Recording, and every row and page title was
reworded to read without its subtitle. The settings content area
now uses a grey ground with white section cards, and the theme
switch is the mobile sun/auto/moon slider (#5046 #5048 #5049 #5052
#5021 #5022 #5023 #5024 #5028 #5034 #4991). -
🖥️ Devices page and multi-homed hosts
The Devices page acts on what it shows: the local device heads the
list, refresh keeps the list, removal asks for confirmation, nearby
devices can be blocked in place. Peers now learn the address they
dialed on multi-homed hosts (Windows ICS, hotspots), the interface
list follows network changes, and a manual add with no usable
address fails with a message (#4935 #4951 #4953 #4955 #4957 #4959
#4993 #5026 #4996 #4998 #5000 #5009). -
🔄 Sync reliability
Received pastes are acknowledged only after they are durable, the
pairing initiator advertises its own address on the v3 commit so
one-way-mDNS networks sync both ways after pairing, stale sync rows
no longer cause duplicate pushes, WebSocket pushes are acknowledged
so receiver failures fail the task, and push session finalize and
expiry are serialized (#4894 #4895 #4915 #4936 #4937 #4945 #5086). -
🛡️ Data integrity and storage reclaim
Storage migration saves the new path before deleting the old store,
an unreadable config is never overwritten with defaults, deleted
pastes take their directories with them, import/export no longer
leave broken records and reject paths escaping managed storage,
remote LOADING rows always reach a terminal state, concurrent
releases of the same content no longer delete each other, and a
startup failure before logging leaves a log and exits non-zero
(#5094 #5095 #5096 #5097 #5098 #5099 #5124 #5125 #5126 #5127 #5130
#5131 #5132 #5133 #5140 #5141). -
🔁 Relay and sync hardening
Clipboard relay now forwards non-file pastes and carries a seen set
so relays never loop, a removed device can no longer be re-inserted
by a racing SyncInfo write, failed polls back off quickly, discarded
pushes free their pre-allocated large-file slots, and headless mode
stops logging the pairing token (#5108 #5109 #5118 #5119 #5122 #5123
#5151 #5152 #5155 #5156). -
🔍 Search window
FTS terms are quoted so punctuation no longer breaks search, the
selection, query reset and tag filter follow live data, closing
without pasting returns focus to the previous app, the window closes
together with the edit bubble, and the panel button recovers after
its display is unplugged (#5093 #5116 #5117 #5145 #5146 #5147 #5148). -
🧠 Memory and runtime
Coil's memory cache limit is no longer inflated to 435 MiB, the
desktop server engine moved from Netty to CIO, Skiko's periodic
System.gc() runs as a concurrent cycle, and the bundled runtime is
JBR 25 (#4908 #4911 #4912 #4913 #4831 #5042 #5044). -
🌐 UI copy revision
English and Chinese copy was revised across the app and the eight
other languages were revised against the new source, with i18n
consistency checks and a style guide added (#4961 #4963 #4965 #4967
#4970 #4972 #4974 #4976 #4979 #4980 #4985 #4986 #4987 #4988).
Bug Fixes 🐛
-
🐛 Capture copies from native Wayland apps via the data-control protocol (#5173)
-
🐛 Report the displayed size of EXIF-rotated images in the side preview (#5162)
-
🐛 Keep a removed device from being re-inserted by a racing SyncInfo write (#5156)
-
🐛 Back off quickly after a failed poll of a regular device (#5152)
-
🐛 Close the search window with the bubble and re-place the panel button when its display is gone (#5148)
-
🐛 Keep the search window's selection, query reset and tag filter in step with live data (#5146)
-
🐛 Stop concurrent releases of the same content from deleting each other (#5141)
-
🐛 Discard a macOS pasteboard snapshot when another write lands during the read (#5139)
-
🐛 Keep CF_HTML offsets in step with the bytes AWT writes on Windows (#5137)
-
🐛 Leave a startup-failure log and exit non-zero when startup fails before logging (#5133)
-
🐛 Save the new storage path before deleting the old store during migration (#5131)
-
🐛 Refuse to apply a zip update whose staging lost its exe (#5129)
-
🐛 Reclaim paste directories and stop import/export from leaving broken records (#5127)
-
🐛 Give remote LOADING rows a terminal state and stop orphaning their files (#5125)
-
🐛 Relay non-file pastes and make clipboard relay loop-free (#5123)
-
🐛 Delete pre-allocated large-file slots when a push is discarded (#5119)
-
🐛 Return focus to the previous app when the search window is closed without pasting (#5117)
-
🐛 Stop logging the pairing token in headless mode (#5109)
-
🐛 Reference MCP-added files at their original path (#5106)
-
🐛 Refresh companion flavors when editing a paste from the UI (#5104)
-
🐛 Remove tag links when a tag or paste is deleted (#5102)
-
🐛 Never overwrite an unreadable app config with defaults (#5099)
-
🐛 Keep the owning record when a file is copied out of CrossPaste storage (#5097)
-
🐛 Reject import records whose paths escape managed storage (#5095)
-
🐛 Quote FTS search terms so punctuation no longer breaks search (#5093)
-
🐛 Fix portable update offline trigger, mirror affinity, cross-mirror resume and rate limiter burst (#5092)
-
🐛 Self-register the initiator's address on the pairing v3 commit so an acceptor that never sees its mDNS can reach it (#5086)
-
🐛 Fix multi-monitor placement, clipping and focus handling for Linux paste panel menu (#5079)
-
🐛 Close the floating button's menu on Linux when the user clicks elsewhere (#5078)
-
🐛 Let the floating button fade back on Linux when no pointer exit arrives (#5076)
-
🐛 Offer a URL paste item as plain text so non-Java apps can paste it (#5072)
-
🐛 Keep GuidePasteDataService.initData from throwing into host startup code (#5070)
-
🐛 Tell the user to paste manually when no X11 window can be targeted (#5066)
-
🐛 Create the paste panel windows as override-redirect on Linux so a click keeps the target app focused (#5064)
-
🐛 Give the paste panel button menu an opaque theme background on Linux (#5063)
-
🐛 Fix the paste panel corners and button menu glyphs on Windows (#5062)
-
🐛 Run the ws-session sync handlers on the test dispatcher to fix a CI flake (#5058)
-
🐛 Route the macOS application menu About item to the About page and localize its title (#5054)
-
🐛 Let the About page scroll so the app name and version are not squeezed out (#5053)
-
🐛 Only offer the large-file destination picker where a storage path manager exists (#5051)
-
🐛 Pass --add-opens as a single token so packaged builds start on JBR 25 (#5044)
-
🐛 Open the Accessibility privacy pane via open(1) since Desktop.browse drops the deep link on macOS 26 (#5036)
-
🐛 Cap the device name marker with a layout modifier so the row can be measured intrinsically (#5026)
-
🐛 Stop caching the update site's fixed-name files for 30 days (#5006)
-
🐛 Cap the device name marker at half the title line so it cannot starve the name (#4993)
-
🐛 Key side preview remember blocks on the data they actually read (#5012)
-
🐛 Extract HTML text from the body only, trim it and unescape entities (#5010)
-
🐛 Refresh the network settings interface list on network changes (#5009)
-
🐛 Fail the manual add when the peer names no address (#5000)
-
🐛 Answer /sync/syncInfo with the address the peer dialed (#4998)
-
🐛 Update the browser extension to the renamed i18n keys and check its references (#4974)
-
🐛 Settle push session finalize and expiry discard under one terminal lock (#4945)
-
🐛 Acknowledge received pastes only after they are durable (#4937)
-
🐛 Harden MCP server lifecycle and surface start failures in settings (#4931)
-
🐛 Isolate JmDNS lifecycle per interface and bind nearby presence to the discovery source (#4929)
-
🐛 Keep the Windows network warning dismissal across restarts (#4926)
-
🐛 Honor the discovery toggle when resolving interfaces and stop dropping hosts by last octet (#4924)
-
🐛 Bound encrypted HTTP payloads and stop caching processors for unknown peers (#4922)
-
🐛 Restart pairing v3 session after a lost proof response instead of refreshing the offer (#4919)
-
🐛 Acknowledge WebSocket paste_push so receiver failures fail the sync task (#4915)
-
🐛 Fix Coil memory cache limit being overridden to 435 MiB (#4912)
New Features ✨
-
✨ Let PasteContentEditor save an HTML paste's background with its content (#5176)
-
⚡ Stream exported files straight into the package instead of staging copies (#5166)
-
⚡ Record the drag preview layer only for the hovered search card (#5160)
-
⚡ Move drop collection, drag-out image decoding and editor serialization off the UI thread (#5150)
-
⚡ Index the history list by createTime and re-index FTS only on content changes (#5135)
-
⚡ Parse HTML/RTF previews off the UI thread (#5121)
-
⚡ Stop the tutorial button pulse after a few cycles and compose device refresh spinners only while they spin (#5111 #5113)
-
✨ Download portable-zip updates in the background with bandwidth throttling and resumable downloads (#5091)
-
✨ Add devices remove, block and unblock CLI commands (#5087)
-
✨ Show sort direction with arrow icons and state-specific tooltips in the search bar (#5081)
-
✨ Paste into native Wayland windows through the RemoteDesktop portal (#5068)
-
✨ Replace the theme segmented buttons with the mobile sun/auto/moon slider (#5052)
-
✨ Replace the large-file Downloads switch with a destination choice and persist conflict renames on receive (#5047)
-
✨ Add a floating non-activating paste panel that pastes a history row into the focused app on click (#5039)
-
✨ Add a setting to keep received files above the backup size limit in managed storage instead of Downloads (#5038)
-
✨ Redesign the Import page: file-aware selection, drop-to-import, gated button and inline result (#5030)
-
✨ Layer the content area with grey ground, white section cards and neutral headers (#5022)
-
✨ Exclude clipboard sources by match rule (#5020)
-
✨ List only excluded apps on the clipboard sources page and add any app by picking it (#5017)
-
✨ Honor password-manager clipboard hints on Windows, macOS and Linux (#5015)
-
✨ Polish settings screen interactions (#4991)
-
✨ Mark the local device row with plain text after its name instead of a status tag (#4959)
-
✨ Show the local device as the first row of my devices on desktop (#4957)
-
✨ Add a nameTrailing slot to DeviceRowContent for inline markers after the device name (#4955)
-
✨ Add a leading item slot to myDevicesSection so the local device can head the list (#4953)
-
✨ Make the Devices page act on what it shows (#4935)
-
✨ Document MCP tools for agents and reject unknown search filters (#4940)
-
✨ Route SOCKS proxies through OkHttp and cap ResourcesClient response sizes (#4933)
-
⚡ Make Skiko's periodic System.gc() a concurrent cycle (#4913)
Multiplatform · Refactor · Code Style 🔨
-
🔨 Remove the unreachable image thumbnail pipeline (#5143)
-
🔥 Remove the unused hand-written SyncApi.SCHEMA route list (#5158)
-
📝 Fix broken DeepWiki badge and bump download badge to v2.2.1 (#5107)
-
🔨 Name what a clipboard write includes with PasteWriteScope (#5074)
-
🔨 Mark the device row ripple read-only and skip hover tracking on disabled rows (#5057)
-
🔨 Clear the Compose 1.12 deprecation warnings in the device row and NonActivatingWindow (#5056)
-
🔨 Restructure the settings tree so common settings are not buried under Advanced (#5048)
-
🔨 Parameterize SettingSectionCard container color, border and modifier (#5021)
-
🔨 Prepare shared device UI for mobile: platform display name, two-line names, neutral section headers, extracted nearby actions (#4951)
-
🔨 Rename shared i18n keys that no longer match their copy (#4970)
-
🔨 Rename, merge, and delete desktop-only i18n keys (#4967)
-
🔨 Replace Netty server engine with CIO on desktop (#4911)
-
🔨 Extract the Glama MCP entrypoint script from the Dockerfile (#4939)
-
🎨 Compact the Export page type picker into filter chips and add the tagged-only icon (#5032)
-
🎨 Put the Share page on the content ground with section cards (#5034)
-
🎨 Group the OCR language packs into section cards on the grey ground (#5028)
-
🎨 Tint the pressed state of cards on the grey ground with primary (#5024)
-
🎨 Keep the hairline border only on cards that group several rows (#5023)
-
🎨 Spell HTML and RTF consistently in i18n strings (#4949)
-
🎨 Capitalize the HTML paste type name in every language (#4947)
-
📝 Rewrite settings copy so each row and page reads without its subtitle (#5049)
-
📝 Revise English and Chinese copy for settings, storage, update, CLI, and MCP screens (#4963)
-
📝 Revise English and Chinese copy for devices, pairing, search, notifications, and About (#4965)
-
📝 Revise Traditional Chinese, Korean, German, Persian, Spanish, Portuguese, French and Japanese copy against the new English source (#4972 #4976 #4979 #4980 #4985 #4986 #4987 #4988)
-
📝 Declare Glama MCP directory maintainers (#4938)
-
📝 Mark command-line mode as shipped in roadmap (#4907)
-
📝 Tighten Chrome Extension and CLI feature blurbs to one line (#4906)
-
📝 Add Trendshift and mcpservers.org badges to README (#4904 #4920)
Build & CI 👷
-
✅ Keep real shells and wall-clock waits out of the fast test tier (#5164)
-
✅ Make eight silently skipped tests run and guard against non-void test methods (#5115)
-
✅ Share a withIsolatedHome helper that restores HOME in CLI tests (#5144)
-
✅ Initialize JsonUtils before FilePushServiceTest builds paste items (#5154)
-
⬆️ Bump gradle-wrapper from 9.7.1 to 9.8.0 (#5169)
-
✅ Add a logback config to the e2e harness so JmDNS debug output stops drowning the results (#5085)
-
✅ Add i18n consistency checks and the i18n style guide (#4961)
-
🐳 Add Glama stdio Dockerfile for the MCP server (#4916)
-
➖ Remove unused kotter entry from the version catalog (#4917)
Dependencies ⬆️
- ⬆️ Migrate the bundled runtime to JBR 25.0.4.1 b610.67 (#4831 #5042)
- ⬆️ Upgrade Compose Multiplatform to 1.12.1 and Navigation to 2.10.0-beta01 (#5055)
- ⬆️ Bump kotlin from 2.4.10 to 2.4.20 (#5001)
- ⬆️ Bump sqldelight from 2.3.2 to 2.4.0 (#5061)
- ⬆️ Bump coil from 3.6.0 to 3.6.3 (#4941 #5060)
- ⬆️ Bump imageio from 3.14.0 to 3.15.2 (#4989 #5083)
- ⬆️ Bump ch.qos.logback:logback-classic from 1.6.3 to 1.6.5 (#5084 #5171)
- ⬆️ Bump com.github.ben-manes.caffeine:caffeine (#5082)
- ⬆️ Bump io.github.vinceglb:filekit-dialogs from 0.15.0 to 0.16.0 (#5004)
- ⬆️ Bump dev.nucleusframework:composenativetray-jvm (#4942 #5172)
- ⬆️ Bump com.squareup.okio:okio from 3.18.1 to 3.18.2 (#4943)
- ⬆️ Bump com.mohamedrejeb.richeditor:richeditor-compose (#4909 #5168)
- ⬆️ Bump org.yaml:snakeyaml from 2.6 to 2.7 (#4910)
- ⬆️ Bump com.helger:ph-css from 8.2.1 to 8.2.2 (#5170)
- ⬆️ Bump vitest to 4.1.11 and browserslist/baseline-browser-mapping to fix Dependabot alerts (#4994)