Everything happens locally in your browser. Nothing you type here is sent anywhere, logged, or stored, it disappears the moment you close the tab.
Type a password to check it
What Actually Makes a Password Strong
Most password advice still fixates on complexity rules, one uppercase, one number, one symbol, that are trivial for cracking software to account for and miserable for humans to remember. What actually slows down an attacker is a mix of raw length and genuine unpredictability, which is why this checker weighs both instead of just ticking boxes.
Length Beats Complexity
Every extra character multiplies the number of guesses an attacker has to try, exponentially, while swapping an a for an @ barely moves the number at all since cracking tools already check that substitution by default. A long, unremarkable passphrase, four or five random unrelated words, usually beats a short password stuffed with symbols, which is why length carries more weight than any single check in the scoring here.
Why Common-Password and Pattern Checks Matter
Real-world password cracking rarely brute-forces the full keyspace, it works down a list of leaked passwords and common patterns first, because that list catches an enormous share of real accounts before anything more expensive is needed. That's why this tool flags obvious sequences like abc or 123 and repeated-character runs like aaa separately from the leaked-password check, both are exactly the shortcuts that kind of list is built to exploit.
What This Tool Doesn't Do
It can't tell you whether a password has actually appeared in a real breach, that requires checking against a live database of leaked credentials, which this offline checker deliberately doesn't do since it would mean sending what you type somewhere. Treat a "Very Strong" result here as a floor, not a guarantee, and pair it with a password manager and unique passwords per site rather than leaning on any single strength meter.
Copy the Code
Plain HTML, CSS, and JavaScript, no dependencies, no build step, nothing phoned home. Comments walk through what each block is doing, so it's easy to adapt rather than just paste and forget.
<!-- Password Strength Checker -- copy this whole block into any HTML page. -->
<!-- No build step, no dependencies -- plain HTML, CSS, and JS. -->
<!-- Everything runs locally: the password is never sent anywhere. -->
<div id="password-checker">
<div class="pw-field">
<input type="password" id="pwInput" placeholder="Type a password to check it" autocomplete="new-password" spellcheck="false">
<button id="pwToggle" type="button">Show</button>
</div>
<div class="pw-meter">
<div class="pw-meter-fill" id="pwMeterFill"></div>
</div>
<div class="pw-meter-label" id="pwMeterLabel">Type a password to check it</div>
<ul class="pw-feedback" id="pwFeedback"></ul>
</div>
<style>
/* Minimal styling -- restyle freely to match your own site. */
#password-checker { font-family: sans-serif; max-width: 360px; }
.pw-field { display: flex; gap: 8px; margin-bottom: 12px; }
.pw-field input { flex: 1; padding: 8px 10px; }
.pw-meter { height: 8px; border-radius: 999px; background: #eee; overflow: hidden; margin-bottom: 6px; }
.pw-meter-fill { height: 100%; width: 0%; background: #999; transition: width 0.2s ease, background 0.2s ease; }
.pw-meter-label { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 12px; opacity: 0.7; }
.pw-feedback { list-style: none; margin: 0; padding: 0; }
.pw-feedback li { display: flex; gap: 8px; padding: 4px 0; font-size: 0.9rem; opacity: 0.6; }
.pw-feedback li.pass { opacity: 1; }
</style>
<script>
(function () {
var input = document.getElementById('pwInput');
var toggle = document.getElementById('pwToggle');
var meterFill = document.getElementById('pwMeterFill');
var meterLabel = document.getElementById('pwMeterLabel');
var feedback = document.getElementById('pwFeedback');
// A short list of extremely common passwords. Not exhaustive, just
// enough to catch the handful of choices that top every leaked list.
var commonPasswords = [
'password', '123456', '12345678', '123456789', 'qwerty',
'letmein', 'welcome', 'admin', 'iloveyou', 'monkey',
'dragon', 'football', 'abc123', '111111', 'password1'
];
function hasSequential(value) {
var lower = value.toLowerCase();
var sequences = ['abcdefghijklmnopqrstuvwxyz', '0123456789', 'qwertyuiop'];
for (var s = 0; s < sequences.length; s++) {
var seq = sequences[s];
for (var i = 0; i <= seq.length - 3; i++) {
if (lower.indexOf(seq.slice(i, i + 3)) !== -1) return true;
}
}
return false;
}
function hasRepeats(value) {
return /(.)\1\1/.test(value);
}
// Runs every check against the current value and returns both the
// individual pass/fail list and an overall score.
function evaluate(value) {
var checks = [
{ label: 'At least 12 characters', pass: value.length >= 12 },
{ label: 'Contains an uppercase letter', pass: /[A-Z]/.test(value) },
{ label: 'Contains a lowercase letter', pass: /[a-z]/.test(value) },
{ label: 'Contains a number', pass: /[0-9]/.test(value) },
{ label: 'Contains a symbol', pass: /[^A-Za-z0-9]/.test(value) },
{ label: 'Not a commonly leaked password', pass: commonPasswords.indexOf(value.toLowerCase()) === -1 },
{ label: 'No obvious sequences (abc, 123)', pass: !hasSequential(value) },
{ label: 'No repeated-character runs (aaa, 111)', pass: !hasRepeats(value) }
];
var passCount = 0;
for (var i = 0; i < checks.length; i++) {
if (checks[i].pass) passCount++;
}
// Length carries more weight than any single check, a long
// passphrase missing a couple of extras still beats a short
// password that technically checks every box.
var score = value ? passCount + Math.floor(value.length / 4) : 0;
var label = 'Empty';
var color = '#999';
var percent = 0;
if (value) {
if (score <= 4) {
label = 'Weak'; color = '#ff5c5c'; percent = 25;
} else if (score <= 7) {
label = 'Fair'; color = '#e0a030'; percent = 50;
} else if (score <= 10) {
label = 'Strong'; color = '#4de8ff'; percent = 75;
} else {
label = 'Very Strong'; color = '#39ff88'; percent = 100;
}
}
return { checks: checks, label: label, color: color, percent: percent };
}
function render() {
var result = evaluate(input.value);
meterFill.style.width = result.percent + '%';
meterFill.style.background = result.color;
meterLabel.textContent = input.value ? result.label : 'Type a password to check it';
feedback.innerHTML = '';
result.checks.forEach(function (check) {
var li = document.createElement('li');
li.className = check.pass ? 'pass' : '';
li.textContent = (check.pass ? '\u2713 ' : '\u2715 ') + check.label;
feedback.appendChild(li);
});
}
input.addEventListener('input', render);
toggle.addEventListener('click', function () {
var showing = input.type === 'text';
input.type = showing ? 'password' : 'text';
toggle.textContent = showing ? 'Show' : 'Hide';
});
render();
})();
</script>