Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
Set Firefox’s proxy when you launch Puppeteer: choose browser: 'firefox' and pass Firefox preferences through extraPrefsFirefox. The preferences below route HTTP and HTTPS page requests through the same proxy host and port. Environment variables such as HTTP_PROXY do not configure traffic generated by a Firefox page.
Working Node.js configuration
Install Puppeteer, launch its Firefox target, inject the proxy preferences, and always close the browser in a finally block:
npm install puppeteer
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
browser: 'firefox',
headless: true,
extraPrefsFirefox: {
'network.proxy.type': 1,
'network.proxy.http': 'proxy.example.com',
'network.proxy.http_port': 8080,
'network.proxy.ssl': 'proxy.example.com',
'network.proxy.ssl_port': 8080,
},
});
try {
const page = await browser.newPage();
await page.goto('https://example.com');
// Continue automation here.
} finally {
await browser.close();
}
Use an actual proxy listener in place of proxy.example.com and 8080. The example uses Firefox’s preference names directly; it is not a Puppeteer-specific proxy shortcut. Confirm that your selected Firefox build accepts the protocol and routing behavior you need before deploying it.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →What each setting does
| Setting | Purpose |
|---|---|
browser: 'firefox' |
Selects Firefox instead of Puppeteer’s default Chrome target. |
headless: true |
Runs without a visible window. Set it to false while diagnosing browser behavior. |
extraPrefsFirefox |
Passes additional Firefox preferences at launch. |
network.proxy.type: 1 |
Enables manual proxy configuration in Firefox. |
network.proxy.http and network.proxy.http_port |
Set the proxy host and port for HTTP destinations. |
network.proxy.ssl and network.proxy.ssl_port |
Set the proxy host and port used for HTTPS destinations. |
Using the same endpoint for the HTTP and SSL pairs is common, but it is only an example. Some providers expose different listeners or require a different protocol. Match the host, port, and protocol to the endpoint documentation. The cited Puppeteer launch API documents preference injection, not a complete recipe for bypass lists, protocol-specific behavior, DNS routing, WebRTC, or credentials.
#1 Best Overall
- 【WIRELESS MOBILE MINI TRAVEL ROUTER】 Convert a public network (wired or wireless) to a private Wi-Fi for secure surfing. Tethering. Powered by any laptop USB, power banks or 5V/2A DC adapters (sold separately). 39g (1.41 Oz) only, portable and pocket friendly. 2.4GHz ONLY
- 【OPEN SOURCE & PROGRAMMABLE】 OpenWrt pre-installed, USB disk extendable.
- 【LARGER STORAGE & EXTENDABILITY】 128MB RAM, 16MB Flash ROM, dual Ethernet ports, UART and GPIOs available for hardware DIY.
- 【OPENVPN CLIENT】 OpenVPN client pre-installed, compatible with 30+ VPN service providers.
- 【PACKAGE CONTENTS】 GL-MT300N-V2 (Mango) mini router (2-year Warranty), USB cable, Ethernet cable, User Manual. Please update to the latest firmware.
Use a script that validates configuration and navigation
Keep proxy values outside source control and fail early when they are missing. This version reads environment variables, applies a navigation timeout, and closes Firefox even when navigation fails:
import puppeteer from 'puppeteer';
const proxyHost = process.env.FIREFOX_PROXY_HOST;
const proxyPort = Number(process.env.FIREFOX_PROXY_PORT || 8080);
const targetUrl = process.env.TARGET_URL || 'https://example.com';
if (!proxyHost || !Number.isInteger(proxyPort) || proxyPort < 1 || proxyPort > 65535) {
throw new Error('Set FIREFOX_PROXY_HOST and a valid FIREFOX_PROXY_PORT');
}
const browser = await puppeteer.launch({
browser: 'firefox',
headless: true,
extraPrefsFirefox: {
'network.proxy.type': 1,
'network.proxy.http': proxyHost,
'network.proxy.http_port': proxyPort,
'network.proxy.ssl': proxyHost,
'network.proxy.ssl_port': proxyPort,
},
});
try {
const page = await browser.newPage();
page.setDefaultNavigationTimeout(45_000);
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
console.log('Loaded', await page.title());
} finally {
await browser.close();
}
Run it with values supplied by your process manager, for example FIREFOX_PROXY_HOST=proxy.example.com FIREFOX_PROXY_PORT=8080 TARGET_URL=https://example.com node proxy-firefox.js. Verify the effective public egress address with an endpoint you control or trust; do not infer routing merely because the browser launched.
Page traffic and Puppeteer tooling use different proxy scopes
A frequent source of confusion is treating environment variables as Firefox page settings. They are separate paths:
| Traffic | Configuration | What to expect |
|---|---|---|
| Requests made by the Firefox page | Firefox preferences inside extraPrefsFirefox |
Configure the browser as shown above. |
| Puppeteer browser download and related tooling | HTTP_PROXY, HTTPS_PROXY, and NO_PROXY |
These variables are documented for Puppeteer’s tooling, not as a replacement for Firefox page preferences. |
The @puppeteer/browsers tooling documentation says that proxy-agent must be installed for those environment variables to work with the tooling. Install it only when you need that download/tooling path:
Rank #2
- 【Advanced Home Data & Media Hub】For advanced home users who need phone backup, file storage, and centralized data management. Centralize family photos, 4K videos, movies, computer backups, and personal files in one place while running multiple apps for home entertainment and everyday data management. Suitable for households with growing digital libraries and multiple NAS use cases.
- 【Built for Creators, Media Servers & Advanced Apps】Powered by the Intel N100 Quad-Core CPU, 8GB DDR5 RAM, 2.5GbE networking, and dual M.2 NVMe slots, DXP2800 handles large files and heavier workloads with ease. Run Docker, virtual machines, and media server applications compatible with Plex—ideal for content creators, tech enthusiasts, and advanced home users managing 4K videos, RAW photos, personal media libraries, and multiple NAS apps.
- 【Up to 80TB for Growing Digital Libraries】 Supports up to 80TB of storage using two HDD bays and two M.2 NVMe SSD slots for family photos, movies, RAW photos, 4K videos, work files, and device backups. AI photo management supports recognition of people, objects, scenes, and locations, album organization, and duplicate photo detection. HDDs and SSDs are not included.
- 【AI-powered Home Surveillance】Turn DXP2800 into a centralized home surveillance hub by connecting compatible network cameras and storing recordings locally on your NAS. AI-powered features include Face Recognition, People Detection, and Pet Detection, helping advanced home users review important events more efficiently while managing home surveillance and personal data in one place.
- 【One data Center Across Your Devices】Keep files from desktops, laptops, phones, tablets, and other devices together instead of scattered across cloud accounts and external drives. Access, back up, organize, and share data across Windows, macOS, Android, iOS, web browsers, and compatible smart TVs—ideal for creators and advanced home users working across multiple devices.
npm install proxy-agent
Setting HTTP_PROXY in the shell therefore does not, by itself, route a page opened in Firefox through that proxy. Keep the two configurations explicit so a browser download proxy is not mistaken for an application traffic proxy.
Choose the Puppeteer package and Firefox build deliberately
Full puppeteer package
The full package manages a Puppeteer-paired browser download. This is the simplest route for the example because the launch call can select Firefox and use the package’s supported browser arrangement.
puppeteer-core
With puppeteer-core, launch() requires either an executablePath or a channel. Supply the Firefox executable explicitly and retain the same browser: 'firefox' and extraPrefsFirefox settings:
Free tools Windows power users keep installed
One-click scans. No signup required.
import puppeteer from 'puppeteer-core';
const browser = await puppeteer.launch({
browser: 'firefox',
executablePath: '/absolute/path/to/firefox',
headless: true,
extraPrefsFirefox: {
'network.proxy.type': 1,
'network.proxy.http': 'proxy.example.com',
'network.proxy.http_port': 8080,
'network.proxy.ssl': 'proxy.example.com',
'network.proxy.ssl_port': 8080,
},
});
Version alignment
Puppeteer’s support page says Firefox support switched to stable releases starting with Puppeteer v23.0.0. Its current mapping snapshot lists Puppeteer v25.12.0 with Firefox 156.0.1. That mapping changes over time, so check the support table for the versions you deploy rather than treating those numbers as permanent. Puppeteer’s launch-options documentation also warns: “Puppeteer is only guaranteed to work with the bundled browser.” A system Firefox executable can work, but it is outside that guarantee; pin and test the exact pair in your build.
Rank #3
- One Place for All Your Data - Consolidate scattered files from multiple computers, phones and external drives into one accessible hub with 100% ownership
- Professional File Collaboration - Share projects with clients, sync documents across teams and maintain version control without Dropbox fees
- Automated Backup Protection - Set-and-forget backups for Macs, PCs and mobile devices to multiple destinations including cloud and external drives
- DIY Surveillance System - Transform IP cameras into a professional monitoring solution with motion alerts, recording schedules and remote viewing
- 2-Year Warranty - Reliable hardware backed by Synology's expert customer support team and ongoing software updates
Proxy authentication is not settled by the launch API
The launch-options reference documents how to inject Firefox preferences, not a verified credential workflow for authenticated proxies. Do not copy Chrome-oriented page.authenticate() examples and assume they provide Firefox proxy authentication. Check the behavior of your exact Firefox and Puppeteer versions, and prefer a proxy endpoint whose access method is supported and documented for that combination. Never put a username or password directly in a committed script or log.
Check routing, privacy, and failure boundaries
- Confirm the listener: A browser can start even when the proxy host is unreachable. Test the host and port from the same machine or container that runs Node.js.
- Confirm egress: Navigate to a destination you control or trust and inspect the observed public address. The sample code has not been presented as a measured test.
- Review bypass behavior: Direct connections, DNS resolution, WebRTC, and bypass rules can affect what leaves the machine. The cited Puppeteer pages do not define Firefox-specific privacy guarantees for these paths.
- Match HTTPS handling: If HTTPS pages fail while HTTP pages work, recheck the
network.proxy.sslhost and port and the proxy provider’s expected protocol. - Keep credentials out of URLs: Proxy URLs with embedded secrets can leak through logs, process listings, or error reports.
Troubleshooting common failures
Firefox launches but the page uses the direct connection
Check that browser: 'firefox' is present, that the preference keys are spelled exactly, and that network.proxy.type is 1. Confirm the proxy host and port from the runtime environment rather than a different shell. Also make sure you are not testing a destination covered by an unintended bypass rule.
HTTP works but HTTPS times out
Verify the SSL preference pair and whether the endpoint expects an HTTP proxy, an HTTPS proxy, or another protocol. The illustrative configuration assumes one host and port can serve both; your provider may require separate values.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →The script times out on every URL
Test connectivity to the proxy from the same container, increase the navigation timeout only after confirming the endpoint is reachable, and try headless: false for visual diagnosis. A timeout is not evidence that the proxy is being used successfully.
Rank #4
- Unlimited bandwidth, unlimited data.
- Super-fast VPN and one tap connect.
- Free worldwide multiple servers.
- Works with all type of data carries. (Wi-Fi, 4G, LTE, 3G).
- No registration, sign up needed.
HTTP_PROXY appears ignored
That variable belongs to Puppeteer’s browser download/tooling path. Install proxy-agent for that path if required, but configure Firefox page traffic with extraPrefsFirefox.
puppeteer-core refuses to launch
Provide a valid executablePath or channel. Also verify that the executable is the Firefox build paired with the Puppeteer version you selected.
Authenticated proxy requests fail
Treat this as an unresolved compatibility issue rather than assuming Chrome’s authentication APIs apply. Confirm the provider’s authentication method and test the exact browser/Puppeteer pair in a controlled environment.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Operational and cost considerations
- Latency: A proxy adds another network hop. Use an explicit navigation timeout and choose a
waitUntilcondition that matches your job;domcontentloadedavoids waiting for every image when you only need the document. - Concurrency: Start with a small number of browser instances and observe proxy connection limits. Reuse a browser for related pages, but close it in a
finallyblock when the job ends. - Reliability: Record the target URL, proxy host identifier (not its secret), Firefox/Puppeteer versions, and the resulting error. This makes endpoint failures distinguishable from browser incompatibilities.
- Proxy charges: Puppeteer does not set the price of your proxy endpoint. Account for the provider’s bandwidth, geography, authentication, and concurrency terms separately from Node.js runtime costs.
Or skip the browser setup
If your actual goal is a clean website image or PDF rather than interactive Firefox automation, ScreenshotNeo returns a screenshot from one request. It is a screenshot API, not a replacement for a stateful Puppeteer session, but it removes browser setup for capture jobs. The API accepts the same target URL in each example; see the ScreenshotNeo documentation for options.
Best Value
- Complete Phone & Computer Backup - Automatically protect photos, documents and videos from iPhone android, Mac and Windows to one secure location
- Your Private File Cloud - Access files from anywhere and share large projects with family or clients without relying on expensive cloud subscriptions
- Smart Home Security Hub - Monitor your home 24/7 with AI-powered surveillance that detects people, vehicles and sends instant alerts
- 100% Data Ownership - Keep full control of your personal data with multi-platform access and no monthly subscription fees
- 2-Year Warranty - Reliable hardware backed by Synology's expert customer support team and ongoing software updates
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
- Cookie and consent banners are accepted like a visitor, then more than 60 known consent platforms, newsletter popups, and chat widgets are removed before capture; each cleanup step can be turned off.
- Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed. Each response identifies the result with
X-Page-VerdictandX-Billedheaders. - An MCP server provides
take_screenshot,get_page_info, andcapture_pdftools for Claude, Cursor, and other MCP clients. - The Free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 shots.
| Plan | Allowance | Price |
|---|---|---|
| Free | 1,000 shots/month | $0, no card |
| Starter | 3,000 shots | $5 |
| Growth | 15,000 shots | $15 |
| Pro | 60,000 shots | $39 |
| Scale | 250,000 shots | $99 |
| Business | 1,000,000 shots | $249 |
Every feature is available on every plan, and yearly billing gives two months free. Create a free ScreenshotNeo account to use the 1,000 monthly screenshots without a card.
Frequently Asked Questions
Can I use this configuration with a visible Firefox window?
Yes. Set headless to false while diagnosing the proxy or a page load, then switch it back for unattended runs.
Does the Firefox preference example prove that DNS and WebRTC are protected?
No. Those routing and privacy details depend on Firefox and the proxy setup; verify them separately for your deployment rather than assuming the HTTP and SSL pairs cover every connection.
What should I pin for reproducible deployments?
Pin the Puppeteer package and the Firefox build together, and recheck the versioned support mapping whenever either one changes.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

