Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
a5ef9a3
Windows: scaffold Rust port with mouse hook, layered overlay, laser d…
MUL7ii Nov 8, 2026
d666e50
Windows: vsync render thread, dirty-rect updates, persistent ink laye…
MUL7ii Nov 8, 2026
782be55
Windows: fix render thread deadlock, present without dirty rect so th…
MUL7ii Nov 8, 2026
148a3d2
Windows: present from the window thread so the overlay updates
MUL7ii Nov 8, 2026
1ea0fff
Windows: step aside while Snipping Tool or other capture tools have f…
MUL7ii Nov 8, 2026
2a1f0d7
Windows: render the hand and rod from the shared pointer art
MUL7ii Nov 8, 2026
78f159c
Windows: attach to the parent console so Ctrl+C works in release builds
MUL7ii Nov 8, 2026
1760b1c
Windows: drop shadow under the hand and rod
MUL7ii Nov 8, 2026
912b787
Windows: toolbar with hand thumbnails, laser and exit, saved pointer …
MUL7ii Nov 8, 2026
f5cf2e5
Windows: hold Alt to click through to apps with the real cursor
MUL7ii Nov 8, 2026
0284490
Windows: click-through mode, toggled from toolbar, tray or Ctrl+Alt+C
MUL7ii Nov 8, 2026
8fcb132
Windows: click-through holds the press so strokes never select text i…
MUL7ii Nov 8, 2026
c5c18f0
Windows: tap sounds with a toolbar mute button
MUL7ii Nov 8, 2026
82bea2a
Windows: run audio on its own thread so the mouse hook never waits on…
MUL7ii Nov 8, 2026
fedf863
Windows: inject replayed clicks and keys from the window thread, neve…
MUL7ii Nov 8, 2026
0c0dcc6
Windows: switch audio off until the waveOut backend is replaced
MUL7ii Nov 8, 2026
f92a163
Windows: crash log, survive render panics, cheaper shadow, tag own in…
MUL7ii Nov 8, 2026
7f5a57b
Windows: keep the overlay above apps like Paint, halve per-frame cost
MUL7ii Nov 8, 2026
d4301d3
Windows: tap sounds on WASAPI, run from their own thread
MUL7ii Nov 8, 2026
d9cb053
Windows: usable tray menu and system popups while the pointer is on, …
MUL7ii Nov 8, 2026
e671e62
Windows: overlay and toolbar follow the cursor across monitors
MUL7ii Nov 8, 2026
5771cf0
Windows: rebuild the toolbar for each monitor's display scaling
MUL7ii Nov 8, 2026
cc81d35
Windows: settings window hosting WebView2, opened from the tray menu
MUL7ii Nov 8, 2026
ec6d4e4
Windows: settings pages for general, appearance, drawing, sound and a…
MUL7ii Nov 8, 2026
9c47056
Windows: use the official logo for the app icon, tray icon and settings
MUL7ii Nov 8, 2026
216220b
Windows: Pointers settings page to pick, add, remove and reorder tool…
MUL7ii Nov 8, 2026
0f1caf2
Document the Windows version and build it in CI
MUL7ii Nov 8, 2026
ea40fa0
Add a Windows release workflow and notes
MUL7ii Nov 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,23 @@ jobs:
- uses: actions/checkout@v4
- name: Build (universal)
run: swift build -c release --arch arm64 --arch x86_64

build-windows:
runs-on: windows-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Build
working-directory: windows
run: cargo build --release
- name: Stage the app with its images and sounds
shell: pwsh
run: |
New-Item -ItemType Directory -Force dist/TinyHand/assets/sounds | Out-Null
Copy-Item windows/target/release/tinyhand.exe dist/TinyHand/TinyHand.exe
Copy-Item assets/hand_*.png dist/TinyHand/assets/
Copy-Item assets/sounds/tap_*.wav dist/TinyHand/assets/sounds/
- uses: actions/upload-artifact@v4
with:
name: TinyHand-windows
path: dist/TinyHand
63 changes: 63 additions & 0 deletions .github/workflows/release-windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Release (Windows)

on:
push:
tags: ['windows-v*']
workflow_dispatch:

concurrency:
group: release-windows-${{ github.ref_name }}
cancel-in-progress: true

jobs:
release:
runs-on: windows-latest
timeout-minutes: 40
permissions:
contents: write
steps:
- uses: actions/checkout@v4

- name: Read the version
shell: pwsh
run: |
$version = (Select-String -Path windows/Cargo.toml -Pattern '^version = "(.*)"').Matches[0].Groups[1].Value
"VERSION=$version" >> $env:GITHUB_ENV

