whisper.cpp runs OpenAI's Whisper speech recognition models without Python or PyTorch. It is plain C and C++ on the same ggml library that powers llama.cpp, so it gets the same treatment: Metal on Apple Silicon, CUDA, Vulkan, ROCm, Core ML for the Neural Engine, and integer quantization that shrinks a model to a fraction of its size. The whisper-cli tool transcribes a file, whisper-stream transcribes the microphone live, and whisper-server exposes an OpenAI-style HTTP transcription API.
It earns its place for being the transcription engine inside a long list of desktop dictation and captioning apps, and for running where the Python original will not: iPhones, Android, a Raspberry Pi, a browser tab through WebAssembly. It started as Georgi Gerganov's port and now lives under ggml-org with more than 1,000 contributors. MIT-licensed, like the Whisper models themselves.
- Repository: github.com/ggml-org/whisper.cpp
- Licence: MIT (MIT License)
- Language: C++. Stars: 53.9K. Forks: 6,195. Last push: Sep 24, 2026.
- Scan: safe, Sep 24, 2026, commit d09f61a
Who it is for
Anyone who wants transcripts or subtitles without uploading audio, developers embedding speech recognition in an app or device, and people for whom the Python Whisper is too slow or too heavy to install.
Getting started
1. Clone the repository
git clone https://github.com/ggml-org/whisper.cpp.git && cd whisper.cpp2. Download a model converted to ggml format
sh ./models/download-ggml-model.sh base.en3. Build, then transcribe the bundled sample
cmake -B build && cmake --build build -j --config Release && ./build/bin/whisper-cli -f samples/jfk.wavwhisper-cli reads 16-bit WAV. Convert anything else first, as the README shows: ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav. The download script fetches weights from the project's Hugging Face repository.
Safety scan
We cloned ggml-org/whisper.cpp at commit d09f61a on Sep 24, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- No secrets, no pattern hits and no bare-IP URLs across about 525,000 lines of C, C++, CUDA and Metal.
- The three scripts listed as installers are ci/run.sh, the CI test driver; a 24-line launcher inside an experimental ggml back end; and scripts/deploy-wasm.sh, which publishes the WebAssembly demos. None uses sudo, edits a shell profile or pipes a download to a shell.
- 15 committed binaries. Twelve are model files prefixed for-tests- (14 KB to 885 KB), which the models README describes as containing no weights and existing for the CI's sanitizer tests. The other three are Gradle wrapper jars for the Java binding and the Android examples.
- All 62 known advisories (2 critical, 33 high) are in examples/addon.node/package-lock.json, the Node.js addon example, whose only dependencies are the dev tools cmake-js, Jest and node-addon-api. The Go binding's seven packages have none, and the C/C++ library vendors what little it uses.
- 22 workflows, none using pull_request_target; 16 of 41 third-party actions are pinned to a commit. Licence and contributing guide present; unlike llama.cpp there is no security policy, and no Dependabot or CodeQL.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | None found. |
| Suspicious code | None found. |
| Install-time code | 3 installer scripts |
| Committed binaries | 15 executable or compiled objects committed; listed under the raw findings. |
| CI workflows | 22 workflows. None use pull_request_target. 25 of 41 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often json.nlohmann.me, github.com, huggingface.co, nlohmann.me. No URLs to bare IP addresses. |
| Known vulnerabilities | 62 advisories across 328 pinned packages: 2 critical, 33 high, 24 moderate, 3 low. bindings/go/go.mod: 7 packages, 0 advisories; examples/addon.node/package-lock.json: 326 packages, 62 advisories. |
| Project hygiene | Has licence file, contributing guide. Missing security policy, automated dependency updates, CodeQL. |
| OpenSSF Scorecard | Not scored: the project is not in Scorecard's weekly index. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Installer scripts (3)
- ci/run.sh, 391 lines
- ggml/src/ggml-et/et-kernels/src/RunBackend.sh, 24 lines
- scripts/deploy-wasm.sh, 32 lines
Committed binaries (15)
models/for-tests-silero-v6.2.0-ggml.bin: .bin, 885 KBmodels/for-tests-ggml-base.en.bin: .bin, 587 KBmodels/for-tests-ggml-medium.en.bin: .bin, 587 KBmodels/for-tests-ggml-small.en.bin: .bin, 587 KBmodels/for-tests-ggml-tiny.en.bin: .bin, 587 KBmodels/for-tests-ggml-base.bin: .bin, 575 KBmodels/for-tests-ggml-large.bin: .bin, 575 KBmodels/for-tests-ggml-medium.bin: .bin, 575 KBmodels/for-tests-ggml-small.bin: .bin, 575 KBmodels/for-tests-ggml-tiny.bin: .bin, 575 KBbindings/java/gradle/wrapper/gradle-wrapper.jar: JAR, 62 KBexamples/whisper.android/gradle/wrapper/gradle-wrapper.jar: JAR, 59 KBexamples/whisper.android.java/gradle/wrapper/gradle-wrapper.jar: JAR, 54 KBmodels/for-tests-ggml-parakeet-tdt.bin: .bin, 17 KBmodels/for-tests-ggml-parakeet-tdt-bad-nfft0.bin: .bin, 14 KB
Worst known vulnerabilities (24 of 62)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-fjxv-7rqg-78g4 | critical | form-data@4.0.2 | form-data uses unsafe random function in form-data for choosing boundary |
| GHSA-23hp-3jrh-7fpw | critical | tar@6.2.1 | node-tar: Decompression/parse DoS via unlimited input |
| GHSA-35jp-ww65-95wh | high | axios@1.8.4 | axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `config.proxy` |
| GHSA-3g43-6gmg-66jw | high | axios@1.8.4 | axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollution Gadget in Config Merge |
| GHSA-43fc-jf86-j433 | high | axios@1.8.4 | Axios is Vulnerable to Denial of Service via __proto__ Key in mergeConfig |
| GHSA-4hjh-wcwx-xvwj | high | axios@1.8.4 | Axios is vulnerable to DoS attack through lack of data size check |
| GHSA-6chq-wfr3-2hj9 | high | axios@1.8.4 | Axios: Header Injection via Prototype Pollution |
| GHSA-777c-7fjr-54vf | high | axios@1.8.4 | Allocation of Resources Without Limits or Throttling in Axios |
| GHSA-hfxv-24rg-xrqf | high | axios@1.8.4 | Axios: Regular Expression Denial of Service (ReDoS) via Cookie Name Injection |
| GHSA-j5f8-grm9-p9fc | high | axios@1.8.4 | Axios: Proxy-Authorization header leaks to redirect target when proxy is re-evaluated to direct connection |
| GHSA-p92q-9vqr-4j8v | high | axios@1.8.4 | Axios: Proxy-Authorization Credential Leak to Origin Server Across HTTP-to-HTTPS Redirect in Axios Node.js HTTP Adapter |
| GHSA-pf86-5x62-jrwf | high | axios@1.8.4 | Axios: Prototype Pollution Gadgets - Response Tampering, Data Exfiltration, and Request Hijacking |
| GHSA-pmwg-cvhr-8vh7 | high | axios@1.8.4 | Axios: Incomplete Fix for CVE-2025-62718 - NO_PROXY Protection Bypassed via RFC 1122 Loopback Subnet (127.0.0.0/8) in Ax… |
| GHSA-q8qp-cvcw-x6jj | high | axios@1.8.4 | Axios has prototype pollution read-side gadgets in HTTP adapter that allow credential injection and request hijacking |
| GHSA-3jxr-9vmj-r5cp | high | brace-expansion@1.1.11 | brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups |
| GHSA-mh99-v99m-4gvg | high | brace-expansion@1.1.11 | brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash |
| GHSA-rgw5-rvv9-x895 | high | brace-expansion@1.1.11 | brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation |
| GHSA-73wf-gq98-2v4g | high | browserslist@4.24.4 | Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.json custom stats (normalizeStats) |
| GHSA-c83g-rgw3-j3cx | high | browserslist@4.24.4 | Browserslist: Unbounded memory growth (no cache eviction) via distinct query results, leading to eventual OOM |
| GHSA-hmw2-7cc7-3qxx | high | form-data@4.0.2 | form-data: CRLF injection in form-data via unescaped multipart field names and filenames |
| GHSA-2883-xcg3-v3hh | high | js-yaml@3.14.1 | js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources |
| GHSA-52cp-r559-cp3m | high | js-yaml@3.14.1 | js-yaml: YAML merge-key chains can force quadratic CPU consumption |
| GHSA-5p4m-2wfm-xmqj | high | js-yaml@3.14.1 | JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) - CVE-2026-59870 fix not backported |
| GHSA-23c5-xmqv-rm74 | high | minimatch@3.1.2 | minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions |
By the numbers
| Stars | 53.9K |
|---|---|
| Forks | 6,195 |
| Contributors | 1,042 |
| Commits | 5,311 |
| Open issues | 170 |
| Open pull requests | 175 |
| Releases | 43 |
| Latest release | v1.9.4 |
| Licence | MIT |
| Main language | C++ |
| Project age | 4 years |
| Last push | Sep 24, 2026 |
| Tracked files | 2,001 |
| Lines of code | 525.4K |
| Checkout size | 39 MB |
Lines by language: C++ 240.5K, C/C++ header 100K, C 92.5K, CUDA 26.4K, Metal 12.3K, GLSL 7,984.
Questions
Is whisper.cpp free?
Yes. whisper.cpp is MIT-licensed and free for any use, including commercial products, and the Whisper models it runs were released by OpenAI under MIT as well. There is no paid tier and no account. The converted models download from the project's Hugging Face repository, also free.
What is the difference between whisper.cpp and OpenAI Whisper?
They run the same models. OpenAI's repository is the Python reference implementation on PyTorch, convenient in notebooks and research code. whisper.cpp is a rewrite in C/C++ with no Python, quantized models and hardware back ends, so it starts instantly, uses less memory and is usually much faster on CPUs and Apple Silicon. Accuracy is essentially the same for the same model size.
What hardware does whisper.cpp need?
Less than you would expect. By the README's table the tiny model needs about 273 MB of memory, base about 388 MB, medium about 2.1 GB and large about 3.9 GB. It runs on a CPU alone, including a Raspberry Pi; a GPU or Apple Silicon makes the large models fast enough for real-time work.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
