Changelog
Version history for CBrowser. See What-Is-CBrowser for an overview. Every release, including v18.80 to v19.3, which this page does not cover yet, is listed on GitHub Releases.
v20.0.0 (October 2026)
20.0 is a breaking release. Most of it makes commands that used to report success without doing the work either do it or fail with a non-zero exit. CLI-Reference describes every command as it now behaves.
Breaking changes
Install
- cbrowser needs Node.js 20.9 or newer. Node 18 has been end of life since April 2025, and sharp 0.35, the image library cbrowser uses, no longer supports it. Stay on cbrowser 19.x if you need Node 18
Defaults
- Pages render at 1920x1080 by default (was 1280x800), the size
desktopmeans everywhere else. To keep the old size, setCBROWSER_VIEWPORT_WIDTHandCBROWSER_VIEWPORT_HEIGHT, orviewportin the config file. Visual baselines already captured compare at their recorded size, and personas keep their own screen sizes - There is no built-in locale or timezone. Pages render in the host's locale and timezone unless
--locale,--timezone,CBROWSER_LOCALE,CBROWSER_TIMEZONEor the config file sets one. Before, en-US and America/Denver applied wherever defaults did - A one-off
--deviceor--geono longer carries over to later commands. Onlydevice setandgeo setpersist - Size names mean the same size in every tool:
mobileis 393x852,tablet834x1194 anddesktop1920x1080. The old sizes keep names:tablet-smis 768x1024 anddesktop-md1440x900.desktop-xlis 2560x1440, and thevisual_baselinetool'sdesktop-lgis now 1920x1080 (was 2560x1440) responsive(the CLI, the library and theresponsive_testMCP tool) renders the mobile and tablet presets as their device: user agent, touch and pixel ratio. They no longer set reduced motion. Pages that adapt to touch or to the user agent look different than beforediffrenders at 1920x1080 (was 1280x720), likecross-browser- Journeys in
compare-personas,competitive-benchmarkandempathy-auditstart with a fresh browser profile, so each persona arrives as a new visitor.cognitive-journeydoes the same unless you pass--persistent
An Anthropic API key is required
explore,competitive-benchmark(the CLI, the library and thecompetitive_benchmarkMCP tool) and the library'sCBrowser.journey()refuse without an Anthropic API key. Their keyless modes are removed. They reported a goal as reached whenever a goal word appeared on the page: "sign up for free trial" on a lamp shop with no sign-up came back as achieved- A cognitive journey that fails now fails, instead of falling back to the keyless mode. In
competitive-benchmark, that site's result names the error
Exit codes
- Commands that fail exit 1 where they used to exit 0: a failed
perf auditorvisual compare, any failedparallelrun, a failedscriptstep, a failedchaosrun, a failed--step-throughstep, an unsuccessfulexplore, anai-benchmarksite that could not be scored, anavigatethat landed on a different page, adaemon stopthat failed,sessioncommands on an unknown name, anai clickthat was refused or missed, andrepair-tests --auto-applythat leaves tests failing - An unknown subcommand exits 1 for
persona,session,cookie,device,geo,visual,ai-visual,record,webhook,parallel,ai,a11y,harandnetwork daemon statusexits 1 when no daemon is running- With a daemon running, a
click,fill,hover,runornavigatethat fails exits 1 (it exited 0). Aclickthrough the daemon no longer hovers menu parents first - While a daemon runs,
script,ai,explore,analyze,generate,hunt-bugs,chaos,a11y,perf,visualandresetexit 1 and ask you to stop it, since they would open a second browser on its profile record start,record stopandrecord saveexit 1. Each command is its own process, so they never recorded anything. Write the flow as a test instead.record listandrecord generatestill work
Flags
- Commands that check their flags reject flags they never read.
--quietis gone, since nothing read it.test-suiteandcognitive-journeyreject the flags they do not read, for exampletest-suite --persona - An out-of-range or non-numeric
--threshold, or a--sensitivityother thanlow,mediumorhigh, exits 1.flaky-check --thresholdis a percentage from 0 to 100;visual compareandai-visualtake 0 to 1 extractaccepts onlytext,links,headings,imagesorforms. Anything else used to return the whole page text.generaterejects an unknown--format- Commands that cannot honour a browser flag refuse it and say why:
cross-browseranddiffrefuse--browser(use--browsers)responsiverefuses--deviceand--viewport(use--viewports)ai-visual testandai-visual suiterefuse--browser,--deviceand--viewport: a test renders as its baseline was capturedparallel devicesrefuses--deviceand--viewportperf-baseline save,compare-personasandcompetitive-benchmarkrefuse--browserai-benchmarkrefuses--viewportand--browserperf-regressionrefuses--device,--viewportand--browser: it renders as its baseline was capturedcoverage --sitemaprefuses all four, since no browser runs
capture startthrough a running daemon exits 1 on--viewport,--deviceor--browser. The daemon's browser keeps the settings it started withagent-ready-audit --geo-regionexits 1 when no proxy is configured, instead of running from your own addressrepair-tests --outputneeds--auto-apply, and is refused before anything runs- A malformed
--widthor--heightis an error instead of falling back to 1920x1080 ai-visual capturewith both--deviceand--viewportuses the viewport's size. The device's size used to wincognitive-journeyruns headless when there is no display, unless you pass--no-headless
Output
--plainand--json-outputturn pass, fail and warning marks into[PASS],[FAIL]and[WARN]instead of deleting them, and keep line breaks- With
--json-output,extractreturns its data indata. It used to return text lines indata.output - With
--htmland an--outputfile whose name ends in.html, the HTML report goes to<name>.report.htmlinstead of overwriting the JSON report - Commands run through the daemon print their status lines, such as "Connected to running daemon", on stderr instead of stdout.
evaluatethrough the daemon prints a string bare, as it does without one repair-testssaves its report with--json-out <file>.--jsonnow prints the report
Webhooks and export
webhook adddefaults to--events test.fail(wastest.fail,journey.complete). It refuses a URL that is not http or https, a URL with a user name or password, an event no command sends, and an unknown--format- The JUnit export marks every failed test as a failure, including one with no error message
MCP tools
- The local stdio server (
npx cbrowser mcp-server) registers the same tools as the hosted servers: 130, plus 7 that keep their state in the local process. It used to serve its own copy of 82 tools. Its responses now have the hosted shapes, sonavigatecan reportsuccess: false compare_personas_record_resultandcompare_personas_summarizeare removed. Nothing could create the session they needed, so both always answered "Session not found"- Red-zone refusals from
click,smart_click,press_key,type_text,dragandevaluate_scriptshare one shape:isError: true,success: false, the tool name,zone: "red", the reason, andhowToRunnamingforce: true.clickandsmart_clickrefusals are now tool errors, and on the hosted servers a refused call is refunded get_network_requestsreturns the newest 50 requests (was the oldest 50)manage_cookiessetwrites a session cookie unless you passexpires(it wrote a 24-hour cookie).deletewith adomainleaves cookies of the same name on other domains- In
visual_baseline, the device namesmobile,tabletanddesktopemulate the device (user agent, touch, pixel ratio) instead of only sizing the page, and an unknown device name is an error empathy_auditreportsdevice: nullwhen no device was set. It used to say "desktop"- The five Enterprise marketing placeholder tools in the public package now use the names the Enterprise server serves, and their parameters changed:
marketing_influence_matrix,marketing_lever_analysis,marketing_funnel_analyze,marketing_competeandmarketing_discover_status. They weremarketing_campaign_influence_matrix,marketing_campaign_levers,marketing_funnel_analysis,marketing_competitive_compareandmarketing_audience_discover_status
CI
- The GitHub Action's
sensitivityinput is removed.test-suitenever read it
Added
cbrowser ask "<question>"sends a question to cbrowser.ai and prints an answer grounded in these docs, with its sources (--context,--json). Thequestion_answerMCP tool now works the same way from the local stdio servercbrowser scroll <top|bottom|up|down> [px]. It runs through the daemon when one is runningnetwork listlists the newest requests first and takes--filter,--alland--jsondaemon start --timeoutsets the idle timeout (minutes, or90s,45m,2h), anddaemon statusshows it.daemon startalso passes--browser,--no-headless,--locale,--timezoneand--geoto the daemon's browsertest-suitesaves each run, soexport junitandexport taphave results to export, and sendstest.passortest.failto the webhooks subscribed to it.cognitive-journeysendsjourney.complete--viewporttakes size names (mobile,tablet,desktop-mdand the rest) on every command- Flags can be written
--flag=value exploreandcognitive-journeyaccept--urlfor the start URLcognitive-journey --replay-tracereplays a recorded journey with no model calls and no API key.--traceprints where the trace was writtentest-suiteuses--browser,--geo,--localeand--timezoneempathy-audit:--goalis optional (without it the page is checked and no key is needed),--scopeis checked, and--devicereaches the audit.agent-ready-auditpasses--deviceand--localeto the auditanalyze --output <file>saves the analysis as JSON, and with--json-outputthe analysis is indata. The GitHub Action'surlmode now writes itperf-baseline saverecords the device and size, andperf-regressionrenders with them- New device presets from Playwright 1.64: the iPhone 17 family, iPhone Air and Pixel 10 Pro
- MCP:
list_deviceslists the device presets and the size presets - MCP:
navigatetakesdeviceandviewport, on the hosted servers too. A hosted call with an existing session token refuses instead of relaunching a browser that may hold a login; the local server relaunches its browser with the new settings - MCP:
evaluate_scriptruns scripts the waycbrowser evaluatedoes (expressions, statements, functions, a top-levelreturn) and takesargs - MCP:
smart_clicktakesforceandretryDelay - MCP:
capture_starttakes the CLI's start and stop triggers (after,afterElement,afterDelay,untilElement,untilElementGone,untilIdle,timeout) anddevice. Its options have camelCase names; the snake_case names still work.capture_stopreports which trigger started and stopped the capture and whether a trigger timed out - MCP:
asserttakescaseSensitive,responsive_testtakeswait,waitForandsensitivity,chaos_testtakesfailApis, andmanage_cookiessettakesexpires
Fixed
- Environment variables and the config file apply. Every CLI command ignored
CBROWSER_DEVICE,CBROWSER_LOCALE,CBROWSER_TIMEZONE,CBROWSER_BROWSER,CBROWSER_HEADLESS,CBROWSER_RECORD_VIDEOand a config file's device - Restoring the session no longer puts the last run's page size back over an explicit
--deviceor--viewport geo setpersists for later commands. Before, it changed nothing and reported success- A flag that takes no value no longer swallows the next word:
screenshot --no-restore out.pngkept restore on and lost the path - Commands that check their flags accept
--no-color,--plainand--json-output. Before,--no-colorfailed with "does not support --color" evaluatethrough the daemon keeps--arg,--url,--wait-for,--timeout,--raw,--jsonand--expect-truthy. Before, an--expect-truthycheck passed on a falsy result- Every millisecond
--timeoutreads30sas 30 seconds. It was 30 milliseconds type --delayworks. It was always 50 msflaky-check --threshold 0.2was read as 0, which flagged every testempathy-auditreads--personas. It used to run every personacognitive-journey --replay-tracereplays the trace. It used to start a live, paid runab,flaky-check,diff,cross-browser,responsive,ai-visual,coverage,parallel,repair-tests,perf-baselineandcompare-personasuse--headless,--browser,--deviceand--viewportwhere they can. Before,ab --viewport 400x700rendered 1920 widecompetitive-benchmarkpasses--deviceand--viewportto every journey, andai-benchmarkpasses--deviceto every auditrunhandles back, forward, reload, select, wait for and scroll, and a failed click or fill insiderunis a failureinstall-skillandsync-skilldownload first and change nothing when the download fails. They used to delete the installed skill first- Through the daemon, every routed command honours
--url,evalworks, a relative screenshot path is saved where you ran the command,extractprints its data, and one missed health check no longer orphans a running daemon cognitive-journeyexits non-zero when its capture fails, even if the goal was reachedcapturethrough the daemon applies--attention-overlayand records with the daemon's own browser enginecookie delete --domaintreats.example.comandexample.comas the same domain- Smart visual baselines record their device and size, and smart regression and transport-map comparisons render at them. They always rendered at 1920x1080
- MCP:
press_keygoes through the same keyboard safety check astype_text, the CLI and the daemon, and writes an audit entry.type_textwithdelay: 0types with no delay (it used 50 ms).press_key,type_text,dragandupload_filereportsuccess: true - MCP: a device name means the same preset in every tool, in any case
- MCP:
visual_cognitive_story,site_cognitive_assessmentandempathy_auditreport the device and page size they rendered at - MCP:
security_auditon the local stdio server scans every registered tool - Errors from
ai find,ai click,smart-clickandscriptgo to stderr - The help no longer lists
smart-baselineortransport-mapcommands (they are the MCP toolsvisual_baseline,visual_regressionandtransport_map) and names the commands the daemon runs - The Dockerfile builds on the Playwright 1.64.1 image, matching the browsers cbrowser expects
v19.4 to v19.6 (October 2026)
Devices and viewport (v19.6)
- About 200 device presets, up from 12: the iPhone 16 family, Pixel 8 to 10, Galaxy foldables, iPad Pro 13, iPad mini, Surface and laptops from Chrome DevTools' device list, plus Playwright's own list. Phones and tablets have landscape presets too
- Device names ignore case and spaces:
--device "iPhone 16"isiphone-16 - An unknown device name is an error naming the closest presets, in the CLI, the MCP tools'
deviceparameter,CBROWSER_DEVICEand the config file. Before, it rendered at the 1280x800 desktop size and reported success device listprints one line per preset and takes a filter:cbrowser device list pixel--viewport WIDTHxHEIGHTis a global flag. It works wherever--devicedoes: the browser commands (navigate,screenshot,evaluate,keyboardand the rest),test-suite,cognitive-journeyanddaemon start. With--device, it sets the size and the device keeps its pixel ratio, touch and user agent. Before,evaluateandkeyboardrefused it, and with a device the preset's size silently wontest-suiteandcognitive-journeynow use--device; before, they ignored itdaemon starttakes--deviceand--viewport
evaluate (v19.6)
- Scripts that contain functions return their value:
function t() { return document.title }; t(), a function expression called later,.map(a => a.pathname), and immediately invoked functions. Before, they threw or printed nothing - Through the daemon,
evaluatehandles scripts the same way, and results such as0,falseand""print
Console and terminal output (v19.5)
cbrowser consolelists the daemon tab's console messages, with--filter,--clearand--json- Text from a page can no longer drive your terminal: control and bidirectional-override characters in CLI output are printed as visible escapes
HAR, network and the daemon (v19.4.3)
harandnetworkrecord through the daemon. Without one they exit 1 and say so; before,har startprinted "started" and recorded nothing- The daemon accepts commands only with a token from its private state file. Stop and restart a daemon started by an older version
MCP tools (v19.4.1, v19.4.2)
responsive_testandempathy_auditapply WCAG 2.5.8's spacing exception, counting inline links as neighbourspage_understandreads word breaks from the gaps actually drawn on screenlist_baselinesincludes smart baselines- Buttons styled as dangerous get no exploratory click
- Motion barriers are typed as timing problems
- Performance averages are rounded where they are computed
Hosting and releases (v19.4.0)
- Hosted Enterprise has unlimited tool use
- npm releases are published from GitHub Actions with provenance
v18.79 (August 2026)
- Sequential Transport Chain expanded from six layers to eight
motorProcedure(Motor Procedure) β split out of Motor, because hitting a target and completing a sequence fail for different reasons; scored against theproceduralFluencytraitreadingAttention(Reading Attention) β split out of Readability, because decoding text and holding your place in it are different abilities; scored against thesustainedAttentiontrait- Chain order is now: saliency, cognitive load, decision, motor, motor procedure, frustration, readability, reading attention
v18.70 (July 2026)
- Screen capture β
capture start/capture stop/capture statusrecords the screen to GIF, animated WebP or WebM (MP4 needs a full ffmpeg; the bundled one does WebM) - Capture targets: the whole viewport, a device preset, a fixed
--regionrect, or--element, whose crop follows the element as it moves - Declarative bounds β
--duration,--after,--after-element,--after-delay,--until-element,--until-element-gone,--until-idle, all under--timeout; a trigger that never fires still writes the manifest and exits non-zero - Frame manifest β
manifest.jsonbeside the JPEG frames, with per-frame timestamp, crop rect and SSIM against the previous frame, plus change points, frame gaps and correlated console/network events --captureontest-suiteandcognitive-journey, with--capture-fps,--capture-formatand--capture-outcapture_start,capture_stopandcapture_statusMCP tools (screen_capturecategory, tier 2)- Daemon-routed live capture β
navigate,click,fill,keyboardandpressfrom separate invocations drive the recorded page; an open-ended capture requirescbrowser daemon start keyboardcommand β key sequences of chords, named keys and literal text, with--selector,--hold,--repeatand--delayevaluateupgraded β--file,--arg,--json,--raw,--wait-forand--expect-truthy- Fixed:
daemon startwas broken by a barerequire()in an ESM module
v18.60+ (April 2026)
question_answertool β ask questions about CBrowser docsdeviceparameter onempathy_auditandagent_ready_auditfor mobile WCAG testing- WCAG-accurate scoring: proper contrast ratio calculation, AA vs AAA touch target thresholds
- Skip link exemption in barrier detection
- Centralized tool result auto-save via tier-gate wrapper
- Per-site analytics dashboard with 6 report tabs
- AI interpretation on all dashboard widgets
- FTS5 knowledge base (291 pages indexed)
- Prompt library with voting and copy tracking
- Visual report image interpretation via Claude Vision
v18.35 (March 2026)
- Site knowledge learning β builds a knowledge graph per site (Tool-Site-Model-Status)
- Page understanding β real-time page model from DOM analysis (Tool-Page-Understand)
- Cross-session state with AES-256-GCM encrypted cookies (Tool-Site-Profile-List)
siteFamiliaritytrait β controls how much site knowledge each persona has (Trait-SiteFamiliarity)- 4 new disability personas: Autism Spectrum, Intellectual Disability, Receptive Aphasia, Dyscalculia
- Empathy audit works with any persona (flags non-disability personas)
v18.24β18.28 (February 2026)
- Cognitive Optimal Transport β Wasserstein-based persona distance and attention maps
- Visual Transport Map (Tool-Transport-Map) β shows WHERE content moved between screenshots
- Attention analysis with saliency heatmaps (Tool-Attention-Analysis)
- 6-layer Sequential CTC: saliency, cognitive load, decision, motor, frustration, readability
v17.x (January 2026)
- 25 cognitive traits (expanded from 12) with research citations
- Trait reference matrix β 5 behavioral levels per trait
- Trait correlations β automatic adjustment of related traits
- Schwartz's 10 universal values framework (Values-Framework)
- Custom persona creation via questionnaire (Persona-Questionnaire)
- 130 MCP tools total
v16.x (December 2025)
- Persona questionnaire β research-backed custom persona creation
- AskUserQuestion integration for persona creation
- Tool count: 107 MCP tools
v11.x (October 2025)
- Self-efficacy trait β Bandura (1977) belief in problem-solving ability
- Satisficing trait β Simon (1956) "good enough" decisions
- Trust calibration β Fogg (2003) website trust with 8 signal types
- Interrupt recovery β Mark (2005) task resumption after distraction
- 12 core cognitive traits
v10.x (September 2025)
- Persona aliases for empathy audit (
motor-tremor,low-vision,adhd) - Research-grounded scoring with 13+ academic citations
- Banner blindness and tunnel vision simulation
- WebGazer saliency for gaze prediction
- Dual-process theory (System 1/2) simulation
- GOMS/KLM keystroke-level timing
v9.x (August 2025)
- Agent-ready audit, competitive benchmark, accessibility empathy mode
- Chrome extension for hybrid automation
- Deterministic cognitive journeys (all AI-driven)
- API-free persona comparison via session bridge
v8.x (July 2025)
- Cognitive user simulation with traits
- Vision mode for screenshot understanding
- Hover-before-click for dropdown navigation
- Daemon mode for persistent browser sessions
- Abandonment detection
v7.x (June 2025)
- Claude skill system
- AI visual regression
- Cross-browser testing (Chrome, Firefox, Safari)
- Responsive testing (mobile, tablet, desktop)
- A/B comparison
- Auth0 OAuth for claude.ai
v6.x (May 2025)
- Natural language tests (Natural-Language-Tests)
- AI test repair (AI-Test-Repair)
- Flaky test detection (Flaky-Test-Detection)
- Multi-persona comparison (Multi-Persona-Comparison)