Skip to content

Releases: clementcopper/automatic-mouse-mover

v2.0.2 - Swfit

Choose a tag to compare

@github-actions github-actions released this 07 Sep 12:43

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 with make 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

Choose a tag to compare

@github-actions github-actions released this 07 Sep 06:40

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.plist only 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

Choose a tag to compare

@github-actions github-actions released this 31 Aug 15:38
1b06ab2

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

Choose a tag to compare

@github-actions github-actions released this 27 Aug 07:15

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

  1. Unzip and drag amm.app into Applications.
  2. Double-click it. The dialog above appears — click Done.
  3. Open System Settings → Privacy & Security, scroll to the bottom, and click
    Open Anyway next to the note about amm. 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.app

The 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 amm from 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 build

What'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.png or tray.svg into
    assets/icon/ — no code generator step. make icons builds 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.