Skip to content

Releases: davefx/clipboardwire

v0.5.2

09 Jun 13:19

Choose a tag to compare

Added

  • Windows: "Start at login" tray toggle. A new checkbox in the
    tray menu reads and writes the HKCU\…\Run registry 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 update before install. Release and CI workflows
    now refresh the package index before apt-get install, preventing
    transient 404 failures when GitHub runner mirrors go stale.

v0.5.1

07 Jun 04:02

Choose a tag to compare

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_MESSAGING type 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

01 Jun 09:02

Choose a tag to compare

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.sh bumps 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.50 would silently fail. Switched to
    base-config cleartextTrafficPermitted=true since this is a
    LAN-first tool where users configure arbitrary IPs.

v0.4.6

27 May 16:47

Choose a tag to compare

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

27 May 08:28

Choose a tag to compare

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-DD on 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.log before aborting. This survives
    even if the tracing layer hasn't flushed yet.

v0.4.4

27 May 08:18

Choose a tag to compare

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's ConnectInfo extractor, making it easy
    to identify which device is connecting or disconnecting.

v0.4.3

25 May 09:02

Choose a tag to compare

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

24 May 07:52

Choose a tag to compare

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

21 May 13:18

Choose a tag to compare

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

21 May 10:43

Choose a tag to compare

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.