← All templates

Password Generator Chrome extension

Generate strong, configurable passwords and copy them to the clipboard without leaving the tab.

How to install

  1. Download and unzip the file.
  2. Open chrome://extensions and turn on Developer mode.
  3. Click "Load unpacked" and pick the unzipped folder.

Source code (6 files)

manifest.json
{
  "manifest_version": 3,
  "name": "Password Generator",
  "version": "1.0.0",
  "description": "Generate strong, configurable passwords and copy them to the clipboard without leaving the tab.",
  "icons": {
    "16": "icons/icon.svg",
    "48": "icons/icon.svg",
    "128": "icons/icon.svg"
  },
  "action": {
    "default_popup": "popup.html",
    "default_title": "Password Generator",
    "default_icon": {
      "128": "icons/icon.svg"
    }
  }
}
popup.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Password Generator</title>
<link rel="stylesheet" href="popup.css" />
</head>
<body>
<header><h1>Password Generator</h1><p class="sub">Built with ManifestGo</p></header>
<main>
<div class="big" id="out">••••••••</div>
  <label class="muted">Length <span id="len">16</span></label>
  <input id="length" type="range" min="8" max="48" value="16" />
  <div class="row"><button id="sym">Symbols: on</button><button id="num">Numbers: on</button></div>
  <button class="primary" id="gen">Generate & copy</button>
</main>
<script src="popup.js"></script>
</body>
</html>
popup.css
:root { color-scheme: dark; }
* { box-sizing: border-box; }
body {
  margin: 0;
  width: 320px;
  font-family: Inter, -apple-system, "Segoe UI", Roboto, sans-serif;
  background: #1b1b1b;
  color: #f2efe9;
}
header { padding: 14px 16px 8px; }
h1 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: -0.01em; }
p.sub { margin: 4px 0 0; font-size: 11px; color: #9a958d; }
main { padding: 10px 16px 16px; display: grid; gap: 10px; }
button {
  font: inherit; font-size: 12px; font-weight: 600; cursor: pointer;
  border: 1px solid #ffffff1f; background: #ffffff0d; color: #f2efe9;
  border-radius: 10px; padding: 9px 12px; transition: background .15s ease;
}
button:hover { background: #ffffff17; }
button.primary { background: #34d399; border-color: #34d399; color: #101010; }
button.primary:hover { filter: brightness(1.08); }
input, select, textarea {
  font: inherit; font-size: 12px; width: 100%; padding: 9px 10px; border-radius: 10px;
  border: 1px solid #ffffff1f; background: #ffffff08; color: #f2efe9; outline: none;
}
input:focus, textarea:focus { border-color: #34d399; }
ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; max-height: 260px; overflow: auto; }
li { display: flex; align-items: center; gap: 8px; font-size: 12px; padding: 8px 10px; border-radius: 10px; background: #ffffff08; }
li span { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row { display: flex; gap: 8px; }
.row > * { flex: 1; }
.big { font-size: 34px; font-weight: 700; text-align: center; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.muted { font-size: 11px; color: #9a958d; }
popup.js
const out = document.getElementById("out");
const length = document.getElementById("length");
const lenLabel = document.getElementById("len");
const symBtn = document.getElementById("sym");
const numBtn = document.getElementById("num");
let symbols = true, numbers = true;

length.addEventListener("input", () => { lenLabel.textContent = length.value; });
symBtn.addEventListener("click", () => { symbols = !symbols; symBtn.textContent = "Symbols: " + (symbols ? "on" : "off"); });
numBtn.addEventListener("click", () => { numbers = !numbers; numBtn.textContent = "Numbers: " + (numbers ? "on" : "off"); });

document.getElementById("gen").addEventListener("click", async () => {
  let set = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
  if (numbers) set += "23456789";
  if (symbols) set += "!@#$%^&*()-_=+[]{}";
  const bytes = crypto.getRandomValues(new Uint32Array(Number(length.value)));
  const pwd = Array.from(bytes, (b) => set[b % set.length]).join("");
  out.textContent = pwd;
  out.style.fontSize = pwd.length > 24 ? "16px" : "22px";
  await navigator.clipboard.writeText(pwd);
});
icons/icon.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128"><rect width="128" height="128" rx="26" fill="#34d399"/><text x="64" y="90" font-family="Inter, Arial, sans-serif" font-size="66" font-weight="700" text-anchor="middle" fill="#ffffff">K</text></svg>
README.md
# Password Generator

Generate strong, configurable passwords and copy them to the clipboard without leaving the tab.

## Install (unpacked)
1. Open `chrome://extensions`.
2. Enable **Developer mode**.
3. Click **Load unpacked** and select this folder.

## Files
- `manifest.json` — Manifest V3 configuration
- `popup.html` / `popup.css` / `popup.js` — toolbar popup UI and logic
- `icons/icon.svg` — source icon (rasterized to PNG on download)

More free templates