oaustegard/creating-bookmarklets
Creates browser-executable JavaScript bookmarklets with strict formatting requirements. Use when users mention bookmarklets, browser utilities, dragging code to bookmarks bar, or need JavaScript that runs when clicked in the browser toolbar.
npx skills add https://github.com/oaustegard/claude-skills --skill creating-bookmarklets
Use ONLY /* */ comments. NEVER use // comments.
Bookmark execution contexts fail with // style. Every comment must use block format.
/* ✓ Correct */
const x = 5; /* inline */
/* ✗ Wrong - breaks bookmarklets */
// const x = 5;
const y = 10; // inline
All bookmarklets must wrap in IIFE:
(function() {
/* bookmarklet code */
})();
All delivered bookmarklets must begin with javascript: protocol:
javascript:(function() {
/* bookmarklet code */
})();
This makes the code immediately usable without requiring manual modification during installation.
Create readable source with:
javascript: protocol to the codeThis version with javascript: prefix gets stored in GitHub and shown to users, making it ready for installation without manual modification.
Default approach - reference installer:
Install: https://austegard.com/web-utilities/bookmarklet-installer.html
Installer handles:
Alternative - generate link programmatically:
Use Terser.js to create installable link if requested:
async function createBookmarkletLink(code, title) {
const minified = await Terser.minify(code);
const encoded = encodeURIComponent(minified.code).replace(/'/g, "%27");
return `<a href="javascript:${encoded}">${title}</a>`;
}
Requires: <script src="https://cdn.jsdelivr.net/npm/terser/dist/bundle.min.js"></script>
Always provide:
javascript: protocol prependedThe code should be delivered in a format ready for direct use - users should be able to copy the entire code block (including javascript:) without modification.
(function() {
try {
/* main logic */
} catch (error) {
console.error('Bookmarklet error:', error);
alert('Operation failed: ' + error.message);
}
})();
Include debug traces by default:
console.log('Bookmarklet: Starting');
/* operations */
console.log('Bookmarklet: Complete');
/* Success */
alert('✓ Content copied to clipboard');
/* Error */
alert('✗ Failed to access clipboard');
(function() {
const element = document.querySelector('.target');
if (!element) {
alert('Element not found');
return;
}
/* manipulate element */
})();
(function() {
const data = Array.from(document.querySelectorAll('.item'))
.map(item => ({
title: item.querySelector('.title')?.textContent.trim(),
value: item.querySelector('.value')?.textContent.trim()
}));
console.log('Extracted:', data);
})();
(function() {
const text = 'content to copy';
navigator.clipboard.writeText(text)
.then(() => alert('✓ Copied'))
.catch(err => {
console.error('Clipboard error:', err);
alert('✗ Copy failed');
});
})();
(function() {
if (typeof someLibrary === 'undefined') {
const script = document.createElement('script');
script.src = 'https://cdn.example.com/library.js';
script.onload = function() {
/* proceed with logic */
};
document.head.appendChild(script);
}
})();
Provide fallbacks for unsupported features:
if (!navigator.clipboard) {
alert('Clipboard API not supported');
return;
}
Cannot use:
// style commentsCan use:
Before delivering:
// comments existjavascript:(function() {
/* Pretty-printed bookmarklet code */
})();
Install: https://austegard.com/web-utilities/bookmarklet-installer.html
Extracts all links from current page and copies to clipboard as markdown list. Works on any webpage.
User repository: https://github.com/oaustegard/bookmarklets
Pretty-printed format matches storage requirements. Installer loads directly from this repo.
Take oaustegard/creating-bookmarklets from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.