Repository navigation
2.2.0.2544
Highlights 🌟
-
⌨️ CrossPaste CLI
Every desktop package now ships a native command-line tool,
crosspaste(macOS offers a one-click terminal command install on
first launch, and Windows offers one-click add-to-PATH). Copy with a
pipe (echo hello | crosspaste), paste, search history with the
same filters as the search window, pick entries in a full-screen
fuzzy picker, edit an entry in$EDITOR, and stream new pastes live
withwatch— plus pair devices and run the app headless on
servers, all from the terminal and your scripts. In sixel-capable
terminals, clipboard images even preview inline as real pixels. See
the
CLI guide
for every command and example (#243 #3828 #4769 #4771 #4776 #4778
#4780 #4782 #4786 #4788 #4790 #4809 #4812 #4815 #4817 #4822 #4824
#4826 #4828 #4836 #4841 #4849 #4850 #4851 #4852 #4859 #4893). -
🔐 Next-generation device pairing
Device pairing now verifies a one-time 6-digit PIN — rotating every
30 seconds on the accepting device — through a SPAKE2 (RFC 9382)
password-authenticated key exchange, so nothing on the network can
intercept the pairing or learn anything from a wrong guess, and
cumulative online PIN guesses are capped. The elliptic-curve
arithmetic runs on a constant-time OpenSSL libcrypto pinned and
bundled with the app, with a fail-closed startup probe. Devices on
older versions keep pairing through the previous flow (#4859 #4861
#4863 #4865 #4867 #4869 #4875 #4877 #4881). -
🪟 More reliable Windows clipboard capture
Rapid clipboard bursts are coalesced into one snapshot through a
single-consumer pipeline, fixing interference with Snipping Tool's
PrtScr auto-save on Windows 11; duplicate image records from a
single copy are deduplicated; and SQLite's busy timeout now takes
effect, fixing sporadic write failures under contention (#4737
#4791 #4793 #4796 #4798 #4799). -
🎨 UI improvements
The UI framework is upgraded to Compose Multiplatform 1.12, and
following the system light/dark mode is now correct from the very
first frame — no more flash at launch. The system tray now shares a
single implementation across macOS, Windows, and Linux; the main
window height is clamped to the usable screen area so the bottom of
the UI can no longer end up below the screen edge; long paste titles
clipped in the side panel show a tooltip on hover and title edits
are committed when focus moves away; and the settings font dropdown
now closes in a single click (#4759 #4761 #4885 #4886 #4887 #4901
#4902 #4903).
Bug Fixes 🐛
- 🐛 Show tooltip for clipped paste title and commit title edit on focus loss (#4903)
- 🐛 Trim surrounding whitespace when creating UrlPasteItem (#4899)
- 🐛 Stop pushing pastes to stale disconnected sync rows (#4895)
- 🐛 Drain sessions in WsSessionManager.closeAll to fix concurrent iteration flake (#4890)
- 🐛 Use origin.remoteAddress instead of remoteHost in pairing v3 routes to avoid a blocking reverse DNS lookup (#4875)
- 🐛 Read trust request bodies before taking the per-peer pairing lock (#4871 #4873)
- 🐛 Unwrap wrapped crypto failures so key mismatch surfaces as DECRYPT_FAIL (#4870 #4872)
- 🐛 Cap cumulative pairing v3 online PIN guesses and harden OpenSSL secret hygiene (#4867)
- 🐛 Map missing native graphics library to actionable 503 in CLI image route (#4857)
- 🐛 Guard cli build script host lookups on unsupported K/N hosts (#4856)
- 🐛 Survive mordant's native-Windows raw-mode timeout and restore console modes on exit (#4826)
- 🐛 Harden TaskExecutor: tolerate corrupt extraInfo, rethrow cancellation, no-throw submit after shutdown (#4806)
- 🐛 Apply sqlite pragmas via connection properties so busy_timeout takes effect (#4799)
- 🐛 Discard duplicate local image records via short-window keep-first dedup (#4798)
- 🐛 Coalesce Windows clipboard bursts into one snapshot via a single-consumer pipeline (#4796)
- 🐛 Harden the headless mode startup and shutdown paths for daemon use (#4782)
- 🐛 Give blocked CLI config keys accurate per-key hints (#4774)
- 🐛 Reject CLI config keys requiring runtime workflows (#4773)
- 🐛 Reject lossy CLI config conversions (#4772)
- 🐛 Clamp the main window height to the usable screen area (#4761)
New Features ✨
- ✨ Surface v3 PINs via crosspaste token with acceptance-window arming (#4893)
- ✨ Let clicks outside the font dropdown pass through instead of being swallowed (#4887)
- ✨ Add a redacted telemetry observer seam to PairingProtocolV3Service (#4881)
- ✨ Roll out pairing v3 by advertising PAIRING_VERSION 3 gated on the bundled backend (#4877)
- ✨ Add crosspaste token command for acceptor-side pairing code display (#4859)
- ✨ Wire sixel rendering into paste inline previews and the pick panel (#4852)
- ✨ Add sixel terminal capability probe with DA1 confirmation (#4851)
- ✨ Add raw RGBA transcode endpoint for CLI image previews (#4850)
- ✨ Add pure-Kotlin sixel encoder with median-cut quantization (#4845 #4849)
- ✨ Let a PATH-installed CLI auto-discover a dev app instance (#4843)
- ✨ One-click add-to-PATH for the Windows CLI on non-MSIX installs (#4841)
- ✨ Show the command line extension entry on every platform and in dev runs (#4836)
- ✨ Make edit update the paste in place instead of copying a new entry (#4828)
- ✨ Add a watch command streaming new pastes over an NDJSON feed (#4824)
- ✨ Add an interactive pick command with a full-screen fuzzy picker (#4822)
- ✨ Merge the search command into history with search-window-parity filters (#4817)
- ✨ Add an edit command that round-trips a paste through $EDITOR (#4815)
- ✨ Treat piped stdin to bare crosspaste as implicit copy and add c/p/h command aliases (#4812)
- ✨ Support targeting a dev app instance via CROSSPASTE_USER_DATA_DIR and a :cli:run task (#4810)
- ✨ Fit CLI list previews to the terminal width with cell-accurate truncation (#4809)
- ✨ Dump image bytes and render inline terminal previews from the CLI (#4790)
- ✨ Launch the headless daemon from the CLI and document daemon deployment (#4788)
- ✨ Pair devices from the terminal via the /cli pairing API (#4786)
- ✨ Improve the CLI terminal experience with pipes, formats, colors, and exit codes (#4780)
- ✨ Offer to install the crosspaste terminal command on macOS (#4778)
- ✨ Probe app liveness and auto-start the desktop app from the CLI (#4771)
- ✨ Serve a local /cli API over a unix domain socket and make the CLI a pure HTTP client (#4769)
Multiplatform · Refactor · Code Style 🔨
- 🔨 Unify the system tray across all three platforms on ComposeNativeTray (#4902)
- 🔨 Make TokenInputRow expect/actual so mobile can provide a flicker-free input (#4900)
- 🔨 Resolve system dark theme directly in composition via dynamic isSystemInDarkTheme (#4886)
- 🔨 Restrict production libcrypto loading to the bundled library with fail-closed startup probe (#4865)
- 🔨 Replace BouncyCastle SPAKE2 EC backend with constant-time OpenSSL via JNA (#4861)
- 🎨 Downgrade expected heartbeat decrypt-failure logs to warn without stack trace (#4838)
- 🎨 Clean up Gradle 9 deprecation warnings and Kotlin compiler warnings (#4833)
- 🔨 Derive CLI version at build time and add a cli compile gate to CI (#4767)
- 🎨 Focus the first token input box when the pairing dialog opens (#4758)
- 🎨 Auto-close the v3 pairing card when the session is cancelled (#4756)
- 🎨 Drain the v2 token countdown bar to match v3 pairing cards (#4754)
Build & CI 👷
- 👷 Auto-download the pinned libcrypto for development runs so pairing v3 loads without a system OpenSSL (#4869)
- 👷 Bundle pinned OpenSSL libcrypto into desktop packages via Conveyor (#4863)
- 👷 Bump Conveyor CLI in CI packaging workflows from v21.0 to v22.1 (#4839)
- 👷 Split the CLI native build into a parallel path-gated CI job (#4803)
- 👷 Tier the test suite so PRs run fast tests and releases run integration suites (#4801)
- 👷 Suppress expected Kotlin/Native disabled-target and cinterop commonization warnings (#4784)
- 👷 Ship the CLI binary in all desktop packages (#4776)
- ✅ Add an --advertise-address option to the e2e harness (#4752)
Dependencies ⬆️
- ⬆️ Bump ComposeNativeTray from 1.3.3 to 2.1.3 for Compose 1.12 support (#4901)
- ⬆️ Bump io.coil-kt.coil3 from 3.5.0 to 3.6.0 for Compose 1.12 support and GIF/AsyncImage rendering fixes
- ⬆️ Bump com.mohamedrejeb.richeditor:richeditor-compose from 1.0.0 to 1.1.0 for Compose 1.12 support and a clipboard fix (#4891)
- ⬆️ Bump gradle-wrapper from 9.7.0 to 9.7.1 (#4889)
- ⬆️ Upgrade Compose Multiplatform to 1.12.0 (#4885)
- ⬆️ Bump io.github.vinceglb:filekit-dialogs from 0.14.2 to 0.15.0 (#4819)
- ⬆️ Bump ch.qos.logback:logback-classic from 1.6.1 to 1.6.3 (#4818)
- ⬆️ Bump org.bouncycastle:bcprov-jdk18on from 1.85 to 1.85.2 (#4765)
- ⬆️ Bump org.jetbrains.compose.hot-reload from 1.1.1 to 1.2.0 (#4764)
- ⬆️ Bump gradle-wrapper from 9.6.1 to 9.7.0 (#4763)
- ⬆️ Bump postcss to 8.5.26 to fix source map disclosure advisories (#4762)