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.
1. Get the CLI
Section titled “1. Get the CLI”The pqdoctor command-line tool for Windows. A single file, nothing to install.
Downloadpqdoctor-0.2.1-windows-x64.exeSHA-256 c1220199323deaef624abc0e30665783fab2433ad7b04e164af02ac6d115b00a
One universal binary for Apple silicon and Intel Macs, with the README and license.
Downloadpqdoctor-0.2.1-macos-universal.tar.gzSHA-256 52fb423de0e387e460519b64867a8dbb9f493dab5b401befaa7e98fbae94cdf8
A static binary (musl): no glibc version or system packages needed.
Downloadpqdoctor-0.2.1-linux-x64.tar.gzSHA-256 6be9049979c1d6377d6b3c49f1cbf3c280b6cec7b760ea998257139d74c4e727
A static binary for 64-bit Arm: Raspberry Pi 4 and 5, AWS Graviton, Ampere.
Downloadpqdoctor-0.2.1-linux-arm64.tar.gzSHA-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.
mkdir $HOME\bin -ForceMove-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 itpqdoctor --helpcurl -fLO https://pqdoctor.com/downloads/v0.2.1/pqdoctor-0.2.1-macos-universal.tar.gztar -xzf pqdoctor-0.2.1-macos-universal.tar.gzsudo mv pqdoctor-0.2.1-macos-universal/pqdoctor /usr/local/bin/pqdoctor --versionDownloaded with curl, macOS doesn’t quarantine the file. If you downloaded it in a browser, see macOS Gatekeeper.
curl -fLO https://pqdoctor.com/downloads/v0.2.1/pqdoctor-0.2.1-linux-x64.tar.gz # or -linux-arm64tar -xzf pqdoctor-0.2.1-linux-x64.tar.gzsudo install -m 0755 pqdoctor-0.2.1-linux-x64/pqdoctor /usr/local/bin/pqdoctor --versionIt’s statically linked, so it runs on any distribution: no glibc version or packages needed.
On macOS, Linux or Windows with Rust installed, build it from crates.io:
cargo install pqdoctorpqdoctor --help2. Check a server
Section titled “2. Check a server”pqdoctor github.comThe first lines are the verdict:
✘ 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-mlkemis 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
opensslcommand 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.
3. Check a post-quantum one
Section titled “3. Check a post-quantum one”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: cloudflare4. Scan a list
Section titled “4. Scan a list”Put one host per line in a file, then:
pqdoctor scan hosts.txthost port verdict cause group stack headlinegithub.com 443 notPq no-mlkem - - Not post-quantumcloudflare.com 443 pq pq-preferred X25519MLKEM768 cloudflare Post-quantum: negotiates X25519MLKEM768nginx.org 443 noTls13 tls12-only - nginx Not post-quantum: TLS 1.2 onlyResults go to standard output as tab-separated rows, and a summary goes to standard error:
pqdoctor: 3 targets, 0 skipped, 3 answered TLS, 1 post-quantum (33.3% of answered) no-mlkem 1 pq-preferred 1 tls12-only 1By 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.
5. Get JSON
Section titled “5. Get JSON”pqdoctor github.com --json > github.jsonpqdoctor scan hosts.txt --json --out results.jsonlOne host prints one JSON object. A scan prints one object per line. The fields are in the JSON reference.