{"_id":"camofox-browser","_rev":"37-d21ba8d5b10e6098da0af33456ac8c99","name":"camofox-browser","dist-tags":{"latest":"2.4.8"},"versions":{"1.0.0":{"name":"camofox-browser","version":"1.0.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.0.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"7ec7e2c752339e719b1e65e5791820731c70db46","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.0.0.tgz","fileCount":66,"integrity":"sha512-Kx5qP6a0wfIlNZ9z5TiTpwqogfj6g9X4loLac0XzJ9XVlJBfF3kuZ0hg/UBOb3dGnE8fDWhzo1Ao64t8KEgFsg==","signatures":[{"sig":"MEQCIFGIcsygRiAUjEbxXSZTnwxd0PEMJvVZmeiQT53MaKsJAiAC0eCGQJ4mUoG8zzqs+w08rjZETtWZPiOut264ao7/nw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277585},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"5512eee5d4edb3d5d32750aae7f3ec753ebbc1bf","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.0.0_1771138040835_0.6159558170574446","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"camofox-browser","version":"1.0.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.0.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"2caffd84c5776d4a6b7de2da930891103249f270","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.0.1.tgz","fileCount":66,"integrity":"sha512-ZCXaxhokhst15krsqsI0jQ+3Z5Wl5Nk2aKrfniuFiqKEfTj8papSsbDMPIL5zs32mM4CYmI4GDh0IlgxzrcgBA==","signatures":[{"sig":"MEUCIHXscxilUOjHcwb4AxQwKiE+DcmwkivnhN4/6ev39u7UAiEA6EanBvmZCV8MSHUwwOqdvlBXoWSRZyyO+MzWc/LCzzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278738},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"60f1edd4849734e6f86ec661fd330d5d83ae4e98","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.0.1_1771144655953_0.4467809477395388","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"camofox-browser","version":"1.0.2","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.0.2","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"cde1c8d1dd7c41370a64337a3df9269d163e6edf","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.0.2.tgz","fileCount":66,"integrity":"sha512-lFrlqQgeZXBmkuHga3eN6vWOpZpLnvoXDiKtbwzitXu19sUeHGQKJaBCUmB8yGHxAU28gYG7jQeLdljFq0lpPw==","signatures":[{"sig":"MEUCIQC6LBB/aSUmrZ3bdmC9BR5da+AjAsZyoX0HjVejvMaZ7wIgV25RCUKeLsh3toc3s66yCQxCbH/GzRDLYN+2HdJesT8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281433},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"4c9e46eb97bdbdd1eba1dcfae70a814bf7723a6d","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.0.2_1771151494884_0.6959513680199674","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"camofox-browser","version":"1.0.3","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.0.3","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"9d26bd1ce7cb7504260d1c4e133dab37f5624dea","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.0.3.tgz","fileCount":66,"integrity":"sha512-QtaeChqueAtMlk9CRiok8KIbbSnJaPTOZNEINK6FIU8QYdVF+c2samWAIY7fm+SHpH4BDTh76TztcIN82WluNg==","signatures":[{"sig":"MEUCIQCCH4NZf1ZvgsPZwuXRykIckDk7GjYnGHKWnPZccuZmYgIgQGUV/F67cHomEE2ahGqOp7Iqel0sZ0ueDluSxKNtJY4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":282448},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"e7c64c7e25478f79cd4ff0e336e08f76d1140034","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.0.3_1771152644910_0.31558010352248544","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"camofox-browser","version":"1.1.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.1.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"964ac95c8850fdcf436caf5de824cb2b91225c3d","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.1.0.tgz","fileCount":66,"integrity":"sha512-U9gW5Vvtw0/YQ2wh3zalyWxAu8kSqfOzwCanpwVbTLJ1K8d0rSbrI1vSOnofailVVnTMkkmPPmRzIU0zuK47xg==","signatures":[{"sig":"MEYCIQDlQSt2vWsaoRx3+UxMD9ArW765jRpLXL1oe+ngfJ0DpgIhAK/JEgKnC1ox+rOo20freQ2/PWRkcPoKyT6pfjAP9KYw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":299935},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"3c4a031d46eef9d9f4e3a3e5b40fd4f34b42e4ff","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.1.0_1771204508470_0.12810489440996276","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"camofox-browser","version":"1.1.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.1.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"cf6ce3b16953017ebaa1cd8094846ddfd7698a2d","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.1.1.tgz","fileCount":67,"integrity":"sha512-oIZ5e+UmcFuucvu4BKlsuayP9M4eYEO4Ykz3ehvHmjfPE5JMYDnqHYqt6yBB2u2IUyBlrL2v9mbRfi++0ttBTQ==","signatures":[{"sig":"MEQCICElDDSwHIj11iZufDfvaNeYnh7xyiIgAs0H1YPeAjWkAiBfvp0eBtVoAriiR/bTs/mEl1FYrf7TOsELaNaJZw29iA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301875},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"e29b822e00ba79413b7c3c5a7afe037f84d79dc6","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.1.1_1771217054632_0.7675306514784539","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"camofox-browser","version":"1.1.2","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.1.2","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"9af7e0923d13b914b878632b11163d91214c6036","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.1.2.tgz","fileCount":67,"integrity":"sha512-D9wXX3FO8aaQlqHseNsNy153F3hcFf0CHy2mIenu12pbq0Ep0FZF/msMVXx8rk2xi8z8vMVGzX2hSg6kiexxEQ==","signatures":[{"sig":"MEUCIQD9pA5EbTwS56GxHkQdpmOBXUqLDa5RmKXBIwlgkoRthgIgdLnqMj9TrITNgGuYcYAeRHnyz020i3VDcUm6kYRSHKc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":302058},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"f36086b6c62339126b874e36b01c422e95c30d00","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.1.2_1771220018191_0.28327618895623874","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"camofox-browser","version":"1.2.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.2.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"2c6209d970a6574d6b22714f542db4e685477622","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.2.0.tgz","fileCount":67,"integrity":"sha512-4Ht35sQ5Efp14hfooTuqOeuvcN7XA3ojhmnuvOLuP3RJtaWKxQbmOHuPV4UNrBiCd1XMjJfi34PCX/9s58ynow==","signatures":[{"sig":"MEYCIQCPO10vfTgRz80mg9hLrl2ox8qiEc6VcFxp7jyDj7hAgwIhAJt/E66ObwReyy4WT3/bxjyHvkCkf1wQVjrmOny/5l3D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":302002},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"4c30d14e888b79e14460329827927a09f92cac46","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.2.0_1771379746217_0.7688583068036596","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"camofox-browser","version":"1.3.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.3.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"141010cd3ce5f6a0f376d28323f4a4497955360f","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.3.0.tgz","fileCount":71,"integrity":"sha512-8YLgZFUfs7fiw3nbKjXBWaJzYmkj/mIvJPCI318mJufUCeF/qEQyXMI6YAoMIm23nCvKjMnqAatBIdRkIKo05g==","signatures":[{"sig":"MEUCIQC2CjZr1i33DyytTzRKHgZAWn2IhKiPqVmAmSx1jK8tjgIgKcwmFIuCkxjqkf8tB67IimbNul2LjfS9wFdtbrW3iu0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322567},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"f2d1155d2c25b1a3f0141b6524f230f353e7dad3","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.3.0_1771390522905_0.19380977803052502","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"camofox-browser","version":"1.4.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.4.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"de3d77ec85a6d69b3338b4275af83625a3987882","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.4.0.tgz","fileCount":71,"integrity":"sha512-Z8isqtdjL8h5PJYZeh66ir6LFEJDdYYPuaDlNG2sxnC0Z1Azmw2o2arrhTgn/1yzgSgkiPq9aXDpo6EbLUVUMw==","signatures":[{"sig":"MEQCIFzWUZ8MPIh2KG+O1XVfKcP8Ac1smAD2utFd6TXGuQ1aAiAXB6/ze3jpWPo3c93iA44Q5R0L0ctUXt1M3hNS0BTe9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":330285},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"2f5d75f065b3e745ffd749ad0b81487c37df9343","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.4.0_1771418031808_0.19827572368159996","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"camofox-browser","version":"1.5.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.5.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"9e50585755ae09a3088ed92a9085e986d23ecf31","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.5.0.tgz","fileCount":86,"integrity":"sha512-5LU5syJgceTHQoi7rtXgkTn5ukmPKeXxYDL4AES2tP9b3v5Pez3esYmMNv9nPgxw0/X14UBhZhUawgVkNpEQjQ==","signatures":[{"sig":"MEYCIQCyLo6dimy07LYcL0nWWM/Xzh1kuRDIYxW4Wz4n8OdT4QIhAKDWuzaCc3wvUUa57eDJ+Ma+CEqVjq2RU6CT5xet6c2t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":456848},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"c9a76dcb69bdbacfa76ee90576b9aab4ed782e24","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.5.0_1771561705234_0.35834899831835965","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"camofox-browser","version":"1.5.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.5.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"c2e4b8b2ab3833c19071762c4d062d14dda390eb","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.5.1.tgz","fileCount":86,"integrity":"sha512-6MIKa2Q1dVfL1ZmZctH0MBWFVu9QagE7t3ezR/n69T0ylspkYvc7Hb3mnsUfXj7erkkV6h5ALZI1V6E2iI4gvQ==","signatures":[{"sig":"MEUCIQC4gd5bpwaUh4k5JZivPcUR3rcA4I8VgxSHqATVWBVMpwIgdGwxiFqAB51YOxcCV13558CA2FkWiFypeoQp+8Fq9v0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":457783},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"c98227df94f84962106bfe0e8c2db0a97ab7b798","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.5.1_1771577590961_0.18945904668188907","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"camofox-browser","version":"1.5.2","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.5.2","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"67aa429b3f5bab60ff791d734143a1763a1ac6ee","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.5.2.tgz","fileCount":86,"integrity":"sha512-i10tOlcOmHwtADgH55As4Pmvfji609HCt+NXdY4Phi2x6Bte3DLzzzJeYf0ViYSNiKl13JhsEYXzIsgcb95DHw==","signatures":[{"sig":"MEQCIHXOKNQwCErg73W+XRvlRuRzMZndb8vnBOu5to98g6g4AiAZvCBRMyI8oi00iyCb6jjBPaW9twG3XB2Js0/Eid/Rbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":476524},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"1456ecce061dec16cde38816a3c8dc3d12f02507","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.5.2_1771584360413_0.2850390786882855","host":"s3://npm-registry-packages-npm-production"}},"1.5.3":{"name":"camofox-browser","version":"1.5.3","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.5.3","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"9449ea10c27fc1c77608c717e08c79a296271041","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.5.3.tgz","fileCount":88,"integrity":"sha512-YYs46no6z0ZwqYZLOPYhdeSKhHigY+zNl6KgDBbYSQhl9kWE/aJEByLidiwh8649cXguFY94hItoV3XrYVyA2g==","signatures":[{"sig":"MEYCIQC0k1Dt1UDmtXHfPDASsHNmGJicKsTzZpavMiKYjO3/mAIhAIwHonz3fm+B4jLL5UncLa/rHAUC02PkRIAbAWxRoLcM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":498205},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"213c08b88048e436efbcce1dc95c2f7c3bb6d00d","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.5.3_1772001940565_0.5034319222605532","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"camofox-browser","version":"1.6.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.6.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"049196b3fdafa1afa33606c3bfd2296a98f4b64f","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.6.0.tgz","fileCount":100,"integrity":"sha512-F7QEt85uobpY4pcslmmBAw13nrBPBxjzeYgWakX3xoxKitcmUTH3/u/X/ikr9pHlvEj1DI9frbUMq7DaA+IxLg==","signatures":[{"sig":"MEQCIC857YpPF6M5kqO/cJNIDKYCuNpbfQ+4qyi/DvpQS7JDAiBMLN5SVSunI2bAm3SdoSRnG8F4YrmwCmrroFw0tRjfcg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":576840},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"2625e7dbe9481ed01d3f9d850d5bd8d700502105","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.6.0_1772193033827_0.3878857205384474","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"camofox-browser","version":"1.6.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.6.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"605fe22891f864a719e10a5baeaaf14c29bc423b","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.6.1.tgz","fileCount":100,"integrity":"sha512-N69d//OhcNvqVIcKXXpCRDNET8VXHViJV2qBvvDcKTXpHG+msVidEE9q1PAyQxfU8p771tCwz5VpuNAF9ABG2A==","signatures":[{"sig":"MEQCIDTeIcFeGTQUx1U54pfItHhJQ/9Aq2I6/qpri9Zte4qDAiA6lw2vOtMbD8zVhptvrx4frTkUN2M91JXTgmLT1GxAhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":580841},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"2c7b324748bf73d6f7d293a97ed5eeca37a286c8","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.6.1_1772198719559_0.4487563976303488","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"name":"camofox-browser","version":"1.6.2","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.6.2","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"b08d1d5797bbcbcecdaa527fcf578bb5370c0c48","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.6.2.tgz","fileCount":100,"integrity":"sha512-sFjmzolJ2O2rfocUVVwcWioWkwpj4GxJXd52wasMvYawL2CwSp4ksseHPTMfO2XH5ebgC0cs+/6lFE8iMHyoMQ==","signatures":[{"sig":"MEQCIFt112/ezNr6a6RsQvwRZmGKyZ9qvvdioZTo5cLBJ36lAiAPaeRcaY+S9SOyGkimavRKcWe4RhNiNHpGK+ox9T8yPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":581060},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=22"},"gitHead":"c6229873a2575d4096ab95255f34288ab51e62bc","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.6.2_1772202648032_0.6822047822622512","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"camofox-browser","version":"1.7.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.7.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"17d5fe9bb4a2dff8ec96c0d68f3a57cb1dd9497b","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.7.0.tgz","fileCount":100,"integrity":"sha512-vhbtwQkbmTcUYr/+eL2Gh5t97gSqzCCanO43laWjpS9C4ibR3KM4KUKw2pK9cb2u/nvObj/x/eko0nJMfw57Iw==","signatures":[{"sig":"MEUCIQC1WHdKGtqaodnTj+cXtE9Y8WfMj5zUF15ZImzm/TNQvgIgRty6NLvcjzf3W4bW9x66zVOu9ThX3O57DIMHPlbMYAs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":587225},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=22"},"gitHead":"480acd1ac56bcb8506414184cf4345a5ce050295","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.7.0_1772204709277_0.6040580915653126","host":"s3://npm-registry-packages-npm-production"}},"1.7.1":{"name":"camofox-browser","version":"1.7.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.7.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"84f5b9c8b427d7f4e7b7d9a0cef01242d7f83548","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.7.1.tgz","fileCount":100,"integrity":"sha512-EqNZY/8EpqrSoTO23jvrPG99IiOD+q688greQaHAIF6uGyRO4JI4MzyamJFzO96KTZPsYT/bxlX45WNYFBoS/g==","signatures":[{"sig":"MEQCIFnhLq9fuNRo2YyKyj3Hw+Wh5B7U+qSz/QKDdWmbCJYNAiBOc/CXSvNLBOgq5VUCbLsf+y85Kw1X6aPhqWQMJMIYRw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":592498},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=22"},"gitHead":"2459a82815e6634c38b2f3fc0a2234ff55621373","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.7.1_1772236843241_0.5549683345775367","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"camofox-browser","version":"1.8.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.8.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"51f8cb9a97aa814c54e712bffda3c5837950b360","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.8.0.tgz","fileCount":104,"integrity":"sha512-q1TFM4Myegn5Z+juSl9ug7i/wSRQwB+YKr9l8Fo5snWOuVdF4ATLB+cgcstXJ7jU7mAYLsLjOWMk7JQH497C9Q==","signatures":[{"sig":"MEUCIGX5h3qtpz4PXcLbIkU9w5iVmeIh9t1Rhqr5LW/WLqT2AiEA411ZoBufzp8ZP5/mTSI0LyLdTKgCwuOsVKn2lDjQMdU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":609064},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=22"},"gitHead":"43dcb99d205b7e72006e3bc952664ba724a4fe54","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.8.0_1772239882258_0.02389197057347392","host":"s3://npm-registry-packages-npm-production"}},"1.8.1":{"name":"camofox-browser","version":"1.8.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.8.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"42bdcb09582bda12af207475f10e82964002ac85","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.8.1.tgz","fileCount":102,"integrity":"sha512-YGnX76rBW+nLkFUgxdONmY+UwsFeCV4HG5WIpL9wuDyITNnG96JfsQiM5iXzrQYBFEN7N4CmrbE4aQEvygxOmQ==","signatures":[{"sig":"MEQCIEUPMWeFtHZbUsuSFUs8R93hhqI0t+c9iJo6VR6SCSlVAiBYmUkoWJfptZghL3ZFRbWEae9dmHwhf+c6G9OmAPLCPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":556839},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"5292c4331d0547ea47997e96e0b0c4d39cd2cddc","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.8.1_1772241820988_0.1997225092463255","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"camofox-browser","version":"1.9.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.9.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"7092b2e8bfc281084bca294187977d23b08458a5","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.9.0.tgz","fileCount":106,"integrity":"sha512-BmpvqYjgAK20bzaYQO9bZcnqHVvsyTl5cDr5WNX3Ftb55VN0khtR7BYBZN68sa7ddIMa+wlA/uZ0/3qh1gNcuQ==","signatures":[{"sig":"MEYCIQCEFCO50VauXaXygbNS6rYh2r7sZg57q3F0sQ0BdQU2FQIhALLdoXZq1yU6KU1O64zQj1348CA04QkAWcsdFGbnIDZy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":575073},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"7b818b8f24114453cdfcfce77855d76bf607213d","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.9.0_1772359409382_0.508991674041857","host":"s3://npm-registry-packages-npm-production"}},"1.9.1":{"name":"camofox-browser","version":"1.9.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@1.9.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"bf106b58809142a226679d2149cb3ef7935badde","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-1.9.1.tgz","fileCount":106,"integrity":"sha512-fsAl8yAbiNAJDlJG7WS5cHmP0+Ii/xFink5wLnaIx5lAjX+Z2UXbmZuRVc5hpiZtJt7MRHoMl0c2jO16XzgBkQ==","signatures":[{"sig":"MEUCIE33RZ5NDpH1znSlkAd0k6507nW9dT8OPjcMyStDo6VaAiEAwzclKyI4cYC+Zy3aro5mEfIaNoWV6MqcRt0sxl0pJn0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":578726},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"8fa81f4871ed454c6d74fdfadba37fc4938e2f1f","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.8.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.6.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_1.9.1_1772460489038_0.4535018935768276","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"camofox-browser","version":"2.0.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.0.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"df17b3dabf2ebfa15d2e0e39547b88c7bf88a66d","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.0.0.tgz","fileCount":195,"integrity":"sha512-FYAZDUCuS6SdxyYJawr8URQKGH3uGFDwwHWhvF0eAl6a6mwUGsuS4WCw7uVLb64MT30NEl6ULubIkBQfeN3teg==","signatures":[{"sig":"MEQCIFUUME2n/0xrgyi7ge9p/9uG7dP0Cnl0iXEJEYougF44AiAe/M6ToMPn3/HY2omOehUte3GYcLZ24qytPc4Q6JzgHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":846008},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"gitHead":"5161e682a107300205b578594cc63bb038817c6a","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.10.1","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.7.0","dependencies":{"express":"^4.18.2","commander":"^14.0.0","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.0.0_1772548630374_0.3469973445180403","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"camofox-browser","version":"2.0.3","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.0.3","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"5e6c66a87581e1d44416aa28dcad72b7099e7e9f","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.0.3.tgz","fileCount":211,"integrity":"sha512-Uezf6T6cXpZeuacB8YhcSQKSh8ebciDfYlkXUNCqqhyDXgoBXBoofIBW87n+fWFO4d9101xiSQGYDeLyLX7HJQ==","signatures":[{"sig":"MEUCIG2i8atpfW9fCo96j11jdO+HYskpaJWDeSkb5G6dI1npAiEA+fte7ixkgfVl6xQIHwx65SU64rnx02xzrcnsuikGaa4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":902065},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"gitHead":"216db5eeb80689554fa228961625dde308989529","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.10.1","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.7.0","dependencies":{"express":"^4.18.2","commander":"^14.0.0","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.0.3_1772709692187_0.9551732791136327","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"camofox-browser","version":"2.0.4","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.0.4","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"dfcecb4307119d6b2d25c8a5b629627bca74a7bd","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.0.4.tgz","fileCount":211,"integrity":"sha512-3xFDgrq00670oX5XL9F26ABbwdBoF5MUKRY7Z1aLFK3PmgSvk757QCvHYdiuL3YiS02XQOn16YqebR+7gbolaw==","signatures":[{"sig":"MEUCIF190TRFKZnJ9Vx4T9n1gh1rg7JKzTqMCNEVEOvBSUU4AiEAr+jQG/FvbiVdtW/b/tDzz15FlLVh59lv2SfKphgdHMs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":902065},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"gitHead":"5df4766c6381b49deac7c02819b087d07685baba","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.10.1","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.7.0","dependencies":{"express":"^4.18.2","commander":"^14.0.0","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.0.4_1772712020621_0.07554878903180562","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"camofox-browser","version":"2.0.5","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.0.5","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"ea5f2396a5727448114bf59bf5700533914bc344","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.0.5.tgz","fileCount":211,"integrity":"sha512-toQcPqJVi1V798EBD2ioG/vJJHsNDsNELVlZVCBbIvkFXF99C7fKawv2gE0+fTLDj28g7QhQTvOWU66khM+wig==","signatures":[{"sig":"MEUCICwqi6KAK+Y6osgl6NOTM4Czp7MjRS5igjvB1s3UHQc3AiEA70uNagQ5DhZAk2DH1kWCYFRRcPJn1DsXDXb3p3qjDY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":909686},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"e696846727585dc228dc422de1f01f031394898b","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.10.1","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.7.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.0.5_1772946922420_0.28026506690614394","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"camofox-browser","version":"2.1.0","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.1.0","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"fee2c102c2611d78c01a2daf6e4592bb899e370f","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.1.0.tgz","fileCount":211,"integrity":"sha512-2KWQS3HQ5ac9RQtY8619LFurqVDACTdAU4wHF8tFHB9JbahC5D+ZcqN37AGvO7FW2Uc63f+UJ5Bdl4+OivCzKA==","signatures":[{"sig":"MEUCIQCp706yXeq6qQJDbuYYlfBSykdUtx1D4Ws+7S6VsWg6eQIgdP4zO/zChG40x3tyziswWblLYDKotJ5rYbKieOTaFS0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":911272},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"ea5af9d5904a06c9d1dce75373a450e9d86e63be","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.10.1","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.7.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.1.0_1772956901926_0.28044537178025264","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"camofox-browser","version":"2.1.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.1.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"455d0c71d93e80139e7c49329f63f3c98b1c3310","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.1.1.tgz","fileCount":211,"integrity":"sha512-Bv0vmBONjHv+NJMG0C/OSPEpEik2ExZf/wlT7y/lxFuQDwUhIxCuAoTMqJk6LJp/x6rV03MsxRCL7tE72Ucj1g==","signatures":[{"sig":"MEUCIHR2lwPuiW+JgQrbLEfYAZV4wG996yXeZyaM1PC28QrqAiEA5DH1EiAIZUBtpf9a82qZLg/YfYXek527iUUVSRbQGeQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":911611},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=18"},"gitHead":"8b979523891b27803129cad8f22f5ed5fce94a63","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.10.1","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"25.7.0","dependencies":{"express":"^4.18.2","camoufox-js":"^0.8.5","playwright-core":"^1.58.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.1.1_1772957937850_0.6764058067179259","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"camofox-browser","version":"2.4.1","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.4.1","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"2ffc0e3f437a8885d4744ff9b92e58f270cd8f8d","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.4.1.tgz","fileCount":241,"integrity":"sha512-0DRVpLqlSrJ2WJGxafl7fQW6a7RX5KxJ2zBnTQykTi5Daxyh4AiJmj7fY971G58gbtd9ZGkaeXUYT1+QNsehDw==","signatures":[{"sig":"MEQCIApnCYcUBeNMJsGo9BB84OTGwjH30qRdNAtxnwKS6D6HAiBUvpk3E+W3bn44j7EoRk/zmJ8sqSQK1NcmpxX4L/PRHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1291911},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"gitHead":"3dd42d818bac37fa07cd0af2b17732e55eb977aa","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true","verify:package":"bash scripts/verify-package.sh"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"deprecated":"Fresh installs can resolve an incompatible playwright-core and crash on first tab launch. Upgrade to camofox-browser@2.4.6.","repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"10.8.2","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"20.19.6","dependencies":{"express":"^4.18.2","css-tree":"^3.2.1","commander":"^14.0.0","camoufox-js":"^0.8.5","openapi-types":"^12.1.3","playwright-core":"^1.58.0","swagger-ui-express":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6","@types/swagger-ui-express":"^4.1.8"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.4.1_1777965322497_0.8507940118684441","host":"s3://npm-registry-packages-npm-production"}},"2.4.3":{"name":"camofox-browser","version":"2.4.3","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.4.3","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"28708466a4dc888da6f78da3cdc5f8c719659c49","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.4.3.tgz","fileCount":241,"integrity":"sha512-43tSkZp+sfgEn3MB39e3L84HRkfiQA3CYi6tRqIbaryv4xMIsbx6ypz4gN/Ce5LYBS39Yes6i6U6CtSKoO5fpA==","signatures":[{"sig":"MEYCIQCmKaqG4YjFgy4jhTcR9dTdE2q+i97DymnyWxoLr2IoYAIhAOAB80YTvIYxVbKftS/2oDF5+50FisT9BMgF3rM2X7HV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1342629},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"gitHead":"7a9c96f397285e97928238cfb21e6e0abc934659","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true","verify:package":"bash scripts/verify-package.sh"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"deprecated":"Fresh installs can resolve an incompatible playwright-core and crash on first tab launch. Upgrade to camofox-browser@2.4.6.","repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"10.8.2","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"20.19.6","dependencies":{"express":"^4.18.2","css-tree":"^3.2.1","commander":"^14.0.0","camoufox-js":"^0.8.5","openapi-types":"^12.1.3","playwright-core":"^1.58.0","swagger-ui-express":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^16.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6","@types/swagger-ui-express":"^4.1.8"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.4.3_1778716968033_0.60126778601251","host":"s3://npm-registry-packages-npm-production"}},"2.4.4":{"name":"camofox-browser","version":"2.4.4","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.4.4","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"f4f3843b8f78bd5ac674643fe24d66eb685bb217","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.4.4.tgz","fileCount":241,"integrity":"sha512-g0pmDG1Pf5cm0jDJ7ui26M0GO19xn+iAN5PCWwAf2ycTNWQYeVg6/Ek7SQgyrwAtiY7YaI79QSPry8uxTDpTIQ==","signatures":[{"sig":"MEUCIHQLphmKnDbDdWcBd52d4Dfm99zeRD5+XQY4jcYCM7BFAiEA7hoevrdgs3liFAg+tGhEJg+uJKRTuoHSVMA4Q97LVTQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1344637},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"gitHead":"96f6be8c5c0de3f6766a3c5ee4a81faa3dffb797","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true","verify:package":"bash scripts/verify-package.sh"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"deprecated":"Fresh installs can resolve an incompatible playwright-core and crash on first tab launch. Upgrade to camofox-browser@2.4.6.","repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"10.8.2","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"20.19.6","dependencies":{"express":"^4.18.2","css-tree":"^3.2.1","commander":"^14.0.0","camoufox-js":"^0.8.5","openapi-types":"^12.1.3","playwright-core":"^1.58.0","swagger-ui-express":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^17.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6","@types/swagger-ui-express":"^4.1.8"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.4.4_1779503177152_0.18168676470382739","host":"s3://npm-registry-packages-npm-production"}},"2.4.5":{"name":"camofox-browser","version":"2.4.5","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.4.5","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"fc3ba6b90f96694f481c125c870ebb2d57d4b17b","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.4.5.tgz","fileCount":241,"integrity":"sha512-pafToZKxf+EAc4sWMjhvQLe2tjX3tC7DM0d1PwFU2f5hBrt4VjbhnYvAO8aKPc6BHuBexc/jdZ7fRgFv/aPTXA==","signatures":[{"sig":"MEYCIQDkuXHVRjgyqBap8cERFmSrv70bGqGmZqRZ8kU8e1hM4gIhAIto501Y+T02jGReLTgkjyrMb2vc0cNazlzhJt/xlzT/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1349907},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"gitHead":"32023fd42367c58ca3eede77201f0f59761d7d65","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true","verify:package":"bash scripts/verify-package.sh"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"deprecated":"Fresh installs can resolve an incompatible playwright-core and crash on first tab launch. Upgrade to camofox-browser@2.4.6.","repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"10.8.2","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"20.19.6","dependencies":{"express":"^4.18.2","css-tree":"^3.2.1","commander":"^14.0.0","camoufox-js":"^0.8.5","openapi-types":"^12.1.3","playwright-core":"^1.58.0","swagger-ui-express":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^17.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6","@types/swagger-ui-express":"^4.1.8"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.4.5_1779685480444_0.3619074825907269","host":"s3://npm-registry-packages-npm-production"}},"2.4.6":{"name":"camofox-browser","version":"2.4.6","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.4.6","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"e9fff08ddb09520e55785d6c36f6e3e1d5018581","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.4.6.tgz","fileCount":241,"integrity":"sha512-CTTgZSAMHzth87J9jGf4BFhMjHcxrnMjOyEVOeRq1RsOkFpNUfkjongDIiguz7rz61sjmH7ibyyi93pohE60XA==","signatures":[{"sig":"MEYCIQCj5suVQAWfolgo1fZmuIHZQOnNhbTm7dCy0tXonEHlRAIhAPuxNUiw8jv9AY+5RknX/lX0Kn6t8D9Po+htSBn5Pwv0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1350249},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"gitHead":"5713539d1308e6415cc2a3acdace28ff32a2373f","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true","verify:package":"bash scripts/verify-package.sh"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"10.8.2","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"20.19.6","dependencies":{"express":"^4.18.2","css-tree":"^3.2.1","commander":"^14.0.0","camoufox-js":"^0.8.5","openapi-types":"^12.1.3","playwright-core":"1.58.1","swagger-ui-express":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","jest-junit":"^17.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6","@types/swagger-ui-express":"^4.1.8"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.4.6_1781657268283_0.6051553522959388","host":"s3://npm-registry-packages-npm-production"}},"2.4.7":{"name":"camofox-browser","version":"2.4.7","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"author":{"name":"redf0x1"},"license":"MIT","_id":"camofox-browser@2.4.7","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"homepage":"https://github.com/redf0x1/camofox-browser#readme","bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"dist":{"shasum":"2ed53751cf4f3905f4761e5c1f35e4b6ef551447","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.4.7.tgz","fileCount":250,"integrity":"sha512-tb4DOGf/DvwmZ+6DBZIianZLPD2XQktUcmk1qmQ+GbwGBTBzK8VaSeGW4yXB21BZ6T7gYf8vcM43GTRSncDxWw==","signatures":[{"sig":"MEUCIHSt3R3R8MWye584TVuJPSpRZAoYF6FmRO5Q2e/OGX6IAiEA76eQHA0NZCM41l7PmUD86nHsxvo5O8Q1Omz1d+Tk2c8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1457896},"main":"dist/src/server.js","type":"commonjs","types":"./dist/src/server.d.ts","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true","verify:package":"node scripts/verify-package.mjs","build:portable:windows":"node scripts/build-portable-windows.mjs"},"_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"openclaw":{"extensions":["plugin.ts"]},"overrides":{"adm-zip":"0.6.0"},"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.16.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"_nodeVersion":"24.18.0","dependencies":{"express":"^4.18.2","css-tree":"^3.2.1","commander":"^14.0.0","camoufox-js":"^0.8.5","openapi-types":"^12.1.3","playwright-core":"1.58.1","swagger-ui-express":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","supertest":"^7.2.2","jest-junit":"^17.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6","@types/supertest":"^7.2.1","@types/swagger-ui-express":"^4.1.8"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"tmp":"tmp/camofox-browser_2.4.7_1786611868069_0.865916634368971","host":"s3://npm-registry-packages-npm-production"}},"2.4.8":{"_id":"camofox-browser@2.4.8","bin":{"camofox":"bin/camofox.js","camofox-browser":"bin/camofox-browser.js"},"bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"dist":{"shasum":"9afe1773429c94be217ed55cd10126cbb1078670","tarball":"https://registry.npmjs.org/camofox-browser/-/camofox-browser-2.4.8.tgz","fileCount":250,"integrity":"sha512-tWVs0Nj4o4anU2Mi5ZBgQznRunnuqnhkHlfAEKck37VYX926iu0aTKxBdMheMEMPTbV9TZIaR9EW+n5it0zeSw==","signatures":[{"sig":"MEUCIQCOn9PLCCxR/r5eKzXqgMJ8URneAa6NqDtcw6utoVo/iwIgLIEvKYxzaHy324MCFLwNWAp6HzGBLmRo/t+bMgb7ZKE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICq0T8WdNSgnKRbo8CpzrWpyKT5s7peTCbxqZanAkg5MAiEAupAZgDW2kVH/q4PC3xeDjh1GasuWF4PcCJBmkpJtUVM="}],"unpackedSize":1460006},"main":"dist/src/server.js","name":"camofox-browser","type":"commonjs","_from":"file:/Users/admin/DEV/camofox-browser/camofox-browser-2.4.8.tgz","types":"./dist/src/server.d.ts","author":{"name":"redf0x1"},"engines":{"node":">=20"},"license":"MIT","scripts":{"dev":"tsx watch src/server.ts","lint":"tsc --noEmit","test":"jest --runInBand --detectOpenHandles","build":"tsc","start":"node dist/src/server.js","pretest":"npm run build","test:e2e":"jest --runInBand --detectOpenHandles tests/e2e","start:dev":"tsx src/server.ts","test:live":"RUN_LIVE_TESTS=1 jest --runInBand --detectOpenHandles tests/live","test:debug":"DEBUG_SERVER=1 jest --runInBand --detectOpenHandles","postinstall":"npx camoufox-js fetch || true","verify:package":"node scripts/verify-package.mjs","build:portable:windows":"node scripts/build-portable-windows.mjs"},"version":"2.4.8","_npmUser":{"name":"redf0x1","email":"tl667564@gmail.com"},"homepage":"https://github.com/redf0x1/camofox-browser#readme","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"openclaw":{"extensions":["plugin.ts"]},"_resolved":"/Users/admin/DEV/camofox-browser/camofox-browser-2.4.8.tgz","overrides":{"adm-zip":"0.6.1"},"_integrity":"sha512-tWVs0Nj4o4anU2Mi5ZBgQznRunnuqnhkHlfAEKck37VYX926iu0aTKxBdMheMEMPTbV9TZIaR9EW+n5it0zeSw==","repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"_npmVersion":"11.19.0","description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","directories":{},"maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"_nodeVersion":"26.7.0","dependencies":{"express":"^4.22.3","css-tree":"^3.2.1","commander":"^14.0.0","camoufox-js":"^0.8.5","openapi-types":"^12.1.3","playwright-core":"1.58.1","swagger-ui-express":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^29.7.0","supertest":"^7.2.2","jest-junit":"^17.0.0","typescript":"^5.9.3","@types/node":"^25.2.3","@types/express":"^5.0.6","@types/supertest":"^7.2.1","@types/swagger-ui-express":"^4.1.8"},"optionalDependencies":{"argon2":"^0.41.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/camofox-browser_2.4.8_1790061586248_0.06025108055414141"}}},"time":{"created":"2026-02-15T06:47:20.834Z","modified":"2026-09-22T07:19:46.520Z","1.0.0":"2026-02-15T06:47:20.990Z","1.0.1":"2026-02-15T08:37:36.113Z","1.0.2":"2026-02-15T10:31:35.035Z","1.0.3":"2026-02-15T10:50:45.068Z","1.1.0":"2026-02-16T01:15:08.627Z","1.1.1":"2026-02-16T04:44:14.765Z","1.1.2":"2026-02-16T05:33:38.362Z","1.2.0":"2026-02-18T01:55:46.388Z","1.3.0":"2026-02-18T04:55:23.106Z","1.4.0":"2026-02-18T12:33:51.963Z","1.5.0":"2026-02-20T04:28:25.436Z","1.5.1":"2026-02-20T08:53:11.116Z","1.5.2":"2026-02-20T10:46:00.573Z","1.5.3":"2026-02-25T06:45:40.728Z","1.6.0":"2026-02-27T11:50:33.972Z","1.6.1":"2026-02-27T13:25:19.714Z","1.6.2":"2026-02-27T14:30:48.185Z","1.7.0":"2026-02-27T15:05:09.551Z","1.7.1":"2026-02-28T00:00:43.410Z","1.8.0":"2026-02-28T00:51:22.418Z","1.8.1":"2026-02-28T01:23:41.147Z","1.9.0":"2026-03-01T10:03:29.536Z","1.9.1":"2026-03-02T14:08:09.191Z","2.0.0":"2026-03-03T14:37:10.606Z","2.0.3":"2026-03-05T11:21:32.400Z","2.0.4":"2026-03-05T12:00:20.782Z","2.0.5":"2026-03-08T05:15:22.633Z","2.1.0":"2026-03-08T08:01:42.123Z","2.1.1":"2026-03-08T08:18:58.030Z","2.4.1":"2026-05-05T07:15:22.667Z","2.4.3":"2026-05-14T00:02:48.255Z","2.4.4":"2026-05-23T02:26:17.317Z","2.4.5":"2026-05-25T05:04:40.721Z","2.4.6":"2026-06-17T00:47:48.501Z","2.4.7":"2026-08-13T09:04:28.226Z","2.4.8":"2026-09-22T07:19:46.378Z"},"bugs":{"url":"https://github.com/redf0x1/camofox-browser/issues"},"author":{"name":"redf0x1"},"license":"MIT","homepage":"https://github.com/redf0x1/camofox-browser#readme","keywords":["camofox","camoufox","anti-detection","browser-automation","ai-agent","stealth-browser","web-scraping","rest-api","typescript","express","playwright","fingerprint-spoofing","mcp","openclaw","headless-browser"],"repository":{"url":"git+https://github.com/redf0x1/camofox-browser.git","type":"git"},"description":"Anti-detection browser server for AI agents — REST API wrapping Camoufox engine with OpenClaw plugin support","maintainers":[{"name":"redf0x1","email":"tl667564@gmail.com"}],"readme":"# CamoFox Browser Server\n\n> Anti-detection browser server for AI agents — TypeScript REST API wrapping the [Camoufox](https://github.com/daijro/camoufox) stealth browser engine\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue)](tsconfig.json)\n[![Node](https://img.shields.io/badge/Node-20%2B-green)](package.json)\n[![npm](https://img.shields.io/npm/v/camofox-browser)](https://www.npmjs.com/package/camofox-browser)\n\n## Table of Contents\n\n- [Why CamoFox?](#why-camofox)\n- [Features](#features)\n- [Preview Status](#preview-status)\n- [Quick Start](#quick-start)\n- [Windows x64 Portable](#windows-x64-portable)\n- [CLI](#cli)\n- [Console Capture](#console-capture)\n- [Playwright Tracing](#playwright-tracing)\n- [Security](#security)\n- [Usage with AI Agents](#usage-with-ai-agents)\n- [Architecture](#architecture)\n- [API Reference](#api-reference)\n- [Structured Extract](#structured-extract)\n- [Search Macros](#search-macros)\n- [Geo Presets](#geo-presets)\n- [Environment Variables](#environment-variables)\n- [Deployment](#deployment)\n- [Used With](#used-with)\n- [Project Structure](#project-structure)\n- [Contributing](#contributing)\n- [Credits](#credits)\n- [License](#license)\n\n## Why CamoFox?\n\n**The Problem**: Standard browser automation (Puppeteer, Playwright, Selenium) is easily detected by modern anti-bot systems. JavaScript-level patches are fragile and get bypassed quickly.\n\n**The Solution**: CamoFox Browser Server wraps [Camoufox](https://github.com/daijro/camoufox), a Firefox fork with **C++ engine-level fingerprint spoofing**. No JavaScript injection — anti-detection happens at the browser engine level.\n\n| Feature | Puppeteer/Playwright | CamoFox Browser Server |\n|---------|---------------------|------------------------|\n| Anti-detection | JavaScript patches (fragile) | C++ engine-level (robust) |\n| Fingerprint spoofing | Limited | Full (engine-level) |\n| Token efficiency | Raw HTML / screenshots | Accessibility snapshots (smaller + structured) |\n| Integration | Direct SDK | REST API for any language / AI agent |\n| AI agent support | Varies | MCP + OpenClaw compatible |\n\n## Features\n\n- **C++ Anti-Detection** — fingerprint spoofing at the Camoufox engine level (not JS injection)\n- **REST API** — language-agnostic HTTP endpoints for browser automation and AI agent integration\n- **Multi-Session** — concurrent isolated browser contexts per `userId` (defaults: max 50 sessions, max 10 tabs/session)\n- **Persistent Browser Profiles** — Each user gets a dedicated Firefox profile. Cookies, localStorage, IndexedDB, and all browser storage persist across sessions automatically.\n- **Geo Presets** — 8 built-in region presets (locale/timezone/geolocation) + custom presets file\n- **Session-Level Proxy/Geo Overrides** — per-session proxy configuration via named profiles or raw credentials, with hybrid geo modes (`explicit-wins` or `proxy-locked`)\n- **14 Search Macros** — Google, YouTube, Amazon, Reddit (search + subreddit JSON), Wikipedia, Twitter, Yelp, Spotify, Netflix, LinkedIn, Instagram, TikTok, Twitch\n- **Element Refs** — accessibility snapshots annotated with stable `eN` element references for precise interaction\n- **Cookie Persistence** — import Netscape/Playwright-style cookies into a session (bearer auth required only when `CAMOFOX_API_KEY` is set)\n- **OpenClaw Plugin** — OpenClaw-compatible endpoints (`/start`, `/tabs/open`, `/act`, etc.)\n- **TypeScript** — strict mode, typed request shapes, modular Express routes\n- **YouTube Transcript Extraction** — yt-dlp + browser fallback (service-level; no public API route currently exposed)\n- **Snapshot Pagination** — offset-based windowing for large page snapshots\n- **Image Listing Route** — image-only extraction over the shared resource extractor with selector, extension, lazy-load, and blob-resolution controls\n- **Structured Extract** — deterministic schema-driven JSON extraction across core API, CLI, and OpenClaw without arbitrary JavaScript\n- **Browser Health Monitoring** — health probe with recovery/degraded state tracking\n- 🖥️ **CLI Mode** — 50+ commands for terminal-based browser automation\n- 🔐 **Auth Vault** — AES-256-GCM encrypted credential storage (LLM-safe)\n- 📜 **Pipeline Scripting** — Execute command scripts from files\n- 🔍 **Console Capture** — capture and filter browser console messages and uncaught errors\n- 📼 **Playwright Tracing** — record and export Playwright traces for debugging\n- 🗂️ **Trace Artifact Management** — list, download, and delete managed trace ZIPs per user session\n\n## Preview Status\n\nCamoFox Browser Server is in **Preview** (Phase 1). Preview releases are functional for browser automation and agent integration, but carry specific compatibility commitments and explicit non-goals.\n\n### What Preview Means\n- The REST API and CLI are usable for agent workflows today; [CamoFox MCP](https://github.com/redf0x1/camofox-mcp) is available as an external companion integration\n- New features may be added between minor versions\n- Backward-compatible aliases are maintained for renamed or moved endpoints (see [Compatibility Policy](#compatibility-policy))\n- Local state (profiles, registries, sessions) uses versioned formats with fail-closed integrity checks\n\n### What Preview Does NOT Guarantee\n- **Frozen API surface** — endpoint behavior, request shapes, or response formats may change between minor versions\n- **Automatic local-state migration** — browser profiles, download registries, and session files use versioned sidecar formats; incompatible upgrades require manual reset (see [Local State Recovery](#local-state-recovery))\n- **Downgrade safety** — rolling back to an older version may require clearing local state\n- **Fixed GA timeline** — promotion to GA requires meeting evidence-based exit criteria, not a calendar date\n\n### Compatibility Policy\nDuring Preview, CamoFox follows an **additive-only deprecation model**:\n- **Legacy aliases** (e.g., `listItemId` accepted alongside `sessionKey`, OpenClaw `/act` routing to core endpoints) continue to work alongside their replacements\n- **Deprecated fields** are accepted silently; no removal until GA or a documented migration window with advance notice in CHANGELOG\n- **No existing endpoint** is removed in a minor version — removals happen only in major versions with prior CHANGELOG notice\n\n### Local State Recovery\nBrowser profiles, download registries, and CLI session files use versioned sidecar formats. When upgrading CamoFox:\n- **Compatible versions**: State loads normally\n- **Incompatible or corrupt state**: The server refuses to load incompatible profiles and download registries; the CLI rejects incompatible saved-session files. Both log an actionable error with the specific recovery path.\n- **Recovery**: Delete the affected profile directory, session file, or download registry as indicated in the error message. Clean state is recreated on next use.\n\nSupported sidecars include limited forward-migration paths (e.g., fingerprint v0 → v1); when no migration path exists for a given version, the server refuses to load the file and logs an actionable recovery message. There is no silent repair or downgrade path — this fail-closed default prevents data corruption at the cost of manual intervention on unsupported version jumps.\n\n## Quick Start\n\n### From Source\n\n```bash\ngit clone https://github.com/redf0x1/camofox-browser.git\ncd camofox-browser\nnpm install\nnpm run build\nnpm start\n```\n\n### Using npm (CLI)\n\n```bash\nnpm install -g camofox-browser\n\n# Start the server\ncamofox-browser\n\n# Or use the CLI for browser automation\ncamofox open https://example.com\ncamofox snapshot\ncamofox click e5\n```\n\n> See [CLI](#cli) for the complete command reference.\n\n## Windows x64 Portable\n\nWindows x64 is supported as a headless-first portable distribution. Release ZIPs are named `camofox-browser-<version>-windows-x64.zip` and contain the Node.js runtime, application runtime, and the pinned Camoufox Windows x64 engine, so a global Node.js installation is not required.\n\nExtract the ZIP to a writable directory and run the bundled launchers from PowerShell or Command Prompt:\n\n```powershell\n.\\camofox.cmd --version\n.\\camofox.cmd server start --background\n.\\camofox.cmd server status\n.\\camofox.cmd server stop\n```\n\nPortable runtime state stays under `data\\home` inside the extracted directory. This includes camofox-browser's `.camofox` profiles/logs and the bundled Camoufox cache, so the portable distribution does not use the normal Windows user profile for its application state.\n\nThe portable ZIP intentionally excludes Camoufox's upstream bundled `fonts/` directory because the exact upstream source explicitly does not permit redistribution of those copyrighted Windows/macOS fonts. On Windows, CamoFox uses fonts installed on the host system instead.\n\nThe supported Windows x64 display contract is `headless=true`. `headless=false` and `headless=\"virtual\"` are rejected with a clear error before any Linux-only display process is attempted. Xvfb/VNC virtual display mode remains Linux-only, and native headed Windows mode is not part of the verified support contract.\n\nThe release workflow verifies the ZIP after extracting it into a path containing spaces, starts the CLI using bundled Node.js with global Node removed from `PATH`, checks `/health`, runs a local create → navigate → snapshot → close browser flow, and confirms server shutdown and portable-state placement.\n\n### Using Docker\n\n> Docker image: `ghcr.io/redf0x1/camofox-browser`\n\n```bash\ndocker build -t camofox-browser .\ndocker run -d \\\n  --name camofox-browser \\\n  -p 9377:9377 \\\n  -p 6080:6080 \\\n  -e CAMOFOX_HOST=0.0.0.0 \\\n  -e CAMOFOX_AUTH_MODE=auto \\\n  -e CAMOFOX_API_KEY=change-me \\\n  -v ~/.camofox:/home/node/.camofox \\\n  camofox-browser\n```\n\nTo persist browser profiles (cookies, localStorage, IndexedDB, etc.) across container restarts, keep the volume mount shown above.\n\n### Using Docker Compose\n\n```yaml\nservices:\n  camofox-browser:\n    build: .\n    ports:\n      - \"9377:9377\"\n    environment:\n      CAMOFOX_HOST: \"0.0.0.0\"\n      CAMOFOX_PORT: \"9377\"\n      # auto requires CAMOFOX_API_KEY when CAMOFOX_HOST is non-loopback\n      CAMOFOX_AUTH_MODE: \"auto\"\n      CAMOFOX_API_KEY: \"change-me\"\n      # CAMOFOX_ADMIN_KEY: \"change-me\"\n      # Optional: proxy routing (also enables Camoufox geoip mode)\n      # PROXY_HOST: \"\"\n      # PROXY_PORT: \"\"\n      # PROXY_USERNAME: \"\"\n      # PROXY_PASSWORD: \"\"\n```\n\n### Verify\n\n```bash\ncurl http://localhost:9377/health\n# {\"ok\":true,\"engine\":\"camoufox\",\"browserConnected\":true}\n```\n\n## CLI\n\nCamoFox Browser includes a powerful CLI for browser automation directly from the terminal. The CLI auto-starts the server when needed.\n\n### Installation\n\n```bash\n# Global install (recommended)\nnpm install -g camofox-browser\n\n# Or use npx (no install needed)\nnpx camofox-browser open https://example.com\n```\n\n### Quick Start\n\n```bash\ncamofox open https://example.com       # Open a page in anti-detection browser\ncamofox snapshot                       # Get accessibility tree with element refs\ncamofox click e5                       # Click element [e5]\ncamofox type e3 \"hello world\"         # Type into element [e3]\ncamofox screenshot --output page.png   # Save screenshot\ncamofox close                          # Close the tab\n```\n\n### Core Commands\n\n```bash\n# Browser lifecycle\ncamofox open <url>                     # Open URL in new tab\ncamofox close [tabId]                  # Close tab\ncamofox navigate <url>                 # Navigate current tab to URL\n\n# Inspection\ncamofox snapshot                       # Get accessibility tree with [eN] refs\ncamofox screenshot [--output file]     # Take screenshot (saves to file)\ncamofox annotate                       # Screenshot + element ref overlay\ncamofox get-url                        # Get current page URL\ncamofox get-text                       # Get page text content\ncamofox get-links                      # Get all links on page\ncamofox get-tabs                       # List open tabs\ncamofox extract-structured @schema.json # Extract deterministic JSON from a schema\n\n# Interaction\ncamofox click <ref>                    # Click element by ref\ncamofox type <ref> <text>              # Type text into element\ncamofox fill '[e1]=\"user\" [e2]=\"pw\"'  # Fill multiple fields at once\ncamofox scroll <direction>             # Scroll up/down/left/right\ncamofox select <ref> <value>           # Select dropdown option\ncamofox hover <ref>                    # Hover over element\ncamofox press <key>                    # Press keyboard key\n\n# Navigation\ncamofox go-back                        # Browser back\ncamofox go-forward                     # Browser forward\ncamofox search \"query\" --engine google # Search (8 engines supported)\ncamofox eval \"document.title\"          # Execute JavaScript\ncamofox wait <selector> [--timeout ms] # Wait for element\n```\n\n> **Text input:** CamoFox has no character limit for typed or filled text. Short text stays humanized for anti-detection, while long text automatically switches to bulk DOM insertion so large inputs do not truncate.\n\n### Session Management\n\n```bash\ncamofox session save <name>            # Save current browser state\ncamofox session load <name>            # Restore browser state\ncamofox session list                   # List saved sessions\ncamofox session delete <name>          # Delete saved session\n```\n\n### Cookie Management\n\n```bash\ncamofox cookie export <file>           # Export cookies to JSON file\ncamofox cookie import <file>           # Import cookies from JSON file\n```\n\n### Auth Vault\n\nSecurely store credentials locally with AES-256-GCM encryption. Credentials are **never** output to stdout — safe for LLM agent automation.\n\n```bash\ncamofox auth save <profile> [--url URL]  # Save credentials (prompts for master password)\ncamofox auth load <profile>              # Show profile info (username only)\ncamofox auth list                        # List saved profiles (no secrets shown)\ncamofox auth delete <profile>            # Delete a profile\ncamofox auth change-password <profile>   # Change master password\n\n# Inject credentials into a browser tab (LLM-safe)\ncamofox snapshot                         # Get element refs first\ncamofox auth load gmail --inject --username-ref e5 --password-ref e12\n```\n\n> **Security:** Master passwords use Argon2id KDF (with PBKDF2 fallback). Vault files are stored with 0600 permissions. The `--inject` flag sends credentials directly to the browser — the LLM agent never sees the password.\n\n### Pipeline Scripting\n\nExecute multiple commands from a file for automation workflows:\n\n```bash\n# Create a script\ncat > login-flow.txt << 'EOF'\n# Login automation script\nopen https://example.com/login\nsnapshot\ntype e3 \"username\"\ntype e5 \"password\"\nclick e7\nwait .dashboard --timeout 5000\nscreenshot --output result.png\nclose\nEOF\n\n# Run it\ncamofox run login-flow.txt\n\n# Continue on errors\ncamofox run login-flow.txt --continue-on-error\n\n# Read from stdin\necho \"get-url\" | camofox run -\n```\n\n### Server Management\n\n```bash\ncamofox server start                   # Start server daemon\ncamofox server start --background      # Start in background\ncamofox server stop                    # Stop server daemon\ncamofox server status                  # Check server status\n```\n\n### Diagnostics\n\n```bash\ncamofox health                         # System health report\ncamofox version                        # CLI + server version\ncamofox info                           # Configuration info\n```\n\n### Console Capture\n\n```bash\ncamofox console [tabId]                  # View console messages\ncamofox console [tabId] --type error     # Filter by type (log/warning/error/info/debug)\ncamofox console [tabId] --clear          # View then clear messages\ncamofox errors [tabId]                   # View uncaught JavaScript errors\ncamofox errors [tabId] --clear           # View then clear errors\n```\n\n### Playwright Tracing\n\n```bash\ncamofox trace start [tabId]              # Start recording trace\ncamofox trace stop [tabId] [-o file.zip] # Stop and save trace ZIP\ncamofox trace chunk-start [tabId]        # Start new trace chunk\ncamofox trace chunk-stop [tabId] [-o f]  # Stop chunk and save ZIP\ncamofox trace status [tabId]             # Check active trace status\n```\n\nView traces at [trace.playwright.dev](https://trace.playwright.dev)\n\n### Global Options\n\n| Flag | Env Var | Description | Default |\n|------|---------|-------------|---------|\n| `--user <id>` | `CAMOFOX_USER` | User/profile ID | `cli-default` |\n| `--port <port>` | `PORT` | Server port | `9377` |\n| `--format <fmt>` | — | Output: `json`, `text`, `plain` | `text` |\n| `-V, --version` | — | Show version | — |\n| `-h, --help` | — | Show help | — |\n\n### Output Formats\n\n```bash\ncamofox get-url --format json          # {\"url\":\"https://example.com\"}\ncamofox get-url --format text          # URL: https://example.com\ncamofox get-url --format plain         # https://example.com\n```\n\n> **Tip:** Use `--format json` for programmatic parsing and LLM agent integration.\n\n## Security\n\n### Anti-Detection\nCamoFox uses [Camoufox](https://github.com/daijro/camoufox), a Firefox fork with **C++ level fingerprint spoofing**. Unlike Chromium-based tools, CamoFox passes bot detection on Google, Cloudflare, and other anti-bot services.\n\n### Auth Vault\n- **AES-256-GCM** encryption with **Argon2id** key derivation (PBKDF2 fallback)\n- Credentials **never** appear in stdout (safe for LLM agent pipelines)\n- Vault files stored with `0600` permissions\n- Master password required for all vault operations\n\n### LLM Agent Safety\n- The `--inject` flag sends credentials directly to the browser — the LLM agent orchestrating the CLI never sees raw passwords\n- Output formats are designed for safe parsing without credential exposure\n- Pipeline scripts can reference auth profiles without embedding secrets\n\n## Usage with AI Agents\n\nCamoFox works seamlessly with AI coding agents and LLM-powered automation:\n\n### AI Coding Assistants (Recommended)\n\nAdd CamoFox skills to your AI coding assistant for full browser automation context:\n\n```bash\nnpx skills add redf0x1/camofox-browser\n```\n\nThis works with **Claude Code**, **Codex**, **Cursor**, **Gemini CLI**, **GitHub Copilot**, **Goose**, **OpenCode**, **Windsurf**, and [40+ other agents](https://github.com/vercel-labs/skills#supported-agents).\n\n**Available skills:**\n\n| Skill | Focus | Best For |\n|-------|-------|----------|\n| `camofox-browser` | Full coverage (CLI + API + OpenClaw) | Complete reference |\n| `camofox-cli` | CLI-only (50+ commands) | Terminal-first workflows |\n| `dogfood` | QA testing workflow | Systematic web app testing |\n| `gemini-image` | Gemini image generation | AI image automation |\n| `reddit` | Reddit automation | Reddit posting/commenting |\n\nThe installer will prompt you to choose which skills and which agents to configure.\n\n#### Claude Code\n\n```bash\nnpx skills add redf0x1/camofox-browser\n# Installs to .claude/skills/camofox-browser/SKILL.md\n```\n\n#### Cursor / GitHub Copilot / Codex\n\n```bash\nnpx skills add redf0x1/camofox-browser\n# Installs to .agents/skills/ directory\n```\n\n> **Tip:** Skills are symlinked from the repo, so they stay up to date. Do not manually copy `SKILL.md` files.\n\n### MCP Integration (Recommended)\nUse [CamoFox MCP](https://github.com/redf0x1/camofox-mcp) for direct integration with Claude, Cursor, Windsurf, and other MCP-compatible agents. See [Used With](#used-with).\n\n### CLI Integration\nAI agents can use the CLI with `--format json` for structured output:\n\n```bash\ncamofox open https://example.com       # Open page\ncamofox snapshot --format json         # Get structured element tree\ncamofox click e5                       # Interact with elements\ncamofox auth load gmail --inject --username-ref e5 --password-ref e12  # Safe credential injection\n```\n\n### Pipeline Automation\nCreate reusable automation scripts that AI agents can execute:\n\n```bash\ncamofox run automation-flow.txt        # Execute multi-step workflow\n```\n\n## Architecture\n\n```text\nAI Agent (MCP / OpenClaw / REST Client)\n    │\n    ▼ HTTP REST API (port 9377)\n┌──────────────────────────────────────────┐\n│          CamoFox Browser Server          │\n│          (Express + TypeScript)          │\n├──────────────────────────────────────────┤\n│ Routes                 Services          │\n│  ├── Core API           ├── Browser      │\n│  └── OpenClaw compat    ├── Session      │\n│                         └── Tab ops      │\n├──────────────────────────────────────────┤\n│        Camoufox Engine (anti-detect)     │\n│   Firefox fork + engine-level spoofing   │\n└──────────────────────────────────────────┘\n```\n\n### Persistent Profiles (v1.3.0)\n\n- Each `userId` runs in its own persistent Firefox process/context (backed by `launchPersistentContext(userDataDir)`)\n- Profile data is stored under `~/.camofox/profiles/` (override via `CAMOFOX_PROFILES_DIR`). Linux/macOS keep the readable default-user directory name; new Windows profiles use a deterministic hashed directory name so case-insensitive or trailing-dot/space-equivalent user IDs cannot share a Firefox profile. Existing Windows directories from the previous layout are read in place only when their exact on-disk name is unambiguous and no hashed directory also exists; conflicting layouts fail closed with both recovery paths in the error.\n- Idle user contexts are closed via LRU eviction (profile data remains on disk)\n\n## API Reference\n\nBase URL: `http://localhost:9377`\n\n> **Security defaults:** `CAMOFOX_HOST` now defaults to `127.0.0.1`, and `CAMOFOX_AUTH_MODE=auto` keeps local loopback usage open while requiring `CAMOFOX_API_KEY` when you bind beyond loopback (for example `0.0.0.0` in Docker or PaaS). Set `CAMOFOX_AUTH_MODE=required` to require API-key auth everywhere. Set `CAMOFOX_AUTH_MODE=disabled` only for trusted private agent networks whose clients cannot send bearer tokens; this disables API-key auth for protected endpoints and keeps private-network navigation blocked. On non-loopback binds, navigation targets on loopback/private/link-local/metadata hosts are blocked by default unless you explicitly set `CAMOFOX_ALLOW_PRIVATE_NETWORK=true`. If you also configure `PROXY_HOST`/`PROXY_PORT`, exposed deployments must opt into `CAMOFOX_ALLOW_PRIVATE_NETWORK=true` until proxy-side private-target validation exists.\n\n### API Documentation\n\nThe Camofox Browser API includes OpenAPI 3.1.0 docs for a representative subset of the shipped route surface:\n\n- **Interactive API Explorer**: [http://localhost:9377/api/docs](http://localhost:9377/api/docs) — Swagger UI with live request testing\n- **OpenAPI Specification**: [http://localhost:9377/openapi.json](http://localhost:9377/openapi.json) — Machine-readable OpenAPI 3.1.0 spec\n\nThe OpenAPI spec covers a representative subset of core and OpenClaw endpoints, including request schemas, response shapes, authentication requirements, and validation rules.\n\n### Core Endpoints\n\nNote: For any endpoint that targets an existing tab (`/tabs/:tabId/...`), the server resolves `tabId` **within a `userId` scope**. If you omit `userId` from the request body, the server returns `400 { \"error\": \"userId is required\" }`. If `userId` is present but the tab belongs to a different user, the server returns `404 Tab not found` — except `DELETE /tabs/:tabId`, which is idempotent and returns `200 { \"ok\": true }` when no matching tab is found under the given `userId` scope (the tab is already gone from the caller's perspective). For endpoints that accept `userId` as a query parameter (e.g. `GET /tabs/:tabId/snapshot`), omitting it may also result in a `400` or `404` depending on the route.\n\n| Method | Endpoint | Description | Required | Auth |\n|--------|----------|-------------|----------|------|\n| POST | `/sessions/:userId/cookies` | Import cookies into a user session (Playwright cookie objects) | Path: `userId`; Body: `{ \"cookies\": Cookie[] }` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/health` | Health check (also pre-launches the browser) | None | None |\n| GET | `/presets` | List available geo presets (built-in + custom) | None | None |\n| POST | `/tabs` | Create a new tab (supports `preset` + per-field overrides) | Body: `userId` + (`sessionKey` or `listItemId`) | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs?userId=...` | List all tabs for a user (OpenClaw-compatible response shape) | Query: `userId` | None |\n| POST | `/tabs/:tabId/navigate` | Navigate to a URL, or expand a search `macro` + `query` | Body: `userId` + (`url` or `macro`) | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs/:tabId/snapshot?userId=...` | Accessibility snapshot annotated with `eN` element refs | Query: `userId` | None |\n| POST | `/tabs/:tabId/wait` | Wait for page readiness (DOM + optional network idle) | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/click` | Click by `ref` (e.g. `e12`) or CSS `selector` | Body: `userId` + (`ref` or `selector`) | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/type` | Type into an element by `ref` or CSS `selector` | Body: `userId` + (`ref` or `selector`) + `text` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/press` | Press a key (e.g. `Enter`, `Escape`) | Body: `userId` + `key` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/scroll` | Scroll up/down/left/right by pixels | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/scroll-element` | Scroll specific element into view | Body: userId, ref/selector | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/back` | Go back | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/forward` | Go forward | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/refresh` | Refresh | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs/:tabId/links?userId=...&limit=50&offset=0` | Extract links (paginated) | Query: `userId` | None |\n| GET | `/tabs/:tabId/images?userId=...` | List extracted images | Query: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs/:tabId/screenshot?userId=...&fullPage=true` | Screenshot (PNG bytes) | Query: `userId` | None |\n| GET | `/tabs/:tabId/stats?userId=...` | Tab stats + visited URLs | Query: `userId` | None |\n| DELETE | `/tabs/:tabId` | Close a tab (expects JSON body: `{ \"userId\": \"...\" }`) | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| DELETE | `/tabs/group/:listItemId` | Close a tab group (expects JSON body: `{ \"userId\": \"...\" }`) | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| DELETE | `/sessions/:userId` | Close all sessions for a user | Path: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/sessions/:userId/toggle-display` | Toggle display mode (headless/headed/virtual) | Path: `userId`; Body: `{ \"headless\": true\\|false\\|\"virtual\" }` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs/:tabId/cookies` | Export tab cookies | Query: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs/:tabId/downloads` | List tab downloads | Query: `userId` | None |\n| GET | `/users/:userId/downloads` | List user downloads | Path: `userId` | None |\n| GET | `/downloads/:downloadId` | Download metadata | Query: `userId` | None |\n| GET | `/downloads/:downloadId/content` | Stream download content | Query: `userId` | None |\n| DELETE | `/downloads/:downloadId` | Delete tracked download | Body or Query: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/extract-resources` | Extract downloadable resources | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/batch-download` | Batch download resources | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/resolve-blobs` | Resolve blob URLs to base64 | Body: `userId` + `urls[]` | None |\n| POST | `/tabs/:tabId/trace/start` | Start trace recording | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/trace/stop` | Stop and save trace ZIP | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/trace/chunk/start` | Start trace chunk | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/trace/chunk/stop` | Stop chunk and save ZIP | Body: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs/:tabId/trace/status` | Check trace status | Query: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/sessions/:userId/traces` | List managed trace ZIPs for a user | Path: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/sessions/:userId/traces/:filename` | Download a managed trace ZIP | Path: `userId`, `filename` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| DELETE | `/sessions/:userId/traces/:filename` | Delete a managed trace ZIP | Path: `userId`, `filename` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs/:tabId/console` | Get console messages | Query: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/tabs/:tabId/errors` | Get uncaught JS errors | Query: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/console/clear` | Clear console + errors | Body or Query: `userId` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/tabs/:tabId/extract-structured` | Extract deterministic JSON from a structured schema | Body: `userId` + `schema` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n\n### Toggle Display Mode\n```bash\nPOST /sessions/:userId/toggle-display\n{\"headless\": \"virtual\"}\n```\n**Auth:** Conditional — requires `Authorization: Bearer $CAMOFOX_API_KEY` when `CAMOFOX_AUTH_MODE=required` or when `auto` mode has an API key configured. No auth is required in `CAMOFOX_AUTH_MODE=disabled`.\nSwitch browser between headless and headed mode. When encountering CAPTCHAs or issues requiring visual interaction, switch to headed mode to show the browser window.\n\n**Platform note:** The Windows x64 contract is headless-only. Requests with `headless: false` or `headless: \"virtual\"` return HTTP 400 on Windows. The Xvfb/VNC behavior described below is Linux-only.\n\nReturns:\n```json\n{\"ok\": true, \"headless\": \"virtual\", \"vncUrl\": \"http://localhost:6080/vnc.html?autoconnect=true&resize=scale&token=...\", \"message\": \"Browser visible via VNC\", \"userId\": \"agent1\"}\n```\n\n**Note:** This restarts the browser context. All tabs are invalidated but cookies/auth state persist via the persistent profile.\n\n### Browser Viewer (noVNC)\nOn Linux, when the display mode is set to `\"virtual\"` or a headed request requires a virtual display, the server can start a VNC viewer accessible via web browser.\n\n```bash\n# 1. Switch to virtual mode\nPOST /sessions/:userId/toggle-display\n{\"headless\": \"virtual\"}\n# Response includes vncUrl — open in browser to see Firefox\n\n# 2. Solve CAPTCHA or interact with the browser\n\n# 3. Switch back to headless\nPOST /sessions/:userId/toggle-display\n{\"headless\": true}\n# VNC automatically stops\n```\n\nThe VNC session auto-terminates after 2 minutes (configurable via `CAMOFOX_VNC_TIMEOUT_MS`).\n\n### Evaluate JavaScript\nExecute a JavaScript expression in the page context and return the JSON-serializable result.\n\nAuth: required when `CAMOFOX_AUTH_MODE=required` or when `auto` mode has an API key configured; no auth is required in `CAMOFOX_AUTH_MODE=disabled`.\n\nNote: async expressions must be wrapped in an async IIFE (for example, `(async () => { ... })()`). Top-level `await` is not supported.\n\n```bash\nPOST /tabs/:tabId/evaluate\n{\"userId\": \"agent1\", \"expression\": \"document.title\"}\n```\nReturns: `{\"ok\": true, \"result\": \"Page Title\", \"resultType\": \"string\", \"truncated\": false}`\n\n### Evaluate JavaScript (Extended)\nExecute a long-running JavaScript expression (up to 300s timeout). Conditionally API-key protected. Rate limited.\n\nAuth: required when `CAMOFOX_AUTH_MODE=required` or when `auto` mode has an API key configured; no auth is required in `CAMOFOX_AUTH_MODE=disabled`.\n\nNote: async expressions must be wrapped in an async IIFE (for example, `(async () => { ... })()`). Top-level `await` is not supported.\n\n```bash\nPOST /tabs/:tabId/evaluate-extended\n{\"userId\": \"agent1\", \"expression\": \"(async () => { const response = await fetch('/api/data'); return await response.json(); })()\", \"timeout\": 60000}\n```\nReturns: `{\"ok\": true, \"result\": {...}, \"resultType\": \"object\", \"truncated\": false}`\n\n### OpenClaw Endpoints\n\nOpenClaw-compatible aliases (used by the OpenClaw plugin).\n\n| Method | Endpoint | Description | Required | Auth |\n|--------|----------|-------------|----------|------|\n| GET | `/` | Status (alias of `/health`) | None | None |\n| POST | `/tabs/open` | Open tab (OpenClaw request/response shape) | Body: `userId` + `url` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| POST | `/start` | Start browser engine | None | None |\n| POST | `/stop` | Stop browser engine | None | `x-admin-key: $CAMOFOX_ADMIN_KEY` |\n| POST | `/navigate` | Navigate (OpenClaw request shape: `targetId` in body) | Body: `userId` + `targetId` + `url` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n| GET | `/snapshot?userId=...&targetId=...` | Snapshot (OpenClaw response shape) | Query: `userId` + `targetId` | None |\n| POST | `/act` | Combined actions (`click`, `type`, `press`, `scroll`, `scrollIntoView`, `hover`, `wait`, `close`, `extractStructured`) | Body: `userId` + `targetId` + `kind` | Conditional: `Authorization: Bearer $CAMOFOX_API_KEY` |\n\n### Structured Extract\n\nStructured extract returns deterministic JSON from a DOM schema without arbitrary JavaScript. Use it when you want stable data contracts instead of ad-hoc `evaluate()` calls.\n\nCore API:\n\n```bash\ncurl -X POST \"$CAMOFOX_URL/tabs/$TAB_ID/extract-structured\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"userId\": \"agent1\",\n    \"schema\": {\n      \"kind\": \"object\",\n      \"fields\": {\n        \"title\": { \"kind\": \"text\", \"selector\": \"h1\", \"required\": true, \"trim\": true },\n        \"products\": {\n          \"kind\": \"list\",\n          \"selector\": \".product\",\n          \"item\": {\n            \"kind\": \"object\",\n            \"fields\": {\n              \"name\": { \"kind\": \"text\", \"selector\": \".name\", \"required\": true, \"trim\": true },\n              \"href\": { \"kind\": \"url\", \"selector\": \"a.product-link\", \"attr\": \"href\", \"required\": true }\n            }\n          }\n        }\n      }\n    }\n  }'\n```\n\nCLI:\n\n```bash\ncamofox extract-structured @schema.json <tabId> --user <userId> --format json\n```\n\nOpenClaw:\n\n```bash\ncurl -X POST \"$CAMOFOX_URL/act\" \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"kind\": \"extractStructured\",\n    \"targetId\": \"tab-123\",\n    \"userId\": \"agent1\",\n    \"schema\": {\n      \"kind\": \"object\",\n      \"fields\": {\n        \"title\": { \"kind\": \"text\", \"selector\": \"h1\", \"required\": true }\n      }\n    }\n  }'\n```\n\nNotes:\n\n- invalid schemas fail with HTTP 400\n- required runtime misses fail the whole request with HTTP 422 and `fieldPath`\n- optional scalar/object/list nodes normalize to `null` / `null` / `[]`\n- selectors must be CSS; no XPath, arbitrary JavaScript, or AI extraction\n- raw resource extraction and structured extraction stay separate on purpose\n\n## Search Macros\n\nUse macros via `POST /tabs/:tabId/navigate` with `{ \"macro\": \"@google_search\", \"query\": \"...\" }`.\n\n| Macro | Engine |\n|-------|--------|\n| `@google_search` | Google |\n| `@youtube_search` | YouTube |\n| `@amazon_search` | Amazon |\n| `@reddit_search` | Reddit (JSON) |\n| `@reddit_subreddit` | Reddit subreddit (JSON) |\n| `@wikipedia_search` | Wikipedia |\n| `@twitter_search` | Twitter/X |\n| `@yelp_search` | Yelp |\n| `@spotify_search` | Spotify |\n| `@netflix_search` | Netflix |\n| `@linkedin_search` | LinkedIn |\n| `@instagram_search` | Instagram tags |\n| `@tiktok_search` | TikTok |\n| `@twitch_search` | Twitch |\n\n## Geo Presets\n\nBuilt-in presets (also exposed via `GET /presets`):\n\n| Preset | Locale | Timezone | Location |\n|--------|--------|----------|----------|\n| `us-east` | `en-US` | `America/New_York` | New York (40.7128, -74.0060) |\n| `us-west` | `en-US` | `America/Los_Angeles` | Los Angeles (34.0522, -118.2437) |\n| `japan` | `ja-JP` | `Asia/Tokyo` | Tokyo (35.6895, 139.6917) |\n| `uk` | `en-GB` | `Europe/London` | London (51.5074, -0.1278) |\n| `germany` | `de-DE` | `Europe/Berlin` | Berlin (52.5200, 13.4050) |\n| `vietnam` | `vi-VN` | `Asia/Ho_Chi_Minh` | Ho Chi Minh City (10.8231, 106.6297) |\n| `singapore` | `en-SG` | `Asia/Singapore` | Singapore (1.3521, 103.8198) |\n| `australia` | `en-AU` | `Australia/Sydney` | Sydney (-33.8688, 151.2093) |\n\nCreate a tab with a preset:\n\n```bash\ncurl -X POST http://localhost:9377/tabs \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"userId\":\"agent1\",\"sessionKey\":\"task1\",\"preset\":\"japan\",\"url\":\"https://example.com\"}'\n```\n\nCustom presets: set `CAMOFOX_PRESETS_FILE=/path/to/presets.json` (JSON object; keys become preset names).\n\n## Session-Level Proxy and Geo Overrides\n\nCamoFox supports session-level proxy and geolocation configuration with a hybrid model that combines server defaults with per-session overrides.\n\n### Proxy Configuration Model\n\n**Server-level baseline** (via environment variables):\n- `PROXY_HOST`, `PROXY_PORT`, `PROXY_USERNAME`, `PROXY_PASSWORD` — applied as the default for all sessions\n- Enables Camoufox geoip mode when configured\n\n**Session-level overrides** (via `POST /tabs` or CLI):\n- `proxyProfile` — select a named proxy profile from `CAMOFOX_PROXY_PROFILES_FILE`\n- `proxy` — provide raw proxy fields (`host`, `port`, `username`, `password`) directly\n- Session-level proxy overrides the server baseline for that specific `userId + sessionKey` combination\n\n**Session identity rules**:\n- The same `userId` may run different `sessionKey` profiles in parallel with different proxy/geo configurations\n- The same `userId + sessionKey` combination maintains a stable proxy/geo identity — requests with conflicting proxy/geo fields are rejected\n- Session reuse and cleanup scope proxy/geo identity by `userId + sessionKey`, not just `userId`\n\n### Geo Mode Behavior\n\nCamoFox offers two geo modes that control how explicit geo fields (locale, timezone, geolocation) interact with proxy-derived geo:\n\n**`geoMode=explicit-wins`** (default):\n- Explicit geo fields (locale, timezone, geolocation) remain authoritative\n- Proxy-derived geo suggestions are ignored\n- Use this mode when you want precise geo control regardless of proxy location\n\n**`geoMode=proxy-locked`**:\n- Explicit geo fields that conflict with proxy-derived geo are rejected\n- Proxy-derived geo is authoritative\n- Use this mode to ensure geo consistency with proxy exit location\n\n### CLI Examples\n\nSession-level proxy with named profile:\n```bash\ncamofox open https://example.com --proxy-profile tokyo-exit --user agent1\n```\n\nSession-level proxy with raw fields:\n```bash\ncamofox open https://example.com \\\n  --proxy-host proxy.example.com \\\n  --proxy-port 8080 \\\n  --proxy-username user \\\n  --proxy-password pass \\\n  --user agent1\n```\n\nCombine proxy with geo mode:\n```bash\ncamofox open https://example.com \\\n  --proxy-profile london-exit \\\n  --geo uk \\\n  --geo-mode proxy-locked \\\n  --user agent1\n```\n\n### API Examples\n\nUsing a named proxy profile with explicit geo:\n```bash\ncurl -X POST http://localhost:9377/tabs \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"userId\": \"agent1\",\n    \"sessionKey\": \"task1\",\n    \"url\": \"https://example.com\",\n    \"proxyProfile\": \"tokyo-exit\",\n    \"preset\": \"japan\",\n    \"geoMode\": \"explicit-wins\"\n  }'\n```\n\nUsing raw proxy fields with proxy-locked geo:\n```bash\ncurl -X POST http://localhost:9377/tabs \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"userId\": \"agent1\",\n    \"sessionKey\": \"task2\",\n    \"url\": \"https://example.com\",\n    \"proxy\": {\n      \"host\": \"proxy.example.com\",\n      \"port\": 8080,\n      \"username\": \"user\",\n      \"password\": \"pass\"\n    },\n    \"geoMode\": \"proxy-locked\"\n  }'\n```\n\n### Named Proxy Profiles\n\nDefine proxy profiles in a JSON file and point `CAMOFOX_PROXY_PROFILES_FILE` to it:\n\n```json\n{\n  \"tokyo-exit\": {\n    \"server\": \"http://tokyo.proxy.example.com:8080\",\n    \"username\": \"user\",\n    \"password\": \"pass\"\n  },\n  \"london-exit\": {\n    \"server\": \"http://london.proxy.example.com:8080\"\n  }\n}\n```\n\nThen use profiles by name in API requests or CLI commands.\n\n## Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `CAMOFOX_PORT` | `9377` | Server port |\n| `PORT` | (optional) | Alternative port env var (common in PaaS) |\n| `NODE_ENV` | `development` | Node environment |\n| `CAMOFOX_HOST` | `127.0.0.1` | Server bind host. Set `0.0.0.0` for Docker/PaaS/network exposure. Non-loopback binds require `CAMOFOX_API_KEY` unless `CAMOFOX_AUTH_MODE=disabled`. |\n| `CAMOFOX_ADMIN_KEY` | (empty) | Required for `POST /stop` (sent via `x-admin-key`) |\n| `CAMOFOX_AUTH_MODE` | `auto` | API-key policy: `auto` allows loopback without auth and requires `CAMOFOX_API_KEY` for non-loopback binds; `required` requires `CAMOFOX_API_KEY` for every bind; `disabled` disables API-key auth for protected endpoints and is only for trusted private agent networks. |\n| `CAMOFOX_API_KEY` | (empty) | Guards protected endpoints (tab creation, navigation, interaction, session management, downloads, image extraction, tracing, console) via `Authorization: Bearer` header when set. Required in `CAMOFOX_AUTH_MODE=required`, and required by `auto` whenever `CAMOFOX_HOST` exposes the server beyond loopback. Must be unset when `CAMOFOX_AUTH_MODE=disabled`. |\n| `CAMOFOX_ALLOW_PRIVATE_NETWORK` | `true` on loopback binds, `false` otherwise | Allows navigation to loopback/private/link-local/metadata targets. Leave unset for the safe default; enable only for trusted deployments that intentionally need internal-network reachability. |\n| `CAMOFOX_HEADLESS` | `true` | Display mode: `true` (headless), `false` (headed), `virtual` (Xvfb). Windows x64 supports `true` only; Xvfb/VNC is Linux-only. |\n| `CAMOFOX_VNC_RESOLUTION` | `1920x1080x24` | Virtual Xvfb display resolution (`WIDTHxHEIGHTxDEPTH`) |\n| `CAMOFOX_VNC_TIMEOUT_MS` | `120000` | Max VNC session duration in ms before auto-stop |\n| `CAMOFOX_EVAL_EXTENDED_RATE_LIMIT_MAX` | `20` | Max evaluate-extended requests per user per window |\n| `CAMOFOX_EVAL_EXTENDED_RATE_LIMIT_WINDOW_MS` | `60000` | Rate limit window duration in ms |\n| `CAMOFOX_COOKIES_DIR` | `~/.camofox/cookies` | Directory used by the OpenClaw plugin cookie tool |\n| `CAMOFOX_PROFILES_DIR` | `~/.camofox/profiles` | Profile storage directory (persistent per-user Firefox profiles) |\n| `CAMOFOX_DOWNLOADS_DIR` | `~/.camofox/downloads` | Download artifact directory |\n| `CAMOFOX_DOWNLOAD_TTL_MS` | `86400000` | Download metadata retention TTL |\n| `CAMOFOX_MAX_DOWNLOAD_SIZE_MB` | `100` | Max single download size |\n| `CAMOFOX_MAX_BATCH_CONCURRENCY` | `5` | Batch download concurrency cap |\n| `CAMOFOX_MAX_BLOB_SIZE_MB` | `5` | Max blob payload size |\n| `CAMOFOX_MAX_DOWNLOADS_PER_USER` | `500` | Per-user download record cap |\n| `CAMOFOX_CONSOLE_BUFFER_SIZE` | `1000` | Per-tab console/error message buffer size (minimum `100`) |\n| `HANDLER_TIMEOUT_MS` | `30000` | Handler timeout fallback |\n| `MAX_CONCURRENT_PER_USER` | `3` | Concurrent operations per user |\n| `CAMOFOX_VNC_BASE_PORT` | `6080` | noVNC/websockify base port |\n| `CAMOFOX_VNC_HOST` | `localhost` | noVNC host in returned URL |\n| `CAMOFOX_CLI_USER` | `cli-default` | Default CLI user id |\n| `CAMOFOX_SERVER_PID_FILE` | (unset) | Optional daemon PID file path used by the CLI server manager |\n| `CAMOFOX_IDLE_TIMEOUT_MS` | `1800000` | Stage 1 idle cleanup threshold (ms) |\n| `CAMOFOX_IDLE_EXIT_TIMEOUT_MS` | `1800000` | Stage 2 daemon exit quiet window (ms, defaults to match Stage 1) |\n| `CAMOFOX_PRESETS_FILE` | (unset) | Optional JSON file defining/overriding geo presets |\n| `CAMOFOX_PROXY_PROFILES_FILE` | (unset) | Optional JSON file defining named proxy profiles for session-level overrides |\n| `CAMOFOX_SESSION_TIMEOUT` | `1800000` | Session idle timeout in ms (min `60000`) |\n| `CAMOFOX_MAX_SESSIONS` | `50` | Maximum concurrent sessions |\n| `CAMOFOX_MAX_TABS` | `10` | Maximum tabs per session |\n| `PROXY_HOST` | (empty) | Proxy host (server-level default; enables proxy routing) |\n| `PROXY_PORT` | (empty) | Proxy port (server-level default) |\n| `PROXY_USERNAME` | (empty) | Proxy username (server-level default) |\n| `PROXY_PASSWORD` | (empty) | Proxy password (server-level default) |\n| `CAMOFOX_MAX_SNAPSHOT_CHARS` | `80000` | Max characters in snapshot before truncation |\n| `CAMOFOX_MAX_SNAPSHOT_NODES` | `2000` | Max accessibility snapshot nodes before truncation |\n| `CAMOFOX_SNAPSHOT_TAIL_CHARS` | `5000` | Characters preserved at end of truncated snapshot |\n| `CAMOFOX_BUILDREFS_TIMEOUT_MS` | `12000` | Timeout for building element refs |\n| `CAMOFOX_TAB_LOCK_TIMEOUT_MS` | `30000` | Timeout for acquiring tab lock |\n| `CAMOFOX_TRACES_DIR` | `~/.camofox/traces` | Managed Playwright trace artifact directory |\n| `CAMOFOX_TRACE_MAX_DURATION_MS` | `300000` | Maximum trace recording duration before automatic stop |\n| `CAMOFOX_HEALTH_PROBE_INTERVAL_MS` | `60000` | Health probe check interval |\n| `CAMOFOX_FAILURE_THRESHOLD` | `3` | Consecutive failures before health degradation |\n| `CAMOFOX_YT_DLP_TIMEOUT_MS` | `30000` | Timeout for yt-dlp subtitle extraction |\n| `CAMOFOX_YT_BROWSER_TIMEOUT_MS` | `25000` | Timeout for browser transcript fallback |\n| `CAMOFOX_OS` | (unset) | Optional server-wide Camoufox OS override (`windows`, `macos`, `linux`, or comma-separated list for randomization) |\n| `CAMOFOX_ALLOW_WEBGL` | (unset) | Optional server-wide WebGL override; malformed values fail startup |\n| `CAMOFOX_SCREEN_WIDTH` | (unset) | Optional screen width override; applied only with `CAMOFOX_SCREEN_HEIGHT` |\n| `CAMOFOX_SCREEN_HEIGHT` | (unset) | Optional screen height override; applied only with `CAMOFOX_SCREEN_WIDTH` |\n| `CAMOFOX_HUMANIZE` | (unset) | Optional server-wide humanization override |\n\n> `CAMOFOX_OS` and `CAMOFOX_SCREEN_*` are **generation-time** controls: they affect only newly generated fingerprints and have no effect while an existing `fingerprint.json` sidecar is in use. Reset the profile or delete `fingerprint.json` to force regeneration under the new defaults. `CAMOFOX_ALLOW_WEBGL` and `CAMOFOX_HUMANIZE` are **launch-time** overrides and apply on every browser launch regardless of whether a sidecar is reused.\n\n### Idle Lifecycle Policy\n\nCamoFox implements a two-stage idle lifecycle for graceful cleanup and daemon exit:\n\n**Stage 1 — Idle Cleanup**\n- After `CAMOFOX_IDLE_TIMEOUT_MS` of idle time (default: 30 minutes), the server runs cleanup to close idle sessions and tabs\n- Cleanup is delayed if browser contexts are launching or sessions are being created\n- New interactive activity (tab creation, navigation, interaction) cancels any pending cleanup\n\n**Stage 2 — Daemon Exit**\n- After Stage 1 cleanup completes, the server waits for `CAMOFOX_IDLE_EXIT_TIMEOUT_MS` (default: matches Stage 1 timeout)\n- If no new activity occurs during this quiet window, the daemon process exits gracefully\n- Any new request activity cancels the pending exit timer\n\n**Activity detection**:\n- Live tabs, launching browser contexts, or staged session creation count as active work and prevent cleanup\n- Empty sessions (sessions with no tabs) do not block cleanup but do disarm pending daemon exit\n- New interactive activity resets both cleanup and exit timers\n\nThis two-stage model ensures cleanup runs before daemon exit, preventing resource leaks while allowing the server to shut down cleanly when fully idle.\n\n## Deployment\n\n### Docker (Recommended)\n\n```bash\ndocker build -t camofox-browser .\ndocker run -p 9377:9377 -p 6080:6080 \\\n  -v ~/.camofox:/home/node/.camofox \\\n  -e CAMOFOX_HOST=0.0.0.0 \\\n  -e CAMOFOX_PORT=9377 \\\n  -e CAMOFOX_AUTH_MODE=auto \\\n  -e CAMOFOX_API_KEY=change-me \\\n  camofox-browser\n```\n\nFor private Docker networks used by agents such as Hermes, OpenClaw, or GoClaw that cannot send a bearer token, keep the service off published host ports and disable API-key auth explicitly:\n\n```bash\ndocker network create camofox-agents\ndocker run -d \\\n  --name camofox-browser \\\n  --network camofox-agents \\\n  -e CAMOFOX_HOST=0.0.0.0 \\\n  -e CAMOFOX_AUTH_MODE=disabled \\\n  -v ~/.camofox:/home/node/.camofox \\\n  camofox-browser\n```\n\nThen configure the agent with `CAMOFOX_URL=http://camofox-browser:9377` from another container on the same Docker network. Do not combine `CAMOFOX_AUTH_MODE=disabled` with public port publishing or `CAMOFOX_ALLOW_PRIVATE_NETWORK=true`.\n\n### Fly.io\n\nThis repo includes a starter `fly.toml` for one-command deploys.\n\n```bash\nfly launch\nfly deploy\n```\n\n### Railway\n\n- Create a new project → deploy from this GitHub repo\n- Set `CAMOFOX_HOST=0.0.0.0`\n- Set `CAMOFOX_API_KEY` to a strong secret\n- Set `CAMOFOX_PORT=9377` (Railway will also provide `PORT`, which is supported)\n- Ensure the service exposes port `9377`\n\n### Render\n\n- Create a new Web Service → deploy from this GitHub repo\n- Use Docker (recommended) and expose port `9377`\n- Set `CAMOFOX_HOST=0.0.0.0`\n- Set `CAMOFOX_API_KEY` to a strong secret\n- Set `CAMOFOX_PORT=9377` (or rely on Render `PORT`)\n\n### System Requirements\n\n- Node.js 20+\n- 2GB+ RAM (browser + contexts require significant memory)\n- Linux recommended for production; macOS is fine for development\n\n## Used With\n\n| Project | Description |\n|---------|-------------|\n| [CamoFox MCP](https://github.com/redf0x1/camofox-mcp) | MCP (Model Context Protocol) server for Claude, Cursor, VS Code |\n| [OpenClaw](https://openclaw.ai) | Open-source AI agent framework (compat endpoints included) |\n| [Camoufox](https://github.com/daijro/camoufox) | Anti-detection Firefox browser engine |\n\n## Project Structure\n\n```text\nsrc/\n├── cli/\n│   ├── commands/       # Command modules (core, navigation, interaction, etc.)\n│   │   ├── console.ts   # Console capture commands\n│   │   └── trace.ts     # Playwright tracing commands\n│   ├── vault/          # Auth vault (encryption, storage)\n│   ├── server/         # Server lifecycle management\n│   ├── transport/      # HTTP transport layer\n│   ├── output/         # Output formatting\n│   └── utils/          # Shared utilities\n├── server.ts           # Express app entry point\n├── types.ts            # Shared TypeScript interfaces\n├── routes/\n│   ├── core.ts         # Core REST API (~42 endpoints)\n│   └── openclaw.ts     # OpenClaw compatibility (~7 endpoints)\n├── services/\n│   ├── browser.ts      # Browser lifecycle + persistent context pool\n│   ├── batch-downloader.ts # Batch download orchestrator\n│   ├── context-pool.ts # Browser context pool with LRU eviction\n│   ├── download.ts     # Download tracking service\n│   ├── health.ts       # Browser health tracking\n│   ├── resource-extractor.ts # Page resource extraction\n│   ├── session.ts      # Session management + limits\n│   ├── tab.ts          # Tab operations (snapshot/click/type/etc.)\n│   ├── tracing.ts      # Playwright tracing service\n│   ├── vnc.ts          # VNC/virtual display lifecycle\n│   └── youtube.ts      # YouTube transcript extraction\n├── middleware/\n│   ├── auth.ts         # API/admin auth helpers\n│   ├── errors.ts       # Error handling\n│   ├── logging.ts      # Structured logging\n│   └── rate-limit.ts   # In-memory rate limiter\n└── utils/\n  ├── config.ts       # Environment config parsing\n  ├── cookies.ts      # Cookie utilities\n  ├── download-helpers.ts # Download helper functions\n  ├── launcher.ts     # Browser launcher utilities\n  ├── macros.ts       # Search macro expansion\n  ├── presets.ts      # Geo preset definitions/loader\n  └── snapshot.ts     # Snapshot truncation/windowing\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md)\n\n## Credits\n\nThis project is based on [camofox-browser](https://github.com/jo-inc/camofox-browser) by [Jo Inc](https://github.com/jo-inc) (YC W24) and the [Camoufox](https://github.com/daijro/camoufox) anti-detection browser engine by [daijro](https://github.com/daijro).\n\n- [Camoufox](https://camoufox.com) - Firefox-based browser with C++ anti-detection\n- [Donate to Camoufox's original creator daijro](https://camoufox.com/about/)\n- [OpenClaw](https://openclaw.ai) - Open-source AI agent framework\n\n## License\n\n[MIT](LICENSE)\n\n## Crypto Scam Warning\n\nSketchy people are doing sketchy things with crypto tokens named \"Camofox\" now that this project is getting attention. **Camofox is not a crypto project and will never be one.** Any token, coin, or NFT using the Camofox name has nothing to do with us.\n","readmeFilename":"README.md"}