Userscripts are JavaScript snippets that run on specific websites. Firefox supports them via the Tampermonkey or Violentmonkey extensions. Here's a practical guide.

What Userscripts Do

A userscript runs after a page loads and can:

  • Modify page content (add/remove/change elements)
  • Inject custom CSS styling
  • Add buttons or functionality
  • Automate repetitive actions
  • Remove annoyances (cookie banners, overlays)

They're like micro-extensions, but easier to write and share as single files.

Setting Up

Install Violentmonkey (open source, recommended) or Tampermonkey from AMO:

Both work similarly. Userscripts are managed via the extension's dashboard.

Your First Userscript

Create a new script in the Violentmonkey dashboard:

// ==UserScript== // @name Example: Remove Cookie Banners // @namespace http://tampermonkey.net/ // @version 0.1 // @description Hide cookie consent banners // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; // Common cookie banner selectors const selectors = [ '#cookie-notice', '.cookie-banner', '#gdpr-consent', '[id*="cookie"]', '[class*="cookie-notice"]' ]; function hideBanners() { selectors.forEach(selector => { document.querySelectorAll(selector).forEach(el => { el.style.display = 'none'; }); }); } // Run on load and on DOM changes hideBanners(); const observer = new MutationObserver(hideBanners); observer.observe(document.body, { childList: true, subtree: true }); })(); 

The // ==UserScript== block is the metadata header. Key fields:

  • @match — which URLs to run on (supports wildcards)
  • @run-at — when to run: document-start, document-end (default), document-idle
  • @grant — API permissions (GM_xmlhttpRequest, GM_getValue, etc.)

Useful Userscript Examples

Force Dark Mode on a Specific Site

// @match *://docs.example.com/* // @run-at document-start GM_addStyle(` body { background: #1a1a1a !important; color: #e0e0e0 !important; } a { color: #7ec8e3 !important; } pre, code { background: #2a2a2a !important; } `); 

This uses GM_addStyle (requires @grant GM_addStyle) to inject CSS. Simpler than a dark mode extension for sites you visit regularly.

Open External Links in New Tab

// @match *://*/* document.querySelectorAll('a[href^="http"]').forEach(link => { if (!link.hostname.includes(window.location.hostname)) { link.setAttribute('target', '_blank'); link.setAttribute('rel', 'noopener'); } }); 

Auto-Dismiss Cookie Banners via Accept Button

// @match *://*/* // @run-at document-idle const acceptSelectors = [ 'button[id*="accept"]', 'button[class*="accept"]', 'button[aria-label*="accept cookies"]' ]; acceptSelectors.forEach(sel => { const btn = document.querySelector(sel); if (btn) btn.click(); }); 

Finding Existing Userscripts

Greasy Fork (greasyfork.org) — the main userscript repository. Scripts for most major sites. Check review counts and dates before installing.

Security note: userscripts run with full access to page content. Only install from sources you trust, and read the code before installing anything that touches sensitive data.

Userscripts vs Extensions

Feature Userscript Browser Extension
Ease of creation Easy (single JS file) Moderate (manifest, popup, etc.)
Cross-browser Works in any browser with Tampermonkey Separate builds/reviews
Distribution Greasy Fork or file share AMO, Chrome Web Store
Storage GM_getValue/GM_setValue browser.storage
Power Limited to page content Full browser API access
Security review None AMO reviews code

For site-specific tweaks, userscripts are faster. For full browser integrations, proper extensions are better.

Developer Use Case

Userscripts are useful for:

  • Adding keyboard shortcuts to internal tools
  • Reformatting API responses in browser
  • Auto-filling test forms with dummy data
  • Adding "open in IDE" links to GitHub files

Combined with Tab Manager & Session Saver for managing development tool tabs alongside your regular browsing, you can build a focused developer environment.