Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert in building browser extensions that solve real problems - Chrome, Firefox, and cross-browser extensions. Covers extension architecture, manifest v3, content scripts, popup UIs, monetization strategies, and Chrome Web Store publishing.
.claude/skills/lingxling-browser-extension-builder/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 140% | 0% |
| case-20 | ✓→✓ | = Same ✓ | 102% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 61% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 150% | 0% |
Expert in building browser extensions that solve real problems - Chrome, Firefox, and cross-browser extensions. Covers extension architecture, manifest v3, content scripts, popup UIs, monetization strategies, and Chrome Web Store publishing.
Role: Browser Extension Architect
You extend the browser to give users superpowers. You understand the unique constraints of extension development - permissions, security, store policies. You build extensions that people install and actually use daily. You know the difference between a toy and a tool.
Structure for modern browser extensions
When to use: When starting a new extension
extension/
├── manifest.json # Extension config
├── popup/
│ ├── popup.html # Popup UI
│ ├── popup.css
│ └── popup.js
├── content/
│ └── content.js # Runs on web pages
├── background/
│ └── service-worker.js # Background logic
├── options/
│ ├── options.html # Settings page
│ └── options.js
└── icons/
├── icon16.png
├── icon48.png
└── icon128.pngjson{ "manifest_version": 3, "name": "My Extension", "version": "1.0.0", "description": "What it does", "permissions": ["storage", "activeTab"], "action": { "default_popup": "popup/popup.html", "default_icon": { "16": "icons/icon16.png", "48": "icons/icon48.png", "128": "icons/icon128.png" } }, "content_scripts": [{ "matches": ["<all_urls>"], "js": ["content/content.js"] }], "background": { "service_worker": "background/service-worker.js" }, "options_page": "options/options.html" }
Popup ←→ Background (Service Worker) ←→ Content Script
↓
chrome.storageCode that runs on web pages
When to use: When modifying or reading page content
javascript// content.js - Runs on every matched page // Wait for page to load document.addEventListener('DOMContentLoaded', () => { // Modify the page const element = document.querySelector('.target'); if (element) { element.style.backgroundColor = 'yellow'; } }); // Listen for messages from popup/background chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.action === 'getData') { const data = document.querySelector('.data')?.textContent; sendResponse({ data }); } return true; // Keep channel open for async });
javascript// Create floating UI on page function injectUI() { const container = document.createElement('div'); container.id = 'my-extension-ui'; container.innerHTML = ` <div style="position: fixed; bottom: 20px; right: 20px; background: white; padding: 16px; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 10000;"> <h3>My Extension</h3> <button id="my-extension-btn">Click me</button> </div> `; document.body.appendChild(container); document.getElementById('my-extension-btn').addEventListener('click', () => { // Handle click }); } injectUI();
json{ "content_scripts": [{ "matches": ["https://specific-site.com/*"], "js": ["content.js"], "run_at": "document_end" }] }
Persisting extension data
When to use: When saving user settings or data
javascript// Save data chrome.storage.local.set({ key: 'value' }, () => { console.log('Saved'); }); // Get data chrome.storage.local.get(['key'], (result) => { console.log(result.key); }); // Sync storage (syncs across devices) chrome.storage.sync.set({ setting: true }); // Watch for changes chrome.storage.onChanged.addListener((changes, area) => { if (changes.key) { console.log('key changed:', changes.key.newValue); } });
| Type | Limit | |------|-------| | local | 5MB | | sync | 100KB total, 8KB per item |
javascript// Modern async wrapper async function getStorage(keys) { return new Promise((resolve) => { chrome.storage.local.get(keys, resolve); }); } async function setStorage(data) { return new Promise((resolve) => { chrome.storage.local.set(data, resolve); }); } // Usage const { settings } = await getStorage(['settings']); await setStorage({ settings: { ...settings, theme: 'dark' } });
Making money from extensions
When to use: When planning extension revenue
| Model | How It Works | |-------|--------------| | Freemium | Free basic, paid features | | One-time | Pay once, use forever | | Subscription | Monthly/yearly access | | Donations | Tip jar / Buy me a coffee | | Affiliate | Recommend products |
javascript// Use your backend for payments // Extension can't directly use Stripe // 1. User clicks "Upgrade" in popup // 2. Open your website with user ID chrome.tabs.create({ url: `https://your-site.com/upgrade?user=${userId}` }); // 3. After payment, sync status async function checkPremium() { const { userId } = await getStorage(['userId']); const response = await fetch( `https://your-api.com/premium/${userId}` ); const { isPremium } = await response.json(); await setStorage({ isPremium }); return isPremium; }
javascriptasync function usePremiumFeature() { const { isPremium } = await getStorage(['isPremium']); if (!isPremium) { showUpgradeModal(); return; } // Run premium feature }
Severity: HIGH
Message: Using Manifest V2 - Chrome requires V3 for new extensions.
Fix action: Migrate to Manifest V3 with service worker
Severity: HIGH
Message: Requesting broad permissions - may cause store rejection.
Fix action: Use specific host_permissions and optional_permissions
Severity: MEDIUM
Message: Not checking chrome.runtime.lastError for errors.
Fix action: Check chrome.runtime.lastError after API calls
Severity: MEDIUM
Message: Hardcoded URLs may cause issues in production.
Fix action: Use chrome.storage or manifest for configuration
Severity: LOW
Message: Missing extension icons - affects store listing.
Fix action: Add icons in 16, 48, and 128 pixel sizes
Skills: browser-extension-builder, frontend, micro-saas-launcher
Workflow:
1. Define extension functionality
2. Build popup UI with React
3. Implement content scripts
4. Add premium features
5. Publish to Chrome Web Store
6. Market and iterateSkills: browser-extension-builder, ai-wrapper-product, frontend
Workflow:
1. Design AI features for browser
2. Build extension architecture
3. Integrate AI API
4. Create popup interface
5. Handle usage limits/payments
6. Publish and growWorks well with: frontend, micro-saas-launcher, personal-tool-builder
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 19,382 | 22,715 | +17% | 1 | 1 | 0% | 2,911 | 5,891 | +102% | 0 | 0 | — |
case-01 | fail→fail | 17,117 | 13,455 | -21% | 1 | 1 | 0% | 2,719 | 4,565 | +68% | 0 | 0 | — |
case-02 | pass→pass | 24,440 | 19,732 | -19% | 1 | 1 | 0% | 3,747 | 6,028 | +61% | 0 | 0 | — |
case-03 | pass→pass | 10,806 | 11,095 | +3% | 1 | 1 | 0% | 1,499 | 3,745 | +150% | 0 | 0 | — |
case-04 | pass→pass | 7,697 | 6,487 | -16% | 1 | 1 | 0% | 1,350 | 3,436 | +155% | 0 | 0 | — |
case-05 | pass→pass | 9,138 | 8,541 | -7% | 1 | 1 | 0% | 1,534 | 3,754 | +145% | 0 | 0 | — |
case-06 | pass→pass | 18,509 | 14,626 | -21% | 1 | 1 | 0% | 2,450 | 4,676 | +91% | 0 | 0 | — |
case-07 | pass→pass | 17,133 | 13,450 | -21% | 1 | 1 | 0% | 2,834 | 4,529 | +60% | 0 | 0 | — |
case-08 | fail→fail | 18,136 | 16,422 | -9% | 1 | 1 | 0% | 2,746 | 5,302 | +93% | 0 | 0 | — |
case-09 | pass→pass | 18,904 | 14,361 | -24% | 1 | 1 | 0% | 2,493 | 4,247 | +70% | 0 | 0 | — |
case-21 | pass→pass | 20,496 | 16,874 | -18% | 1 | 1 | 0% | 2,675 | 4,630 | +73% | 0 | 0 | — |
case-10 | fail→pass | 13,718 | 9,294 | -32% | 1 | 1 | 0% | 1,902 | 3,613 | +90% | 0 | 0 | — |
case-11 | fail→fail | 16,274 | 18,244 | +12% | 1 | 1 | 0% | 2,543 | 4,697 | +85% | 0 | 0 | — |
case-12 | pass→pass | 21,658 | 13,891 | -36% | 1 | 1 | 0% | 2,226 | 4,703 | +111% | 0 | 0 | — |
case-13 | fail→fail | 18,407 | 15,832 | -14% | 1 | 1 | 0% | 2,816 | 5,095 | +81% | 0 | 0 | — |
case-14 | pass→pass | 4,757 | 6,686 | +41% | 1 | 1 | 0% | 765 | 3,025 | +295% | 0 | 0 | — |
case-15 | pass→pass | 3,450 | 3,647 | +6% | 1 | 1 | 0% | 524 | 2,826 | +439% | 0 | 0 | — |
case-16 | pass→pass | 10,324 | 10,240 | -1% | 1 | 1 | 0% | 1,984 | 3,966 | +100% | 0 | 0 | — |
case-17 | pass→pass | 16,258 | 11,551 | -29% | 1 | 1 | 0% | 2,427 | 4,505 | +86% | 0 | 0 | — |
case-18 | fail→pass | 10,005 | 14,158 | +42% | 1 | 1 | 0% | 1,741 | 4,172 | +140% | 0 | 0 | — |
case-19 | pass→pass | 9,897 | 11,390 | +15% | 1 | 1 | 0% | 1,452 | 3,780 | +160% | 0 | 0 | — |
case-22 | pass→pass | 4,925 | 4,356 | -12% | 1 | 1 | 0% | 633 | 3,001 | +374% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.