MrTechKing

4 min read

KeePassXC: A Free, Offline Password Manager for Every Desktop (GitHub, Scanned)

A free password manager that keeps everything in one encrypted file you control, on Windows, macOS and Linux.

KeePassXC logo
✅
Scan: safe. Nothing to warn about. Every secret hit is a test key or a key-format constant, and the only advisories sit in a small optional recovery utility. Scanned Nov 10, 2026; the full report is below.

KeePassXC stores your passwords in a single encrypted file instead of someone else's cloud. You choose where that file lives: on your laptop, a USB stick or any sync service you already use, since the contents are encrypted before they leave the app. It runs on Windows, macOS and Linux and uses the standard KDBX format, so the same file opens in other KeePass-compatible apps.

It covers what people expect from a paid manager: a password generator, two-factor (TOTP) codes, passkeys, browser integration with Chrome, Firefox, Edge, Brave, Vivaldi and Tor Browser, auto-type into other apps, file attachments, entry history and YubiKey or OnlyKey challenge-response. It can import from 1Password, Bitwarden, Proton Pass and CSV files, and its password health report can check your entries against Have I Been Pwned. There is also a command-line tool and SSH agent integration.

KeePassXC is a community-driven port of the Windows app KeePass Password Safe, licensed under GPL-2 or GPL-3, with about 30,000 stars and 516 contributors. Version 2.8.0 came out on 21 October 2026.

Who it is for

Anyone who wants a password manager without a subscription or an online account, people who prefer to keep their vault offline, and technical users who want SSH keys, TOTP codes and passwords in one place.

Getting started

1. Download the installer for Windows, macOS or Linux

https://keepassxc.org/download

2. Or take a build from GitHub

https://github.com/keepassxreboot/keepassxc/releases/latest

3. Then follow the official getting started guide to create your first database

https://keepassxc.org/docs/KeePassXC_GettingStarted.html

Your vault is only as safe as its master password and your backups. KeePassXC has no account recovery: if you forget the master password, nobody can open the file for you. Keep a copy of the database somewhere safe.

Safety scan

We cloned keepassxreboot/keepassxc at commit 6bcb901 on Nov 10, 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.

  • 22 secret hits, none of them real secrets. 20 are test keys in tests/TestOpenSSHKey.cpp, tests/TestPasskeys.cpp and tests/TestSSHAgent.cpp, used to check SSH key and passkey handling. The other 2 are constants in the app itself: the BEGIN and END PRIVATE KEY markers it uses to store passkeys (src/core/EntryAttributes.cpp) and to write SSH keys in PEM format (src/sshagent/OpenSSHKey.cpp).
  • No pattern hits, no install hooks and no committed binaries across 1,517 files and about 664,000 lines. The bare IP addresses are in tests for the website icon downloader.
  • 4 advisories, all unrated and all in golang.org/x/crypto inside utils/keepassxc-cr-recovery, a small Go tool for recovering a YubiKey challenge-response secret. They concern that package's SSH and OpenPGP code, and the main app is C++ and does not use it.
  • The hosts in the code fit a password manager: haveibeenpwned.com for the optional breach check, yubico.com, the project's own site, and many example domains in tests. We found no analytics service.
  • 2 workflows, no pull_request_target and no third-party actions. CodeQL is on and there is a security policy. The licence sits in a file called COPYING, which is why GitHub shows it as other.

What the scanner counted

