rayCATCHER is a Manifest V3 Chrome extension that records the cf-ray response header for requests whose completed duration is above a configurable threshold.
Chrome generally blocks direct .crx installs outside the Chrome Web Store for normal consumer profiles. The reliable manual-install path is to load rayCATCHER as an unpacked extension.
- Use
dist/manual/raycatcher-0.1.0-manual-install.zip. - Unzip it somewhere permanent, for example
~/Applications/rayCATCHER. - Open Chrome and go to
chrome://extensions. - Enable Developer mode.
- Click Load unpacked.
- Select the unzipped
rayCATCHERfolder, the folder that containsmanifest.json. - Confirm rayCATCHER is switched On.
- Set Site access to the level you want. For default behavior, choose On all sites.
Do not delete or move the unpacked folder after loading it. Chrome reads the extension from that folder.
- Replace the existing unpacked
rayCATCHERfolder with the new release folder. - Go to
chrome://extensions. - Click the reload button on the rayCATCHER extension card.
Using the same folder path helps Chrome keep the same unpacked extension identity and local data.
- Open the rayCATCHER popup.
- Leave domains set to All.
- Leave request method set to All.
- Set Time threshold to
1000ms and save settings. - Visit a request that takes more than one second and includes a
cf-rayresponse header. - Open the popup again.
Expected result: the request appears under Logged rays with the domain, timestamp, duration, method, URL, and cf-ray value.
Each capture is stored locally in the extension IndexedDB with:
cf-rayheader value- domain and full URL
- timestamp
- request method
- request type
- status code
- duration in milliseconds
Open the extension popup to configure:
- Domains to run on: all domains by default, or a comma separated allowlist
- Request method: all by default, or only
GET/POST - Time threshold:
1000milliseconds by default
Domain list entries match the exact hostname and subdomains. For example, example.com also matches api.example.com.
The popup lists captured rays with the newest entries first. Use the filters to narrow by domain text and minimum request duration, for example 5000 ms.
rayCATCHER stores data locally in the browser profile. It does not transmit logs, settings, URLs, request metadata, or cf-ray values to a server.
It does not collect request bodies, response bodies, cookies, credentials, form data, page content, or personal communications.
Run the focused tests:
npm testRegenerate store assets:
npm run assets:storeCreate the Chrome Web Store upload ZIP:
npm run package:storeCreate the manual-install ZIP:
npm run package:manualThe generated packages are:
dist/store/raycatcher-0.1.0-chrome-store.zipdist/manual/raycatcher-0.1.0-manual-install.zip
The store submission material is in:
store/listing.mdstore/privacy-policy.mdstore/reviewer-instructions.mdstore/submission-checklist.mdstore-assets/promotional/small-promo-440x280.pngstore-assets/screenshots/raycatcher-popup-1280x800.png
Before submitting, publish store/privacy-policy.md at a stable HTTPS URL and use that URL in the Chrome Web Store privacy form.
Upload this ZIP in the Chrome Developer Dashboard:
dist/store/raycatcher-0.1.0-chrome-store.zip
Load the repo directly in Chrome by opening chrome://extensions, enabling Developer mode, and choosing Load unpacked for this project directory.
There is also an optional runtime verifier:
npm run verify:chromeThe verifier needs a browser build that still supports command-line unpacked extension loading, such as Chromium or Chrome for Testing. If your regular Google Chrome blocks that route, load the extension manually with Load unpacked and use the popup to confirm captures.
