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:
- 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.
- 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.
- 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.