Verifiable Bookmarklets - Roberto Vázquez González Site
roberto▼g<br>about<br>projects<br>contact<br>blog
Blog Post
Verifiable Bookmarklets<br>27 Jul, 2026I just added a small new tool to the site: Verifiable Bookmarklets. Every bookmarklet it generates carries a SHA-256 fingerprint, so anyone can check that the javascript: link they received was really built from the source code they were shown.
It is a lightweight reproducible-builds mindset applied to bookmarklets. Nothing more than that.
The question it answers is:
Can this bookmarklet be proven to match this source code?
That is all. It does not make bookmarklets secure. It does not sandbox them. It does not replace browser extensions or browser stores. A verified bookmarklet can still be bad code, dangerous code or code you should not run. But at least you can know whether the bookmarklet you received is exactly the bookmarklet that was built from the source being shown.
Why bookmarklets?
Bookmarklets are old, simple and still useful. You drag a link to the bookmarks bar, click it later and the browser runs a small piece of JavaScript in the current page. No install flow, no store review, no account, no backend.
I still use them every day at work. These are real ones I have written over the years to make repetitive tasks easier, all of them from a pre-AI world, but the same principles apply:
🐙 GitHub PR Feedback Extractor v1.0.0
The newest one. Run it on a PR and it opens a dialog listing every comment grouped by author. I tick the ones I care about and it copies a Markdown extraction I can paste straight into an AI agent to iterate on and address.
A GitHub skill with access to the GitHub CLI could do the same, but when I already have the comments in front of me, clicking a bookmarklet is just faster.
🔗📋 Copy page link v1.0.3
Generates a Markdown link to the current page and copies it to the clipboard. If there is text selected it becomes the link text, otherwise it falls back to the page title.
📤 Full Site To Markdown Extractor v1.0.3
Extracts the content of a page as Markdown so I can feed it to an AI agent. I will expand on this one in a following post.
🕳 🧩 🦑 📋 Show / Hide the Content Extractor v1.0.9
Shows an input on the page where I can type a CSS selector. It highlights the matching elements and copies their content to the clipboard.
Most of my others are too specific to my daily work to be worth publishing. The point is the shape of the list: tiny, boring, single-purpose automations that pull an identifier out of a page, reformat something into Markdown, or save me four clicks in an internal tool. An extension would be overkill for every single one of them.
Notice the version numbers too. These things get edited, regenerated and re-dragged constantly, which is exactly where provenance starts to matter.
Sharing them never worked well
There is no standard way to share a bookmarklet. Drag one to your desktop and you get a .inetloc file on macOS, a .url file on Windows or a .desktop file on Linux. They all contain the javascript: URL, but they are not human-readable and they are not nice to share.
For years I generated bookmarklets with Bookmarklet Maker, which takes normal JavaScript and gives you back a bookmarklet ready to drag into the browser. That solved generation well enough that I never looked for anything else. I shared them with colleagues, they shared them with me, and I treated them as informal web scripts without any more pretension than that.
The part that changed recently
Because of LLMs, the generation step has become trivial. Ask for "a bookmarklet that does X" and you get working code back in seconds. That is genuinely useful and I do it often. It also means a lot more javascript: URLs are being generated, pasted into Slack and shared between people who never saw the source.
So more mates share bookmarklets with me, and I share more with them. Generation is no longer the bottleneck.
Which is when it hit me: how do I know that the bookmarklet I received is exactly the one that was built from the source I was shown? And how can I be sure the bookmarklet I am about to share is exactly the one built from the source I am showing?
Whether that source was written by me, by a colleague or by a model does not really change the question:
Is this bookmarklet exactly what this source produces?
Before
Share an opaque javascript: URL
Trust the author
Impossible to compare
"Looks fine"
After
Share a source URL
Verify the build
Deterministic SHA-256
"Matches source"
How it works
Each generated bookmarklet contains a small metadata comment:
/*bm:v1;sha=;src=*/
The tool builds the payload, hashes it with SHA-256 and embeds that comment. The hash does not include the metadata itself, which avoids the circular problem of hashing something that contains its own hash.
The pipeline is deliberately short:
normalize source (normalize newlines, trim)<br>build payload<br>SHA-256(payload)<br>embed metadata<br>share
The tool can...