Type on your Mac or iPhone/iPad keyboard and have the keystrokes replayed on a Windows PC over Tailscale. Built for daily use with a screen reader; the Windows side is standalone, with no NVDA dependency.
- iOS / macOS apps — capture the physical keyboard and forward it.
- Windows agent — replays the keystrokes via
SendInput, as if they came from a keyboard plugged into the PC.
Keyboard only: no mouse, clipboard, files, or screen sharing.
The App Store name is RemKeys; the repository, the Xcode targets and the bundle id are still
KeyBridge. That mismatch is deliberate — seeCLAUDE.md.
- Windows PC: download
RemKeysAgent-win-x64.zipfrom the latest Release, unzip it, and runinstall-agent.batas Administrator. It registers a logon scheduled task (not a Windows service — a session 0 service cannot inject into your desktop) and starts the agent, which shows up as a tray icon. Note the PC's Tailscale IP. - Mac: download the
RemKeys-macOS-<build>.zipfrom the latest Mac build, unzip it, and move RemKeys to Applications before first launch (a copy run from Downloads can't update itself). Grant Accessibility + Input Monitoring, enter the IP address, and toggle forwarding from the menu-bar window (⌘F). Optionally record a global keyboard shortcut there to toggle it from any app. From then on it updates itself: it checks daily, says so when an update is waiting, and installs when you choose Install update in its window. - iPhone/iPad: install from TestFlight, attach a keyboard, enter the IP address on the Start tab and tap Start forwarding (keeps working while the app is in the foreground). Optionally record a toggle shortcut in Settings.
Any IP address that both ends can reach works — Tailscale is just how it is normally used, and it is what encrypts and authenticates the link.
- Virtual Input tab (iOS) — send keys without a physical keyboard: a three-column pad with the keys the iPhone keyboard lacks (navigation, editing, F-keys) plus a permanent modifier block, and a text field for letters. Built for VoiceOver: drag to hear, lift to send.
- Screen curtain (iOS) — blacks the display and drops brightness to zero for long sessions while forwarding keeps running. Double-tap to bring it back.
- Lock-screen support (Windows, optional) — turn it on from the tray menu to keep typing at the lock screen, the sign-in screen and UAC prompts. It swaps the logon task for a LocalSystem service, and tightens which peers are accepted, since anyone who can reach the port could then type as SYSTEM. Who may type at the lock screen is a tray menu of its own while this is on: Tailscale addresses only (the default), Tailscale or this local network, or any address. Pick the second one if you use RemKeys over a plain home network — otherwise the PC will refuse the connection and say so in the tray.
- Key repeat — held keys repeat at the PC's own repeat delay and rate; Windows does not repeat injected keys by itself.
- Dropped links recover on their own — TCP keepalive at both ends, the newest peer supersedes the older session, and any keys the vanished peer left held are released.
Apple apps (Mac + Xcode 16+):
brew install xcodegen
xcodegen generate # writes KeyBridge.xcodeproj (not committed)
open KeyBridge.xcodeprojWindows agent (.NET 8 SDK):
cd windows-agent
dotnet publish -c Release -o publishThen run install-agent.bat from the publish output, as Administrator.
CLAUDE.md covers the architecture, the wire format, the shared
rules and how to build each piece. Per-component detail lives in docs/:
docs/ios.md— iOS capture, the Virtual Input tab, visual designdocs/macos.md— the event tap and the menu-bar appdocs/windows-agent.md— modes, injection, lock-screen support, configdocs/ci-cd.md— workflows, signing, distribution