Skip to content

Releases: netarcx/handmirror

Hand Mirror 1.1.14

Choose a tag to compare

@github-actions github-actions released this 17 Jun 01:13
Add a draggable corner resize grip (aspect-locked)

Mouse-wheel scaling alone wasn't discoverable and the borderless window
has no edge to drag. Add a visible resize grip in the bottom-right corner;
dragging it resizes the window keeping the camera aspect ratio (clamped to
the screen). Excluded from window-drag so it doesn't conflict with move.
Wheel scaling still works as a bonus; size still resets to default on open.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Hand Mirror 1.1.13

Choose a tag to compare

@github-actions github-actions released this 17 Jun 01:06
Repoint Ctrl+Shift+R to check for a new app version

Ctrl+Shift+R now checks for (and installs) a new release like a browser
hard-refresh, instead of refreshing the camera. The window raises an
UpdateCheckRequested callback that the tray handles with balloon feedback
("You're up to date" / "Update available"). Camera refresh stays available
via the tray "Refresh camera" item (and is still used on camera switch).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Hand Mirror 1.1.12

Choose a tag to compare

@github-actions github-actions released this 17 Jun 00:59
Release-candidate hardening from final bug sweep

Auto-update robustness (could otherwise leave the app dead/broken):
- App: when relaunched with --updated after a silent update, wait (up to
  10s, or take an abandoned mutex) for the previous instance to release the
  single-instance mutex instead of exiting immediately.
- Installer: silent relaunch passes --updated; PrepareToInstall now settles
  ~1.5s after taskkill so the exe handle is released before files are copied
  (a still-locked exe was silently aborting the update).
- TrayApp: guard the async update handlers (check/install) so an exception
  can't crash the tray; re-enable the menu item via finally.

Concurrency / lifecycle:
- WebcamCapture.Dispose now tears down the reader off the UI thread (no
  bounded .Wait), so close/refresh/camera-switch never freeze the UI; the
  reader is stopped before disposal. OS releases the camera on process exit.
- Reset the frame gate on DispatcherOperation.Aborted so a dispatcher
  shutdown mid-frame can't wedge the preview.
- TrayApp: use DispatcherTimer instead of WinForms Timer (correct WPF
  primitive; removes message-pump ambiguity).

UI:
- Wheel-scaling clamps by screen height too, so a portrait source can't grow
  the window taller than the display.

CI:
- Bump actions to Node 24-native majors (checkout@v6, setup-dotnet@v5,
  upload-artifact@v7, action-gh-release@v3); drop the FORCE_NODE24 env.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Hand Mirror 1.1.11

Choose a tag to compare

@github-actions github-actions released this 17 Jun 00:46
CI: run JS actions on Node 24 to clear Node 20 deprecation

Set FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 so checkout/setup-dotnet/
upload-artifact/action-gh-release run on Node 24 without version churn.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Hand Mirror 1.1.10

Choose a tag to compare

@github-actions github-actions released this 17 Jun 00:46
CI: run JS actions on Node 24 to clear Node 20 deprecation

Set FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 so checkout/setup-dotnet/
upload-artifact/action-gh-release run on Node 24 without version churn.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Hand Mirror 1.1.9

Choose a tag to compare

@github-actions github-actions released this 17 Jun 00:31
Fix build: disambiguate KeyEventArgs (WPF vs WinForms)

The project enables both UseWPF and UseWindowsForms with implicit usings,
so KeyEventArgs was ambiguous. Fully-qualify System.Windows.Input.KeyEventArgs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Hand Mirror 1.1.7

Choose a tag to compare

@github-actions github-actions released this 17 Jun 00:22
Fix YUY2 duotone by letting MediaFoundation output BGRA8; widen FOV

Diagnostic showed in=Yuy2: frames arrived as YUY2 and we converted them
with SoftwareBitmap.Convert, which mishandles YUY2 (green-shadow/magenta-
highlight duotone) on this hardware.

- CreateReaderAsync now prefers BGRA8 reader output so MF's color converter
  does YUV->RGB (correct), falling back to NV12 then native. We no longer
  feed YUY2/native YUV frames through SoftwareBitmap.Convert.
- PickFormat now prefers the largest frame up to 1080p (full field of view)
  and allows MJPG (the reader decodes it), since low uncompressed modes like
  640x480 are often a cropped sensor readout.

The on-screen diagnostic stays so we can confirm reader=Bgra8 / in=Bgra8
and the new resolution.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Hand Mirror 1.1.6

Choose a tag to compare

@github-actions github-actions released this 17 Jun 00:02
Add in-app auto-update (notify + one-click) via GitHub Releases

- UpdateService: checks the repo's latest GitHub Release, compares to the
  running assembly version, downloads the installer, and launches it
  silently (the installer kills + upgrades + relaunches us).
- TrayApp: checks on launch and every 30 min; shows a tray balloon and an
  "Install update X" menu item when a newer build exists. Clicking either
  downloads and applies it. Balloon only pops once per version.
- Installer: add a silent-mode [Run] relaunch so the app comes back after
  an unattended update.
- CI: version each build 1.1.<run_number> (monotonic) and publish a
  GitHub Release with the installer on every push to main, marked latest.
  Dropped the tag trigger (releases are now created by the build).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v1.0.1

Choose a tag to compare

@netarcx netarcx released this 25 Apr 05:26

Bug fixes from code review.

  • Drop overlapping camera frames so the background thread can't overwrite the pixel buffer mid-read
  • Clean up MediaCapture / MediaFrameReader if the window is closed during init
  • Camera now opens in SharedReadOnly mode so it coexists with Teams / Zoom
  • Enforce single instance via named mutex
  • Replaced GDI Bitmap.GetHicon tray-icon path with embedded icon.ico (was leaking an HICON each launch)
  • Clicking the X close button no longer triggers window drag

Install: download HandMirrorSetup.exe and run it. Per-user install, no admin required.

Hand Mirror v1.0.0

Choose a tag to compare

@netarcx netarcx released this 25 Apr 04:51

First release. Self-contained Windows installer (no .NET runtime required).

Install: download HandMirrorSetup.exe and run it. Installs to %LocalAppData%\Programs\HandMirror (no admin prompt). Optional desktop shortcut.

Features:

  • System tray icon — left-click to toggle preview
  • Top-center placement, auto-matches camera aspect ratio
  • Mirrored horizontally, rounded corners, draggable
  • Start with Windows toggle in tray menu
  • Closing the window fully releases the camera (LED off)