Free beta for macOS 14 and later

A pointer that never lets go.

Stickypoint keeps the mouse pointer on a button, link or field at all times. Push the trackpad and it jumps to the next element in that direction. It is never in empty space, and it cannot be nudged off the thing you were about to click. Built with a low-vision VoiceOver user, for anyone who finds the pointer too easy to lose.

New · 1.0.9  Updated September 10, 2026 · Universal (Apple silicon and Intel) · Notarized · Needs Accessibility access · What's new

How it works

stretching next element
  1. The pointer parks on the centre of a control and stays there. Small accidental movements do nothing.
  2. Push and it stretches. Three progressively stronger clicks from the Force Touch trackpad tell you how far you have pulled, and a dashed preview shows where you will land.
  3. It pops. One firm click and the pointer jumps to the next element. Let go and the band relaxes.
  4. Hold fn to move freely for dragging or anything unusual. Let go and it sticks again.

Never in dead space

Every landing spot is a real element: buttons, links, fields, rows, menu items, the menu bar, the Dock. Pushing past the edge of your app stops there instead of drifting into another one.

Made for VoiceOver

The pointer stays put, so hover reading is finally reliable, or hand each landed element to VoiceOver directly. Spoken names and roles are optional. Haptics do the rest.

Works everywhere

Native apps, Safari, Electron apps like Discord, open menus, popovers, full screen. Menus that open under the pointer pull it onto their first item.

What's new

September 10, 2026. Tried 1.0.9? Answer nine quick questions, each with buttons.
Installed copies of 1.0.1 and later update themselves. If 1.0.1 crashes as soon as the panel opens, download 1.0.2 here.

1.0.9: Off means off

With Stickypoint running but Off, the whole system's pointer could stutter and scrolls lurched, because every pointer event still passed through Stickypoint and waited for it. Now Off costs nothing: the event tap is switched off, nothing is scanned or observed, and turning Sticky back on is instant. Measured: identical to Stickypoint not running.

1.0.9: no silent landings, and lists that scroll

A scan finishing mid-push could put the pointer back on an unverified spot and skip the announcement; verified landings are kept now and every landing is spoken. At the end of a list, one more push scrolls it and lands on the next item instead of jumping to whatever sat beyond the list.

1.0.9: stands aside for the keyboard, says role and state

Any key press makes Stickypoint stand aside (no moving, no announcing, no highlight) until your next push, so VoiceOver's keyboard navigation is yours. Landings read like a screen reader: name, role, then checked, on, selected, a slider's value, a field's text, or dimmed.

1.0.9: widgets, the Dock, Discord's slow start

Desktop widgets read their title and contents, and their buttons are landing spots. The hidden Dock is given longer and nudged into view. Discord builds its accessibility information only when asked and can take a while; Stickypoint keeps asking, keeps what it knew, and no longer asks web apps to drop it while Off.

Still chasing (please read)

On the macOS 27 beta with VoiceOver running, VoiceOver's own helper processes were measured holding pointer events for up to 45 seconds while the pointer sat on a Discord message; everything looks frozen until they let go, and Command-F5 twice cleared it. Discord's first seconds after launch can leave only the menu bar reachable. Apple Music's playback bar and widgets inside Notification Center are not done yet. The diagnostics file ("Collect diagnostics and email them" in the panel) now says exactly what happened.

1.0.8: every landing is spoken

Announcements are on by default. With VoiceOver running, VoiceOver itself reads each landing in its own voice with the name Stickypoint has for it: a Discord message as sender, text and time, a Finder row as name, date and size. Stickypoint parks a tiny window of its own under the pointer that carries the element's name; clicks and scrolls pass straight through. With VoiceOver off, Stickypoint speaks with your Spoken Content system voice, or any installed voice you pick.

1.0.8: Discord messages are back

Discord answers "what is under this point" roughly first and precisely a moment later; 1.0.7 checked with whichever came first, so quick pushes skipped real messages and slow ones landed on hidden hover toolbars. Web landings now use the refined answer, and the preview's pick is re-verified at the jump.

1.0.8: fn double-tap, edge taps, the Dock

