Requirements

betterkvm is peer-to-peer: every machine runs the same daemon, there is no master or server. Here's what each platform captures input with, injects with, and needs from you.

Linux

Capture

evdev — /dev/input/event*, or the Wayland InputCapture portal where granted

Injection

uinput — /dev/uinput

Needs

input group membership + the bundled udev rule

macOS

Capture

CGEventTap

Injection

CGEventPost

Needs

Accessibility + Input Monitoring permissions

Windows

Capture

low-level keyboard/mouse hooks + Raw Input

Injection

SendInput

Needs

nothing extra — no special permission prompt

Install · Linux

Grab the .deb, .rpm, or AppImage for your distro and install it. The package drops in betterkvm and the layout editor, adds the udev rule for input access, and installs a background user service.

linux · install
# Debian / Ubuntu
$ sudo apt install ./betterkvm_1.0.0_amd64.deb

# Fedora / RHEL
$ sudo dnf install ./betterkvm-1.0.0.x86_64.rpm

# add yourself to the input group (one-time), then start it
$ sudo usermod -aG input $USER     # then log out and back in
$ betterkvm init
$ systemctl --user enable --now betterkvm

Install · macOS

Download the .dmg, drag betterkvm to Applications, and launch it. Grant two permissions the first time so it can capture and inject input.

macos · install
# 1. Open betterkvm.dmg and drag betterkvm to Applications
# 2. Launch it, then in System Settings -> Privacy & Security allow:
#      - Accessibility
#      - Input Monitoring
# 3. Quit and reopen betterkvm to apply

Install · Windows

Run the signed installer for Windows 10 or 11. It drops in betterkvm and the layout editor and registers a background service — no extra permission prompts.

windows · install
# 1. Run betterkvm-setup.msi and follow the installer
# 2. betterkvm and the layout editor land in the Start menu
# 3. The background service starts at login automatically
#    No extra permissions are required.

Configuration

Config lives at ~/.config/betterkvm/config.toml. Print the exact path with betterkvm config-path, or create a commented example with betterkvm init. Each machine describes its own neighbors, so configure both sides.

config.toml
# ~/.config/betterkvm/config.toml

name = 'fedora'                  # shown to peers; defaults to hostname
password = 'your-shared-secret'  # enables AES-256-GCM; match on every machine

[[peers]]
name   = 'mac1'
side   = 'up'        # left | right | up | down
anchor = 'DP-1'      # optional: attach to ONE monitor's edge
align  = 'center'    # optional: start | center | end
side
Maps the peer to the whole desktop edge — fine for two machines.
anchor
Pins the peer to one monitor's edge (connector name from xrandr, or index). Essential for multi-monitor desks.
align
Where along that edge the peer starts: start, center, or end.

Layout editor

The easiest way to arrange your desk is the GUI. It renders your real monitors and configured peers to scale — drag a peer to any monitor edge and click Save to write the config.

shell
$ betterkvm-layout

Usage

Under the installed service managers the daemon runs automatically at login. You can also drive it directly:

shell
$ betterkvm run                          # run the daemon in the foreground
$ betterkvm send mac1 photo.jpg doc.pdf  # send files to a connected peer
$ betterkvm init                         # write an example config
$ betterkvm config-path                  # print the config file location
$ betterkvm-layout                       # visual layout editor

Logs & received files

Received files — from send or a clipboard file paste — arrive in ~/Downloads/betterkvm/ on the receiving machine. Daemon logs live with your service manager:

shell
# Linux
$ journalctl --user -u betterkvm

# macOS
$ tail -f /tmp/betterkvm.out.log /tmp/betterkvm.err.log