We expect this release to ship in the DevTools of Chrome 112, and to PageSpeed Insights within 2 weeks.
Thanks to our new contributors 👽🐷🐰🐯🐻!
- Alex N. Jose @alexnj
- Alexandra White @heyawhite
- Amanda @apettenati
- Andrew Gutekanst @Andoryuuta
- Christopher Holder @ChristopherPHolder
- Dongkyun Yu (Steve) @hackurity01
- Floris @FMJansen
- Gabe @MrBrain295
- ghost_32 @k99sharma
- Littleton Riggins @TripleEquals
- lowkeyAngry @lowkeyAngry
- Michael McMahon @TechnologyClassroom
- Shogo Hida @shogohida
- Stoyan @stoyan
- Yang Guo @hashseed
In the 8.0 release, we described TTI's waning role, and today we have the followup. Time to Interactive (TTI) no longer contributes to the performance score and is not displayed in the report. However, it is still accessible in the Lighthouse result JSON.
Without TTI, the weighting of Cumulative Layout Shift (CLS) has increased from 15% to 25%. See the docs for a complete breakdown of how the Performance score is calculated in 10.0, or play with the scoring calculator.
Lighthouse now includes type declarations! Our example TypeScript recipe demonstrates how to achieve proper type safety with Lighthouse.
Since Lighthouse 5.3, the community-driven third-party-web
dataset has been used to summarize how every third-party found on a page contributes to the total JavaScript blocking time, via the third-party-summary
audit. With Lighthouse 10.0, we are adding a new property to the JSON result (entities
) to make further use of this dataset. Every origin encountered on a page is now classified as first-party or third-party within entities
. In 10.0, this classification is used to power the existing third-party filter checkbox.
In a future version of Lighthouse, this will be used to group the table items of every audit based on the entity it originated from, and aggregate the impact of items from that specific entity.
The Back/forward cache (bfcache for short) is a browser optimization that serves pages from fully serialized snapshots when navigating back or forwards in session history. There are over 100 different reasons why a page may not be eligible for this optimization, so to assist developers Lighthouse now attempts to trigger a bfcache response and will list anything that prevented the browser from using the bfcache. #14465
For more on bfcache, see the web.dev article.
Note: This audit initially will not be available for PageSpeed Insights.
The audit password-inputs-can-be-pasted-into
is now paste-preventing-inputs
. This audit's logic works just as before, but rather than just considering [type=password]
inputs, it now fails if any non-readonly input element prevents the user from pasting. #14313
Our documentation is no longer hosted on web.dev. For the most up to date audit docs, please go to developer.chrome.com/docs/lighthouse/
Under the hood, Lighthouse now uses the new user-flow supporting infrastructure by default, even for traditional navigation runs. You can opt out of this by: in the CLI, use --legacy-navigation
; in DevTools: check “Legacy Navigation” in the settings menu. If you have a use case that necessitates this escape hatch, please file an issue. We plan to remove this legacy path in 11.0.
Until now, there were two URL fields to describe a Lighthouse run:
requestedUrl
: the url given by the users, which Lighthouse instructs Chrome to navigate tofinalUrl
: the url after any server-initiated HTTP and JS-initiated redirects
This taxonomy cannot account for more complex scenarios, such as JS-initiated redirects, usage of the History API or soft-navigations. They were also ill-defined for timespan and snapshot modes. To account for that, Lighthouse 10.0 now has these URL fields:
- (changed)
requestedUrl
: The URL that Lighthouse initially navigated to before redirects. This is the same as it was before for navigation mode, but now it will beundefined
in timespan/snapshot. - (new)
mainDocumentUrl
: The URL of the last document requested during a navigation. It does not account for soft navigations or history API events made after the page loads. It is only available in navigation mode, and will be undefined in timespan and snapshot modes. - (new)
finalDisplayedUrl
: The URL displayed in the browser combobox at the end of a Lighthouse run. It accounts for soft navigations and history API events. Available in navigation, timespan, and snapshot modes. - (deprecated)
finalUrl
: Same value asmainDocumentUrl
.
password-inputs-can-be-pasted-into
->paste-preventing-inputs
preload-lcp-image
->prioritize-lcp-image
third-party-summary
no longer uses alink
value foritem.entity
, instead uses a rawtext
valuefull-page-screenshot
is no longer an audit, instead it is stored atlhr.fullPageScreenshot
. To suppress collection of the full-page screenshot in the CLI, you must migrate from--skip-audits full-page-screenshot
to--disable-full-page-screenshot
.
- Node 14 is no longer supported, the minimum is now Node 16
- In case you import paths within the lighthouse node package:
lighthouse-core/
andlighthouse-cli/
folders are now simplycore/
andcli/
- Converted from CommonJS to ES modules. You can still use lighthouse in CommonJS by using an dynamic import:
await import('lighthouse')
. For access to just thelighthouse
function in CommonJS, you can also userequire('lighthouse/core/index.cjs')
- The CSV output for Lighthouse is much more useful now. Consult the PR for an example of the new format
LHError
is nowLighthouseError
. If you are attempting to catch an error thrown by Lighthouse, be sure to account for this!
The lighthouse
function now has better integration with Puppeteer. Use lighthouse(url, flags, config, page)
to run Lighthouse, passing an existing Puppeteer.Page
handle as page
.
The user flow api has moved to the top level node entrypoint and can be imported with import {startFlow} from 'lighthouse'
.
New flow.startNavigation()
and flow.endNavigation()
functions let you define a user triggered navigation without any callback function. See the user flow docs for an example.
To change settings for a single user flow step, define the settings overrides on the toplevel flags options flow.snapshot({skipAduits: ['uses-http2']})
instead of on the settingsOverride
property.
To give a flow step a custom name, use flow.snapshot({name: 'Custom name'})
. Previously this was done via stepName
.
- To work in Lighthouse 10.0, custom gatherers will need to implement the new Gatherer interface (an example). Otherwise, they will only work in legacy navigation mode and older versions of Lighthouse
- Lighthouse cannot use
passes
to load the page multiple times in navigation mode anymore. If you need to load the page multiple times, we recommend using a user flow. See our config docs for instructions on how to convert to the new config format - The
ScriptElements
artifact is nowScripts
, with a slightly different shape Audit.makeOpportunityDetails
andAudit.makeTableDetails
now accept an options object as the third parameter. This ends up being a breaking change for justAudit.makeOpportunityDetails
.
- [BREAKING] apple-touch-icon: remove audit (#14243)
- [BREAKING] vulnerable-libraries: remove audit (#14194)
- [BREAKING] full-page-screenshot: remove audit, move to top-level (#14657)
- [BREAKING] scoring: rebalance perf metric weightings for v10 (#14667)
- [BREAKING] third-party-summary: change item.entity from link to text (#14749)
- [BREAKING] refactor csv output (#13558)
- [BREAKING] emulation: retire moto g4, use moto g power (#14674)
- [BREAKING] emulation: bump chrome UA to m109 and drop LH identifier (#14384)
- [BREAKING] rename preload-lcp-image to prioritize-lcp-image (#14761)
- [BREAKING] audit: add options param to make{Table,Opportunity}Details (#14753)
- restructure types for direct import and publishing (#14441)
- add entity classification of origins to the LHR (#14622, #14744)
- no-unload-listeners: move to best practices (#14668)
- viewport: support interactive-widget (#14664)
- preload-lcp-image: get LCP image url from trace (#14695)
- use
performance.now
in isolation (#14685) - add initiatorRequest from async stacks and preloads (#14741)
- processed-navigation: computed directly from trace (#14693)
- add
usePassiveGathering
flag (#14610) - finalize master => main branch rename (#14409)
- is-crawlable: only warn if some bots are blocked (#14550)
- doctype: check for limited quirks mode (#14576)
- add
BFCacheFailures
artifact (#14485) - use LCP specific message for NO_LCP (#14556)
- i18n: fix path bug resulting in invalid i18n id via npx (#14314)
- warn when clear storage times out (#14476)
- expose default and desktop configs on
index.js
(#14543) - remove globals from
externs.d.ts
(#14537) - merge
api.js
intoindex.js
, new report generator api (#14531) - remove deprecated flags check (#14454)
- make
bypass
,th-has-data-cells
, andvideo-caption
informative (#14453) - save lhr to latest-run/ for -A, not just -GA (#14414)
- remove
fraggle-rock
directory (#14377) - use-landmarks: fix missing markdown in description (#14608)
- remove sd-validation audit files (#14391)
- remove replay stringify extension (#14330)
- rename url-shim to url-utils, stop extending global URL (#14360)
- deprecate passes, remove config navigations from FR (#13881)
- rename pwmetrics-events to metric-trace-events (14258)
- remove trace-of-tab (#14237)
- return result for xhtml, but with warning (#12351)
- move network recorder and monitor to EventEmitter (#14152)
- make session an event emitter (#14147)
- update SourceMap build to use newest frontend and ParsedURL (#14108)
- move target manager a driver component (#14122)
- handle sessions inside target-manager (#14106)
- save native getBoundingClientRect to avoid overrides (#14002)
- log
requestedUrl
with unexpected value (#14010) - make
requestedUrl
optional (#13816) - fix build-sample-reports (#13865)
- use
mainDocumentUrl
instead offinalUrl
(#13793) - remove
context.url
(#13806) - append sourceURL comment to eval code (#13754)
- expand URL artifact (#13776)
- always use
MainResource
for main document (#13756) - accessibility: link audits directly to axe docs (#13876)
- build: inline-fs error if file missing, ignorePaths (#14436)
- cdp: update HTTP method for /json/new call (#14063)
- computed-artifacts: convert to named exports (#14352)
- config: use fr config to construct the legacy config (#13965)
- config: make module resolution async (#13974)
- connection: drop /new tab creation fallback (#14012)
- crc: exclude non network nodes from being a leaf (#9801)
- csp-xss: prevent meta warning if header CSPs are secure (#14490)
- refactor audits to use async syntax (#14542)
- cumulative-layout-shift: deprecate m89 check (#14085)
- devtools-log: consolidate implementation into gatherer (#14080)
- devtoolslog: include Target and Runtime domains (#14101)
- doctype: check document.compatMode for quirks mode (#12978)
- doctype: fix mistaken text saying name must be lowercase (#13888)
- dom-size: display metric values as integers (#14479)
- driver: guard verbose logic behind log.isVerbose check (#14086)
- driver: do not use target manager in legacy mode (#14079)
- fetcher: remove iframe fetcher (#13923)
- font-size: use order from protocol as implicit specificity (#13501)
- fps: limit height at max webp size (#14499)
- fps: use observed metrics for screenshot dimensions (#14418)
- fps: make lhId less dependent on chrome internals (#14272)
- full-page-screenshot: use webp instead of jpeg (#13828)
- i18n: delete
i18n.createMessageInstanceIdFn
(#14251) - image-elements: use execution context isolation (#14005)
- index: update api helpers to use FR (#14011)
- js-usage: remove debugger domain (#13753)
- lantern: add network timings to debug traces (#14571)
- lantern: add comment to about node times being in microseconds (#14568)
- lantern: divide throughput only on network node count (#14564)
- largest-contentful-paint: remove m79 check (#14082)
- layout-shift-elements: add link to documentation (#14466)
- legacy: create legacy directory under core (#14341)
- legacy-javascript: key on script id, not url (#13746)
- listitem: mention li can be contained by a menu (#13927)
- manifest: remove css color verification (#14447)
- network-monitor: resolve server redirects (#13790)
- network-request: use ms instead of seconds (#14567)
- page-dependency-graph: compute using URL artifact (#13772)
- plugins: allow
supportedModes
in category (#13921) - preload-lcp-image: be specific about when to do this (#13771)
- replay: fix stringify extension (#14297)
- replay: @puppeteer/replay stringify extension (#14146)
- user-flow: passively collect full-page screenshot (#14656)
- network-request: switch to improved timing names (#14721)
- network-request: add rendererStartTime (#14711)
- legacy-javascript: upgrade babel and core-js (#14712)
- fr: preserve scroll position in gatherers (#14660)
- bf-cache: link to chrome developer docs (#14699)
- bf-cache-failures: pause on the temporary page (#14694)
- fix protocol errors from late frame navigation (#14716)
- remove util.cjs (#14703, #14709)
- rename
Config.Json
toConfig
(#14673) - use
config
to name every config json (#14649) - legacy: convert some base artifacts to regular gatherers (#14680)
- scoring: update expected perf score for flow fixtures (#14692)
- trace-processing: add backport for pubads (#14700)
- trace-processor: refactor processEvents and frameEvents (#14287)
- script-treemap-data: create node for each inline script (#13802)
- scripts: narrow to only listen to parsed events (#14120)
- scripts: use scriptId as identifier for scripts (#13704)
- smoke: replace --invert-match cli option with --ignore-exclusions (#14332)
- smoke: support a per-runner test exclusion list (#14316)
- source-maps: throw explicit error when map is missing required fields (#14060)
- target-manager: only listen to LH sessions (#14385)
- types: use union of
puppeteer
andpuppeteer-core
(#14435) - user-flow: update UIString comments (#14458)
- user-flow: add base flags option (#14459)
- user-flow: cleanup types (#14442)
- user-flow: i18n default names (#14455)
- user-flow: start/end navigation functions (#13966)
- uses-responsive-images: higher threshold with breakpoints (#13853)
- viewport: fix tap delay link (#14460)
- page-functions: remove all
*String
exports (#14374) - internalize resolved configs (#14589)
- asset-saver: save flow artifacts in separate files (#14599)
- replace
Page.getResourceTree
withPage.getFrameTree
(#14663) - js-usage: ignore puppeteer_evaluation_script (#13952)
- use main-frame LCP trace element (#14760)
- full-page-screenshot: get screenshot, nodes concurrently (#14763)
- config: prevent custom gatherer interference (#14756)
- valid-source-maps: validate url in first-party check (#14758)
- disconnect Puppeteer when started by Lighthouse (#14770)
- use
resolvedConfig
to name every resolved config (#14600) - rename resolved config types (#14647)
- remove trace-of-tab references (#14590)
- disable bf-cache in lr/psi (#14774)
- [BREAKING] update flow API for 10.0 (#14388)
- [BREAKING] replace
configContext
withflags
(#14050) - add page to context (#14359)
- always run NetworkUserAgent gatherer (#14392)
- index test parity (#13867)
- do not monkey patch puppeteer session.emit (#14087)
- minor renames: cdpSession, defaultSession, requestfinished (#14097)
- [BREAKING] use fraggle rock (user flow) runner by default, deprecate legacy navigation runner (#13860)
- [BREAKING] remove --print-config (#14585)
- error early if --output-path is invalid (#14367)
- throw error if running x64 node on mac arm64 (#14288)
- thumbnails: increase res and display, reduce number (#14679)
- use entity classification to filter third-parties (#14697)
- fix compat for older lighthouse reports (#14617)
- sticky table headers (#14508, #14748, #14766)
- reuse numberFormatters for ~50% performance gains (#14493)
- expand on "learn more" links (#14091)
- prevent opportunity savings from wrapping (#14619)
- screen emulation and dpr in meta tooltip (#14515)
- use narrow formatting for opportunity units (#14723)
- filter
lcp-lazy-loaded
with LCP audits (#14724) - reduce stuttery feel of gauge animation (#14513)
- limit screenshot thumbnail height (#14511)
- use
focus-visible
for the three-dot menu (#14497) - link accessibility audits to new docs (#14400)
- remove extra space from screenshot preview (#14424)
- set minimum width of element screenshot preview (#13856)
- prevent breaking words in opportunity text (#14329)
- handle non-numeric numericValues in calc link (#10880)
- avoid css issue with border when hoisting meta block (#13877)
- dom: support code snippets within markdown links (#14121)
- flow: fix ui strings not being bundled (#14427)
- fix wording when screenEmulation disabled (#14587)
- specify in tooltip that cpu/memory power is unthrottled (#14704)
- devtools: fix wrong emulation string in meta block (#14672)
- rename i18n to i18n-formatter, move strings to Util (#13933)
- remove eslint --fix step in report generation (#13864)
- consolidate table headers (#14315)
- [email protected] (#14244, #14706)
- [email protected] (#14713)
- [email protected] (#14070)
- [email protected] (#14690)
- [email protected] (#14546)
- latest chrome-devtools-frontend (#14606)
- switch third-party-web dataset to entities-nostats subset (#14548)
- [email protected] (#14646, #14058)
- update typescript-eslint for tsc 4.7 (#14111)
- [email protected] (#14221)
- latest CDT packages (#14293)
- bump node-fetch from 2.6.1 to 2.6.7 (#13759)
- [email protected] (#13902)
- update quibble fork to work with new loader api (#14366)
- re-sync yarn.lock file (#14403)
- viewer: ga event for flow-report (#13932)
- lr: expose computeBenchmarkIndex (#14582)
- lr: export primary api, presets from lr bundle (#14425)
- lr: add FR navigation support (#13901)
- lr: run benchmark repeatedly given special query parameter (#14075)
- psi: expose hasLocale in bundle types (#14325)
- localize units in report formatter (#13830)
- fix broken description in installable-manifest audit (#14444)
- update comments to match expanded "learn more" links (#14446)
- remove default granularity values from formatter (#13839)
- replace placeholder using replacer callback (#14109)
- fix i18n filename path on windows (#14220)
- fix collect-strings on windows with pathToFileURL (#14201)
- handle string placeholder collisions (#14432)
- reduce unnecessary message formats (#14030)
- import strings (#14768)
- update web.dev links to new developer.chrome.com home (#14581)
- fix multiline xvfb-run command (#14471)
- remove gulp recipe (#14183)
- remove git.io shortlinks (#13911)
- fix some broken links (#13872)
- architecture: update to reflect FR changes (#14017)
- budgets: add example using config (#14278)
- config: revert #14321 (#14323)
- config: update to reflect changes in FR (#14321)
- proto: update protobuf installation guidance (#14558)
- readme: drop dead and unmaintained services/projects (#14338)
- readme: update devtools screenshot, better alt (#14563)
- readme: add Auditzy and Lighthouse Metrics to services list (#13976)
- releasing: dependencies that should always be up to date (#14156)
- user-flows: fix the order of the mode thumbnail images (#14219)
- user-flows: refactor document (#14021)
- user-flows: add instructions for DevTools (#14009)
- user-flows: update api usage (#13826)
- update user-flow.md to reflect current release (#14604)
- config: add plugins property (#14645)
- fix outdated code and command line in hacking tips (#14720)
- changelog: add 9.6.x release notes (f03850a)
- update custom gatherer recipe for 10.0 (#14765)
- reintroduce changes to flows for 10.0 (#14710)
- update docs/readme.md for 10.0 (#14457)
- update puppeteer auth example for 10.0 (#14195)
- config: update to reflect changes in FR (#14324)
- plugins: update to reflect changes in 10.0 (#14322)
- puppeteer: update to reflect FR changes (#14319)
- recipes: update custom-gatherer-puppeteer to use FR (#13940)
- user-flows: use new api location (#14533)
- fix timings in update-flow-fixtures.js (#14591)
- fix mocha test runner and mocks on windows (#14202)
- upgrade protobuf test to use python 3 (#14557)
- dynamically import all modules when using mocks (#14468)
- fix node version in weekly cron (#14534)
- fix mocha test paths for windows (#14464)
- assert to assert/strict (#14412)
- add missing await on promise assertions (#14437)
- static-server can continue if already running (#14307)
- reformat trace fixtures (#14279)
- use workers, Mocha node api instead of calling the CLI (#14215)
- sync BUILD.gn files for devtools e2e tests (#14184)
- move readJson from root.js to test-utils.js (#14175)
- replace jest with mocha (#14054)
- add devtools e2e test runner (#14110)
- disable
perf-diagnostics-third-party
for FR (#14092) - use readJson instead of imports for json (#14020)
- move webtest expectations to platform/generic (#13997)
- add eslintrc jest env and remove all the env comments (#13954)
- fix unconverted test (#13959)
- replace $0 in cli-flag snapshots (#13922)
- add temp fix for failing deprecations smoke test (#13930)
- default to chrome-launcher path (#13912)
- assert what axe checks matches our a11y audits (#12699)
- use cache instead of artifacts for devtools build (#13840)
- fix flaky isPositionFixed check in oopif-scripts (#13855)
- temporarily disable oopif-scripts smoke for devtools (#13859)
- fix invalid artifact name for devtools smoke failures (#13841)
- fix smoke shard total in CI (#13844)
- upload smoke failures for devtools (#13794)
- improve logging for devtools smoke runner (#13781)
- increase smoke shards from 2 to 3 (#13792)
- clean devtools repo in CI (#13758)
- asset-saver: use .tmp instead of pwd for temp file (#14140)
- ci: force color output in CI (#14580)
- ci: add node 18 to test matrix (#13874)
- ci: shard all smoke tests (#13968)
- ci: sample flow result check (#13728)
- config-helpers: restore process.cwd after mocking (#14036)
- crq: call setExtrasFn before using the urls (#13910)
- dbw: ignore
webkitStorageInfo
deprecation in m110 (#14541) - devtools: sync e2e (#14577)
- devtools: sync e2e (#14544)
- devtools: sync e2e tests (#14451)
- devtools: ensure device emulation is ready (#14431)
- devtools: sync e2e tests (#14426)
- devtools: sync e2e (#14389)
- devtools: sync e2e tests (#14373)
- devtools: sync e2e tests (#14365)
- devtools: add i18n to e2e navigation test (#14294)
- devtools: inject custom config directly (#14285)
- devtools: sync e2e tests (#14236)
- devtools: use linux for CI (#14199)
- devtools: remove webtests, sync e2e tests, use release mode (#14163)
- devtools: extend yarn timeout (#13878)
- devtools: reduce concurrent job number (#13797)
- devtools: bump cache (#13755)
- devtools: support dbw smoke (#14616)
- devtools: use correct build folder for e2e tests (#14613)
- docs: clear problematic cache (#13941)
- eslint: add import/order rule for core tests (#13955)
- fr: snapshot audit id lists in api test (#13994)
- lantern: correctly clear old trace data (#13809)
- smoke: check runner result is sensible before using (#14343)
- smoke: check lhr.environment exists in version check (#14320)
- smoke: remove external domains from perf-preload (#14289)
- smoke: check objects against a subset of keys (#14270)
- smoke: enable more DevTools tests (#14224)
- smoke: test fr navigations in devtools (#14217)
- smoke: use DevTools runner through node directly (#14205)
- smoke: use fraggle rock as the default (#13951)
- smoke: reenable oopif smokes with ToT (#14153)
- smoke: disable
oopif-scripts
in FR (#14150) - smoke: disable
oopif-requests
(#14148) - smoke: make oopif-requests assertions more specific (#14100)
- smoke: print multiple differences (#14141)
- smoke: add tests for report-assert.js (#14138)
- smoke: use major milestone (#14104)
- smoke: increase windows retries (#14022)
- smoke: run bundle smokes in a worker (#13947)
- smoke: realign byte ranges (#13920)
- smoke: disable
lantern-idle-callback-short
(#14670) - smoke: disable metrics-tricky-tti for M112 (#14762)
- topbar: replace module mock with dependency injection (#14057)
- unit: fix node to 16.16 (#14333)
- rewrite fake timer usage to reduce isolation (#14595)
- add computed/metrics/interactive-test.js to tsconfig (#13071)
- better times for generated network requests (#14714)
- [BREAKING] rename LHError to LighthouseError (#14173)
- inp: switch proccessing "delay" to "time" (#13999)
- document where network timings come from (#14227)
- split lhr compat code to lib/lighthouse-compatibility.js (#14701)
- update tsconfig.json (e2f7e75)
- fix broken link for PWA checklist (#14240)
- include used files in flow-report tsconfig (#14174)
- only run scheduled publish job if there are new commits (#14145)
- prevent forks from running cron job (#13973)
- use top-level await (#13975)
- remove
createCommonjsRefs
(#14004) - shim fs out of lightrider report generator bundle (#14098)
- replace appendChild with append (#13995)
- also update flow json in update:sample-json script (#13936)
- generate snapshot/timespan reports from sample flow result (#13937)
- use a unique local port for the treemap (#14308)
- set encoding on streams for unicode correctness (#13780)
- lantern-trace-saver: fix request finishTime (#14198)
- build: remove lighthouse shim no longer necessary for plugins (#14538)
- build: remove non-functional package.json shim (#14536)
- build: extract bfcache strings from devtools (#14452)
- build: use git-describe for build bundle version header (#14347)
- build: fix smokerider bundles (#14267)
- build: shim unneeded deps in lr report generator (#14773)
- change default build folder for devtools gn (#14492)
- fix broken links in changelog (#14130)
- mark build folder as not generated for GitHub UI (#14192)
- rename eslint config files to .cjs (#14172)
- restore expected newline padding around imports (#13998)
- fix gcp-collection scripts (#14625)
- update vercel deployment config (#14588)
- assets: update logo (#13919)
- mark dependencies of entity classification computed artifact (#14732)
- fix issues found in some strings from localizers (#14740)
- exclude core/util.cjs from code coverage (#14688)
- github: mark styles.css as not generated (#14754)
- allow multiple nightlies to be published in a day (#14767)
- lint: enable no-conditional-assignment rule (#14757)
- add brendan back to triage rotation (#13838)
See the older changelog for pre-10.0 revisions.