A Firefox-first, local-only WebExtension for mapping endpoint URLs from the active tab during authorized security review.
EndPointX helps security testers, bug bounty researchers, developers, and defenders quickly turn the currently open page into a compact endpoint inventory. It collects URLs from visible page structure and browser resource timing metadata, redacts query values, deduplicates endpoints, and exports a local JSON artifact.
It is intentionally not a proxy, crawler, fuzzer, scanner, exploit tool, or request replayer.
Prototype: 0.1.0
The first release is an unpacked Firefox extension for local development and review. A development zip is attached to GitHub releases. It is not listed on Mozilla Add-ons yet.
Use this tool only on systems you own, systems you administer, explicit bug bounty scope, written client scope, or local lab targets.
This project is designed for:
- authorized application security testing
- defensive endpoint inventory
- bug bounty note preparation
- local lab learning
- developer self-review before release
This project is not designed for unauthorized reconnaissance or automated probing of third-party systems.
Use only on systems and content you own or are explicitly authorized to test. Unauthorized use may violate policy, law, or both.
To the maximum extent permitted by law, this software is provided "as is" without warranties of any kind. The authors and contributors are not liable for misuse, unauthorized use, or any loss or damage resulting from use of the software.
Collection happens only after the user clicks Collect Current Tab in the extension popup.
The collector records:
- links from
a[href],area[href], andlink[href] - form action URLs, form methods, and form field names
- script, image, frame, media, embed, object, and source URLs
srcsetimage candidates- inline CSS
url(...)and@importreferences - metadata URLs from selected
meta[content]values PerformanceResourceTimingmetadata exposed by the browser- same-origin versus cross-origin classification
- query parameter names with query values redacted
The latest capture is stored in Firefox extension storage so the popup can be closed and reopened without losing the current map.
- No request bodies.
- No response bodies.
- No cookie values.
- No credential values.
- No browser history.
- No keystrokes.
- No localStorage or sessionStorage values.
- No data from inactive tabs.
- No background crawling.
- No remote upload.
- No telemetry.
- No request modification.
Most security workflows eventually need a clean list of observed routes, assets, forms, and API-looking URLs. Browser devtools can show this, but the output is scattered across Elements, Network, Sources, and manual notes.
EndPointX makes a narrow promise:
- Ask the active tab what endpoint-like URLs are visible.
- Redact risky URL values.
- Deduplicate the result.
- Keep it local.
- Export a useful artifact for notes and reports.
- Click-to-collect: no persistent content script and no continuous collection.
- Active-tab only: uses
activeTabwithscriptingrather than broad host permissions. - Endpoint deduplication: groups repeated URLs across DOM, forms, CSS, and timing sources.
- Query redaction: keeps query keys but replaces values with
<redacted>. - Origin grouping: marks same-origin and cross-origin endpoints.
- Local persistence: keeps the latest capture in
browser.storage.local. - JSON export: downloads a structured evidence file from the popup.
- URL copy: copies the redacted endpoint list to the clipboard.
- Dependency-free runtime: plain HTML, CSS, and JavaScript.
The extension follows Mozilla's WebExtension permission model and keeps the permission set small.
| Permission | Why it is used | Boundary |
|---|---|---|
activeTab |
Grants temporary access to the current tab after user action. | Current active tab only. |
scripting |
Injects the collector script on demand. | One-shot execution from the popup. |
storage |
Saves the latest capture locally. | Firefox extension storage only. |
Permissions intentionally not requested:
<all_urls>cookiesdownloadshistorytabswebRequestwebRequestBlocking
The manifest also declares Firefox's data_collection_permissions.required as
["none"]. The extension does not transmit collected data outside the local
browser.
- Open Firefox.
- Visit
about:debugging. - Select This Firefox.
- Select Load Temporary Add-on.
- Choose
manifest.jsonfrom this folder.
Firefox keeps temporary extensions installed until the browser is restarted.
Mozilla's official web-ext workflow can lint and run the extension:
npm run lint
npm run startThe scripts use npx --yes web-ext ..., so no committed dependency folder is
required.
- Navigate to an authorized target page.
- Click the EndPointX toolbar icon.
- Click Collect Current Tab.
- Review the endpoint list and origin labels.
- Use the filter box to narrow the list.
- Click Copy URLs to copy the currently visible endpoints, or Export JSON to save the full capture.
For a local smoke test, load the extension temporarily and collect endpoints from Seedboard:
http://127.0.0.1:8787/
The smoke test is local-only and keeps the collection flow inside the browser.
Example export:
{
"version": 1,
"collectedAt": "2026-05-08T20:30:00.000Z",
"page": {
"url": "https://example.test/app?view=<redacted>",
"origin": "https://example.test",
"host": "example.test",
"title": "Example App"
},
"counts": {
"endpoints": 3,
"sameOrigin": 2,
"crossOrigin": 1
},
"endpoints": [
{
"url": "https://example.test/api/users?page=<redacted>",
"origin": "https://example.test",
"host": "example.test",
"path": "/api/users",
"queryKeys": ["page"],
"sameOrigin": true,
"sources": ["performance"],
"kinds": ["fetch"],
"methods": [],
"count": 1,
"details": [
{
"initiatorType": "fetch",
"durationMs": 42,
"transferSize": 2048,
"nextHopProtocol": "h2"
}
]
}
],
"warnings": []
}EndPointX is built around a narrow collection surface:
- user action gates collection
- the active tab gates access
- URL query values are redacted before storage
- collected data stays in Firefox extension storage unless exported
- runtime code contains no
fetch,XMLHttpRequest, orsendBeaconcalls - runtime code does not access
document.cookie - runtime code does not read web storage values from the target page
See PRIVACY.md and SECURITY.md for the full policy.
Run the local static verifier:
From the repository root:
npm run verifyThe verifier checks:
- manifest JSON validity
- expected minimal permissions
- absence of forbidden permissions
- Firefox no-data-collection declaration
- referenced icons and popup files
- no network API calls in runtime scripts
- no cookie access in runtime scripts
- no page web storage value reads
- README security/privacy markers
When web-ext is available, also run:
npm run lintMozilla recommends web-ext lint before running or submitting an extension.
.
├── manifest.json
├── src/
│ ├── collector.js
│ ├── popup.css
│ ├── popup.html
│ └── popup.js
├── icons/
│ ├── endpoint-48.svg
│ └── endpoint-96.svg
├── scripts/
│ └── verify_extension.py
├── PRIVACY.md
├── SECURITY.md
├── CONTRIBUTING.md
├── LICENSE
└── package.json
webRequest is powerful, but it expands the permission story and can move a
small endpoint mapper toward proxy-like behavior. The MVP relies on active-tab
DOM inspection and browser Performance API metadata instead.
Future versions may add optional network observation only after the scope guard, redaction model, and permission explanation are stronger.
Mozilla documents activeTab as a way to let an extension act on the current
page after explicit user interaction without requesting broad host access. This
matches the product boundary: collect only when asked.
Endpoint mapping usually needs paths and parameter names, not live secret
values. Query values are replaced with <redacted> before display, storage, or
export.
MIT. See LICENSE.
