DEVELOPER TOOLKIT / V1.2

HTTP TOOLING · LOCAL PROCESSING · NO ACCOUNT

Client Hints Generator.
Build, test & debug UA-CH.

Generate User-Agent Client Hints, prepare server configurations, and compare HTTP responses. Observe the hints your browser actually sends, investigate missing values, and check compatibility before deploying.

Build reproducible test cases with seven editable browser profiles, export cURL commands, and inspect Accept-CH, Critical-CH and Vary. Keep synthetic requests separate from real browser observations.

Request workspace

Example profiles, never a browser identity guarantee

01 Configure the client

These version controls apply to the seven named browser fixtures. Brands and versions are illustrative, not captured profiles or claims of current releases. Read your browser for observed low-entropy values. Chromium base versions differ by browser and release (Samsung Internet, Opera and Android WebView do not necessarily match Chrome); check the browser’s own About page before editing them.

Synthetic fixtures. Version numbers are editable, not claims about the latest browser.

Browsers decide which hints to disclose. A server opt-in does not guarantee delivery. Reading this browser clears any fixture values first, so real and synthetic values are never mixed. Values are read locally and are not sent anywhere.

02 Reproduce the request

cURL performs a GET, prints response headers, discards the body and does not follow redirects. It sends your chosen values; it does not emulate browser negotiation or TLS fingerprints.

03 Extended hints & deployment

EXPLICIT OPT-IN

UA-CH above covers all ten current UA hint fields. Enable additional fields individually below. Draft and legacy fields are included for controlled testing; availability differs by browser, version, policy and request type. This registry does not promise universal browser support.

Device, images, preferences, network & legacy fields

Select HTTP server opt-in, Nginx or Apache in Output format to export. Critical fields are also added to Accept-CH and Vary. Snippets need review against existing header inheritance, cache/CDN configuration and modules. Cross-origin delegation requires a separate Permissions-Policy configuration and HTTPS; Accept-CH alone does not grant it.

Sources: MDN hint families (opens in a new tab) · Responsive image draft (opens in a new tab) · Preference draft (opens in a new tab). Registry reviewed October 18, 2026.

04 Compare two real responses

RUN IN YOUR TERMINAL

Test one URL with the configured profile (A) and a second UA profile (B). Enabled extended hints are shared by A and B; the no-UA-CH fallback B sends none. Capture status, response headers and bodies, then compare the evidence.

Configure profile A and a target URL above, then build the script.

POSIX shell with curl, diff, cmp and cksum (WSL / Git Bash on Windows). Each run creates a private temporary directory and keeps responses there. Bodies may contain sensitive information. Dynamic content, time and cache state may also cause differences. No automatic redirects, cookies or credentials.

05 Browser negotiation lab

REAL NAVIGATION + REQUEST

Choose the UA hints to request. Request 1 is a top-level navigation to /api/optin, whose response carries Accept-CH. The page then reloads, and request 2, sent by the reloaded page, records which hints this browser now sends. Chromium stores Accept-CH preferences from navigation responses, not from fetch() responses, so a single page cannot observe the change without a navigation.

Hints to request from this browser

Labels do not change browser requests. Select Sec-CH-UA-Full-Version-List above to request exact reported versions; those values may still be withheld.

Not run. Requires the included Node server on localhost, or the deployed /api/optin and /api/echo endpoints over HTTPS.

Running the experiment sends this browser’s UA-CH to this origin, including any high-entropy values you select. Request 1 passes back only the names of the hints it received, in the return address; values are reported from request 2. The pending run and up to 20 completed reports are kept in this tab’s sessionStorage until you clear them or close the tab. The lab does not send the synthetic profile or contact your target URL.

06 Observed browser results

LOCAL SESSION EVIDENCE

Run the browser negotiation experiment above to record real HTTP observations from this browser. To test another browser or version, open this lab there and export its report. Fixtures and cURL runs do not populate these results.

No completed runs. Results stay in this tab’s sessionStorage until you clear them or close the tab.

Reports include selected hints, observed values, timestamps, origin, declared browser/version labels and reported version metadata when available. Review them before sharing. A missing hint is an observation, not proof of incompatibility.

07 Server response inspector

PASTED EVIDENCE

Choose cURL above, run it in your terminal, then paste the response headers below. This inspector does not contact the target. Inspect each redirect response separately.

No response analyzed. No network request has been made.

Header checks cannot prove that a server used a hint. Compare status, body and cache behavior across controlled requests to verify adaptation.

