When the mouse stops crossing to a screen, it tells you why — and gives you the button that fixes it.
Deskflow shares one keyboard and mouse across Windows, Linux and macOS machines. When the pointer stops crossing to a screen, Desk Monitor says which of the reasons it is — the client is offline, hung, asleep, or sitting at its login screen — and puts the fix for that reason one click away.
It also keeps the Remote Desktop PCs in one list: whether each is online, who is logged in, and a way to log a session off or unstick its clipboard. Nothing runs on its own. Every fix is a button you click.
A shared keyboard and mouse fails in one way that looks like many: the pointer reaches the edge of the screen and stops. Behind that one symptom sit different causes — a client that dropped off the network, one hung on a clipboard transfer, a Mac that went to sleep, a Linux box waiting at a Wayland login screen that Deskflow’s mouse cannot drive — and each one is fixed on a different machine.
Desk Monitor reads the server log, checks each client over ssh, names the cause, and shows only the buttons that apply to it — from the one PC that runs the Deskflow server, without walking to the others.
Connected, hung, disconnected, asleep, offline or unknown — read from the Deskflow server log, a TCP check on port 22 and short ssh checks on each client.
The Deskflow server restarts through Deskflow’s own Windows service, the same way the Deskflow window does it. The window never needs to be open.
On a network without fixed addresses, it rewrites the server address in a client’s Deskflow settings to this PC’s current LAN address — backing the file up first — and restarts the client.
Per machine, and only where you set them up: Log in at a Linux login screen, Wake a sleeping machine with your own script, Restart the Deskflow client. A button whose command is not set is hidden, not broken.
Put the screens in a left-to-right row and save. It rewrites the links in Deskflow’s server.conf — backup first — and leaves your options block as it was.
Bind keys 1–9 to a screen. Keys bound to the server can also pick one of its monitors, and the app moves the cursor to that monitor’s centre.
Online check by name lookup and port 3389, Connect through mstsc, the session list from qwinsta, log a session off, and fix a stuck clipboard by restarting rdpclip on the remote PC.
Closing the window hides it. It can start with Windows.
Every one of these is recorded in the repository itself. They are here because a choice explained is worth more than a feature listed.
There is no background fixer. The app checks and reports; every change to a machine is the direct result of a button you clicked. A tool that silently restarts things on other computers is a tool nobody can reason about when it gets it wrong.
A client is called hung when its Deskflow socket on port 24800 has more than 100 kB waiting in its receive queue — the known clipboard-chunk hang — read with ss on Linux and netstat on macOS. Connected-but-frozen gets a name of its own instead of passing for connected.
Log in asks for the password in place and hands it to your login command as the first line of its input over ssh. The app neither stores nor logs it. The command answers with an exit code — 0 logged in, 3 wrong password, 4 already logging in — so the app can tell a typo from a failure.
A Wayland login screen cannot be driven by Deskflow’s mouse, so the repository ships a helper for GNOME: it checks the password with PAM, turns autologin on for that one login only, and installs a fail-safe so a power cut in the middle still boots to the password screen. It runs through sudo -n from a narrow sudoers rule, never with a stored password.
Every ssh call runs with BatchMode=yes, so a client set up without a key fails at once with an error instead of hanging on a password prompt nobody can see.
Deskflow machines are given a raw LAN IP, because a Flatpak client cannot resolve .local names. Remote Desktop PCs are given the PC name, because their addresses move.
The server restart talks to Deskflow’s service over its named pipe, a protocol internal to Deskflow with no version check, read from the 1.26.0 source. So the server status warns whenever the installed Deskflow is not 1.26.x, rather than letting a restart quietly stop working after an upgrade.
On the desk map only one screen is lit. The app has no way to know where the cursor is, so the light follows the screen you selected — it does not pretend to track something it cannot see.
deskflow client status, fix actions, server.conf layout read and write
daemon talks to the Deskflow service over its pipe, so its window is never needed
rdp Remote Desktop: online check, connect, sessions, clipboard fix
shortcuts Win+numpad keys bound to a screen or one of the server's monitors
config machines.json in %APPDATA%\desk-monitor
util hidden process runner, ssh, TCP probe, backupsThe Rust side, one file per concern. Every action in deskflow.rs is the result of a button click.
What each word on a client means, and where it is read from.
One file, on your machine.
It holds your machines, their roles, ssh aliases and optional commands, and your hotkeys. No password is ever written to it — Windows Credential Manager keeps working as usual for Remote Desktop. On first start it holds one entry: this PC as the Deskflow server.
Bun, Rust and the Tauri 2 prerequisites for Windows. Each Linux or macOS client needs an ssh alias that logs in with a key and no prompt.
bun install
bun run tauri buildEach platform builds only its own artifacts; the release workflow in the repository does all of them at once.
v0.1.018 October 2026
The macOS builds are unsigned, so Gatekeeper will call the app damaged on first run. It is not — the repository has the one command that clears it, and the reason the Intel build is missing.