Native macOS menu bar app for timed cursor movement, session management, system monitoring, and idle prevention.
Overview · Screenshots · Features · Quick Start · Build · Contributing · License
Left: Dashboard with live session stats | Right: Settings panel
deceiverMe moves the cursor on a configurable schedule — set the pixel step, direction, and interval. Use it for demos, long-running sessions, or keeping the display and system from idling on machines you own or are authorised to control.
Single-file, zero dependencies. One Swift file + one
Info.plist. Compiles to a universal binary (Intel + Apple Silicon) with ad-hoc codesign.
| App | deceiverMe.app |
| Source | MouseMoverNative.swift + Info.plist |
| Build | ./build.sh → universal binary, ad-hoc codesign, optional zip |
| Repo | github.com/mimran-khan/deceiverme |
| Author | mimran-khan |
- Configurable step size — pixels per move (default
5) - Five directions — right, left, up, down, or circular
- Adjustable interval — seconds between moves (default
10) - Safe bounds — cursor clamped to main display via CoreGraphics
| Mode | Behaviour |
|---|---|
| Run forever | Runs until manually stopped |
| Fixed duration | Auto-stops after N hours of active time (paused time excluded) |
| Stop at date & time | Stops when system clock passes the chosen moment |
Quick-start presets from the menu: Saved Settings, Run Forever, 1 h, 4 h, 8 h.
Live control centre accessible from the menu bar:
- Status badge —
Idle/Running/Paused - Session clock — elapsed
HH:MM:SS, time remaining, move count, progress bar - System monitor — CPU/GPU temperature, CPU %, RAM, network throughput
- Action buttons — Start, Pause/Resume, Stop, Settings
- Version tag — current version at a glance
On every Dashboard open, the app queries the GitHub Releases API:
- New release detected → a notification banner appears at the bottom
- One-click update → downloads the
.zip, extracts, replaces the running app, and relaunches automatically - Up to date → banner stays hidden
- Fallback → if the zip asset is missing, the button opens the release page instead
The check is a single background HTTPS GET — no telemetry, no data leaves your machine beyond the version query.
Real-time telemetry in the Dashboard and menu bar:
| Metric | Source |
|---|---|
| CPU temperature | SMC (dynamic key discovery — Apple Silicon & Intel) |
| GPU temperature | SMC (dynamic key discovery) |
| CPU usage | host_processor_info |
| RAM usage | host_statistics64 |
| Network throughput | getifaddrs (↓ / ↑) |
- Dock-free — runs as an
LSUIElementagent; no Dock icon, no app-switcher entry - Close = hide — closing the Dashboard hides the window; the app keeps running in the menu bar
- Status icon — concentric rings (template image)
- Banner rotation — live elapsed time, system stats
- Start submenu — presets (saved settings, run forever, 1 h / 4 h / 8 h)
- Pause / Resume, Stop
- Dashboard
⌘W· Settings⌘,· Quit⌘Q
Default ⌘⇧Space — toggles start / pause. Customisable in Settings via Record shortcut….
Scheme: deceiverme://
open "deceiverme://start" # start with saved settings
open "deceiverme://start?duration=1800" # start, 30 min session
open "deceiverme://start?until=1700000000" # start, stop at Unix epoch
open "deceiverme://stop" # stop
open "deceiverme://pause" # toggle pauseSession-end alerts via UserNotifications (banners on macOS 11+). Toggle in Settings.
- Download the latest
.zipfrom Releases, or build from source. - Move
deceiverMe.appto/Applications. - Open the app — the menu bar icon appears.
- Grant Accessibility when prompted:
System Settings→Privacy & Security→Accessibility→ enable deceiverMe. - Open Settings → configure pixels, direction, interval, session mode → Save.
- Start from the Dashboard, menu bar, hotkey, or URL scheme.
- macOS 11+ with Xcode Command Line Tools
xcode-select --installchmod +x build.sh # first time only
./build.shThe script compiles with -O -whole-module-optimization, builds a universal binary (Intel + Apple Silicon), ad-hoc codesigns, and produces a distributable zip.
deceiverMe.app/ ← repository root (gitignored)
dist/deceiverMe-macos.zip ← distributable archive
| Variable | Effect |
|---|---|
BUILD_STYLE=native |
Single-arch for current CPU only |
SKIP_CODESIGN=1 |
Skip codesigning |
SKIP_ZIP=1 |
Skip zip creation |
BUILD_STYLE=native ./build.sh
SKIP_ZIP=1 ./build.shReference — internals, defaults, and repo layout
NSApplication+NSStatusItem+ DashboardNSWindowTimeronRunLoop.main(.commonmode) fires everymoveInterval→moveMouse()AXIsProcessTrustedWithOptionsbefore first startshouldAutoStopon tick → optionalstopMovement(notify:reason:)- 1 Hz UI refresh for menu + Dashboard
- SMC temperature polling via persistent IOKit connection with dynamic key discovery
| Key | Purpose |
|---|---|
pixelMove |
Pixels per move |
direction |
MovementDirection raw value |
moveInterval |
Interval (seconds) |
totalDuration |
Duration (seconds) |
prefsSessionKind |
0 forever / 1 fixed / 2 stop at |
sessionUntilEpoch |
Deadline (timeIntervalSince1970) |
notifyOnSessionEnd |
Bool |
preventIdleSleepWhileRunning |
Bool (default true) |
hotkeyKeyCode |
Carbon virtual key |
hotkeyCarbonModifiers |
Carbon modifiers bitmask |
.
├── LICENSE
├── README.md
├── AGENTS.md
├── build.sh
├── .gitignore
├── screenshots/
│ ├── dashboard.png
│ └── settings.png
├── packaging/
│ └── Info.plist
└── MouseMoverNative/
└── MouseMoverNative.swift
| Permission | Required | How to enable |
|---|---|---|
| Accessibility | Yes | System Settings → Privacy & Security → Accessibility → enable deceiverMe |
| Notifications | Optional | Allow when prompted for session-end alerts |
Restart the app after changing permissions.
Click to expand
| Issue | Fix |
|---|---|
Build fails at swiftc |
Install CLT; check Swift errors in terminal |
codesign fails |
Read the error; or SKIP_CODESIGN=1 ./build.sh |
| Zip missing | Ensure SKIP_ZIP is not set; check dist/ is writable |
| App won't open | Right-click → Open; review Gatekeeper / quarantine |
| Cursor never moves | Accessibility off → add app and restart |
| Hotkey not working | Pick another combo in Record shortcut… |
| Can't save settings | Stop the running session first |
| Screen still locks | Enable Keep display & system awake in Settings; confirm session is active (not paused). MDM policies can override. |
Temperatures show — |
SMC access requires running without sandboxing; ad-hoc signed builds work on personal machines. v1.3.0+ uses dynamic key discovery to support all Apple Silicon generations (M1–M4). |
- No telemetry — the only outbound request is the GitHub Releases API update check.
- Cursor control and idle-sleep assertions are sensitive in managed environments — follow your org's policy.
- Ad-hoc signing is fine for personal builds; wide distribution needs Developer ID + notarization.
Contributions, issues, and feature requests are welcome.
- Fork the repo
- Create your branch (
git checkout -b feature/amazing-feature) - Make changes and ensure
./build.shpasses - Commit (
git commit -m 'feat: add amazing feature') - Push (
git push origin feature/amazing-feature) - Open a Pull Request
See Issues for known bugs and planned features.
Distributed under the MIT License. See LICENSE for details.
deceiverMe is built and maintained by mimran-khan
If you find this useful, consider giving a ⭐