08 Compatibility by header & browser

DOCUMENTED SUPPORT

Version ranges describe published compatibility data. They do not prove that a hint will be sent in a particular context. Aliases, flags, partial support and removals are shown separately; unknown records remain unknown. Accept-CH, Critical-CH and deprecated Content-DPR are response headers.

No version lookup performed.

Source: MDN browser-compat-data (opens in a new tab) · Data license (opens in a new tab). This is a dated local snapshot; it makes no third-party requests while you use the tool.

Small headers. Important boundaries.

FIELD GUIDE

Opt-in is a conversation

Supporting browsers generally send brand, mobile and platform hints on secure origins. The server requests additional hints with Accept-CH for later requests. Missing hints must remain a supported path.

Cache only what you vary

Use Vary for request fields that actually change the representation. Adding every high-entropy hint can fragment a shared cache. This inspector flags review points, not confirmed cache vulnerabilities.

Metadata is not identity

Client Hints can be forged outside a browser. They cannot authenticate a user, prove device performance or establish trust. Prefer feature detection for capabilities and request only data you need.

Start with modules 01–03 to build a request and configure opt-in. Use modules 04–07 to collect evidence, then compare the outcome with documented support in module 08. See the implementation FAQ below for troubleshooting steps.

Client Hints implementation FAQ

24 PRACTICAL QUESTIONS

Answers for implementing, debugging and testing Client Hints in browser applications, origin servers and CDN workflows. Follow the linked modules above to reproduce a result rather than relying on a generated profile alone.

Client Hints and browser migration

What are User-Agent Client Hints (UA-CH)?

UA-CH exposes browser and platform metadata through structured HTTP request headers and, in supporting browsers, navigator.userAgentData. Use it where your application needs that metadata; it does not directly measure browser capabilities. Start with module 01 to inspect the header shapes.

Do Client Hints completely replace User-Agent today?

Do not assume a universal replacement. Support varies by browser, field and policy, and some clients send no UA-CH. Keep a functional fallback while migrating specific parsing rules, and check the dated compatibility matrix before changing production behavior.

What is the difference between low- and high-entropy hints?

The basic UA-CH fields describe brands, mobile preference and platform. More detailed values, such as model, architecture or full versions, are higher entropy and require an opt-in scenario for browser delivery. The client may withhold values even when a server asks for them.

Which browsers and versions can I test here?

There are named synthetic fixtures for Chrome, Edge, Opera, their listed Android variants, Samsung Internet and Android WebView. The matrix provides documented version information for these seven targets. Real delivery must be tested in the actual browser or embedded WebView; selecting a fixture does not launch that browser.

Why can the brand list contain an unfamiliar brand?

UA brand lists can include deliberately unfamiliar GREASE-style entries and need not have a fixed order. Avoid rejecting a client because one brand is unknown. Use a Structured Fields-aware parser and test unknown brands as part of your migration.

Should I use Full-Version or Full-Version-List?

Use Sec-CH-UA-Full-Version-List when full browser versions are needed and supported. Sec-CH-UA-Full-Version remains available here as a deprecated test field. In module 05, explicitly select Full-Version-List to request reported full versions; they may still be withheld.

Server configuration and missing hints

How do I request high-entropy hints with Accept-CH?

Return an Accept-CH response header listing the request-header names you need on the HTML document (navigation) response. For example, Accept-CH: Sec-CH-UA-Arch, Sec-CH-UA-Bitness asks a supporting browser to consider sending those fields on subsequent eligible requests. Chromium does not store Accept-CH received on fetch() or other subresource responses. Generate an opt-in snippet in modules 02–03, then check actual delivery in module 05.

Why am I not receiving Sec-CH-UA-Model?

Check that the actual response requests it through Accept-CH, that the browser supports it and that the context and applicable policies allow delivery. Then compare later requests, not just the initial navigation. An empty quoted model can also be a valid result, especially for desktop scenarios; absence alone is not proof of a server failure.

How do I configure Client Hints in Nginx or Apache?

Select the needed fields, enter Vary/Critical-CH names in module 03, then choose the Nginx or Apache output in module 02. Review the generated snippet for your server scope, modules and existing headers. Test the configuration before deployment; this site does not apply changes to your infrastructure.

What is the difference between Accept-CH, Critical-CH and Vary?

Accept-CH requests hints. Critical-CH identifies hints essential before rendering, which can affect retry behavior in supporting browsers. Vary tells caches which request fields distinguish representations. Our generator also includes selected critical fields in Accept-CH and Vary, but you must check how your server and CDN combine existing headers.