CheckResult
Secrets22 candidates found and read; see the notes above.
Suspicious codeNone found.
Install-time codeNone: nothing runs at install beyond the package manager itself.
Committed binariesNone.
CI workflows2 workflows. None use pull_request_target. No third-party actions.
Network hosts40 distinct hosts referenced from source; most often www.gnu.org, github.com, keepassxc.org, haveibeenpwned.com. 11 URLs to a bare IP address, listed under the raw findings.
Known vulnerabilities4 advisories across 3 pinned packages: 0 critical, 0 high, 0 moderate, 0 low, 4 unrated. utils/keepassxc-cr-recovery/go.mod: 3 packages, 4 advisories.
Project hygieneHas security policy, CodeQL, licence file, contributing guide. Missing automated dependency updates.
OpenSSF Scorecard7.5 out of 10, as of Oct 19, 2026.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Secret candidates (22, redacted)
WhereRuleMatch
src/core/EntryAttributes.cpp:52private-key-----B…--- (27 chars)
src/sshagent/OpenSSHKey.cpp:180private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:38private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:70private-key-----B…--- (31 chars)
tests/TestOpenSSHKey.cpp:96private-key-----B…--- (31 chars)
tests/TestOpenSSHKey.cpp:142private-key-----B…--- (31 chars)
tests/TestOpenSSHKey.cpp:184private-key-----B…--- (31 chars)
tests/TestOpenSSHKey.cpp:212private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:264private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:288private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:314private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:341private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:373private-key-----B…--- (31 chars)
tests/TestOpenSSHKey.cpp:419private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:451private-key-----B…--- (31 chars)
tests/TestOpenSSHKey.cpp:497private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:521private-key-----B…--- (35 chars)
tests/TestOpenSSHKey.cpp:547private-key-----B…--- (35 chars)
tests/TestPasskeys.cpp:245private-key-----B…--- (27 chars)
tests/TestPasskeys.cpp:264private-key-----B…--- (27 chars)
tests/TestPasskeys.cpp:461private-key-----B…--- (27 chars)
tests/TestSSHAgent.cpp:78private-key-----B…--- (35 chars)
URLs to bare IP addresses (11)
WhereRuleMatch
tests/TestIconDownloader.cpp:81ip-literal-urlQTest::newRow("Raw IP with schema") << "https://134.130.155.184"
tests/TestIconDownloader.cpp:82ip-literal-url<< QStringList{"https://134.130.155.184/favicon.ico"};
tests/TestIconDownloader.cpp:83ip-literal-urlQTest::newRow("Raw IP") << "134.130.155.184" << QStringList{"https://134.130.155.184/favicon.ico"};
tests/TestIconDownloader.cpp:85ip-literal-url<< "https://134.130.155.184/with/path/"
tests/TestIconDownloader.cpp:86ip-literal-url<< QStringList{"https://134.130.155.184/with/path/favicon.ico", "https://134.130.155.184/favicon.ico"};
tests/TestIconDownloader.cpp:86ip-literal-url<< QStringList{"https://134.130.155.184/with/path/favicon.ico", "https://134.130.155.184/favicon.ico"};
tests/TestIconDownloader.cpp:88ip-literal-url<< "https://134.130.155.184:8080/test/"
tests/TestIconDownloader.cpp:89ip-literal-url<< QStringList{"https://134.130.155.184:8080/test/favicon.ico", "https://134.130.155.184:8080/favicon.ico"};
tests/TestIconDownloader.cpp:89ip-literal-url<< QStringList{"https://134.130.155.184:8080/test/favicon.ico", "https://134.130.155.184:8080/favicon.ico"};
tests/TestIconDownloader.cpp:92ip-literal-url<< QStringList{"https://134.130.155.184:8080/test/favicon.ico", "https://134.130.155.184:8080/favicon.ico"};
tests/TestIconDownloader.cpp:92ip-literal-url<< QStringList{"https://134.130.155.184:8080/test/favicon.ico", "https://134.130.155.184:8080/favicon.ico"};
Worst known vulnerabilities (4 of 4)
AdvisorySeverityPackageSummary
GO-2026-5932unknowngolang.org/x/crypto@0.52.0The golang.org/x/crypto/openpgp package is unmaintained, unsafe by design, and has known security issues
CVE-2026-56854unknowngolang.org/x/crypto@0.52.0Source-address critical option not enforced for non-public-key auth callbacks in golang.org/x/crypto/ssh
CVE-2026-78662unknowngolang.org/x/crypto@0.52.0Prevent DoS on deadlocked undecided channel in golang.org/x/crypto/ssh
CVE-2026-56855unknowngolang.org/x/crypto@0.52.0Prevent DoS on deadlocked established channel in golang.org/x/crypto/ssh

By the numbers

Stars29.9K
Forks2,023
Contributors516
Commits5,054
Open issues801
Open pull requests195
Releases50
Latest release2.8.0
Licencecustom
Main languageC++
Project age10 years
Last pushNov 8, 2026
Tracked files1,517
Lines of code664K
Checkout size41 MB

Lines by language: TypeScript 510.9K, C++ 116.8K, C/C++ header 28K, Markdown 2,200, Python 1,581, CMake 919.

Questions

Is KeePassXC free?

Yes, completely. It is open source under GPL-2 or GPL-3, with no paid tier, subscription or account.

How do I use the same passwords on my phone?

KeePassXC is a desktop app. Put the database file in a sync service you trust and open it with a KDBX-compatible app on your phone. The file is encrypted, so the sync service only sees encrypted data.

Can I move from another password manager?

Yes. It imports from 1Password, Bitwarden, Proton Pass, KeePass 1 and CSV files. We list Bitwarden in our directory at /bitwarden/ if you would rather have a hosted manager.

Does KeePassXC send my passwords anywhere?

Not by itself. The database stays where you save it. Network features such as downloading website icons and the Have I Been Pwned check only run when you use them.


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.