Two quick taps of fn turn Stickypoint off and on. Two fingers tapped twice at the bottom edge of the trackpad jump to the Dock, at the top edge to the menu bar; hidden bars slide in first. The Dock is reachable by pushing down, and a push down from the bottom of a window slides a hidden Dock in.

1.0.8: scroll past the end, Finder, the desktop

At the last visible item one more push scrolls the list and lands on the next item; Right Command + push goes to the true end. Finder's icon view, the desktop and its widgets, and table rows (Finder's list view, Music) are landing spots, rows read as name, then the next columns.

1.0.7: one stop per message with VoiceOver

With VoiceOver running, apps expose a richer accessibility tree. Stickypoint now treats headings and text blocks as landing spots in that tree, and a named row such as a Discord message counts as one stop. Verified with VoiceOver on: one push per message, and the element under the pointer is the message itself.

1.0.6: Discord channels read by name, verified

Each channel row in the Discord app is a named link whose interior is one nameless wrapper; only the row's margins reach the link. The pointer now parks on the margin, and at every landing Stickypoint checks what the accessibility system reports under the pointer and adjusts if it is not the item itself.

1.0.5: Right Command + push jumps to the end

Hold the right Command key while pushing to jump straight to the first or last item in that direction. Two pops confirm it. Setting under Strokes.

1.0.4: VoiceOver reads Discord channels by name

The pointer now parks on an item's padding, after its main text and away from every icon, image and button inside it, so VoiceOver's hover reading announces the row's full name instead of "text" or "icon". Verified against Discord's own hit-testing. (1.0.3 attempted this but picked the wrong spot.)

1.0.2: crash on macOS 27 when the panel opened

On the macOS 27 beta, opening the settings panel could crash the app within seconds. A background scan was hit-testing our own panel, which the beta now forbids off the main thread. Every hit-test now runs on the main thread and the overlay opts out of hit-testing entirely.

VoiceOver reads list items again

Landing on a Discord channel or similar list item made VoiceOver step inside it and read its parts ("text, icon") instead of its name. Stickypoint no longer gives landed items keyboard focus, and lands on an item's text so hover reading names it. A new option announces each landing through VoiceOver itself.

Off and on works every time

Switching Sticky off while a key, button or finger was held could leave it stuck after switching back on. State is now tracked in every mode and re-read when the mode changes.

Two crash fixes and diagnostics

A dangling pointer in finger tracking and an unprotected shared collection could crash at random. After any crash, the next launch offers to collect a diagnostics file and email it to us; the same button is in the panel.

Automatic updates

From this version on, updates arrive in the app with release notes. Free-pointer key choices are now fn, Right Command or None, since Control and Option are VoiceOver's own keys.

This is a beta

  • It is early. Stickypoint has been tuned with one user's hands so far. Expect rough edges, and tell us about them.
  • It reaches deep into macOS. Haptics and finger-contact tracking use trackpad interfaces Apple does not document, so a macOS update could switch them off until we catch up. The app falls back gracefully, but the feel may change.
  • It needs Accessibility access to see the elements on screen and move the pointer. It never reads your keystrokes or your screen contents beyond element names and positions, and it sends nothing anywhere.
  • Escape hatch: hold fn to move the pointer freely at any time, or click the menu bar icon and choose Off.

Questions

Who is this for?

People with low vision, VoiceOver users who also use a trackpad, and anyone with tremor or limited fine motor control for whom the standard pointer is too easy to lose. It was built for a VoiceOver user who described wanting a mouse that "magnetically clings to the next item".

Does it work with a mouse?

Yes. The elastic band works with any pointing device. Finger-resting behaviour and haptics need a Force Touch trackpad.

How do I drag, select text, or move a window?

Hold the mouse button and the pointer moves freely for as long as you hold it. Holding fn does the same without clicking.

Can I still switch apps?

Use the keyboard, as you probably already do. By default the pointer stays in the app you are in, so it can never drift into another one by accident; the menu bar is always reachable by pushing up. You can turn that off in settings.

What does it cost?

Nothing during the beta.

How do I get help or report a problem?

Use the support page. Say which app you were in and what you expected to happen.