Skip to content

Quickstart: pqdoctor

By the end of this page you’ll have checked a real server, read why it isn’t post-quantum, and scanned a list.

pqdoctor for Windowsv0.2.1 · Windows x64 · 1.3 MB

The pqdoctor command-line tool for Windows. A single file, nothing to install.

Downloadpqdoctor-0.2.1-windows-x64.exe

SHA-256 c1220199323deaef624abc0e30665783fab2433ad7b04e164af02ac6d115b00a

pqdoctor for macOSv0.2.1 · macOS 11+ · Apple silicon and Intel · 1.4 MB

One universal binary for Apple silicon and Intel Macs, with the README and license.

Downloadpqdoctor-0.2.1-macos-universal.tar.gz

SHA-256 52fb423de0e387e460519b64867a8dbb9f493dab5b401befaa7e98fbae94cdf8

pqdoctor for Linuxv0.2.1 · Linux x86_64 · any distro · 800 KB

A static binary (musl): no glibc version or system packages needed.

Downloadpqdoctor-0.2.1-linux-x64.tar.gz

SHA-256 6be9049979c1d6377d6b3c49f1cbf3c280b6cec7b760ea998257139d74c4e727

pqdoctor for Linux (Arm)v0.2.1 · Linux arm64 · any distro · 748 KB

A static binary for 64-bit Arm: Raspberry Pi 4 and 5, AWS Graviton, Ampere.

Downloadpqdoctor-0.2.1-linux-arm64.tar.gz

SHA-256 3ded3bcfd31b6e698e0800abe1c1a7d1e2ccfb7dc6b2e44c40d1970ec077d8ac

Released 2026-10-16 · Release notes · SHA256SUMS.txt

It’s a single file. Put it in a folder on your PATH. The examples below call it pqdoctor.

Terminal window
mkdir $HOME\bin -Force
Move-Item .\pqdoctor-0.2.1-windows-x64.exe $HOME\bin\pqdoctor.exe
$env:Path += ";$HOME\bin" # this session; add it in System Properties to keep it
pqdoctor --help
Terminal window
pqdoctor github.com

The first lines are the verdict:

pqdoctor github.com · real output, 2026-10-15
✘ github.com:443 (140.82.114.4)
Not post-quantum
TLS 1.3 works, but when offered X25519MLKEM768 the server asks for X25519 instead. Its TLS library doesn't have ML-KEM, or the groups are limited in config.
cause: no-mlkem
  • ✘ means it isn’t post-quantum. ✔ means it is.
  • cause: no-mlkem is the reason, as a stable code. Each code has its own page: no-mlkem.
  • Below that come the fixes, the certificate check, all seven probes, and an openssl command to confirm it yourself. Reading a report walks through each part.

The exit status says the same thing for scripts: 0 post-quantum, 1 not, 2 unreachable.

Terminal window
pqdoctor cloudflare.com
pqdoctor cloudflare.com
✔ cloudflare.com:443 (104.16.133.229)
Post-quantum: negotiates X25519MLKEM768
Supports and prefers hybrid ML-KEM key exchange.
cause: pq-preferred server: cloudflare

Put one host per line in a file, then:

Terminal window
pqdoctor scan hosts.txt
pqdoctor scan hosts.txt · real output
host port verdict cause group stack headline
github.com 443 notPq no-mlkem - - Not post-quantum
cloudflare.com 443 pq pq-preferred X25519MLKEM768 cloudflare Post-quantum: negotiates X25519MLKEM768
nginx.org 443 noTls13 tls12-only - nginx Not post-quantum: TLS 1.2 only

Results go to standard output as tab-separated rows, and a summary goes to standard error:

stderr
pqdoctor: 3 targets, 0 skipped, 3 answered TLS, 1 post-quantum (33.3% of answered)
no-mlkem 1
pq-preferred 1
tls12-only 1

By default a scan checks 4 hosts at once and starts at most 2 new ones a second. Scanning a list covers large scans, resuming, and opt-outs.

Terminal window
pqdoctor github.com --json > github.json
pqdoctor scan hosts.txt --json --out results.jsonl

One host prints one JSON object. A scan prints one object per line. The fields are in the JSON reference.