Browser Extension¶
The browser extension lets you send any article to Huntable CTI Studio with one click, no manual URL entry needed.
Installation¶
- Open Chrome/Edge and go to
chrome://extensions/ - Enable Developer mode (toggle in top right)
- Click Load unpacked and select the
browser-extension/directory in the project root - The extension icon appears in your browser toolbar
Usage¶
- Navigate to any article you want to analyze
- Click the extension icon in your browser toolbar
- Review the extracted content (title, URL, word count)
- Click Send to Huntable CTI Studio
- The processed article opens in your instance automatically
The extension extracts article content from the page using smart selectors (works on news, blogs, security research, government advisories like CISA, and technical docs).
Configuration¶
Click the extension icon to access these settings:
| Setting | Description |
|---|---|
| API URL | Your Huntable CTI Studio instance URL (default: http://127.0.0.1:8001) |
| Force scrape | Scrape even if the URL already exists in the database |
Settings persist in chrome.storage.local across sessions.
Image Text Extraction¶
The extension can extract text from images on the page using three modes:
| Mode | Description | Requirements |
|---|---|---|
| OCR (local, free) | Runs Tesseract.js WASM in-browser | None, fully offline |
| Vision LLM | Uses GPT-4o Vision or Claude via your app's API key | LLM provider configured in Settings |
| Hybrid | Vision LLM first, falls back to OCR on failure | Both of the above |
Vision LLM providers (openai or anthropic) are selected in the extension popup. The API key is resolved server-side by the backend proxy; the extension never stores or transmits API keys.
Article extraction inserts [IMAGE:<src>] markers where qualifying page images appear. When you OCR or run Vision LLM extraction for those images, the extension replaces the matching marker with a [Image OCR: <alt text>] block before sending, so extracted image text stays inline with the surrounding article context. If an extracted image is not present in the article text, its OCR block is appended as a fallback.
This is a separate pipeline from the server-side Image OCR Ingest feature. The extension's OCR/Vision LLM runs client-side, on demand, only for images you choose to extract before clicking Send. The ingest pipeline runs server-side, automatically, on every article regardless of source (local Tesseract only, no Vision LLM); it re-scans images the extension didn't touch and skips ones already OCR'd via the [Image OCR: <url>] marker it recognizes. You don't need to run extension-side OCR for the server pipeline to work; the two are complementary, not exclusive.
How It Works¶
The extension calls POST /api/scrape-url on your instance with the page title, URL, and extracted content (including any inline OCR text). The backend processes the article through the standard ingestion pipeline, threat hunting scoring and all.
Non-Routable IP Protection¶
The extension blocks ingestion from private/local IP addresses (127.0.0.1, 192.168.x.x, 10.x.x.x, link-local, and IPv6 equivalents). This prevents accidental ingestion of internal documentation or localhost content. The API URL field also rejects non-routable addresses.
Troubleshooting¶
| Symptom | Likely cause |
|---|---|
| "Unable to extract article data" | Content script injection blocked by page CSP |
| "Non-routable IP" error | Current page is served from a private IP |
| "Content too short" | Page has fewer than 50 words of extractable text |
| API errors | Huntable CTI Studio not running on the configured URL |
Check the browser console (Chrome DevTools -> Console) for debug log lines prefixed with CTIScraper Debug:.
File Structure¶
browser-extension/
manifest.json # MV3 extension manifest
popup.html # Extension popup UI
popup.js # Popup logic, OCR, image extraction
background.js # Service worker for API calls
content.js # Content script for page extraction, injected on all pages via manifest.json
icons/ # Extension icons
tesseract*.wasm # Bundled Tesseract.js OCR engine
Last updated: 2026-07-05 Last reviewed: 2026-09-01