Releases: CrossPaste/crosspaste-desktop
Release list
2.1.7.2461
Highlights π
-
π‘οΈ Hardened device sync
A full round of security and robustness hardening on the sync path:
sync connections and control requests strictly verify peer identity,
file transfers validate path legitimacy and cap resource usage, and
malformed data can no longer disrupt normal syncing (#4705β#4716). -
π More reliable connections
A corrupted device record no longer prevents the device list from
loading; metadata read failures no longer reset the device identity;
device state changes propagate reliably across the UI; devices now
show as connected the moment an incoming connection is established,
instead of waiting for the next liveness poll; and HarmonyOS
devices are recognized with their own icon (#4695 #4720 #4722 #4724
#4728 #4747). -
π The main window now opens on first launch
Fixed an issue on some platforms where the first launch only showed a
tray icon and no window at all, making it look like the app "wouldn't
open". The main window now opens automatically on first launch on
every desktop platform (#4696 #4697). -
ποΈ Customizable size limit for large clipboard entries
A new setting customizes the maximum size for text, HTML, rich text,
and link content written into the history (8MB by default). Entries
over the limit are not recorded, so meaninglessly huge text can't
bloat the database or slow down the UI; sync skips them too, without
breaking pull continuity. Files and images are not affected
(#4699 #4701 #4703 #4704). -
π¨ New Appearance settings page
Settings now has an Appearance page with a customizable side search
window height and live preview. Card title bars in the side window
scale proportionally with card size (#4664 #4674 #4676). -
π macOS: hide the Dock icon
A new macOS-only setting hides CrossPaste from the Dock, keeping only
the menu bar icon (#4659 #4677 #4678). -
π URL preview fetching can now be turned off
A new setting disables fetching a copied link's title and icon, so
CrossPaste makes no network request for copied URLs β for privacy,
or to avoid accidentally triggering one-time links. On by default,
matching the previous behavior (#4742 #4744). -
π§© Chrome extension improvements
The extension now decrypts encrypted paste pushes from the desktop
app, supports the newer SAS/PIN-based pairing flows, and performs
the authenticated WebSocket handshake so it can keep syncing with
peers that require authenticated connections (#4683 #4729 #4730
#4749).
Bug Fixes π
- π Implement authenticated WebSocket handshake in the Chrome extension (#4749)
- π Resolve device state immediately when an inbound WebSocket session opens (#4747)
- π Dedupe search results by id in the shared search ViewModel (#4733)
- π Decrypt encrypted WS paste push in Chrome extension (#4730)
- π Tolerate corrupted hostInfo JSON per row in device-list mapping (#4728)
- π Never rotate device identity on metadata read failure (#4724)
- π Give SyncRuntimeInfo flow broadcast semantics (#4722)
- π Include network prefix in host info equality (#4720)
- π Make ErrorCode hashCode consistent with equals (#4718)
- π Validate file transfer path metadata correspondence (#4716)
- π Roll back push prepare on session capacity rejection (#4714)
- π Authenticate sync control requests (#4712)
- π Disambiguate WebSocket whole-file pulls (#4711)
- π Authenticate WebSocket sessions (#4710)
- π Bind WebSocket paste identity (#4709)
- π Bound remote file transfer resources (#4708)
- π Fail truncated file chunks (#4707)
- π Bind remote paste to authenticated identity (#4706)
- π Reject unsafe remote file paths (#4705)
- π Prevent paste pull cursor gaps (#4704)
- π Persist paste pull cursor for discarded oversized remote pastes (#4703)
- π Auto-show main window on first launch for all desktop platforms (#4697)
- π Allocate v2 exchange generations before async dispatch and make verifier acquisition atomic (#4693)
- π Release the responder's pending v2 exchange when the initiator abandons pairing (#4690)
- π Fix SPAKE2 session lifecycle races and fail closed pending constant-time EC review (#4663)
New Features β¨
- β¨ Add option to disable URL preview fetching (#4744)
- β¨ Add chunked WebSocket payload transfer negotiated via the pairing v3 handshake (dormant until v3 rollout) (#4732)
- β¨ Discard oversized non-file paste items to prevent huge database rows (#4699)
- β¨ Add HarmonyOS platform support with system icon (#4695)
- β¨ Add pairing v2 (SAS) and v3 (SPAKE2 PIN) support to the browser extension (#4683)
- β¨ Render pairing v3 acceptor sessions as per-device token cards with auto-close on trust (#4681)
- β¨ Add macOS setting to hide the Dock icon (#4677)
- β¨ Add appearance settings page with customizable search window height (#4674)
- β¨ Add development-only pairing v3 interop flag (#4667)
- β¨ Add pairing v3 scenarios (pair-v3, all-v3) to e2e harness (#4665)
- β¨ Pairing v3: real SPAKE2/P-256 PakeProvider with RFC 9382 vectors (#4658)
- β¨ Pairing v3 Phase 4: desktop UI (#4656)
- β¨ Pairing v3 Phase 3: network protocol service, routing, and client API (#4654)
- β¨ Pairing v3 foundation: per-device sessions, PIN + SPAKE2 building blocks (#4652)
Multiplatform Β· Refactor Β· Code Style π¨
- π¨ Scale side paste title bar proportionally with card size (#4676)
- π¨ Harden pairing v3 interop handshake and trust dialog UX (#4669)
- π¨ Extract PairingV3Transport seam for in-process pairing v3 tests (#4661)
- π¨ Split stored paste JSON codec from sync format and fix hashing and size accounting (#4648)
- π¨ Separate QR bearer token from SAS code at the type level (#4644)
- π¨ Harden paste process plugin pipeline and cap max non-file paste size input (#4701)
Build & CI π·
- π· Add Microsoft Store publish automation (#4738)
- π· Speed up CI with per-job Gradle caches, konan cache, and superseded-run cancellation (#4689)
- β Move platform-agnostic tests to core commonTest and cover core/shared in CI (#4646)
Documentation π
- π Replace contact email with support@crosspaste.com (#4671)
- π Add Video link to README navigation
- π Bump README download badge to v2.1.6
Dependencies β¬οΈ
- β¬οΈ Bump org.bouncycastle:bcprov-jdk18on from 1.84 to 1.85 (#4741)
- β¬οΈ Bump com.squareup.okio:okio from 3.18.0 to 3.18.1 (#4740)
- β¬οΈ Bump ktor from 3.5.1 to 3.5.2 (#4739)
- β Drop unused Compose plugin and runtime from shared (#4726)
- β¬οΈ Bump logback-classic from 1.5.38 to 1.6.1 (#4687)
- β¬οΈ Bump io.modelcontextprotocol:kotlin-sdk-server (#4686)
- β¬οΈ Bump kotter from 1.3.0 to 1.4.0 (#4685)
- β¬οΈ Bump metadata-extractor from 2.20.0 to 2.21.0 (#4650)
- β¬οΈ Bump okio from 3.17.0 to 3.18.0 (#4649)
- β¬οΈ Bump compose-shimmer (#4642)
- β¬οΈ Bump richeditor-compose
- β¬οΈ Bump kotlin from 2.4.0 to 2.4.10
- β¬οΈ Bump imageio from 3.13.1 to 3.14.0
2.1.6.2390
Highlights π
-
π Fixed a clipboard loop between the Chrome extension and desktop
Running the Chrome extension and the desktop app on the same machine
could bounce the same clipboard entry back and forth endlessly,
flooding the history with duplicates. Both sides now recognize
content written by the other and no longer re-trigger each other
(#4619 #4620). -
πͺ Same-machine pause protection now actually works on Windows
The native messaging bridge that lets the extension detect a running
desktop app never launched on Windows: the host manifest pointed to
the bridge script with a forward-slash path, which cmd.exe β used by
Chromium to launch non-exe hosts β cannot execute. The manifest now
keeps native backslashes, the bridge script resolves the pid file at
run time (immune to code-page path garbling on non-ASCII user
profiles), and stdin draining is Windows PowerShell 5.1-safe. While
the desktop app is running, the extension on the same machine now
pauses its clipboard capture as designed (#4633 #4634). -
πͺ Upgraded clipboard monitoring on Windows
Clipboard monitoring on Windows now uses the AddClipboardFormatListener
event mechanism, so copied content is picked up faster and more
reliably. The "copied from" app is now resolved via GetClipboardOwner
β the program that actually wrote to the clipboard β instead of
whichever window happened to be in the foreground (#4597 #4606). -
πͺ Works on newer Windows builds without wmic
Newer Windows 11 builds have removed the wmic tool, which prevented
CrossPaste from generating a device identifier. It now reads the
registry MachineGuid instead (#4580). -
π§© Extension zip from GitHub Releases now connects to the desktop app
Loading the Chrome extension zip via "Load unpacked" used to fail with
"Access to the specified native messaging host is forbidden", because
Chrome assigned it a different extension ID on every machine. The
extension ID is now pinned to the Chrome Web Store ID, so unpacked
installs connect to the desktop app just like the store version
(#4631 #4632). -
π Search window resets properly on reopen
Reopening the search window or changing the query now scrolls the
list back to the top and selects the newest entry, instead of keeping
a stale position or selection (#4595 #4600). -
πΆ Device discovery prefers your LAN
When a computer has multiple network connections (such as a cellular
modem or a phone hotspot), CrossPaste now ranks local network
interfaces first when discovering nearby devices (#4568). -
π§ New Linux ARM64 build
CrossPaste now ships a Linux ARM64 (aarch64) package, so ARM-based
Linux devices are supported too (#4581 #4582 #4626).
Bug Fixes π
- π Keep native backslashes in the native messaging host path so cmd.exe can launch the bridge script, resolve the pid file via %~dp0, and make the stdin drain PowerShell 5.1-safe (#4634)
- π Read lastError on native host disconnect to log the reason and silence unchecked-error noise (#4634)
- π Pin Chrome extension ID via manifest key so unpacked installs can reach the native messaging host (#4632)
- π Build Linux ARM64 in releases and survive the apt-repo site layout (#4626)
- π Fix endless clipboard duplication loop between Chrome extension and desktop (#4620)
- π Force PNG output for README avatars to keep circle-mask corners transparent (#4615)
- π Migrate Windows clipboard monitoring to AddClipboardFormatListener (#4606)
- π Reset side search selection and scroll to newest on reopen and query change (#4600)
- π Resolve Windows clipboard source via GetClipboardOwner instead of foreground window (#4597)
- π Pass signing_key to Conveyor in the Linux beta workflow (#4584)
- π Replace deprecated wmic with registry MachineGuid for Windows device UUID (#4580)
- π Lower WindowsProcessUtils version-resource log from error to debug (#4578)
- π Capture network errors in ResourcesClient.request() instead of throwing (#4577)
- π Rank LAN interfaces above cellular for device discovery (#4568)
New Features β¨
Performance β‘
- β‘ Use plain remember for RichTextState in side preview views (#4618)
Multiplatform Β· Refactor Β· Code Style π¨
- π¨ Remove runBlocking from DesktopAppLaunchState DI assembly (#4575)
- π¨ Group Koin module declarations by sub-domain with regions (#4573)
- π¨ Make ImageHandler and ImageWriter I/O methods suspend (#4570)
Build & CI π·
- π· Decouple update-site publishing from release builds (#4630)
- π· Drop the nested apt repo from versioned release assets (#4627)
- π· Replace contrib.rocks with manually triggered contributors README workflow (#4613)
- π· Add manual Linux beta build workflow (#4583)
- π· Serve updates from the OSS-backed CDN site (#4560)
- π· Mirror the Conveyor update site to a stable OSS prefix (#4559)
Documentation π
- π Fix checkered flag emoji code in commit guide (#4598)
Dependencies β¬οΈ
- β¬οΈ Gradle Wrapper 9.5.1 β 9.6.1 (#4589 #4608)
- β¬οΈ logback-classic 1.5.34 β 1.5.37 (#4592 #4611)
- β¬οΈ MCP Kotlin SDK Server 0.13.0 β 0.14.0 (#4628)
- β¬οΈ Ktor 3.5.0 β 3.5.1 (#4607)
- β¬οΈ web build deps vite / @babel/core security bump (#4593)
- β¬οΈ composenativetray-jvm bump (#4591)
- β¬οΈ webp-imageio 0.10.2 β 0.11.0 (#4588)
- β¬οΈ Koin 4.2.1 β 4.2.2 (#4585)
- β¬οΈ Coil 3.4.0 β 3.5.0 (#4566)
- β¬οΈ filekit-dialogs 0.14.1 β 0.14.2 (#4565)
- β¬οΈ HikariCP 7.0.2 β 7.1.0 (#4564)
- β¬οΈ JNA 5.19.0 β 5.19.1 (#4563)
New Contributors π
- @swording-k made their first contribution in #4598
Full Changelog: 2.1.5.2343...2.1.6.2390
CrossPaste Linux Beta (build 2360)
Linux beta (amd64+aarch64) for #4581 ARM testing. Unsigned packages β do not use the in-app auto-updater.
2.1.5.2343
Highlights π
This is an urgent hotfix release with a single purpose. We recommend all users upgrade.
- π οΈ Fixed "Check for Updates" failing with an error
Clicking Check for Updates while a newer version was available threw
"Cannot call invokeAndWait from the event dispatcher thread" and the
update flow stopped there. This affected the Windows installer and
macOS builds; the Microsoft Store and Windows portable zip channels
were not affected (#4554).
Bug Fixes π
- π Guard update-check trigger against invokeAndWait on the EDT (#4555)
Full Changelog: 2.1.4.2340...2.1.5.2343
2.1.4.2340
Highlights π
-
π Faster, more reliable reconnection
This release focuses on the connection between your devices. When you
switch Wi-Fi networks, your network address changes, or your computer
wakes from sleep, CrossPaste now rediscovers your other devices and
reconnects much faster β no more being stuck "offline" for a long
time. Even when a device's IP address changes, it reconnects reliably
(#4506 #4510 #4515 #4519 #4521 #4527 #4529). -
π In-app changelog and upgrade reminder
You can now see what each update brings right inside the app. When a
new version is available, a small dot appears in the left menu to
remind you to upgrade (#4525). -
β¬οΈ Windows (portable zip): update from within the app
The Windows portable (zip) build can now update itself. When a new
version is available, CrossPaste downloads and verifies it, then swaps
in the new build and restarts β no more manually downloading and
extracting a fresh zip (#4537). -
π±οΈ Fixed an endless paste loop
Fixed an issue where pressing Cmd/Ctrl+V could trigger an endless
paste loop in some situations. Pasting is now more reliable (#4501
#4502). -
β¨ Smoother device list
The device list no longer flickers while re-checking offline devices,
so it stays steady (#4508).
Bug Fixes π
- π Gate
/sync/telnetaddress-push to already-paired peers (#4529) - π Harden network discovery: non-blocking mDNS teardown, debounced rebuild, offline gate (#4515)
- π Stop device list flicker when re-probing offline devices (#4508)
- π Decouple device identity from IP for reliable reconnection (#4506)
- π Suppress shortcut recognition during simulated paste (#4502)
- π Stop swallowing CancellationException in sync resolve loop (#4504)
- π Prevent infinite paste loop from Cmd+V shortcut binding (#4501)
- π Round drag preview corners on web paste cards (#4485)
- π Fix CLI native build after
appInstanceIdmoved out ofAppConfig(#4482)
New Features β¨
- β¨ In-app self-update for the Windows portable-zip distribution (#4537)
- β¨ Discovery-driven fast reconnect for paired peers (#4527)
- β¨ In-app What's New changelog screen with upgrade badge (#4525)
- β¨ Push subnet-matched address on steady-state heartbeat (#4521)
- β¨ Push subnet-matched address on
/sync/telnetto cut mDNS reconnection latency (#4519) - β¨ Self-heal mDNS discovery on OS network changes (#4510)
Multiplatform Β· Refactor Β· Code Style π¨
- π¨ Remove Jewel dependency in favor of native Compose Window (#4489)
- π¨ Reduce SyncResolver connection-polling log noise (#4523)
Build & CI π·
- π· Regenerate web version and translation artifacts (#4487)
- π· Upgrade GitHub Actions to Node.js 24 runtime (#4480)
Documentation π
- π Default to Chinese for developer interaction in CLAUDE.md (#4512)
Dependencies β¬οΈ
- β¬οΈ composenativetray-jvm bump (#4535)
- β¬οΈ logback-classic 1.5.32 β 1.5.34 (#4497 #4534)
- β¬οΈ web build deps rollup / postcss security bump (#4533)
- β¬οΈ Kotlin 2.3.21 β 2.4.0 (#4513)
- β¬οΈ Compose Multiplatform 1.11.0 β 1.11.1 (#4511)
- β¬οΈ MCP Kotlin SDK Server bump (#4517)
- β¬οΈ JNA 5.18.1 β 5.19.0 (#4516)
- β¬οΈ ph-css 8.1.1 β 8.2.1 (#4498)
- β¬οΈ Gradle Wrapper 9.5.0 β 9.5.1 (#4491)
- β¬οΈ kotlin-logging 8.0.03 β 8.0.4 (#4492)
- β¬οΈ MockK 1.14.9 β 1.14.11 (#4493)
- β¬οΈ Caffeine bump (#4494)
- β¬οΈ atomicfu 0.32.1 β 0.33.0 (#4495)
Full Changelog: 2.1.3.2297...2.1.4.2340
2.1.3.2297
Highlights π
-
π€ Faster file sharing across devices
Sharing files between your devices is now snappier and more reliable.
The device you copied from delivers files directly to your other
devices, instead of making them ask for the data first. This also
paves the way for the upcoming iOS Share Extension, letting you share
files straight from any app on your iPhone or iPad to your desktop
(#4456 #4457 #4467 #4468). -
π‘οΈ Windows: heads-up when your network blocks CrossPaste
On Windows, if your network is set to "Public", the Windows Firewall
silently blocks CrossPaste from finding nearby devices. CrossPaste
now detects this and offers a one-click shortcut to the Windows
setting where you can switch the network to Private (#4402 #4404). -
π±οΈ Smoother drag-and-drop from CrossPaste
Dragging items from the CrossPaste side panel into other apps is
now much better. On macOS, the drag preview no longer hides behind
the paste window β you can finally see what you're dragging. The
side panel also handles edge cases more gracefully, so drags don't
get blocked while previews are still loading, and dragging stays
smooth even with lots of items on screen. Bonus: you can now drag
to reorder your search tags too (#4361 #4357 #4377 #4388). -
πΌοΈ Animated GIFs and real video thumbnails in the side preview
GIFs in your clipboard history now actually animate (smoothly, even
for large ones), and video files show a real thumbnail of the first
frame in the side panel instead of a generic icon. We also fixed a
rare crash that could happen while previews were loading (#4353 #4410
#4422 #4438).
Bug Fixes π
- π Pre-allocate file slots on push receive so the first chunk has somewhere to land (#4468)
- π Namespace nearby device LazyColumn keys to avoid a Compose 1.11 duplicate-key crash (#4470)
- π Bypass JVM system proxy for LAN sync traffic so peer sync no longer hangs behind a configured HTTP proxy (#4449)
- π Make smoke-test orphan-JVM kill order-independent so cleanup keeps working if the launcher reorders
-Dflags (#4452) - π Replace
dzirbel/compose-material-context-menu(incompatible with Compose 1.11TextContextMenuAPI) with an in-tree Material context menu to fix text-field crash (#4448) - π Stop smoke-test from killing user's PROD CrossPaste and aborting on macOS bash 3.2 (#4445)
- π Serialize Skia codec/bitmap close with in-flight readPixels (#4438)
- π Bring main window to front on every showMainWindow call (#4408)
- π Fix COM ref leak and false-positive warning in Windows network detection (#4404)
- π Composite translucent HTML/RTF preview bg over theme to avoid double-blending (#4400)
- π Sort nvm node versions by parsed semver in web build (#4390)
- π Reset selected index when the search window opens (#4382)
- π Stop surfacing CancellationException as a refresh failure (#4373)
- π Stop ClientEncryptPlugin throwing on bodyless GET and harden pull error handling (#4371)
- π Harden thumbnail extraction and fix .ts TypeScript misclassification (#4367)
- π Resolve npm absolute path in :web build to fix daemon Exec error 2 (#4365)
- π Lower mac paste window level so drag preview is visible (#4361)
- π Skip empty Apple sync tasks and harden side drag preview (#4357)
- π Skip iPhone/iPad peers for Apple Universal Clipboard pastes (#4355)
- π Accept
java.net.URLtransfer data inDesktopUrlTypePlugin(#4349) - π Fix side search crashes on fast horizontal scroll (#4347)
- π Route Apple Universal Clipboard pastes to non-Mac peers (#4344)
- π Correct
.gitignoreentry toscheduled_tasks.lock
New Features β¨
- β¨ Add desktop file push protocol β
/sync/pastepush mode +/sync/file/push+/sync/paste/push/complete(M1+M2) (#4456) - β¨ Add desktop-side client for the file push protocol (M4) (#4457)
- β¨ Redesign OCR language rows and add drag-to-reorder for loaded languages (#4473)
- β¨ Add
PasteDao.filterExistingIdsfor stale-id filtering (#4428) - β¨ Add bulk tag operations to
PasteTagDao(#4426) - β¨ Animate GIFs in image side preview via Skia codec (#4410)
- β¨ Add
UserAttentionServiceto gate background pollers on window visibility (#4406) - β¨ Detect Windows Public network profile and offer one-click jump to settings (#4402)
- β¨ Add drag-and-drop reordering for search tags (#4377)
- β¨ Add Chrome extension release tooling and marketing preview (#4363)
- β¨ Preview video files in side panel with native thumbnails (#4353)
- β¨ Make device info values selectable for copy (#4320)
UI Improvements π
- π¨ Simplify settings description copy across all locales (#4315)
Multiplatform Β· Refactor Β· Code Style π¨
- π¨ Extract push out of
SyncPasteTaskExecutorintoSharePushOrchestrator(#4467) - π¨ Extract
DesktopBootstrapto consolidate process-wide hooks (#4450) - π¨ Opt in to
ExperimentalRichTextApiin HTML/RTF side previews (#4424) - π¨ Catch block exceptions inside
launchWhileAttentiveso a single failed tick doesn't kill the poller (#4415) - π¨ Regenerate
web/package-lock.jsonandi18n/translations.generated.ts(#4386) - π¨ Lazy-resolve npm in
:webGradle config, drop interactive-shell probe (#4384) - π¨ Consolidate
MacAcrylicEffectand tidy small readability issues (#4369) - π¨ Extract
hbitmapToBufferedImageand addPlatform.isApple(#4359) - π¨ Introduce
PasteSourceContextto bundle paste origin metadata (#4342) - π¨ Use
Durationform forkotlinx.coroutines.delaycalls (#4340) - π¨ Extract
AbstractGlobalCopywritertocommonMain(#4338) - π¨ Hoist shared i18n primitives to
commonMain(#4336) - π¨ Clarify
DiscoveryDriver.browsecontract and makeTargetCacheatomic (#4334) - π¨ Harden
DiscoveryDriver.close()and useDateUtilsin e2e (#4332) - π¨
:e2eharness review follow-ups (#4329) - π¨ Harden
appInstanceIdloadOrCreateand surfaceOneFilePersistwrite failures (#4322) - π¨ Harden
appInstanceIdmigration against corrupt metadata (#4317) - π¨ Extract
appInstanceIdout ofAppConfig(#4313) - π¨ Lazy-init
deviceId/deviceNameinEndpointInfoFactory(#4311)
Performance β‘
- β‘ Decode GIF frames off the UI thread with double buffering (#4422)
- β‘ Defer
dragOffsetXread to layer phase inSearchTagsView(#4388) - β‘ Stop firing side search load-more on every scroll frame (#4351)
Testing β
- β
Regression tests for
MaterialContextMenuhover-index and submenu position (#4454) - β
Regression test for
SkiaAnimatedImageViewclose ordering (#4444) - β
Add
:e2ereal-device test harness (#4318)
Build & CI π·
- π· Auto-update GitHub Sponsors avatars in README, with historical sponsors and rounded avatar rendering (#4458 #4462 #4464)
- π· Add desktop startup smoke test to CI (#4442)
- π· Drop
/hyperframes-demo/from.gitignore(#4412) - π· Ignore
/.claude/worktrees/ - π· Ignore
scheduled_task.lockandskills-lock.json - π· Ignore
/hyperframes-demo/directory - π· Ignore
/.dev-context/directory (#4309)
Documentation π
- π Require English for GitHub issue and PR content
- π Refresh README, CHANGELOG and Roadmap for v2.0.0 release (#4327)
Dependencies β¬οΈ
- β¬οΈ kotlinx-coroutines 1.10.2 β 1.11.0 (#4474)
- β¬οΈ kotlinx-serialization-json bump (#4475)
- β¬οΈ kotlin-logging 8.0.02 β 8.0.03 (#4477)
- β¬οΈ kotter 1.2.1 β 1.3.0 (#4478)
- β¬οΈ Compose Multiplatform β 1.11.0 (#4417)
- β¬οΈ Ktor 3.4.2 β 3.5.0 (#4305 #4429)
- β¬οΈ Kotlin 2.3.20 β 2.3.21 (#4324)
- β¬οΈ Jewel 0.34.0-253 β 0.36.0-261 (#4307 #4432 #4434)
- β¬οΈ Compose Shimmer β 1.5.0-beta02 (#4325 #4436)
- β¬οΈ richeditor-compose β 1.0.0-rc14 (#4419)
- β¬οΈ filekit-dialogs 0.13.0 β 0.14.1 (#4430)
- β¬οΈ Gradle Wrapper 9.4.0 β 9.5.0 (#4394)
- β¬οΈ atomicfu 0.31.0 β 0.32.1 (#4391)
- β¬οΈ kotlin-logging 8.0.01 β 8.0.02 (#4392)
- β¬οΈ kotlinx-datetime bump (#4393)
- β¬οΈ MCP Kotlin SDK Server bump (#4431)
- β¬οΈ semver 3.0.0 β 3.1.0 (#4379)
- β¬οΈ compose.hot-reload bump (#4378)
- β¬οΈ ksoup 0.2.5 β 0.2.6 (#4380)
- β¬οΈ icu4j 78.2 β 78.3 (#4308)
- β¬οΈ metadata-extractor 2.19.0 β 2.20.0 (#4323)
Full Changelog: 2.0.0.2192...2.1.3.2297
2.0.0.2192
Release Notes - v2.0.0
π§© Note on the Chrome Extension
The Chrome extension is now live on the Chrome Web Store: https://chromewebstore.google.com/detail/crosspaste/aajpcfbdbnaidaaljamjpmmjcfebhmlh
A few things to keep in mind about scope:
- The extension is a lightweight companion, not a replacement for the native desktop app. It is not feature-complete and is not intended to cover every workflow the desktop client supports.
- Supported: using the extension as a lightweight in-browser clipboard manager, and pairing it with the native desktop app to sync clipboard content across devices.
- Not supported: extension-to-extension cross-device pairing. Two browsers running only the extension cannot sync directly with each other β at least one peer in the mesh must be a native CrossPaste desktop (or mobile) instance.
If you need the full cross-device experience, install the native desktop app on at least one of your devices and pair the extension to it.
Highlights π
-
π§© Chrome Extension β A Brand New Platform
CrossPaste now runs as a first-class Chrome Extension, bringing clipboard sync directly to the browser. Includes WebSocket-based file pulling, Native Messaging to pause the extension when the desktop app is running, and full SyncState parity with desktop (#4152 #4157 #4158 #4164 #4168 #4176). -
π SAS-Based v2 Pairing Protocol
Pairing now uses a Short Authentication String (SAS) to prevent MITM attacks, with ashowPairingCodeendpoint and a remote access toggle for safer device onboarding (#4088 #4096 #4098). -
π WebSocket Sync Protocol
A new bidirectional, real-time WebSocket sync channel replaces polling for many flows, enabling instant cross-device updates, batch pulls, and live liveness probes (#4112 #4120 #4223). -
π₯οΈ Redesigned Devices Screen
The devices screen has been rebuilt with offline grouping, a current-device dialog, and a refined add-device flow β a cleaner, faster way to manage your mesh (#4207). -
π·οΈ Namespaced App Source Icons
App source icons are now namespaced byappInstanceId, eliminating cross-device collisions and enabling correct icon rendering across heterogeneous meshes (#4191 #4193 #4197).
Bug Fixes π
- Fix notification close button intercepted by native title bar buttons on Windows (#4039)
- Fix image side preview crop fill and blurry decode size (#4041)
- Fix color hex format in MarketingPasteData from ARGB to RGBA (#4043)
- Fix missing
libtesseract.soin Linux builds since 1.2.6 (#4049) - Fix ToStartView showing on open and not appearing when scrolled (#4052)
- Fix HTML/RTF search content returning raw markup (#4062)
- Fix Sparkle crash on macOS by disabling redundant scheduled check (#4086)
- Fix
SegmentedControlSettingsRowlayout in twoLine mode (#4136) - Deprioritize virtual network interfaces in auto-selection (#4138)
- Fix incorrect MCP SSE endpoint URL in configuration command (#4146)
- Skip sync for remote clipboard data to prevent duplication (#4148)
- Fix
ConnectCodeUtilsto use KMP-compatibleconcatToString(#4154) - Restore ESC key binding for
hide_windowand display it in shortcuts UI (#4183) - Fail fast when
crosspaste-version.propertiesis missing the version key (#4277)
New Features β¨
- β¨ Add loading indicator for pasteboard lazy loading and fix throttle stall (#4054)
- β¨ Add Portuguese (pt) language support (#4076)
- β¨ Add mobile app promotion guide in desktop devices view (#4083)
- β¨ Add user-configurable JVM system-property override file (#4267)
UI Improvements π
- π Replace custom
CountBadgeAutowith Material 3 Badge and add image count badge (#4143) - π Simplify
DesktopPromoteGuideto single download button (#4156) - π¨ Align add-device button style with current-device button (#4273)
Multiplatform Β· Refactor Β· Code Style π¨
- π¨ Extract core module and deduplicate shared/app code (#4060)
- π¨ Add Compose stability configuration for core module types (#4064)
- π¨ Remove
getSearchContent/getSummaryfromPasteItem, introducePasteItemReaderandPasteDataHelper(#4067) - β Remove unused
material-kolordependency (#4081) - π¨ Convert
withTimeout/withTimeoutOrNullLong overloads to Duration (#4094) - π¨ Abstract
TrustDeviceViewinDeviceScopefor platform-specific pairing (#4098) - β Remove duplicate exception classes from app module (#4100)
- π¨ Refactor
SyncResolverto unified single-pass connection flow (#4104) - π¨ Refactor
searchPasteDatapasteTypetopasteTypeListfor multi-type filtering (#4122) - π¨ Refactor
getCrossPasteWebUrlto use remote locale config frommeta.json(#4124) - π¨ Reduce default shortcut key bindings to
show_mainandshow_searchonly (#4127) - π¨ Migrate
promote.jsonto web API and update data model (#4150) - π¨ Refactor
addSyncTaskto accepttargetAppInstanceIdsasSet<String>(#4181) - π¨ Add identity parameter to
loadRepresentationfor mobile platform support (#4185) - π¨ Refactor
targetAppInstanceIdsto nullableSet<String>?for explicit no-sync semantics (#4188) - π¨ Unify coroutine scopes via
namedScopehelper (#4216)
Performance β‘
- β‘ Improve device reconnection with fast-then-slow telnet probe strategy (#4108)
- β‘ Skip icon pull when local icon file already exists (#4195)
Dependencies β¬οΈ
- β¬οΈ Kotlin 2.3.10 β 2.3.20 (#4069)
- β¬οΈ Compose Multiplatform 1.10.1 β 1.10.3 (#4055 #4068)
- β¬οΈ Compose Hot-Reload 1.1.0-alpha05 β 1.1.0-rc01 (#4208)
- β¬οΈ Ktor 3.4.0 β 3.4.2 (#4073 #4128)
- β¬οΈ Koin 4.1.1 β 4.2.1 (#4115 #4159)
- β¬οΈ SQLDelight 2.2.1 β 2.3.2 (#4114)
- β¬οΈ Cryptography 0.5.0 β 0.6.0 (#4132)
- β¬οΈ MCP Kotlin SDK Server 0.8.4 β 0.11.0 (#4024 #4113 #4162)
- β¬οΈ Jewel 0.33.0 β 0.34.0 (#4056 #4129)
- β¬οΈ Lifecycle 2.9.6 β 2.10.0 (#4070)
- β¬οΈ Conveyor 1.13 β 2.0 (#4071)
- β¬οΈ Ktlint 14.0.1 β 14.2.0 (#4072)
- β¬οΈ Okio 3.16.4 β 3.17.0 (#4133)
- β¬οΈ Logback Classic 1.5.31 β 1.5.32 (#4134)
- β¬οΈ Kotlin Logging 7.0.14 β 8.0.01 (#4160)
- β¬οΈ ComposeNativeTray 1.1.0 β 1.3.0 (#4209)
- β¬οΈ Coil 3.3.0 β 3.4.0 (#4210)
Build & Tooling π·
- π· Split CI into app-build and web-build with path filters (#4239)
- π Bump version to 2.0.0 (#4243)
- π· Tighten CI path filters and unify Node version in build-release (#4279)
Contributors β¨
- @Fldicoahkiin use imageFlavor instead of javaFileListFlavor for single-image clipboard writes (#4302)
Full Changelog: 1.2.9.2059...2.0.0.2192
1.2.9.2059
Release Notes - v1.2.9
Highlights π
-
π·οΈ Tag-Based Organization System
Replaced the simple favorite boolean with a flexible tag-based system, enabling users to organize and filter clipboard items with custom tags. Includes AppControl hooks for tag creation and pinning (#3989 #3991). -
π Right-Click "Sync To" for Targeted Device Syncing
A new right-click context menu lets you sync any clipboard item directly to a specific device, giving you fine-grained control over what gets shared and where (#4019 #4020). -
π« Source Exclusion β Filter Clipboard by Application
You can now exclude specific applications from clipboard monitoring, preventing unwanted content from being captured. Useful for password managers, banking apps, and other sensitive tools (#3920 #3921). -
π₯οΈ Desktop UI Polish & Platform Refinements
Rounded window corners on Windows and Linux, adaptive QR code sizing for multi-device pairing, a redesigned About page matching the mobile layout, and async font loading to eliminate UI stutter (#4006 #4011 #3996 #4004).
Bug Fixes π
- Fix
SQLITE_BUSYerrors by serializingSyncRuntimeInfoDaowrites (#3994) - Fix
IllegalStateExceptionincompressExportFiledue to flush on closed stream (#3976) - Fix SearchWindow position flash on macOS after long background (#3984 #3985)
- Fix devices list overlapping FAB and transparent sticky headers (#3983)
- Fix theme flash from light to dark on startup (#3960)
- Fix flaky
testThreeDeviceMeshby adding stabilization delay (#3978) - Fix flaky tampered ciphertext test in
EncryptUtilsTest(#3947) - Fix duplicate JAR version conflicts in MSIX packages (#4026 #4027)
- Recreate
LazyListStateon window open to reliably reset scroll position (#3962) - Refresh storage statistics immediately after cleanup and show progress dialog (#3980)
New Features β¨
- β¨ Add source exclusion service to filter clipboard by application (#3920 #3921)
- β¨ Add
GET /pull/pasteendpoint for iOS pull (#3922) - β¨ Add right-click "Sync To" context menu for syncing paste to specific device (#4019 #4020)
- β¨ Add adaptive QR code sizing for multi-device compatibility (#4010 #4011)
- β¨ Add rounded corners for main window on Windows and Linux (#4006)
- β¨ Add Windows native lazy file clipboard write via JNA delayed rendering (#3931)
- β¨ Add macOS native lazy file pasteboard write via
NSPasteboardItemDataProvider(#3930) - β¨ Auto-close token view when all pending verifiers complete verification (#3972)
UI Improvements π
- π Redesign desktop About page to match mobile layout (#3996)
- π Redesign Counter component to match prototype stepper design (#3998)
- π Redesign FilledDropdown component to match prototype design (#4000)
- π Extract
ScreenLayoutintoScreenProviderinterface with configurable padding (#3967) - π Improve QR code layout for narrow screens (#4012 #4013)
Multiplatform Β· Refactor Β· Code Style π¨
- π¨ Move SQLDelight to shared module, extract DAO interfaces (#3950)
- π¨ Extract
FilePullServicefromPullFileTaskExecutor(#3933) - π¨ Refactor
PasteDao: extractPasteReleaseServiceandPasteTagDao(#3926) - π¨ Extract
SyncResolverApiinterface andSyncDeviceManagerclass (#3943) - π¨ Split
ColorUtilsintoColorParser,ColorConversion, andColorAccessibility(#3941) - π¨ Refactor
User32.kt: extract utility functions into focused utility objects (#3935) - π¨ Refactor
DesktopModule.kt: extract DI sub-modules into separate files (#3937) - π¨ Extract
ImageLoadersinto individual DI-registeredImageLoaderinstances (#3958) - π¨ Extract
SearchPasteDataandQueryPasteTaginterfaces from DAO layer (#3956) - π¨ Extract platform-specific number keyboard options for iOS compatibility (#4002)
- π¨ Extract
PlatformTokenTextFieldexpect/actual for iOS backspace compatibility (#4018) - π¨ Merge
addSyncTaskandaddTargetedSyncTaskinto single method (#4021 #4022) - π¨ Initialize shared-ui and web Gradle modules (#3954)
- π¨ Add missing
@Volatileexplicit imports (#3918)
Performance β‘
- β‘ Truncate HTML DOM for side preview rendering to prevent UI lag (#3939)
- β‘ Use content hash as
LaunchedEffectkey to avoid equals on large HTML strings (#3948) - β‘ Async font loading and virtualized font dropdown to eliminate UI stutter (#4004)
Dependencies β¬οΈ
- β¬οΈ Gradle Wrapper 9.3.1 β 9.4.0 (#4023)
- β¬οΈ ComposNativeTray 1.0.4 β 1.1.0 (#3924)
- β¬οΈ MCP Kotlin SDK Server 0.8.3 β 0.8.4 (#3969)
- β¬οΈ ImageIO 3.13.0 β 3.13.1 (#3968)
- β¬οΈ SnakeYAML 2.5 β 2.6 (#4008)
- β¬οΈ FileKit Dialogs 0.12.0 β 0.13.0 (#4009)
Build & Tooling π·
- π· Add JVM lazy clipboard verification tests (#3928)
- π· Fix Kotlin Default Hierarchy Template warnings for web module (#3987)
- β Convert favorite boolean to tag-based system (#3989)
Full Changelog: 1.2.8.1999...1.2.9.2059
1.2.8.1999
Highlights π
-
π¨ Material 3 & Tailwind UI Evolution
A comprehensive visual overhaul migrating the application to the CrossPasteColor M3 theme and a Tailwind CSS-inspired color palette. The entire icon system has been refactored using Material Symbols, providing a unified and modern aesthetic (#3718 #3734 #3740). -
π€ MCP Server for AI Integration
Introduced support for the Model Context Protocol (MCP), allowing AI agents to securely access your clipboard data. This update includes a dedicated settings interface for managing agent permissions and connectivity (#3839 #3841). -
π«§ BubbleWindow & Advanced Inline Editing
Launched the BubbleWindow, enabling seamless inline text and HTML editing directly from the Search window. The new editor includes a floating toolbar with undo/redo support and optimized layouts for rapid content adjustments (#3837 #3860 #3862 #3867). -
π Advanced File Management & Sync Control
Significant upgrades to the sync engine, including the ability to sync large files directly to system download directories and granular controls for specific content types. A new "Cut" operation with full undo support has also been added for file and image items (#3737 #3833 #3843 #3871). -
π‘οΈ Architecture Hardening & Massive Test Suite
Major stability improvements addressing native resource leaks on Windows (COM/DC), macOS, and Linux. To ensure long-term reliability, we've added over 750 new unit and integration tests covering the core data, sync, and UI layers (#3742 #3780 #3782 #3816 #3820-3827).
Bug Fixes π
- Fix native resource leaks: Windows (DC, COM, HICON), macOS (Keychain), and Linux (Pointer bugs) (#3770 #3780 #3782 #3786)
- Resolve synchronization race conditions, silent error swallowing, and redundant retry loops (#3762 #3766 #3875 #3889)
- Patch Zip Slip vulnerability and security risks in the encryption layer (#3810 #3768)
- Fix
runBlockingUI freezes and thread-safety issues in RTF and UI infrastructure (#3804 #3808 #3794) - Fix Bonjour service race condition causing registration with port 0 (#3772)
- Resolve stream leaks during import/export and orphaned database entries (#3752 #3900 #3908)
- Correct macOS shortcut
rawCodemapping and fragile reflection logic (#3784) - Fix cleanup logic where expiration was guarded by the wrong configuration flag (#3896)
- Fix "launch_at_startup" switch being bound to the incorrect config field (#3722)
New Features β¨
- β¨ Add "In Downloads" indicator for synced files and hide missing local items (#3852)
- β¨ Support drag-and-drop overlay UI for remote file synchronization (#3846)
- β¨ Add mutedText color to the theme system for better typography (#3728)
- β¨ Implement PasteTypeExt constants and composable helpers for better type handling (#3724 #3726)
UI Improvements π
- π Redesign menu items for improved visual clarity (#3720)
- π Enhanced image info components with adaptive layouts and decimal byte formatting (#3697 #3699 #3700)
- π Fix BubbleWindow visual glitches (white corners/tails) on Linux platform (#3910)
- π Add
isLoadingstate support for Dialog action buttons (#3835) - π Fix InfoItem value text alignment issues during text wrapping (#3831)
Multiplatform Β· Refactor Β· Code Style π¨
- π¨ Clean up core data models and unify error handling logic (#3744)
- π¨ Refactor icon system with unified
IconDataand Material Symbols (#3740) - π¨ Update
CLAUDE.mdwith strict commit message conventions and code formatting rules (#3707 #3732) - π¨ Refactor SemanticColorGroup to utilize Tailwind CSS color palette (#3734)
Performance β‘
- β‘ Enable per-device concurrent sync event processing to reduce latency (#3881)
- β‘ Replace binary search with cumulative size scan for faster threshold cleanup (#3898)
- β‘ Resolve task executor semaphore starvation and queue backpressure (#3894)
- β‘ Optimize image processing by removing redundant hash computations and bitmap copies (#3748 #3774)
Dependencies β¬οΈ
- β¬οΈ Kotlin 2.3.0 β 2.3.10 (#3801)
- β¬οΈ Compose Plugin 1.10.0 β 1.10.1 (#3856)
- β¬οΈ Ktor 3.3.3 β 3.4.0 (#3701)
- β¬οΈ Gradle Wrapper 8.14 β 9.3.1 (#3710)
- β¬οΈ Logback Classic 1.5.25 β 1.5.31 (#3708 #3892)
- β¬οΈ Atomicfu 0.29.0 β 0.31.0 (#3702)
- β¬οΈ Kotlinx Serialization 1.9.0 β 1.10.0 (#3703)
Build & Tooling π·
- π· Replace
Thread.sleepwithrunTestto resolve flaky test results (#3858)
Full Changelog: 1.2.7.1883...1.2.8.1999
1.2.7.1883
π v1.2.7 - Emergency Hotfix
This release addresses a critical issue where devices were unable to connect or sync due to an incorrectly configured HTTP header.
β οΈ Critical Fixes
- Connection Failure: Removed manually set
Hostreserved header which caused communication timeouts in certain network environments. (#3691)
π Other Improvements
- Compatibility: Fixed
cursorColormethod for better Android compatibility. (#3681) - UI: Fixed
FileBottomSolidsize calculation logic. (#3686) - Internal: New
getNoDeletePasteDataFlowfor better multiplatform data handling. (#3688)
Full Changelog: 1.2.6.1876...1.2.7.1883