- name: Build
working-directory: windows
run: cargo build --release

- name: Package
shell: pwsh
run: |
$dir = "dist/TinyHand"
New-Item -ItemType Directory -Force "$dir/assets/sounds" | Out-Null
Copy-Item windows/target/release/tinyhand.exe "$dir/TinyHand.exe"
Copy-Item assets/hand_*.png "$dir/assets/"
Copy-Item assets/sounds/tap_*.wav "$dir/assets/sounds/"
Copy-Item LICENSE "$dir/LICENSE"
Copy-Item windows/README.md "$dir/README.md"
$zip = "dist/TinyHand-Windows-$env:VERSION.zip"
Compress-Archive -Path $dir -DestinationPath $zip
$hash = (Get-FileHash $zip -Algorithm SHA256).Hash.ToLower()
"$hash TinyHand-Windows-$env:VERSION.zip" | Out-File "$zip.sha256" -Encoding ascii

- uses: actions/upload-artifact@v4
with:
name: TinyHand-Windows
path: dist/*.zip*

- name: Publish the release
if: startsWith(github.ref, 'refs/tags/windows-v')
shell: pwsh
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$files = "dist/TinyHand-Windows-$env:VERSION.zip", "dist/TinyHand-Windows-$env:VERSION.zip.sha256"
gh release view $env:GITHUB_REF_NAME *> $null
if ($LASTEXITCODE -eq 0) {
gh release upload $env:GITHUB_REF_NAME @files --clobber
} else {
gh release create $env:GITHUB_REF_NAME @files --title "TinyHand for Windows $env:VERSION" --notes-file windows/RELEASE_NOTES.md --prerelease
}
30 changes: 19 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,40 @@
# TinyHand

[![Latest release](https://img.shields.io/github/v/release/nilbuild/tinyhand?display_name=tag&sort=semver&cacheSeconds=3600)](https://github.com/nilbuild/tinyhand/releases/latest)
[![Platform: macOS](https://img.shields.io/badge/platform-macOS-lightgrey)](https://tinyhand.app)
[![Platform: macOS and Windows](https://img.shields.io/badge/platform-macOS%20%7C%20Windows-lightgrey)](https://tinyhand.app)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)

A tiny hand on a stick that points at things on your Mac screen.
A tiny hand on a stick that points at things on your screen.

<img src="./.github/banner.jpg" alt="TinyHand: a tiny hand for your Mac" />

[![Download for macOS](https://img.shields.io/badge/Download_for_macOS-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/nilbuild/tinyhand/releases/latest/download/TinyHand.dmg)
[![Visit website](https://img.shields.io/badge/Visit_website-ffffff?style=for-the-badge&logo=safari&logoColor=black)](https://tinyhand.app)

macOS 13 or later, Apple Silicon and Intel.
**macOS** 13 or later, Apple Silicon and Intel. **Windows** 10 or 11, 64-bit (build from source for now, see [windows/](windows/README.md)).

## Install

### macOS

Open `TinyHand.dmg`, drag TinyHand to Applications and allow **Accessibility** when asked. It needs that to turn your clicks into taps. TinyHand updates itself.

### Windows

No permission prompt and no installer yet. Build it with Rust and run it, as described in [windows/README.md](windows/README.md).

## Use

| | |
|---|---|
| Click the menu bar icon, or **⌃⌥H** | Turn the pointer on or off |
| Right-click the menu bar icon | Menu and Settings |
| Click | Tap (nothing underneath gets clicked) |
| Hold and drag | Draw on the screen |
| **⌃⌥X** | Clear the drawing |
| **Esc** | Clear everything and turn the pointer off |
| macOS | Windows | |
|---|---|---|
| Click the menu bar icon, or **⌃⌥H** | Click the tray icon, or **Ctrl+Alt+H** | Turn the pointer on or off |
| Right-click the menu bar icon | Right-click the tray icon | Menu and Settings |
| Click | Click | Tap (nothing underneath gets clicked) |
| Hold and drag | Hold and drag | Draw on the screen |
| **⌃⌥X** | **Ctrl+Alt+X** | Clear the drawing |
| **Esc** | **Esc** | Clear everything and turn the pointer off |
| Hold **⌥** and click | Hold **Alt** and click | Click for real, with your normal cursor |
| | **Ctrl+Alt+C** | Let plain clicks through to apps while drags still draw (Windows) |

While the pointer is on, a small toolbar at the bottom of the screen lets you pick one of
36 hands or a laser dot, mute the tap sound, or exit.
Expand Down
1 change: 1 addition & 0 deletions windows/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/target
Loading