The state of post-quantum readiness on the web
Each day we measure fixed panels of public hosts for hybrid key exchange (X25519MLKEM768), certificate posture, and whether they offer and honour session resumption, then publish the trend. Read-only handshakes, a restrained probing policy, and an open methodology.
Web panel · hybrid KEX adoption · 2026-10-19
72.7%
48 of 66 reachable hosts negotiated X25519MLKEM768
Updated 2026-10-19
Collection methodology change
The authenticated collector requires a completed TLS 1.3 handshake and a valid certificate chain and hostname. Earlier probes could count TLS 1.2 or certificate-invalid endpoints as reachable. Excluding those endpoints changes the denominator: a change in adoption percentage can reflect the measurement rules, rather than a server migration. Historical and authenticated-collector percentages are not directly comparable. The first verified full production collection under these rules completed on 11 October 2026 at 19:00 UTC. Its records are unsigned telemetry, not issuer-authenticated evidence.
Device compatibility remains unknown without representative client and device measurements; this panel measures server behavior from one collector.
Collection rules and limits →48
Migrated
15
Classical
3
Regressed
4
Unreachable
Session resumption
59of 59
Issues a ticket
Offers resumption at all, after one HEAD request.
38of 66
Without being asked
Sends the ticket on a connection that sends no request.
54of 59
Resumes when offered
Accepts its own ticket back at the same address and SNI.
Each count is shown over the hosts that were actually asked, because the three questions reach three different populations: a host that issues no ticket is never offered one back, so it cannot be said to have refused. Hosts last measured before 28 August 2026 are in none of these counts.
Adoption over time
Read this series with the collection methodology change above; changes across collection methods do not establish adoption or regression.
Adoption by category
Regression detected
3 hosts regressed: they spoke post-quantum and stopped. Use the “Regressed” filter below.
70 of 70 hosts
| Host | Status | Group | TLS | Cert | Ticket | Resumes | Why |
|---|---|---|---|---|---|---|---|
| cloudflare.comCDN / edge | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| akamai.comCDN / edge | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| fastly.comCDN / edge | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| cloudflare-dns.comCDN / edge | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yes | yes | |
| amazonaws.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| cloud.google.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | - | - | - | |
| azure.microsoft.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | sha384WithRSAEncryption | yesunasked | yes | |
| digitalocean.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| heroku.comCloud / SaaS | Classical | X25519 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| vercel.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| netlify.comCloud / SaaS | Classical | X25519 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | no | |
| wordpress.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| shopify.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| salesforce.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| oracle.comCloud / SaaS | Unreachable | - | - | - | - | - | |
| ibm.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| adobe.comCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| dropbox.comCloud / SaaS | Classical | X25519 | TLSv1.3 | ecdsa-with-SHA384 | yes | yes | |
| slack.comCloud / SaaS | Classical | X25519 | TLSv1.3 | sha256WithRSAEncryption | yes | yes | |
| zoom.usCloud / SaaS | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yes | yes | |
| letsencrypt.orgSecurity / PKI | Classical | X25519 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | no | |
| digicert.comSecurity / PKI | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| sectigo.comSecurity / PKI | Unreachable | - | - | - | - | - | |
| globalsign.comSecurity / PKI | Unreachable | - | - | - | - | - | |
| okta.comSecurity / PKI | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| auth0.comSecurity / PKI | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yes | yes | |
| crowdstrike.comSecurity / PKI | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| paloaltonetworks.comSecurity / PKI | Regressed | X25519 | TLSv1.3 | - | - | - | |
| fortinet.comSecurity / PKI | Classical | X25519 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| signal.orgMessaging / privacy | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| proton.meMessaging / privacy | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yes | yes | |
| telegram.orgMessaging / privacy | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | no | |
| discord.comMessaging / privacy | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| stripe.comPayments | Classical | X25519 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| paypal.comPayments | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yes | yes | |
| github.comDeveloper platform | Classical | X25519 | TLSv1.3 | ecdsa-with-SHA256 | yesunasked | no | |
| gitlab.comDeveloper platform | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yes | yes | |
| stackoverflow.comDeveloper platform | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yes | yes | |
| npmjs.comDeveloper platform | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| nodejs.orgDeveloper platform | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| python.orgDeveloper platform | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| kernel.orgDeveloper platform | Classical | X25519 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| debian.orgDeveloper platform | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| ubuntu.comDeveloper platform | Classical | X25519 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| mozilla.orgDeveloper platform | Regressed | X25519 | TLSv1.3 | - | - | - | |
| censys.ioMeasurement / research | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yes | yes | |
| shodan.ioMeasurement / research | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| ssllabs.comMeasurement / research | Classical | X25519 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| google.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | - | - | - | |
| youtube.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | - | - | - | |
| facebook.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| instagram.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| x.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yes | yes | |
| linkedin.comConsumer web | Classical | X25519 | TLSv1.3 | - | - | - | |
| wikipedia.orgConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| reddit.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| amazon.comConsumer web | Classical | X25519 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| apple.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA256 | yes | yes | |
| microsoft.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | sha384WithRSAEncryption | yesunasked | yes | |
| netflix.comConsumer web | Classical | X25519 | TLSv1.3 | ecdsa-with-SHA384 | yes | yes | |
| ebay.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| yahoo.comConsumer web | Classical | X25519 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| bing.comConsumer web | Unreachable | - | - | - | - | - | |
| duckduckgo.comConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | no | |
| spotify.comConsumer web | Regressed | X25519 | TLSv1.3 | - | - | - | |
| twitch.tvConsumer web | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| cnn.comNews / media | Hybrid | X25519MLKEM768 | TLSv1.3 | ecdsa-with-SHA384 | yesunasked | yes | |
| bbc.comNews / media | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| nytimes.comNews / media | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes | |
| theguardian.comNews / media | Hybrid | X25519MLKEM768 | TLSv1.3 | sha256WithRSAEncryption | yesunasked | yes |
Methodology
Once a day we open two or three read-only TLS connections to each host in a fixed public panel. The first sends nothing at all, and records whether the server selects the hybrid group X25519MLKEM768, the negotiated TLS version, the leaf certificate’s signature algorithm and expiry, and whether it volunteers a session ticket. Hosts that volunteer none get a second connection carrying a single HEAD /, because many servers withhold a ticket until a request arrives. The last connection offers that ticket back, to the same address and the same server name that issued it, and records whether the server resumes. We send no credentials, we never offer a ticket to a host that did not issue it, we honor connection refusals, and we do not attempt any exploitation. This is the same class of measurement public scanners such as SSL Labs and Censys perform.
The panel and the probing policy live in the open-source pqc-observatory repository, where anyone can propose a host. To have a host removed from the panel, open a pull request or contact [email protected] and we will drop it within one measurement cycle.