Releases: clementcopper/automatic-mouse-mover
Release list
v2.0.2 - Swfit
A small fix release for 2.0.2
Fixed
- The mover paused while a dialog was on screen or the menu was open. The 30-second
timer sat in the run loop's default mode, which does not run during a modal dialog
or while a menu is being tracked — so About left open, or the permission alert
waiting for a click, meant no moves until it was dismissed. Measured: 0 of 3 due
ticks during a dialog before, 3 of 3 now. The 1.6 Go version did not have this
problem, so 2.0.0 was a regression there. - The "AMM" fallback title in the menu bar was invisible when no icon could be
loaded (only affects running from the build tree withmake start).
Changed
- The timer carries a 5-second tolerance, so macOS can batch its wake-up with
other timers. A move may land up to 5 s later than before; the cadence stays at
60 to 95 seconds. - Two small simplifications in the engine, no behaviour change.
Updating from 2.0.0 — the Accessibility grant and the login item are tied to the
exact binary. Remove amm from Privacy & Security → Accessibility with the minus
button and add it again, and tick Launch at Login again if you use it.
Installing — universal, macOS 13+, ad-hoc signed and not notarised, so clear the
quarantine attribute before the first launch (xattr -cr /Applications/amm.app) or
use System Settings → Privacy & Security → Open Anyway. See the README.
v2.0.0 — Swift
The app is now written in Swift. Same menu, same behaviour, same bundle id — but one
thread, no runtime, about 300 KB instead of 4.5 MB. The Go version stays available on
branch go and as tag v1.6.1.
Why the rewrite: 1.6 had already dropped every dependency, but 40% of what remained
existed only to bridge Go's runtime and AppKit, and every bug fixed in 1.6.1 lived in
that bridge. Swift talks to AppKit directly, so that whole class of problems — a second
mover loop, a menu that stops responding, a race between the wake handler and Stop —
cannot occur any more. A Timer on the main thread drives the engine; there is no
queue, lock or atomic in the app.
Changed
- The "permission" alert no longer re-arms after Stop/Start: one alert per 24 hours,
full stop. - Resume After Wake only checks the idle time on wake. It never restarts a mover you
stopped — which was the intent before, but the old code carried a restart path that
could fire. - The moved-mouse log line no longer carries a second, UTC timestamp.
- The version lives in
Info.plistonly and shows in About and in the startup log.
Measured, for the record
- 1.6.0 on an Intel Mac: 17 s of CPU in 5 days 16 hours; on an M2: 19 s in 4 days. The
"high CPU" report against 1.6.0 reproduces on neither. The startup log line still
names version, architecture and macOS build so a report can be pinned to a build. - A move lands every 60 to 90 seconds, not every 60: the check runs on a 30-second
grid and the move itself resets the idle timer just after a tick. Documented, not
changed; every chat client's away threshold is minutes.
Installing — universal, macOS 13+, ad-hoc signed and not notarised, so clear the
quarantine attribute before the first launch (xattr -cr /Applications/amm.app) or use
System Settings → Privacy & Security → Open Anyway. See the README.
Updating from 1.6 — the Accessibility grant and the login item are tied to the exact
binary. Remove amm from Privacy & Security → Accessibility with the minus button and
add it again, and tick Launch at Login again if you use it. The app tells you on the
first failed move if the grant is stale.
Building from source needs only the Xcode Command Line Tools: make build, make test.
v1.6.1
A bug-fix release. 1.6.0 could stop responding to menu clicks and keep running with
nothing left to do about it except Activity Monitor. That is fixed, along with three
smaller defects found while looking for it.
Fixed
- The menu stopped responding. Two races between the menu and the wake handler: a
second Start could open a second mover loop, and Stop could then block for ever
waiting for a loop that was no longer listening. The menu still opened, but no click
did anything. Start, Stop and the wake check are serialised now. - The permission dialog could stay invisible. AMM has no dock icon, so it never comes
to the front on its own, and the old dialog never timed out. If you never saw it,
the app looked broken for no reason. It is a normal alert now, it comes to the
front, and only one shows at a time. - A cursor parked in a screen corner stopped the mover for good. macOS clamps a move
at the screen edge, which looks exactly like a refused move, and AMM only reversed
direction after a successful one — so it kept pushing into the same corner and
eventually blamed the Accessibility permission. It now tries the other direction
before reporting a failure. - The menu bar icon is rasterised once instead of being re-rendered from vector data
whenever the menu bar redraws.
Added — version, architecture and macOS build in the startup log (log show --last 1h
--predicate 'subsystem == "com.pg.amm"' --style compact).
Still open — one report of 1.6.0 pinning the CPU is not explained. Nothing in the code
spins, a 1.6.0 build measured here used 19 s of CPU in four days. Attach sample amm
10, a spindump and the log show output to an issue if you hit it.
Installing — universal, macOS 13+, ad-hoc signed and not notarised, so clear the
quarantine before the first launch (xattr -cr /Applications/amm.app). Upgrading from
1.6.0: remove amm from Accessibility with the minus button and add it again — the
grant is tied to the exact binary, so the old tick looks right while macOS refuses
every move.
v1.6.0
Universal build (Apple Silicon + Intel), macOS 13 or newer. Ad-hoc signed, not notarised.
Install
The app is ad-hoc signed but not notarised, so macOS blocks it on first launch with:
Apple could not verify "amm.app" is free of malware that may harm your Mac or
compromise your privacy.
That is expected. Two ways past it — pick one.
Finder
- Unzip and drag
amm.appinto Applications. - Double-click it. The dialog above appears — click Done.
- Open System Settings → Privacy & Security, scroll to the bottom, and click
Open Anyway next to the note aboutamm. Confirm with Touch ID or your password.
On macOS 15 and newer this is the only way through the GUI: right-click → Open no longer
bypasses the check.
Terminal
Clearing the quarantine attribute before the first launch avoids the dialog entirely:
ditto -x -k ~/Downloads/amm-1.6.0-universal.zip ~/Downloads/
mv ~/Downloads/amm.app /Applications/
xattr -cr /Applications/amm.app
open /Applications/amm.appThe order matters: once macOS has assessed the app, the dialog is what you get.
Then grant permission
System Settings → Privacy & Security → Accessibility → add amm.
Upgrading from an earlier version? Remove
ammfrom that list with the minus
button and add it again. macOS pins the permission to the binary's code signature, so
a replaced app leaves a tick box that looks fine but no longer grants anything.
Toggling the checkbox does not refresh it. The same applies to Launch at Login —
untick and tick it once after updating.
Nothing needs installing to run it: no Go, no Xcode tools, no Rosetta.
Or build it yourself
Needs Go 1.21+ and the Xcode Command Line Tools. A self-built app is never quarantined,
so none of the above applies:
git clone https://github.com/clementcopper/automatic-mouse-mover.git
cd automatic-mouse-mover
make buildWhat's new
-
New menu bar artwork, and the icon no longer has to be square. It is scaled to
16 pt tall with the width following the aspect ratio, so a wide mark stays wide. -
The binary is 36% smaller. 3.37 MB → 2.15 MB per architecture; the download went
from 3.8 MB to 1.8 MB. Panic traces are unaffected — Go resolves them through its own
pclntab, not the symbol table that was stripped. -
Logs are readable at last. A Finder-launched app has no stderr, so everything the
app wrote went nowhere. It now uses unified logging:log show --last 10m --predicate 'subsystem == "com.pg.amm"' --style compact -
Builds are portable. The deployment target is pinned to macOS 13, so a bundle built
on a newer Mac still runs on Ventura. -
Swapping the menu bar icon is now dropping a
tray.pngortray.svginto
assets/icon/— no code generator step.make iconsbuilds the Finder icon from a
single SVG and warns if the menu bar artwork carries colour, which would silently
collapse it into a silhouette.
Carried over from 1.5.0
- Launch at Login — registers the app as a login item so the mover runs from the
moment you log in. Off by default. - Resume After Wake — makes sure the mover is going again after the Mac wakes, and
checks immediately instead of waiting out the next interval. On by default. Something
stopped on purpose stays stopped. - The app asks macOS whether it actually holds Accessibility permission and says so on
the first failed move, instead of blaming the mouse after five minutes.
Since the upstream project
Rewritten to carry no runtime dependencies. robotgo, activity-tracker,
mac-sleep-notifier and systray are replaced by around 250 lines of CoreGraphics and
AppKit.
Gone along with the code that caused them: the crashes on lid close and screen lock
(prashantgupta24#63, prashantgupta24#64), the macOS 15 build failure (prashantgupta24#62), a ~10 MB/day memory leak (prashantgupta24#29), and stuck
input from event taps that were never unwound (prashantgupta24#54, prashantgupta24#22). Added: a native Apple Silicon
build (prashantgupta24#33) and a menu bar icon that follows light and dark mode (prashantgupta24#56).
Based on the original by Prashant Gupta, MIT licensed.
Verified on Intel (macOS 13.7.8) and on Apple Silicon (M2, macOS 26): the cursor moves
on schedule, Teams stays active instead of going idle, and the menu, greying and icon
tinting behave. The release artefact itself was downloaded, installed and run on Intel;
on Apple Silicon the app was built from source.