Bookmarklets for developers

A bookmarklet is a bookmark that instead of storing a URL to a page stores JavaScript code that can be executed on a page. To save a bookmarklet, either drag it to the bookmarks bar or create a new bookmark with the javascript:... code as the URL.

You can try a bookmarklet directly by clicking it on this page. Or by copy&pasting it into the address bar, but you will have to readd the javascript: part in the beginning as it is stripped for security reasons.


Text transform bookmarklets

These bookmarklets transform a text taken as input and do not load any external resources.

AtoB: base64 to text

javascript: void(() => {
    try {
        prompt('Decoded text:', atob(prompt('Decode base64:') ?? (function() {
            throw null;
        }())))
    } catch (e) {
        e && alert(e);
    }
})()

BtoA: text to base64

javascript: void(() => {
    try {
        prompt('Encoded text:', btoa(prompt('Encode text as base64:') ?? (function() {
            throw null;
        }())))
    } catch (e) {
        e && alert(e);
    }
})()

Remove all newlines

javascript: void(() => {
    try {
        prompt('Text without newlines:', (prompt('Remove newlines (\\n and \\r):') ?? function() {
            throw null
        }()).replaceAll('\n', '').replaceAll('\r', ''))
    } catch (e) {
        e && alert(e)
    }
})();

Decode URI Component

javascript: void(() => {
    try {
        prompt('Decoded text:', decodeURIComponent(prompt('Decode URI Component:') ?? (function(){throw null;}())))
    } catch (e) {
        e && alert(e);
    }
})()

Encode URI Component

javascript: void(() => {
    try {
        prompt('Decoded text:', encodeURIComponent(prompt('Encode URI Component:') ?? (function(){throw null;}())))
    } catch (e) {
        e && alert(e);
    }
})()

Generate random UUID

javascript: void(() => {prompt('UUID:', self.crypto.randomUUID())})()

Generate random number

javascript: void(() => {
    const buffer = new Uint32Array(1);
    self.crypto.getRandomValues(buffer);
    const min = Math.ceil(parseInt(prompt('Min value:')));
    const max = Math.floor(parseInt(prompt('Max value:')));
    prompt('Random value between ' + min + ' and ' + max + ' (inclusive):', Math.floor(buffer[0] / (0xffffffff + 1) * (max - min + 1)) + min);
})()

Length of string

javascript: void(() => {alert(prompt('Input:').length)})()

Replace all occurrences of a string

javascript: void(() => {
    prompt('Replaced output:', prompt('Input:').replaceAll(prompt('String to replace:'), prompt('Replace with:')))
})()

Local bookmarklets

These bookmarklets modify the content of the page and do not load any external resources.

Update page title

javascript:void(document.title=prompt('Enter page title') ?? document.title)

Reload page in x seconds

javascript:setTimeout(()=>location.reload(), prompt('Reload the page in seconds:')*1000)

Rotate images

javascript:var orientation = prompt('Rotate by degrees (90,180,270...):');
[...document.querySelectorAll('img')].forEach(el => el.style.transform = 'rotate(' + (parseInt(orientation)) + 'deg)')

contentEditable

javascript:void(document.body.contentEditable=true)

Dark color scheme

javascript:void(document.documentElement.style.colorScheme='dark')

Evaluate JavaScript code

javascript: void(() => {
    try {
        alert(eval(prompt('JavaScript code to evaluate:') ?? (function(){throw null;}())))
    } catch (e) {
        e && alert(e);
    }
})()

Get document’s current HTML source

javascript: void(() => {prompt('Document outer HTML:',document.documentElement.outerHTML)})()

Open native eye dropper

javascript: void(async () => {
    try {
        prompt('Selected HEX color:', (await new EyeDropper().open()).sRGBHex);
    } catch (e) {
        alert(e);
    }
})()

Get user agent

javascript: void(() => {prompt('User agent:', navigator.userAgent)})()

Search selection using a search engine

javascript: void(() => {
    open('https://google.com/search?q=' + encodeURIComponent(getSelection().toString().length === 0 ? prompt('Query to search:') ?? (function() {throw null;}()) : getSelection().toString()));
})()

Search selection using a search engine only on the current domain

javascript: void(() => {
    open('https://google.com/search?q=site:' + location.hostname + ' ' + encodeURIComponent(getSelection().toString().length === 0 ? prompt('Query to search on ' + location.hostname + ':') ?? (function() {throw null;}()) : getSelection().toString()));
})();

Change password inputs to plaintext

javascript: (() => {document.querySelectorAll('input[type=password]').forEach(el => el.type = 'text')})();

Open light/dark themed textpad

data:text/html,<title>Textpad</title><style>@media (prefers-color-scheme: dark){html {color-scheme: dark;}}</style><body contenteditable spellcheck="false">

External page bookmarklets

These bookmarklets open an external site with some information from the current page.

Create a QR code of the current page

javascript: void(
    open('https://chart.apis.google.com/chart?cht=qr&chs=300x300&chld=L|2&chl=' + encodeURIComponent(location.href), null, 'location=no,status=yes,menubar=no,scrollbars=no,resizable=yes,width=500,height=500,modal=yes,dependent=yes')
);

Create a QR code from text

javascript: void(() => {
    open('https://chart.apis.google.com/chart?cht=qr&chs=300x300&chld=L|2&chl=' + (prompt('Enter text for QR code:') ?? (function() {
        throw null;
    }())), null, 'location=no,status=yes,menubar=no,scrollbars=no,resizable=yes,width=500,height=500,modal=yes,dependent=yes')
})();

Open Alexa Site Info

javascript:void(open('https://www.alexa.com/siteinfo/' + location.hostname));

Open this page in Web Archive

javascript:void(open('https://web.archive.org/web/*/' + decodeURIComponent(location.href)));

Open this page in archive.is

javascript:void(open('https://archive.is/search/?q=' + encodeURIComponent(location.href)));

Open this page in Google Web Cache

javascript:void(open('https://google.com/search?q=cache:' + encodeURIComponent(location.href)));

Google Page Speed Test

javascript:void(open('https://developers.google.com/speed/pagespeed/insights/?url=' + encodeURIComponent(location.href)));

Is it down?

javascript:void(open('https://downforeveryoneorjustme.com/' + location.hostname));

Follow a Mastodon user on your instance ([INSTANCE HOSTNAME])

javascript:location.href='https://[INSTANCE HOSTNAME]/authorize_interaction?uri='+document.querySelector("h1 > small").innerText

Remote script bookmarklets

âš  These bookmarklets modify the content of the page using an external script. Make sure you trust and understand the source code before running it on a sensitive website.

All the bookmarklets below load remote scripts with a subresource integrity check. This means if the content of the external script changes, the script won’t load.

The following bookmarklets won’t work on pages with a Content Security Policy that blocks external scripts.

Mobile DevTools

javascript: void(() => {
    const script = document.createElement('script');
    script.crossOrigin = 'anonymous';
    script.integrity = 'sha256-Zz2LCa5JP/pTvQZgI64e/nH4Wp84M2rLGUb2AtrGtPY=';
    script.onload = () => eruda.init();
    script.src = 'https://cdn.jsdelivr.net/npm/eruda@2.4.1/eruda.js';
    document.head.appendChild(script);
})();

Contribute

View the source or submit new bookmarklets at ThomasOrlita/awesome-bookmarklets.