How do I delegate UA-CH to another origin?

Choose the UA-CH Permissions-Policy output and enter an HTTPS origin in module 03. Review the receiving origin’s opt-in, browser support and any iframe allow configuration relevant to your use case. Delegation is separate from CORS; it does not authorize arbitrary cross-origin JavaScript access.

Why does Android WebView behave differently from Chrome Android?

A WebView is embedded by an Android application, whose configuration and installed WebView version can affect user-agent metadata. A Chrome Android test does not certify that app’s WebView. Run the lab inside the target app where possible and record the actual WebView/app environment with your exported evidence.

Reproducible tests and evidence

Can browser JavaScript send any Sec-CH header I choose?

Browser JavaScript cannot freely set reserved Sec-* request headers. Use the generated cURL command for a controlled custom-header request, and the negotiation lab for values the actual browser supplies. These are different experiments and should not be presented as interchangeable evidence.

How can I compare desktop and mobile server responses?

Set profile A in module 01, enter your URL in module 02, and choose a contrasting profile B in module 04. Build the script and run it in a POSIX shell. Inspect status, headers and bodies, then repeat with stable application/cache conditions before concluding that UA-CH caused a difference.

Does the A/B script simulate a complete browser?

No. It sends selected headers with cURL and records HTTP evidence. It does not reproduce browser negotiation, JavaScript execution, UA string consistency or TLS fingerprints. The script can reveal response differences, but dynamic pages and cache state can also produce them.

How do I record results for an exact browser version?

Open module 05 in the actual browser/version, select Full-Version-List if needed and run the experiment. Module 06 exports user-declared labels separately from browser-reported metadata and observed headers. If exact versions were not disclosed, preserve that uncertainty rather than treating a typed label as verified.

Why are detailed hints already present in request 1?

The browser stored an opt-in for this origin from an earlier navigation response with Accept-CH, for example a previous run. Select Clear origin opt-in in module 05; it navigates to a response with an empty Accept-CH header. Then run the experiment again. A clean browser profile or another local server port also gives a fresh origin. Record the conditions with your evidence.

Can I use these commands directly in PowerShell?

The current cURL examples and A/B script target a POSIX shell. On Windows, use WSL or Git Bash and follow the README. Shell quoting and paths differ from native PowerShell, so do not assume the generated script is a PowerShell recipe.

Caching, security, privacy and technical SEO

Should every requested hint be added to Vary?

Only use request fields in the cache key when they actually distinguish the representation, or configure an equivalent cache strategy at the edge. Unnecessary high-cardinality fields can fragment caches. Test both requests with and without hints; Accept-CH by itself does not mean that your response varies by every requested field.

Do Client Hints identify a trusted user or a real browser?

No. Custom HTTP clients can forge hint values, and browser-reported metadata is not authentication. Do not use a generated profile as evidence of identity or as the only basis for access control. The response inspector is not a penetration test or security certification.

Does this tool send or store my browser metadata?

Generating fixtures, reading this browser’s values and inspecting pasted responses happen in this page. Running module 05 sends the browser-provided hints to this origin’s endpoints, which do not persist them. Completed reports stay in this tab’s sessionStorage until you clear them or close the tab. The hosting provider and Google’s advertising services process connection data independently; see the privacy notice.

What is Content-DPR, and should I implement it now?

Content-DPR is a deprecated image response header, not a request hint to insert into Accept-CH. The inspector identifies it for legacy troubleshooting. For new image-delivery work, review the current responsive-image specifications and browser behavior rather than copying a legacy header pattern.

Do Client Hints improve SEO or Core Web Vitals automatically?

No automatic search or performance improvement follows from adding headers. They can support a specific server adaptation, but measure its effect on content, latency and caching. Keep useful equivalent content when hints are absent, avoid using hints alone to classify crawlers and validate the deployed page in Search Console and performance tools.

How should I use compatibility data before a rollout?

Check the exact header, browser and version in module 08, including notes and aliases. Treat the source snapshot as documentation, then gather observed results in modules 05–06 under your real policy and origin conditions. A successful UA-CH test does not certify image hints or every other Client Hints family.

Technical references: UA-CH draft (opens in a new tab) · Accept-CH (opens in a new tab) · Critical-CH (opens in a new tab) · Vary (opens in a new tab) · Android WebView metadata (opens in a new tab).