Open source

Desk Monitor

When the mouse stops crossing to a screen, it tells you why — and gives you the button that fixes it.

v0.1.0Released 18 October 2026MITView on GitHub

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.

Only the selected screen is lit.
Log in to a Linux login screen without walking to it.
Remote Desktop PCs and their sessions.

Why it exists

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.

What it does

A status per client, with the reason

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.

Restart the server without its window

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.

Fix server IP

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.

Log in, wake, restart

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.

Layout editor

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.

Win+numpad to any screen

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.

Remote Desktop PCs

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.

Lives in the tray

Closing the window hides it. It can start with Windows.

Decisions, and what they cost

Every one of these is recorded in the repository itself. They are here because a choice explained is worth more than a feature listed.

  1. Nothing runs on its own

    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.

  2. Hung means a full receive queue, not a guess

    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.

  3. The password is never stored

    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.

  4. A login helper with a fail-safe

    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.

  5. ssh never prompts

    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.

  6. Addresses for Deskflow, names for Remote Desktop

    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.

  7. An undocumented protocol, checked

    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.

  8. The lit screen follows your choice, not the cursor

    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.

How it is put together

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, backups

The Rust side, one file per concern. Every action in deskflow.rs is the result of a button click.

Language mix

  • Rust39.2%
  • Svelte27.6%
  • TypeScript26.8%
  • CSS4.4%
  • JavaScript1.8%
Runs on
Windows 10 or 11 — the Deskflow server
Watches
Windows, Linux and macOS clients
Deskflow
1.26, through its Windows service
Client checks
ssh with a key, never a prompt
Passwords
Never stored
Stored data
One JSON file, local
Background actions
None
Licence
MIT
  • Rust
  • Tauri 2
  • Svelte 5
  • TypeScript
  • Deskflow
  • OpenSSH

Everything you can type or press

Client status

What each word on a client means, and where it is read from.

offline
No answer on port 22
hung
Over 100 kB stuck in the receive queue on port 24800
connected
The server log’s last word on it is connected
disconnected
The server log’s last word is disconnected — on Linux, also says if it is at the login screen
asleep
macOS, best effort: disconnected and no caffeinate power assertions
unknown
The server log cannot be read, or has no line for it

Where your data lives

One file, on your machine.

Windows
%APPDATA%\desk-monitor\machines.json

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.

Build it yourself

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 build

Each platform builds only its own artifacts; the release workflow in the repository does all of them at once.

Download

v0.1.018 October 2026

Choose a build

Checksums and release notes are on the releases page.

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.