The Userscript Exoskeleton: Automating the Last Mile in the Browser

Some automation can't live on a server — it has to happen inside the logged-in browser tab, between me and the web apps I'm forced to use. Tampermonkey is where those fixes live.

The Unautomatable Zone

My automation usually lives in respectable places — Workers, Apps Script, containers. But there's a category of friction none of them can reach: the stuff that happens inside a logged-in browser session, in web apps I don't control and can't get API access to.

SSO portals. Issue trackers. Internal tools. The web you're forced to use, in the exact shape someone else decided.

For that zone there's a much older, much less respectable tool: userscripts. A folder of .user.js files in Tampermonkey, version-controlled in my scripts repo like everything else. Think of them as an exoskeleton — small motors attached to the joints of the web where I bend a hundred times a day.


The Fleet

github-jira-linker — The classic missing feature: ticket IDs in commit messages, PR titles, and branch names on GitHub become clickable links to the tracker. Fifty times a day, a select-copy-switch-tab-paste ritual becomes a click. This script has probably repaid its writing time a thousandfold, which is a return most software never sees.

jira-inline-copy — The inverse direction: hover any ticket, copy a perfectly formatted KEY-123: Title (or a markdown link) in one click, ready to paste into standup notes, commits, or Slack. Formatting a reference is a robot's job; the robot now does it.

okta-auto-verify — The SSO login flow has a page whose entire purpose is hosting a button I will always click. The script clicks it. That's it. That's the whole program — and it's the one I'd defend to the death, because it deletes a mandatory pause from every workday. (The MFA challenge itself stays fully manual, to be clear — the script automates navigation, not authentication.)

autoclick-boilerplate — The template the others hatch from: wait for selector, act, observe DOM mutations, retry — the SPA-taming survival kit, solved once. New annoyance → copy boilerplate → change two selectors → done in ten minutes. Lowering the marginal cost of the next script is what turned a hack into a fleet.

And one honorary member: openrouter-balance.html — a single self-contained HTML file that charts my LLM API spend. No build step, no framework, no server; open file, see burn rate. Sometimes the correct amount of engineering is one file.


Why This Layer Deserves Respect

Userscripts have a reputation as duct tape, and fair enough — they break when the DOM changes, they're unsanctioned, and they live in a browser extension. But judged by the only metric that matters for personal tooling — friction removed per hour invested — they're among the best code I own:

  1. They work where APIs don't exist. The renderable DOM is the universal API of last resort. If you can see it, you can script it.
  2. They compose with the human, not instead of them. A userscript doesn't replace my judgment; it deletes the mechanical clicks around my judgment. That makes them safe in a way full automation isn't — there's a person present at every step.
  3. They're honest about their scope. Each one fixes exactly one annoyance. No roadmap, no config, no ambition. Software that small doesn't rot; it either works or takes ten minutes to fix.

The grand automation projects get the blog posts (well — until this one). But day to day, the exoskeleton is what I'd miss first.