Releases: davefx/clipboardwire
Releases · davefx/clipboardwire
v0.5.2
Added
- Windows: "Start at login" tray toggle. A new checkbox in the
tray menu reads and writes theHKCU\…\Runregistry key, so
users can enable or disable auto-start without touching the
registry manually. Works whether clipboardwire was installed via
MSI or as a standalone binary.
Fixed
- CI:
apt-get updatebefore install. Release and CI workflows
now refresh the package index beforeapt-get install, preventing
transient 404 failures when GitHub runner mirrors go stale.
v0.5.1
Fixed
- Android: WebSocket connections now work with TLS servers. OkHttp
was negotiating HTTP/2 via ALPN, but the server's WebSocket handler
only supports upgrade over HTTP/1.1. The client now forces HTTP/1.1. - Android: foreground service no longer killed on Android 14+. The
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGINGtype is now passed to both
startForeground()and notification updates, as required by API 34+. - Android: persistent notification now visible. Shows connection
status ("Connected", "Disconnected", "Paused") and the server address
in the notification body. - Android: cleartext ws:// now works with any IP address. The
previous network security config used<domain>entries which don't
match IP literals.
Added
- Android: WiFi-aware reconnect. When the server is a private IP
(192.168.x.x, 10.x.x.x, etc.) and the phone is on mobile data, the
service pauses with "Waiting for WiFi" instead of burning battery on
failed retries. Reconnects automatically when WiFi comes back.
v0.5.0
Added
- Android client. Native Kotlin + Jetpack Compose app with OkHttp
WebSocket, foreground service for background sync, DataStore
preferences, boot-start receiver, and exponential-backoff reconnect.
The APK is now attached to every GitHub release for sideloading. - Android ↔ Rust server integration tests. A new CI job builds the
Rust hub, starts it, spins up an Android emulator, and verifies the
full clip relay flow end-to-end (welcome, multi-client fan-out,
auth rejection). 35 Android tests total (23 JVM + 12 instrumented). - Release workflow builds the Android APK and attaches it to the
GitHub release automatically. - Release notes auto-populated from CHANGELOG.md — the release
workflow extracts the matching version section and fills the GitHub
release body. scripts/release.shbumps Android version — versionName and
auto-incremented versionCode are now updated alongside Cargo.toml.
Fixed
- Android cleartext ws:// connections now work to any IP. The
previous network security config used<domain>entries for private
IP ranges, but Android treats those as literal hostnames — so
ws://192.168.1.50would silently fail. Switched to
base-config cleartextTrafficPermitted=truesince this is a
LAN-first tool where users configure arbitrary IPs.
v0.4.6
Fixed
- Windows client no longer disconnects every ~60 seconds. The
client was not sending WebSocket pings, relying entirely on the
server's pings and the auto-pong response. On Windows, power-managed
network adapters can delay or drop a pong just long enough to trip
the server's read timeout. Fixed by adding client-side pings every
30 s (matching the server) and raising the server's read timeout
from 45 s to 90 s so a single missed pong doesn't kill the
connection.
v0.4.5
Added
- Persistent file logging. All tracing output now goes to both
stderr and a daily-rotating log file under the config directory
(~/.config/clipboardwire/clipboardwire.log.YYYY-MM-DDon Linux).
If the process disappears unexpectedly, the log file shows what
happened last. - Panic hook with crash file. Panics are caught by a custom hook
that writes the panic message plus a full backtrace to
~/.config/clipboardwire/crash.logbefore aborting. This survives
even if the tracing layer hasn't flushed yet.
v0.4.4
Changed
- Hub logs now include peer IP address. Every WebSocket connection
log line (opened, closed, errors) includes the client's IP:port in
the tracing span via axum'sConnectInfoextractor, making it easy
to identify which device is connecting or disconnecting.
v0.4.3
Changed
- Tray menu now shows server URL and hub peer count as disabled
info lines below the status item. Linux tray icons (libayatana-
appindicator) don't support tooltips, so the server address and
hub connection count are now always visible in the right-click
menu. The tooltip is still maintained for platforms that support it. - Smaller status-dot overlay on the tray icon. Reduced from ~35%
to ~22% of the icon side so the actual icon artwork is more
visible while the colored connection-status dot still reads clearly.
v0.4.2
clipboardwire v0.4.2 One user-visible addition on top of v0.4.1: - Tray tooltip now shows the connected-peer count when the embedded hub is running. A new line like `hub running (3 clients connected)` appears under the existing status/server line, so you can tell at a glance how many devices are wired into the local hub without opening anything. Singular and plural handled. Plumbing: new `HubStatsSink` (Arc<AtomicUsize>) the hub task updates on every register/deregister, plugged into `ServerConfig` by the tray. A 1-second poller posts a `HubPeerCountChanged` event on count shifts; tooltip rebuilds on each. The count includes our own loopback supervisor (the hub treats it as a peer like any other), so a freshly-started hub with no remote peers reads `1 client connected`. Three new tests for this: - Unit tests for the sink (register/deregister tick, no underflow on unknown id) and the tooltip pluralisation. - End-to-end test that opens two real WebSockets against an axum-served hub and asserts the sink tracks 0 -> 1 -> 2 -> 1 -> 0 as the connections come and go. Catches regressions in ws.rs's deregister path that the unit tests would not see. No protocol changes. v0.4.x clients keep working unchanged.
v0.4.1
clipboardwire v0.4.1 Two polish items on top of v0.4.0 — same protocol, same wire, just less surprising behavior at the edges. - **Multi-file Ctrl+C now arrives as a single clipboard set.** Receiver-side debounce: file completions accumulate for 500 ms, then the whole batch is applied to the OS clipboard at once. Selecting 5 files in Nautilus/Explorer/Finder + Ctrl+C → all 5 pastable on the other machine. (v0.4.0 only left the LAST file on the receiver's clipboard.) - **Tray icon live-reloads on system theme change.** A 5-second background poll re-runs `dark_light::detect()`; if the value flips, the icon swaps to the matching mono variant in place. Toggle dark mode mid-session and the tray catches up without a relaunch. No protocol changes. v0.4.0 clients keep working unchanged.
v0.4.0
clipboardwire v0.4.0 Highlights - File transfer (PROTOCOL v0.3.0). New `file_chunk` frame type carries 4 MiB pieces of a file through the same hub; the receiver assembles + verifies the SHA-256 and saves to `~/Downloads/clipboardwire/`. - OS file-clipboard integration. Ctrl+C a file in Nautilus/Explorer/Finder on one machine, Ctrl+V in the other machine's file manager pastes the saved file. Backends: - Linux X11: `text/uri-list` selection via x11-clipboard. - Windows: CF_HDROP via clipboard-win. - macOS: NSPasteboardTypeFileURL via objc2-app-kit. Wayland: Xwayland fallback covers most distros; native protocol coming in a v0.4.x patch. - `clipboardwire send <FILE>` subcommand for one-shot programmatic sends (no clipboard interaction required). - Tray icon status overlay. Colored dot mirrors the menu's Status line — green/amber/red/none. - "Pin from server" button in the Settings dialog: one-click TLS handshake, capture peer cert, save next to config, populate `tls_ca_file`. - macOS .app bundle + .dmg installer in the release workflow, hand-rolled with sips + iconutil + hdiutil. App lives in the menu bar (LSUIElement) — no Dock entry. - Homebrew tap: `brew install --cask davefx/clipboardwire/clipboardwire`. - Settings dialog window icon matches the tray + .desktop branding. - macOS in CI matrix with tray smoke + singleton-lock + embedded-hub-binds + file-clipboard roundtrip running on every push. Notable bug fix surfaced during the development of this release: the file-transfer one-shot subprocess would intermittently drop its queued chunks because `select!` raced on a simultaneous drop of both outbound channels — fixed by draining outbound_files before exit. And the Linux X11 backend was releasing the clipboard selection immediately after every set (Clipboard handle dropped per call) — now held for process lifetime in a OnceLock. Breaking - PROTOCOL_VERSION bumps from clipboardwire/0.2.0 to clipboardwire/0.3.0. Older clients that didn't understand `file_chunk` just ignored them, so the wire is backwards- compatible for the existing clip frame surface.