Camofox Browser
Measure Camofox without confusing idle memory, browser memory and task success
Build a workload-specific evaluation of cold launch, snapshots, screenshots, concurrency and correct authorized task completion.
What you will learn
- Measure the whole browser workload, not only Node heap or idle state.
- Count pagination, screenshots and recovery in observation cost.
- Configured ceilings are not measured throughput.
Before you start
- Basic HTTP and JSON knowledge
- An isolated service and an owned or permitted test page
Explain the chapter’s actual service boundary and verify the proposed observation or lifecycle fixture.
Key takeaways
- Measure the whole browser workload, not only Node heap or idle state.
- Count pagination, screenshots and recovery in observation cost.
- Configured ceilings are not measured throughput.
Idle service cost is not active browser cost
The README advertises a small idle footprint through lazy browser launch and shutdown. That is a different state from active pages, rendering processes and authenticated contexts. Measure the complete process tree or container rather than only the Node heap. The health response’s process.memoryUsage values describe the Node process, so they are not by themselves a complete browser-memory measurement.
Separate startup time, first page readiness, warm navigation and idle return. A configuration that saves idle memory may move latency into the next task. Record the browser-running state and workload at each measurement. This series does not reproduce the README’s idle-memory number or translate a low idle footprint into a universal server-size recommendation.
Compact observations still have cumulative cost
Compare raw HTML, semantic snapshots and screenshots on the same allowed fixture and with the same information requirement. Include every paginated snapshot chunk needed to answer the question, not just the first response. A small snapshot that omits a required control fails the task even if it looks efficient in a token counter.
Optional base64 screenshots and downloads increase response volume; a screenshot also spends rendering and encoding work. Count network bytes and actual model input separately, and record whether a visual observation was needed. A claimed percentage reduction between one representation and another does not establish lower end-to-end cost when the agent needs repeated observations or recovery calls.
Capacity depends on resource policy and correctness
The inspected defaults include three concurrent operations per user, fifty sessions, ten tabs per session and fifty tabs globally. These are configured ceilings, not a proven throughput target for your machine. Tab recycling, timeouts and browser recovery can change task outcomes before CPU utilization alone reveals a bottleneck. Start with a small owned workload and raise concurrency gradually.
Report successful tasks with verified final state, latency percentiles, peak process-tree memory, errors and recycled tabs. Include cold and warm runs and a controlled failure case. Leave unmeasured values null. The result should support a concrete capacity decision for that workload, not a universal price-per-page claim or an assertion of success against sites that have not authorized your test.
Implementation steps
- 1
Freeze an owned fixture and a final-state acceptance rule.
- 2
Measure cold launch, warm work and idle return separately.
- 3
Increase concurrency while recording recycling and errors.
- 4
Report correct tasks, latency, memory and total response volume together.
Copy-ready example
{"workload":"owned-form-observation","state":"cold","tasks":10,"verifiedSuccesses":null,"latencyP95Ms":null,"processTreePeakBytes":null,"allResponseBytes":null,"recycledTabs":null}Frequently asked questions
Can /health memory be treated as total browser memory?
No. Its process.memoryUsage values describe Node. Measure the browser process tree or container for the full workload.
Does MAX_SESSIONS=50 mean fifty sessions will perform well?
No. It is an admission ceiling. Capacity depends on pages, resources, concurrency and the task’s correctness requirements.
Sources
- README.mdSource checked 2026-09-08
- package.jsonSource checked 2026-09-08
- DockerfileSource checked 2026-09-08
- lib/auth.jsSource checked 2026-09-08
- lib/snapshot.jsSource checked 2026-09-08
- lib/extract.jsSource checked 2026-09-08
- lib/config.jsSource checked 2026-09-08
- lib/reporter.jsSource checked 2026-09-08
- lib/page-lease.jsSource checked 2026-09-08
- server.jsSource checked 2026-09-08
- tests/unit/snapshot.test.jsSource checked 2026-09-08
- tests/unit/auth.test.jsSource checked 2026-09-08