← All templates

Tab Manager Chrome extension

See every open tab, jump to one instantly, or close it without leaving the popup.

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": "Tab Manager",
  "version": "1.0.0",
  "description": "See every open tab, jump to one instantly, or close it without leaving the popup.",
  "icons": {
    "16": "icons/icon.svg",
    "48": "icons/icon.svg",
    "128": "icons/icon.svg"
  },
  "action": {
    "default_popup": "popup.html",
    "default_title": "Tab Manager",
    "default_icon": {
      "128": "icons/icon.svg"
    }
  },
  "permissions": [
    "tabs"
  ]
}
popup.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Tab Manager</title>
<link rel="stylesheet" href="popup.css" />
</head>
<body>
<header><h1>Tab Manager</h1><p class="sub">Built with ManifestGo</p></header>
<main>
<input id="q" type="search" placeholder="Filter tabs…" />
  <ul id="list"></ul>
  <button id="dupes">Close duplicate tabs</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: #f59e0b; border-color: #f59e0b; 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: #f59e0b; }
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 list = document.getElementById("list");
const q = document.getElementById("q");
let tabs = [];

function render() {
  const term = q.value.trim().toLowerCase();
  list.innerHTML = "";
  tabs
    .filter((t) => !term || (t.title || "").toLowerCase().includes(term) || (t.url || "").toLowerCase().includes(term))
    .forEach((t) => {
      const li = document.createElement("li");
      const span = document.createElement("span");
      span.textContent = t.title || t.url;
      span.title = t.url || "";
      span.addEventListener("click", () => chrome.tabs.update(t.id, { active: true }));
      const close = document.createElement("button");
      close.textContent = "✕";
      close.addEventListener("click", async () => {
        await chrome.tabs.remove(t.id);
        load();
      });
      li.append(span, close);
      list.appendChild(li);
    });
}

async function load() {
  tabs = await chrome.tabs.query({});
  render();
}

q.addEventListener("input", render);
document.getElementById("dupes").addEventListener("click", async () => {
  const seen = new Set();
  const kill = [];
  for (const t of await chrome.tabs.query({})) {
    if (seen.has(t.url)) kill.push(t.id);
    else seen.add(t.url);
  }
  if (kill.length) await chrome.tabs.remove(kill);
  load();
});

load();
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="#f59e0b"/><text x="64" y="90" font-family="Inter, Arial, sans-serif" font-size="66" font-weight="700" text-anchor="middle" fill="#ffffff">T</text></svg>
README.md
# Tab Manager

See every open tab, jump to one instantly, or close it without leaving the popup.

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