Skip to content

Releases: harshalgajjar/Reminal

v1.7.1

Choose a tag to compare

@github-actions github-actions released this 06 Jul 07:46
Release v1.7.1 — re-add dropped v1.4.2/v1.4.3 fixes

v1.7.0

Choose a tag to compare

@github-actions github-actions released this 06 Jul 07:21
Release v1.7.0 — v1.4.1 baseline + security fix #1 only

v1.6.2

Choose a tag to compare

@github-actions github-actions released this 06 Jul 05:35
Release v1.6.2 — fix tap-to-focus keyboard (cross-browser touch)

v1.6.1

Choose a tag to compare

@github-actions github-actions released this 06 Jul 05:03
Release v1.6.1 — restore pre-#2 reconnect behaviour (no flood)

v1.6.0

Choose a tag to compare

@github-actions github-actions released this 06 Jul 04:12
Release v1.6.0 — smooth momentum touch-scrolling in the web viewer

v1.5.1

Choose a tag to compare

@github-actions github-actions released this 06 Jul 01:17
Release v1.5.1 — fix reconnect scrollback flood

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 05 Jul 23:45
Release v1.5.0 — security fix #1 (relay never learns the PIN)

v1.4.3

Choose a tag to compare

@github-actions github-actions released this 05 Jul 20:13
Reap leaked caffeinate inhibitors on startup

The display-sleep inhibitor (caffeinate -d -w <pid>) is spawned while a window
is mirrored. A hot-restart (`reminal restart`, syscall.Exec) keeps the same PID
but never runs the stop funcs, so the old image's caffeinate children survive —
their `-w <pid>` still points at the (same-PID) new image — and pile up across
restarts, silently pinning the host display awake (never idle-locks). Combined
with the pre-v1.4.2 winAwake leak this could leave dozens of orphaned
inhibitors.

keepawake.ReapOrphans(), called once at startup before Start()/StartDisplay(),
kills any `caffeinate -w <our-pid>` left over — which at startup are all from a
previous incarnation. This both prevents accumulation and auto-cleans an older
leaky build's mess on the next `restart --all` after upgrading. Orphans of a
genuinely-exited PID already self-terminate via `-w`, so it only matches our own
live PID; macOS only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

v1.4.2

Choose a tag to compare

@github-actions github-actions released this 05 Jul 19:02
Fix reconnect/leak/multi-viewer bugs + online critical-upgrade forcing

Three bug fixes found in a code review:

- Terminal blank on reconnect to an IDLE session (agent.go runSender): a
  caught-up viewer reconnecting sent resume{from_seq=N} whose cursor was past
  everything still buffered, so neither a snapshot nor a replay went out and the
  screen stayed blank until a keystroke. Now every resume paints one snapshot;
  up-to-date viewers drop it via seq dedup.
- Keep-awake (display-sleep inhibitor) leak (windows.go streamWindow): a stream
  that self-exits (window closed, viewer silent) bypassed stopWindowStream and
  never released winAwake, pinning the host awake forever — worsened by the
  v1.4.1 close-detection. The defer now releases it when the last stream ends,
  and clears the stale winMenu entry.
- WebRTC starved WS-only viewers (windows.go): once one viewer confirmed a
  DataChannel, frames went ONLY to confirmed DCs, freezing every WS-only viewer.
  Frames now also go over WS whenever a viewer isn't on a confirmed channel
  (wsSinkNeeded); an all-P2P set still skips WS to save relay cost.

Also adds an online, maintainer-controlled critical-upgrade switch: the Worker
serves /version → {critical_min} (from a CRITICAL_MIN wrangler var, empty by
default). On its normal ≤24h check, a client below critical_min force-installs
the upgrade automatically — no `--force`, no user action — so a security fix can
be pushed out fast. Best-effort; the binary still comes from the signed release.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

v1.4.1

Choose a tag to compare

@github-actions github-actions released this 05 Jul 07:44
Fix mirrored panes freezing open when a window is closed

When a window closed but its app kept running, macOS kept returning the
window's last frame from screencapture instead of erroring, so the picture
looked merely static (0 fps) and the close-detection — which only ran on a
capture failure — never fired. The window left the picker immediately but its
pane stayed frozen on the last frame indefinitely.

- exists() now checks the same on-screen list the picker uses
  (kCGWindowListOptionOnScreenOnly) instead of kCGWindowListOptionAll; the
  "All" list retained a closed window's still-capturable backing store, which
  is exactly what kept the pane alive.
- streamWindow proactively re-verifies a static window is still on-screen
  (every winLiveCheck) rather than waiting for a capture failure that may never
  come, and drops the pane when it's gone.

Occluded windows stay on-screen so they're unaffected; minimizing or moving a
mirrored window to another Space now closes its pane too, matching the picker.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>