← All templates

Page Word Counter Chrome extension

Count words, characters, images and links on the current page, with an estimated reading time.

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": "Page Word Counter",
  "version": "1.0.0",
  "description": "Count words, characters, images and links on the current page, with an estimated reading time.",
  "icons": {
    "16": "icons/icon.svg",
    "48": "icons/icon.svg",
    "128": "icons/icon.svg"
  },
  "action": {
    "default_popup": "popup.html",
    "default_title": "Page Word Counter",
    "default_icon": {
      "128": "icons/icon.svg"
    }
  },
  "permissions": [
    "activeTab",
    "scripting"
  ]
}
popup.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Page Word Counter</title>
<link rel="stylesheet" href="popup.css" />
</head>
<body>
<header><h1>Page Word Counter</h1><p class="sub">Built with ManifestGo</p></header>
<main>
<ul id="stats"></ul>
  <button class="primary" id="again">Recount</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: #f472b6; border-color: #f472b6; 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: #f472b6; }
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 stats = document.getElementById("stats");

async function run() {
  const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
  if (!tab?.id) return;
  const [res] = await chrome.scripting.executeScript({
    target: { tabId: tab.id },
    func: () => {
      const text = document.body.innerText || "";
      const words = text.trim().split(/\s+/).filter(Boolean).length;
      return {
        Words: words,
        Characters: text.length,
        Images: document.images.length,
        Links: document.links.length,
        "Reading time": Math.max(1, Math.round(words / 220)) + " min",
      };
    },
  });
  stats.innerHTML = "";
  Object.entries(res.result || {}).forEach(([k, v]) => {
    const li = document.createElement("li");
    const a = document.createElement("span");
    a.textContent = k;
    const b = document.createElement("strong");
    b.textContent = String(v);
    li.append(a, b);
    stats.appendChild(li);
  });
}

document.getElementById("again").addEventListener("click", run);
run();
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="#f472b6"/><text x="64" y="90" font-family="Inter, Arial, sans-serif" font-size="66" font-weight="700" text-anchor="middle" fill="#ffffff">W</text></svg>
README.md
# Page Word Counter

Count words, characters, images and links on the current page, with an estimated reading time.

## 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