Repository navigation
Releases: netarcx/handmirror
Releases · netarcx/handmirror
Release list
Hand Mirror 1.1.14
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
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
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
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
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
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
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
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
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
SharedReadOnlymode so it coexists with Teams / Zoom - Enforce single instance via named mutex
- Replaced GDI
Bitmap.GetHicontray-icon path with embeddedicon.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
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)