A lightweight browser extension that captures the current tab's context and POSTs it to a configurable webhook endpoint.
Designed as a browser-to-automation ingress tool for AI workflows β connect to n8n, Zapier, Make, Slack, or any service that accepts an HTTP POST.
| Feature | Detail | |
|---|---|---|
| π | Multiple endpoints | Add, edit, and delete named webhook endpoints with custom headers and tags |
| β‘ | Two-click send | Open popup β pick endpoint β Send |
| π±οΈ | Context menu with submenus | Right-click β Send page or Send selection β choose endpoint directly |
| π | Optional note | Add freeform context before sending |
| π | Dark / light mode | Toggle in the popup or options page; preference is remembered across restarts |
| π¦ | Structured payload | Consistent JSON format ready for downstream automation |
| π | Cross-browser | Single shared codebase for Firefox, Chrome, and Edge |
Every send delivers a JSON object with this shape:
{
"source": "clawclip",
"url": "https://example.com/article",
"title": "Article Title",
"selection": "Highlighted text, if any",
"note": "User's optional note",
"timestamp": "2025-06-01T14:30:00.000Z",
"endpoint": "My Zapier Hook",
"tags": ["ai", "research"]
}git clone https://github.com/shifteverywhere/ClawClip.git
cd ClawClipmanifest.json is pre-configured for Firefox.
- Open
about:debugging - Click This Firefox β Load Temporary Add-onβ¦
- Select
manifest.jsonfrom the cloned directory
Minimum version: Firefox 109 (Manifest V3 with
background.scripts)Temporary add-ons are removed on browser restart. For a persistent install, the extension must be signed by Mozilla or loaded in Firefox Developer Edition / Nightly with
xpinstall.signatures.required = falseinabout:config.
manifest.json is the Firefox version. Swap in the Chrome manifest before loading:
cp manifest.chrome.json manifest.json- Navigate to
chrome://extensions/(oredge://extensions/) - Enable Developer mode (top-right toggle)
- Click Load unpacked and select the project directory
Restore the Firefox manifest at any time:
git checkout manifest.json
- Click the ClawClip toolbar icon
- Click Manage endpoints in the popup footer
- Click + Add Endpoint and fill in:
- Name β a label you'll recognise
- Webhook URL β must be HTTPS
- Static Headers β optional JSON, e.g.
{"Authorization": "Bearer token"} - Default Tags β optional comma-separated tags sent with every payload
- Click Save Endpoint
The first endpoint is automatically set as the default.
- Click the ClawClip icon in the toolbar
- Choose an endpoint from the dropdown (or keep the default)
- Add an optional note
- Click Send
The context preview bar shows the URL and any selected text that will be included in the payload.
Right-click anywhere on a page to access the send submenus:
Send page to ClawClip βΆ My Webhook
n8n Local
βββββββββββββββββ
Manage endpoints
Send selection to ClawClip βΆ My Webhook (appears when text is selected)
n8n Local
βββββββββββββββββ
Manage endpoints
A badge flashes β (green) on success or β (red) on failure. The submenu rebuilds automatically whenever endpoints are added or removed.
Click the moon / sun icon in the upper-right corner of the popup or options page. The preference is saved to browser.storage.local and restored on every page load.
| Permission | Reason |
|---|---|
activeTab |
Read the current tab's URL and title |
scripting |
Extract selected text via executeScript |
storage |
Persist endpoint configuration and theme preference locally |
contextMenus |
Register the right-click menu items |
host_permissions *://*/* |
Send POST requests to arbitrary user-configured HTTPS webhook URLs. Required to bypass CORS restrictions for self-hosted servers that don't emit Access-Control-Allow-Origin headers. |
ClawClip/
βββ manifest.json β Firefox (background.scripts)
βββ manifest.chrome.json β Chrome / Edge (background.service_worker)
βββ icons/
β βββ original.png β source artwork
β βββ icon16.png
β βββ icon32.png
β βββ icon48.png
β βββ icon128.png
βββ src/
βββ core/ β shared by all entry points
β βββ compat.js browser vs chrome namespace normalisation
β βββ storage.js endpoint CRUD + default tracking
β βββ validate.js URL validation, header/tag parsing
β βββ payload.js JSON payload construction
β βββ sender.js fetch POST logic
β βββ theme.js dark/light mode state + toggle helper
βββ background/
β βββ service-worker.js Chrome/Edge β ES module service worker
β βββ background.firefox.js Firefox β self-contained event page script
β βββ background.html Firefox background page wrapper
βββ popup/
β βββ popup.html
β βββ popup.css
β βββ popup.js
βββ options/
βββ options.html
βββ options.css
βββ options.js
All business logic lives in src/core/. Browser-specific differences are limited to the two background entry points and compat.js.
- All WebExtensions APIs used:
storage,contextMenus,scripting,tabs,action,runtime - ES module scripts in popup and options (
<script type="module">) browser.*/chrome.*namespace normalised bycompat.js
| Area | Firefox | Chrome / Edge |
|---|---|---|
| Minimum version | 109 | MV3 (Chrome 88+) |
| Manifest | manifest.json |
manifest.chrome.json β rename to manifest.json |
| Background | Persistent event page (background.firefox.js) |
ES module service worker (service-worker.js) |
| Background lifetime | Always alive | May terminate when idle; wakes on events |
| Namespace | browser.* (native) |
chrome.* β normalised by compat.js |
Key considerations for a future Safari port:
- Wrapper app required. Convert with
xcrun safari-web-extension-converter . --app-name ClawClipand ship inside a native macOS/iOS app. browser.*namespace is supported natively βcompat.jsalready handles this.scripting.executeScriptrequires Safari 16+.- Service workers require Safari 15.4+ (lifetime may differ).
- No build step needed. The converter works directly with plain ES modules.
host_permissions *://*/*is allowed but may require App Store review justification; consideroptional_host_permissionsto reduce the surface.
Use a free temporary HTTPS endpoint to inspect payloads:
- webhook.site β live request viewer in the browser
- requestbin.com β inspect headers and body
Both services send Access-Control-Allow-Origin: * headers, so no extra browser configuration is needed.
Issues and pull requests are welcome.
- Keep the no-build, no-dependency contract β plain JS/HTML/CSS only
- New features that require browser-specific code should be isolated in the relevant background entry point, not in
src/core/ - Test against both Firefox and Chrome before opening a PR