creating-bookmarklets
Scannednpx machina-cli add skill oaustegard/claude-skills/creating-bookmarklets --openclawBookmarklet Creation
Critical Requirements
Comment Style - ABSOLUTE
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
IIFE Wrapper
All bookmarklets must wrap in IIFE:
(function() {
/* bookmarklet code */
})();
Protocol Prefix
All delivered bookmarklets must begin with javascript: protocol:
javascript:(function() {
/* bookmarklet code */
})();
This makes the code immediately usable without requiring manual modification during installation.
Workflow
1. Generate Pretty-Printed Code
Create readable source with:
- 2-space indentation
- Descriptive variable names
- Block comments for key sections
- Logical organization
- Prepend
javascript:protocol to the code
This version with javascript: prefix gets stored in GitHub and shown to users, making it ready for installation without manual modification.
2. Provide Installation
Default approach - reference installer:
Install: https://austegard.com/web-utilities/bookmarklet-installer.html
Installer handles:
- Minification with Terser
- URL encoding
- Draggable link generation
- GitHub repo integration
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>
3. Deliverables
Always provide:
- Pretty-printed source code with
javascript:protocol prepended - Installation method (installer link or generated link)
- Brief description of functionality
- Usage instructions
The 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.
Code Standards
Error Handling
(function() {
try {
/* main logic */
} catch (error) {
console.error('Bookmarklet error:', error);
alert('Operation failed: ' + error.message);
}
})();
Console Logging
Include debug traces by default:
console.log('Bookmarklet: Starting');
/* operations */
console.log('Bookmarklet: Complete');
User Feedback
/* Success */
alert('✓ Content copied to clipboard');
/* Error */
alert('✗ Failed to access clipboard');
Common Patterns
DOM Manipulation
(function() {
const element = document.querySelector('.target');
if (!element) {
alert('Element not found');
return;
}
/* manipulate element */
})();
Data Extraction
(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);
})();
Clipboard Operations
(function() {
const text = 'content to copy';
navigator.clipboard.writeText(text)
.then(() => alert('✓ Copied'))
.catch(err => {
console.error('Clipboard error:', err);
alert('✗ Copy failed');
});
})();
Dynamic Library Loading
(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);
}
})();
Browser Compatibility
Provide fallbacks for unsupported features:
if (!navigator.clipboard) {
alert('Clipboard API not supported');
return;
}
Constraints
Cannot use:
- External files (CSS, images) without embedding
- Build tools or preprocessing
//style comments
Can use:
- Fetch API
- localStorage/sessionStorage
- Modern browser APIs
- CDN libraries (loaded dynamically)
Testing
Before delivering:
- Verify no
//comments exist - Test in browser console wrapped in IIFE
- Check error handling with missing DOM elements
- Verify user feedback for all paths
Example Output
javascript:(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.
GitHub Storage
User repository: https://github.com/oaustegard/bookmarklets
Pretty-printed format matches storage requirements. Installer loads directly from this repo.
Source
git clone https://github.com/oaustegard/claude-skills/blob/main/creating-bookmarklets/SKILL.mdView on GitHub Overview
Generates browser-executable JavaScript bookmarklets that follow strict formatting rules. It enforces an IIFE wrapper, a javascript: prefix, and block-style comments, delivering code you can drag into the bookmarks bar or install directly.
How This Skill Works
Outputs a pretty-printed source with 2-space indentation, descriptive names, and block comments. It then offers either the default installer path for minification and encoding or a programmatic link generator using Terser to create an installable javascript: URL.
When to Use It
- When you need a bookmarklet that runs immediately from the browser toolbar.
- When you want to convert a snippet into a drag-to-bookmarklet workflow for non-developers.
- When sharing utilities that must be installable with a ready-to-use link.
- When ensuring compatibility by using only block comments (/* */) to avoid bookmarklet breakage.
- When you want a readable, GitHub-ready source with proper indentation and documentation.
Quick Start
- Step 1: Draft your JavaScript logic with clear variable names and 2-space indentation.
- Step 2: Wrap the code in an IIFE and add block comments; prepend javascript: to the code.
- Step 3: Choose the install path (default installer) or generate a programmatic link with Terser, then copy the final bookmarklet URL.
Best Practices
- Wrap all code in an IIFE: (function(){ ... })();
- Prepend the javascript: protocol to the final code block.
- Use ONLY /* */ comments; avoid // comments to prevent execution issues.
- Prefer descriptive variable names and 2-space indentation for readability.
- Include console logs during development and a try/catch with user feedback for robustness.
Example Use Cases
- Copy current page title or URL to the clipboard.
- Toggle a simple dark-mode style on the current page.
- Extract all image URLs on the page and copy as JSON.
- Highlight or outline all heading elements for quick review.
- Auto-fill a form with test data or preset values.