now on the Chrome Web Store · MV3 · open source

The auto clicker that
doesn't lose the button

Every other auto clicker hammers a coordinate. Pin & Click pins the element — so when the page re-renders, swaps class names, or reloads entirely, it's still clicking the right thing. Chain a few buttons into a sequence, and tell it when to stop.

Free on the Chrome Web Store · works in Chrome, Edge, Brave and Arc · or load the .zip unpacked

Try the engine, right here

This is the extension's actual scheduler running on this page. The button below destroys and rebuilds itself every 500ms with new class names — exactly what a React re-render does. Watch the count keep climbing.
Single target only here — sequences and stop conditions need the real extension, since they act on a whole page.

0clicks landed · 0 missed
↻ button node replaced 0 times — press start, it rebuilds every 500ms
Speed 50/s
Burst size 25 clicks
Pause between bursts 500ms

Why it keeps working

Three fallbacks, re-evaluated on every single click.

🪜

Sequences, not just one button

Pin several buttons and they're clicked top to bottom, then looped — enough to drive a real flow like cart → checkout → confirm.

Waits for the next step

If step 2 isn't on the page yet, it waits instead of skipping — because step 2 usually only appears because step 1 was clicked. Stuck 30s? It stops and says which step.

🛑

Knows when to stop

After N clicks, after N seconds, when text like Sold out appears, or when the button disappears. However it ends, it tells you why.

📊

Sent vs skipped

Counts clicks it sent and ones it skipped — with the reason: the button was covered by an overlay, or disabled. The fastest way to see why nothing's happening.

📌

Pinned to the element

Prefers stable hooks — id, data-testid, aria-label — over brittle structural paths, so the selector survives a redesign.

🔁

Survives re-renders

If the selector dies, it matches on tag + visible text. Catches React and Vue swapping in a brand-new node with shuffled classes.

🎯

Position as last resort

Still nothing? It falls back to the last-known viewport point via elementFromPoint. Three chances to find your button.

⏸️

Burst mode

N clicks, then a breather. A flat 50/s stream gets coalesced by the page and 429'd by the backend — bursts land more real clicks than a faster stream does.

🎲

Jitter

Randomises every gap by ±20% so the cadence isn't machine-perfect.

💾

Auto-resume

Target and settings are saved per page. Reload, and it picks up clicking where it left off.

🖼️

Works in iframes

Runs in every frame; whichever frame catches your pick claims the target.

⌨️

Keyboard + HUD

Alt+Shift+C toggles. A live pill shows the click count and pulses the target so you always know what's being hit.

🖱️

Real OS clicks too

Ships with a native CoreGraphics clicker for file pickers, permission sheets and game canvases that ignore synthetic events.

Install in one click

It's on the Chrome Web Store, so there's nothing to unzip and no developer mode.

Pin & Click — Fast Auto Clicker

Add it, pin ⚡ to your toolbar, then open the popup and press 🎯 Pick a button on the page.

Add to Chrome

Using it? Leave a review — ratings are most of what decides whether anyone else finds it.

Prefer to load it unpacked?
  1. Download pin-and-click.zip and unzip it
  2. Open chrome://extensions and turn on Developer mode
  3. Click Load unpacked and select the unzipped folder

The zip is built from source on every deploy, so it always matches this commit.

When synthetic clicks aren't enough

Browser extensions can only fire JavaScript events (isTrusted: false). Normal web UIs accept them — file pickers, OS permission sheets and anti-cheat game canvases don't. So the repo ships a native clicker that posts real mouse events through CoreGraphics' HID tap.

./native/build.sh                     # compile (Xcode CLT)
./native/nativeclick pick             # aim the pointer, get coords
./native/nativeclick --at 812,455 --cps 50 --burst 25 --pause 500 --jitter

Same burst and jitter options. Move the mouse by hand to abort — your escape hatch when 50/s makes the UI unusable.

Two honest caveats. macOS gates synthetic input behind Accessibility, so you must allow your terminal under Privacy & Security → Accessibility once. And OS-level clicks are inherently coordinate-based — there's no DOM down there, so a button that moves is a button that's missed. The extension pins the element; the native tool pins the point.