npx skills add smithery/neversight --skill content-script-developer
shipshitdev/skills
content-script-developer
Expert in browser extension content scripts, DOM integration, and safe page augmentation across modern web apps. Use when building or updating a browser-extension content script, injecting UI into third-party pages, or handling SPA navigation and dynamic DOM changes.
Installation
npx skills add shipshitdev/skills --skill content-script-developer
Similar popular skills
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Guidance for distinctive, intentional visual design when building new UI or reshaping an existi…
866.4K installsBrowser automation CLI for AI agents. Use when the user needs to interact with websites, includ…
810.4K installsReview UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "chec…
617.3K installsBuild, deploy, evaluate, optimize, fine-tune, and manage Microsoft Foundry agents, models, and …
576.5K installsDebug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe …
568.9K installsAlso in this package
Other skills from shipshitdev/skills · top by installs.
npx skills add shipshitdev/skills
More details
Agent compatibility
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
Also listed on
Alternate registries and mirrors of this skill.
Repository health
master
Skill metadata
Parsed from SKILL.md frontmatter.
More metadata
- version
- 1.0.0
- tags
- browser-extension, content-script, dom
Package contents
Files included with this skill beyond the listing page.
-
skill md
SKILL.md3,697 B -
docs
SUMMARY.md299 B
History
- First seen on skills.sh
- First recorded snapshot · 164 installs
SKILL.md
Content Script Developer
When to Use
- Building or updating a content script
- Injecting UI into third-party pages
- Scraping or reading page state in a browser extension
- Handling SPA navigation changes or dynamic DOM updates
Core Constraints
- Content scripts run in an isolated world; page JS scope is not shared.
- Avoid polluting the host page (global styles, conflicting IDs/classes).
- Be idempotent: injection should not duplicate on re-run.
- Prefer robust selectors over brittle class chains.
- Never block the main thread; throttle observers and event handlers.
Workflow
1) Understand the Target Page
- Identify stable anchors (data attributes, IDs, landmark roles).
- Note SPA navigation patterns (URL changes, DOM root swaps).
- Decide what you need: read-only scrape vs UI injection.
2) Plan Injection Safely
- Create a single root container for your UI.
- Use a shadow root if CSS conflicts are likely.
- Add styles with a unique prefix or scoped to your root.
- Ensure cleanup hooks if the page swaps roots.
3) Handle Dynamic Pages
- Use a MutationObserver for DOM changes.
- Throttle work with
requestAnimationFrameor debouncing. - Re-check anchors on navigation events.
4) Message and Store Data
- Use
chrome.runtime.sendMessagefor background/service worker calls. - Use
chrome.storagefor persistent state. - Keep tokens or sensitive data in extension storage, not DOM.
5) Accessibility and UX
- Keyboard-focusable UI elements.
- Visible focus styles.
- ARIA labels for controls.
Patterns and Snippets
Idempotent UI Injection
const ROOT_ID = 'ext-root';
export function ensureRoot() {
let root = document.getElementById(ROOT_ID);
if (root) return root;
root = document.createElement('div');
root.id = ROOT_ID;
root.setAttribute('data-ext-root', 'true');
document.body.appendChild(root);
return root;
}
Safe Styling (Scoped)
const styleId = 'ext-style';
function injectStyles(css: string) {
if (document.getElementById(styleId)) return;
const style = document.createElement('style');
style.id = styleId;
style.textContent = css;
document.head.appendChild(style);
}
MutationObserver with Throttle
let scheduled = false;
const observer = new MutationObserver(() => {
if (scheduled) return;
scheduled = true;
requestAnimationFrame(() => {
scheduled = false;
// re-check anchors or update UI
});
});
observer.observe(document.body, { childList: true, subtree: true });
Messaging to Background
async function fetchData(payload: Record<string, unknown>) {
return await chrome.runtime.sendMessage({ type: 'FETCH_DATA', payload });
}
Reliability Checklist
- UI injection is idempotent
- Styles are scoped or shadow-rooted
- Observers are throttled and cleaned up
- Messaging uses explicit message types
- Host page performance remains stable
Common Pitfalls
- Injecting the same UI multiple times on SPA navigation
- Using brittle selectors that break on minor DOM changes
- Global CSS that overrides host styles
- Heavy MutationObserver handlers without throttling
Notes
- Prefer small, composable helpers over large one-off scripts.
- Keep extension logging prefixed and easy to disable in production.