For your IT person
Last updated October 15, 2026
Draft. Highlighted bits are placeholders still to be filled in before launch.
This page is for whoever decides what can be installed on a computer. It says what Deskercise does, what it doesn't do, what it sends over the network, where it keeps data, and how to turn parts of it off. Questions: contact@deskerciseapp.com.
Summary
| What it is | A desktop app that counts mouse movement, clicks, scroll-wheel notches and key presses, and estimates the calories they use. It counts that a key was pressed, never which key. |
|---|---|
| Publisher | [LEGAL NAME OF COMPANY], [COUNTRY] |
| Platforms | Windows 10 and 11 (64-bit). macOS 14 or later (Apple silicon and Intel). |
| Privileges | Runs as the signed-in user. On Windows it never asks for administrator rights. On a Mac it needs the Input Monitoring permission, and never asks for Accessibility. |
| Network | License activation with Polar (api.polar.sh). Optionally, update checks
(Windows only) and The Desk League. No analytics, telemetry, advertising or crash reporting. |
| Offline use | After a one-time activation it works with no network access at all. |
| Data | Hourly totals in local files in the user's profile. Nothing about the user is stored on a server unless they join The Desk League. |
| Code signing | See Publisher and code signing. |
Publisher and code signing
Status: [PENDING: code signing and notarization are being set up before launch]
- Windows: the installer (
Deskercise-win-Setup.exe) and every update are signed with [COMPANY]'s code-signing certificate, so Windows shows [COMPANY] as the publisher. - Mac: the app is signed with an Apple Developer ID certificate, built with the hardened runtime, and notarized by Apple.
- If Windows shows "Unknown publisher", or any warning about the installer, don't run it. Email contact@deskerciseapp.com.
How it reads input
Windows
- It uses the Windows Raw Input API. It registers for mouse and keyboard input with
RegisterRawInputDevices(withRIDEV_INPUTSINK, so it keeps counting while other apps are in front) and receives it in a hidden window on its own thread. - From a mouse it reads the sensor's relative movement (before Windows pointer speed and acceleration), button presses and wheel notches. From a keyboard it reads key-down and key-up events.
- It doesn't use keyboard or mouse hooks (
SetWindowsHookEx), doesn't inject code into other processes or read their memory, and doesn't install drivers or services. - It runs as the signed-in user. Its manifest requests
asInvoker, so it never asks for elevation. - Input generated by software (macros, remote-control tools, on-screen keyboards) isn't counted unless the user turns on "Count software-generated input" in Settings.
Mac
- It uses IOKit's
IOHIDManagerto read HID reports from mice and keyboards. macOS allows that only with the Input Monitoring permission, which the user grants in System Settings → Privacy & Security. - It never asks for Accessibility access and doesn't create event taps.
- For trackpads that don't send relative movement, it also watches pointer-movement events (mouse-moved and drag events only, never keys) to estimate distance.
- Key presses, clicks and scrolling come only from hardware HID reports.
- The app isn't sandboxed. It's built with the hardened runtime.
What happens to key presses
- On Windows, the key code is used for an instant, in memory, to tell a new press from auto-repeat, so holding a key down counts once. On a Mac, the HID usage is checked only to tell a real key from the keyboard's other reports.
- Then it's dropped. Which key was pressed is never stored, logged or sent anywhere. What's kept is a count per hour.
- The app never reads the screen, window titles, app names, websites, files or the clipboard. It writes to the clipboard only when the user presses Copy on a League invite code.
What it can't see
- On Windows, the secure desktop: the sign-in and lock screens, Ctrl+Alt+Del, and administrator (UAC) prompts, which Windows shows on the secure desktop by default. Input there never reaches the app.
- On a Mac, nothing at all without Input Monitoring: without the permission it can't count.
- Pens and touchscreens report positions rather than movement, so only their clicks and scrolling count.
Network connections
All connections use HTTPS. There's no analytics, telemetry, advertising or crash reporting. The update and League addresses are fixed when a build is made; a build without a League address has no League at all.
| Destination | When | What's sent |
|---|---|---|
api.polar.shPolar, our payment and license provider |
When a key is activated or deactivated, and about once every 30 days to check that the license still exists. | The license key, Deskercise's Polar organization ID, the activation ID, and a random label such as "Deskercise · 3f2a91c0". Not the user's name or the computer's name. |
| [UPDATE FEED HOST] Updates, Windows only |
About every 6 hours while the app runs, if automatic updates are on, and when the user presses Check for updates. | A request for release information, then the update package if there's a new version. Nothing about the user. |
| [LEAGUE HOST] The Desk League (optional), hosted on Cloudflare |
While the League page is open in the app: the public standings, about once a minute. If the user has joined: their totals every 10 minutes, and any mini-league actions they take. | Not joined: nothing about the user. Joined: their username, a secret member token, and that day's and the previous day's calories (scored at 154 lb). Keystroke, click and mouse-distance totals go too only while the user is on the worldwide board or in a Friends league; a member only in Office leagues sends calories only. The license key, once, when joining, so the League can check it with Polar. |
The Mac app makes the license and League requests only. It doesn't check for updates.
These are the app's connections. The website, deskerciseapp.com, is separate: with a visitor's consent it can use Google Analytics and ad measurement (Google Ads, Meta), as the privacy policy describes. None of that is in the app, and the app never contacts those services.
Blocking the network
Only activation needs the network. Once a key is activated you can block everything above, and Deskercise keeps counting: history, goals, milestones and export all work offline. The monthly license check fails quietly and never locks anyone out. The only thing that stops a license is Polar answering that it no longer exists (refunded or revoked), and even then the app keeps counting for 3 more days. With the network blocked, the League and updates stop.
Data on the computer
Everything is in one folder in the user's profile: %APPDATA%\Deskercise on Windows (the roaming AppData
folder), or ~/Library/Application Support/Deskercise on a Mac. The files are plain JSON and text, and
some have a .bak copy beside them.
| File | What's in it | Kept |
|---|---|---|
stats-2026-10.json, one per month | Hourly totals: mouse distance, hand movement, key presses, clicks, scroll notches and active time. | Until the user deletes them |
settings.json | Preferences, an optional body weight, and calibration for each mouse, identified by its hardware vendor and product ID. | Until the user deletes it |
license.json | The license key, its activation ID, and the buyer's name or email as Polar returned them (not for a gifted or pack key). | Until the computer is deactivated |
league.json | Only if the user joined the League: their username, secret member token, and whether the League last said a board they're on shows keystrokes, clicks and mouse distance. | Until they leave the League, or the League stops recognising the membership |
league-notice.txt | Only if the League stopped recognising the membership (for example, removed after 12 months without activity): one sentence saying so. | Until the app's League page has shown it |
logs folder, one file per day | Start-up, errors and the names of detected pointing devices. Never input. | 7 days |
Turning parts of it off
For one user, in the app
- Updates (Windows): Settings → Updates → turn off "Download updates automatically".
- The Desk League: it's off until the user joins. Leave League in the app deletes their League data from the server, and the server deletes an account itself after 12 months without activity.
- Counting: Pause, from the tray icon (the menu bar on a Mac) or the Today page.
By policy
On Windows, the app reads these values from HKLM\SOFTWARE\Policies\Deskercise (every user of the
computer) or HKCU\SOFTWARE\Policies\Deskercise (one user). A value under HKLM wins over the same value
under HKCU. Any value other than 0 turns a switch on. The app reads them when it starts, so a change applies the
next time it starts.
| Value (DWORD) | Effect |
|---|---|
DisableLeague = 1 | Hides The Desk League and stops all League network traffic. |
DisableUpdates = 1 | Stops update checks, downloads and installs. |
For example, from an administrator command prompt:
reg add HKLM\SOFTWARE\Policies\Deskercise /v DisableLeague /t REG_DWORD /d 1 /f
reg add HKLM\SOFTWARE\Policies\Deskercise /v DisableUpdates /t REG_DWORD /d 1 /f
On a Mac, use a configuration profile (managed preferences) for the domain
com.deskerciseapp.Deskercise:
| Key | Effect |
|---|---|
DisableLeague (Boolean) = true | Hides The Desk League and stops all League network traffic. |
The Mac app doesn't update itself, so it has no update setting to turn off.
Work and privacy
- An employer can't see anyone's numbers unless that person joins a league the employer is in. There's no admin console and no reporting to employers.
- Every League member's app reports daily calories. It reports keystrokes, clicks and mouse distance only while the member is on the worldwide board or in a Friends league, the boards that show them. A member who is only in Office leagues sends calories only: their counts never leave the computer. The server decides which applies and tells the app, keeps no counts it doesn't need, and deletes the stored ones when the member leaves the worldwide board or their last Friends league.
- Mini leagues are either Friends or Office, chosen by whoever starts them. For an Office league's board, the server sends calories only: it leaves keystrokes, clicks and mouse distance out, for every member, including whoever started the league.
- The worldwide board is optional. A member can play only in their mini leagues, and can keep out of username search. A member who is on the worldwide board appears there publicly, with their username and totals.
- The full details are in the privacy policy.
What it's built with
- Windows: C# on .NET 10, with WPF. It's self-contained: the .NET runtime is included, so nothing else gets installed, which is why the download is about 72 MB. Third-party components: WPF-UI 4.3.0 (controls), CommunityToolkit.Mvvm 8.4.2, and Velopack 1.2.161 (installer and updates).
- Mac: Swift and SwiftUI, for macOS 14 or later, as one app for both Apple silicon and Intel. It uses only Apple's frameworks, with no third-party code.
- The Desk League server: a Cloudflare Worker with a Cloudflare D1 database.
Installing and deploying
- Windows: the installer installs just for the current user, in their own user folder, with no
administrator prompt. Start with Windows (on by default; the user can turn it off during setup or in Settings)
uses the per-user Run key (
HKCU\Software\Microsoft\Windows\CurrentVersion\Run), so it appears in Task Manager's Startup apps. - Mac: a disk image; the app goes in Applications. Open at login (on by default; the user can turn it off during setup or in Settings) uses macOS's Login Items.
- Machine-wide deployment (an MSI, or a per-machine silent install) isn't available yet. If you need it, tell us at contact@deskerciseapp.com.
Uninstalling and removing data
- If the user joined The Desk League, they should choose Leave League in the app first. That deletes their League data from the server; uninstalling doesn't (the server deletes it after 12 months without activity).
- To free the license for another computer: Settings → Deactivate this PC (on a Mac, Deactivate this Mac).
- Windows: Settings → Apps → Installed apps → Deskercise → Uninstall (on Windows 10: Apps &
features). This removes the app and its Start with Windows entry. The data folder stays: delete
%APPDATA%\Deskerciseto remove the stats, settings, license and logs. - Mac: quit Deskercise from the menu bar, drag it from Applications to the Trash, and delete
~/Library/Application Support/Deskercise. The Input Monitoring entry can be removed in System Settings → Privacy & Security → Input Monitoring. - Within the app, Settings → Delete all data removes the activity history at any time.
Questions
Email contact@deskerciseapp.com with security questions, vendor questionnaires, or anything on this page that looks wrong.