Skip to content
Skillv1.0.0

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 thi

by shipshitdev(0) 0 installs
Free
Sign in to install

Free account. Installing gives you the manifest plus copy-paste snippets.

See reviews

About

Imported from shipshitdev/skills (skills/content-script-developer/SKILL.md). Install upstream with npx skills add shipshitdev/skills --skill content-script-developer. Copyright stays with the author.

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 requestAnimationFrame or debouncing.
  • Re-check anchors on navigation events.

4) Message and Store Data

  • Use chrome.runtime.sendMessage for background/service worker calls.
  • Use chrome.storage for 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.

Use it

Copy one of these into your project. Installing also returns the manifest and these snippets.

yaml
targets:
  - https://api.opensmartroute.ai/api/v1/registry/shipshitdev-skills-content-script-developer/manifest   # or paste the manifest below

Manifest

An Open Capability Manifest: the router reads it to know what this does, what it costs and when to pick it.

shipshitdev-skills-content-script-developer.ocm.jsonjson
{
  "ocm": "1",
  "id": "shipshitdev-skills-content-script-developer",
  "kind": "skill",
  "name": "content-script-developer",
  "description": "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.",
  "publisher": "shipshitdev",
  "version": "1.0.0",
  "capabilities": {
    "domains": [
      "general"
    ],
    "tags": [
      "skill-md",
      "browser-extension",
      "content-script",
      "dom",
      "skills-sh"
    ],
    "languages": [
      "en"
    ]
  },
  "quality_prior": 0.6,
  "examples": [
    "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."
  ],
  "primary": false,
  "metadata": {
    "source": {
      "provider": "skills.sh",
      "repository": "https://github.com/shipshitdev/skills",
      "path": "skills/content-script-developer/SKILL.md",
      "ref": "HEAD",
      "url": "https://github.com/shipshitdev/skills/blob/HEAD/skills/content-script-developer/SKILL.md",
      "key": "shipshitdev/skills/skills/content-script-developer/SKILL.md"
    }
  },
  "instructions": "# Content Script Developer\n\n## When to Use\n\n- Building or updating a content script\n- Injecting UI into third-party pages\n- Scraping or reading page state in a browser extension\n- Handling SPA navigation changes or dynamic DOM updates\n\n## Core Constraints\n\n- Content scripts run in an isolated world; page JS scope is not shared.\n- Avoid polluting the host page (global styles, conflicting IDs/classes).\n- Be idempotent: injection should not duplicate on re-run.\n- Prefer robust selectors over brittle class chains.\n- Never block the main thread; throttle observers and event handlers.\n\n## Workflow\n\n",
  "cost": {
    "context_tokens": 824
  }
}

Fetch it by URL: GET /api/v1/registry/shipshitdev-skills-content-script-developer/manifest?version=1.0.0

Reviews

Star ratings from people who tried it. One review per account; edit yours any time.

No reviews yet. Install it, try it, and be the first to rate it.