`
happens to wrap most of the page.
### Component and Team-Level Performance
For a large application or design system, stable `containertiming` identifiers
could become a useful contract between component owners and RUM:
* `global-navigation`
* `account-summary`
* `quote-panel`
* `checkout-form`
* `order-confirmation`
Teams could compare the first render, initial paint span, and number of
substantial updates for their own surfaces across releases. This gives
performance ownership a much more recognisable shape than asking every team to
explain its contribution to page-level LCP.
The identifiers need governance. Renaming `quote-panel` to `quote-card-v2` or
reusing the same identifier for different experiences will silently break the
time series. Treat them like analytics event names, not CSS classes.
## What Container Timing Is Not
New performance APIs are very easy to over-promote, so a few boundaries are
worth making explicit.
### It Is Not a New Core Web Vital
Container Timing does not change [the LCP
algorithm](https://github.com/WICG/container-timing#lcp-integration), and its
entries are not a new metric in CrUX or the Core Web Vitals programme. It is
application instrumentation built on the performance timeline.
That is a feature. The whole point is to represent regions that only the
application can identify.
### It Is Not ‘Component Ready’
Paint is not readiness.
A form can paint before its validation code is available; a chart can appear
while its data is stale; a button can render before its event listener is
attached. If the metric name promises interactive, usable, hydrated, accurate,
or complete, Container Timing alone is insufficient evidence.
Name the result after what it actually measures: _Product Summary Latest
Contentful Paint_ is clumsy but honest; _Product Summary Ready_ needs more
proof.
### It Is Not Visual Completeness
The `size` property is not a percentage. It is the cumulative area of qualifying
painted regions, with no authoritative denominator for what the component will
eventually become. The container may grow, move, reveal below-the-fold content,
or add new descendants later.
We can derive a product-specific progress model if we control the final
geometry, but the API does not hand us ‘83% complete’.
### It Is Not Free Reinstrumentation
The [Blink intent](https://groups.google.com/a/chromium.org/g/blink-dev/c/1uvAGNd2uME)
says overhead is limited to pages that enable the feature, with the
implementation piggybacking on rendering work that already happens. That is
encouraging, but it is not an invitation to annotate every ``.
Use it on a small number of important, semantic regions; sample RUM collection;
and measure the measurement on the devices your users actually have.
## Trying the Chrome Origin Trial
At the time of writing, Container Timing is experimental and the [WICG
explainer lists an origin trial from Chrome 148 to
153](https://github.com/WICG/container-timing#container-timing-explainer).
The API was developed by Bloomberg, implemented in Chromium by Igalia, and the
trial is intended to test its instrumentation model, entry shape, buffering,
nesting behaviour, and real-world ergonomics.
That is what an origin trial is for. It is access to a proposed feature for
field testing, not a promise that every name and behaviour is now permanent.
To enable it for real visitors:
1. register for Container Timing on Chrome’s [origin-trial
site](https://developer.chrome.com/origintrials/);
2. add the origin-specific token to the relevant pages, either as an HTTP
response header:
```http
Origin-Trial: TOKEN_GOES_HERE
```
or in the document ``:
```html
```
3. add `containertiming` to the important regions in the server-rendered HTML;
and
4. feature-detect before registering the observer.
Chrome’s [origin-trial
documentation](https://developer.chrome.com/docs/web-platform/origin-trials)
explains token scope, renewal, iframes, and how to verify enrolment in DevTools.
For local development without a token, enable _Experimental Web Platform
features_ at:
```text
chrome://flags/#enable-experimental-web-platform-features
```
Alternatively, launch Chrome with:
```sh
--enable-blink-features=ContainerTiming
```
The `containertiming` attribute itself is harmless in browsers that do not
support the API. Feature-detect the observer code like this:
```js
if (typeof PerformanceContainerTiming !== 'undefined') {
// Register the PerformanceObserver here.
}
```
During the trial, this constructor check is preferable to relying only on
`PerformanceObserver.supportedEntryTypes`. Chrome’s guidance warns that the
latter is frozen on first access and can misreport if it is read before the
origin-trial token has been processed.
Finally, put the attribute in the original HTML or set it before inserting the
element into the document. Adding it after the component has already started
painting means those earlier paints are gone; the observer can only report
subsequent qualifying updates.
## Browser Support and Standardisation
Container Timing is not Baseline and should not yet be treated as a universally
available production primitive.
Chromium has the implementation and origin trial. Mozilla has recorded
a [positive standards position](https://github.com/mozilla/standards-positions/issues/1155)
and has been working on an implementation; WebKit’s [standards-position
request](https://github.com/WebKit/standards-positions/issues/442) remains open.
The proposal itself is still in the [Web Incubator Community
Group](https://wicg.github.io/container-timing/), with discussion taking place
in and around the W3C Web Performance Working Group.
The specification also has known gaps. Shadow DOM is out of scope for this first
version, composite elements such as SVG and MathML are not automatically
treated as containers, and the ignore mechanism may still change.
Progressive enhancement is easy enough here: unsupported browsers continue as
normal, and our RUM receives Container Timing data only where the feature
exists. The harder problem is analytical bias. An origin-trial dataset is
Chromium-heavy by definition, so do not mistake its numbers for a
browser-neutral population.
{% include promo.html %}
## What I Would Measure First
I would not begin by inventing one new company-wide metric called _Container
Ready_.
I would choose one important component that:
* appears on a high-volume journey;
* contains several independently rendered parts;
* is not represented well by LCP or one Element Timing entry; and
* has a clear owner who can explain how it is assembled.
A product summary, search-results region, account overview, or flight-search
result would all be good candidates.
For a sampled group of Chromium sessions, I would collect:
* the container’s first render time;
* every cumulative `size` and `startTime` during the initial loading window;
* the tag name of `lastPaintedElement` for diagnosis;
* the first user interaction time within that component; and
* the standard page-level metrics alongside it.
Then I would look at the evidence before naming the metric. Perhaps first render
correlates best with user behaviour. Perhaps the last large area increase is
more stable. Perhaps the interesting finding is not the endpoint at all, but
that one release turned a two-stage component into a six-stage one.
That, to me, is the promise of Container Timing. It does not try to replace
Core Web Vitals, and it does not pretend that the browser understands our
product. It gives us lower-level rendering evidence at a much more useful
boundary, then lets us apply our own domain knowledge.
Element Timing asks when one thing rendered. Container Timing lets us ask how
the thing our user actually recognises came together.
That is a materially larger—and philosophically much more interesting—step.