KEYWORD SUGGESTION TOOL

Free Keyword Suggestion Tool — Long-Tail, Questions & CSV Export

{
“@context”:”https://schema.org”,
“@type”:”FAQPage”,
“mainEntity”:[
{
“@type”:”Question”,
“name”:”Is this keyword suggestion tool free?”,
“acceptedAnswer”:{“@type”:”Answer”,”text”:”Yes. It runs entirely in your browser and uses public suggestion logic. No signup required.”}
},
{
“@type”:”Question”,
“name”:”Does it show exact search volumes?”,
“acceptedAnswer”:{“@type”:”Answer”,”text”:”No. This tool focuses on idea generation (long-tails, questions, modifiers). For volumes, use Google Keyword Planner.”}
},
{
“@type”:”Question”,
“name”:”Can I export keywords?”,
“acceptedAnswer”:{“@type”:”Answer”,”text”:”Yes. Click Export CSV to download your suggestions as a CSV file.”}
}
]
}

:root {
–bg: #0f172a; /* slate-900 */
–card: #111827; /* gray-900 */
–muted: #94a3b8; /* slate-400 */
–text: #e5e7eb; /* gray-200 */
–accent: #22d3ee; /* cyan-400 */
–accent2: #a78bfa; /* violet-400 */
–ring: rgba(34, 211, 238, .35);
–ok: #34d399; /* green-400 */
–warn: #fbbf24; /* amber-400 */
}
* { box-sizing: border-box; }
html, body { margin:0; padding:0; background: var(–bg); color: var(–text); font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, “Apple Color Emoji”,”Segoe UI Emoji”; }
a { color: var(–accent); text-decoration: none; }
.wrap { max-width: 1100px; margin: 32px auto; padding: 0 16px; }
.hero {
padding: 28px; border-radius: 20px; background: linear-gradient(135deg, rgba(167,139,250,.12), rgba(34,211,238,.12));
border: 1px solid rgba(255,255,255,.08);
backdrop-filter: blur(6px);
box-shadow: 0 10px 30px rgba(0,0,0,.35);
}
h1 { font-size: clamp(24px, 3vw, 36px); margin: 0 0 6px 0; letter-spacing: .2px; }
.sub { color: var(–muted); margin: 0 0 16px 0; }

.grid { display:grid; grid-template-columns: 1.2fr .8fr; gap:18px; margin-top: 16px; }
@media (max-width: 900px){ .grid { grid-template-columns: 1fr; } }

.card { background: var(–card); border: 1px solid rgba(255,255,255,.06); border-radius: 18px; padding: 18px; }
.row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.row3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }
.row4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
@media (max-width: 700px){ .row, .row3, .row4 { grid-template-columns: 1fr; } }

label { font-size: 14px; color: var(–muted); margin-bottom: 6px; display:block; }
input[type=”text”], select, textarea {
width: 100%; padding: 12px 12px; border-radius: 12px; border: 1px solid rgba(255,255,255,.08);
background: #0b1220; color: var(–text); outline: none; transition: border .2s, box-shadow .2s;
}
textarea { min-height: 120px; resize: vertical; }

input:focus, select:focus, textarea:focus { border-color: var(–accent); box-shadow: 0 0 0 6px var(–ring); }

.btns { display:flex; flex-wrap: wrap; gap: 10px; align-items: center; }
button {
appearance: none; border: 1px solid rgba(255,255,255,.1); background: linear-gradient(135deg, rgba(34,211,238,.12), rgba(167,139,250,.12));
color: var(–text); padding: 10px 14px; border-radius: 12px; cursor: pointer; font-weight: 600;
transition: transform .05s ease, filter .2s ease, border .2s ease;
}
button:hover { filter: brightness(1.1); }
button:active { transform: scale(.98); }
.btn-accent { border-color: rgba(34,211,238,.35); }
.btn-ghost { background: transparent; }
.badge { font-size: 12px; color: var(–muted); padding: 3px 8px; border:1px solid rgba(255,255,255,.08); border-radius: 999px; }

.toolbar { display:flex; gap: 10px; align-items: center; justify-content: space-between; margin: 10px 0 14px; }
.toolbar-left, .toolbar-right { display:flex; gap:10px; align-items:center; flex-wrap: wrap; }
.count { font-weight: 700; color: var(–ok); }

.table {
width: 100%; border-collapse: collapse; overflow: hidden; border-radius: 14px; border: 1px solid rgba(255,255,255,.08);
}
.table thead th { text-align: left; font-size: 12px; letter-spacing:.3px; text-transform: uppercase; color: var(–muted); background: #0b1220; padding: 10px; }
.table tbody td { padding: 10px; border-top: 1px solid rgba(255,255,255,.06); }
.table tbody tr:hover { background: rgba(167,139,250,.06); }
.pill { font-size: 12px; padding: 4px 8px; border-radius: 999px; border: 1px solid rgba(255,255,255,.1); color: var(–text); }

.footer { text-align:center; color: var(–muted); font-size: 13px; margin: 28px 0 10px; }
.tiny { font-size: 12px; color: var(–muted); }
.hint { color: var(–warn); font-size: 12px; }

/* Subtle fade-in */
.fade-in { animation: fade .35s ease-out; }
@keyframes fade { from {opacity:0; transform: translateY(4px)} to {opacity:1; transform: none;} }

Keyword Suggestion Tool

Generate long-tail ideas, “People-also-ask”-style questions, and smart modifier combos. Deduplicate, sort, copy, and export to CSV.

English
Hindi

Yes — add QnA ideas
No

25
50
100
200



No login • Client-side • CSV export

Tip: Add both prefixes and suffixes to force long-tail variations (e.g., “how to + seed + in india 2025”).

Note: Idea generation only — search volumes are not shown here.

We’ll combine locations with your seed for local SEO ideas.

Results
0

Sort A → Z
Sort by length (short → long)
Sort by length (long → short)
Keep order



# Keyword Type Actions

// ———- Utility ———-
const $ = sel => document.querySelector(sel);
const $$ = sel => Array.from(document.querySelectorAll(sel));
const sleep = ms => new Promise(r => setTimeout(r, ms));

function sanitize(text) {
return (text || “”).toString().trim().replace(/s+/g, ” “);
}
function uniq(arr) {
return Array.from(new Set(arr.map(s => s.toLowerCase()))); // uniqueness by lowercase
}
function applyExcludes(list, excludes) {
if (!excludes.length) return list;
const ex = excludes.map(e => e.toLowerCase().trim()).filter(Boolean);
return list.filter(k => !ex.some(e => k.includes(e)));
}
function addRows(keywordsWithMeta) {
const tbody = $(“#resultBody”);
tbody.innerHTML = “”;
keywordsWithMeta.forEach((obj, i) => {
const tr = document.createElement(“tr”);
tr.innerHTML = `

${i + 1} ${obj.k} ${obj.type}

`;
tbody.appendChild(tr);
});
// Bind per-row copy
$$(‘button[data-copy]’).forEach(btn => {
btn.addEventListener(‘click’, () => {
navigator.clipboard.writeText(btn.getAttribute(‘data-copy’));
btn.textContent = “Copied!”;
setTimeout(()=>btn.textContent=”Copy”, 900);
});
});
}

function setCount(n) { $(“#resultCount”).textContent = n; }

function csvDownload(rows, filename = “keyword_suggestions.csv”) {
const header = [“keyword”,”type”];
const csv = [header.join(“,”)]
.concat(rows.map(r => {
const k = ‘”‘ + r.k.replace(/”/g,’””‘) + ‘”‘;
const t = ‘”‘ + r.type.replace(/”/g,’””‘) + ‘”‘;
return [k, t].join(“,”);
}))
.join(“n”);
const blob = new Blob([csv], {type: “text/csv;charset=utf-8;”});
const url = URL.createObjectURL(blob);
const a = document.createElement(“a”);
a.href = url; a.download = filename;
document.body.appendChild(a); a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}

// ———- Modifiers ———-
const modifierBuckets = {
“Informational”: [“how to”,”what is”,”guide”,”tips”,”ideas”,”examples”,”meaning”,”vs”],
“Commercial”: [“best”,”top”,”review”,”compare”,”alternatives”,”near me”,”cheap”,”affordable”,”under 5000″,”under 10000″,”2025″],
“Transactional”: [“buy”,”price”,”discount”,”coupon”,”deal”,”offer”,”subscription”,”trial”],
“Local”: [“in india”,”in delhi”,”near me”,”online”,”offline”,”for beginners”,”for students”]
};

function renderModifierBuckets() {
const container = $(“#modBuckets”);
container.innerHTML = “”;
Object.entries(modifierBuckets).forEach(([label, mods]) => {
const col = document.createElement(“div”);
const title = document.createElement(“div”);
title.className = “tiny”;
title.style.marginBottom = “6px”;
title.textContent = label;
col.appendChild(title);
mods.forEach(m => {
const b = document.createElement(“button”);
b.className = “btn-ghost”;
b.textContent = m;
b.title = “Click to add to prefixes/suffixes”;
b.addEventListener(“click”, () => quickInsertModifier(m));
col.appendChild(b);
});
container.appendChild(col);
});
}
function quickInsertModifier(text) {
const p = $(“#prefix”), s = $(“#suffix”);
// Heuristic: short (<= 2 words) are prefixes, else suffixes
if (text.split(" ").length {
const w = (row.word || “”).trim();
if (w && !/d{6,}/.test(w)) out.add(w);
});
} catch(e){}
await sleep(120); // be polite
}
return Array.from(out);
}

// ———- Core generation ———-
function expandWithModifiers(seed, prefixes, suffixes, cities) {
const ideas = [];

// Plain seed
ideas.push({k: seed, type: “seed”});

// Seed with prefixes
prefixes.forEach(p => ideas.push({k: `${p} ${seed}`.trim(), type: “prefix”}));

// Seed with suffixes
suffixes.forEach(s => ideas.push({k: `${seed} ${s}`.trim(), type: “suffix”}));

// Prefix + Seed + Suffix
prefixes.forEach(p => {
suffixes.forEach(s => ideas.push({k: `${p} ${seed} ${s}`.trim(), type: “prefix+suffix”}));
});

// Local cities
cities.forEach(city => {
ideas.push({k: `${seed} in ${city}`, type: “local”});
prefixes.forEach(p => ideas.push({k: `${p} ${seed} in ${city}`.trim(), type: “local”});
suffixes.forEach(s => ideas.push({k: `${seed} ${s} in ${city}`.trim(), type: “local”});
});

return ideas;
}

function generateQuestions(seed, lang=”en”) {
const tpls = QN_TPL[lang] || QN_TPL.en;
const alt = seed.split(” “).slice(-1)[0] + ” alternatives”;
return tpls.map(t => ({k: t.replaceAll(“SEED”, seed).replaceAll(“ALT”, alt), type: “question”}));
}

function dedupeAndFilter(objs, excludes=[]) {
// lowercase uniqueness on ‘k’
const seen = new Set();
const filtered = [];
const ex = excludes.map(e => e.toLowerCase().trim()).filter(Boolean);
for (const o of objs) {
const key = o.k.toLowerCase();
if (seen.has(key)) continue;
if (ex.length && ex.some(e => key.includes(e))) continue;
if (key.length a.k.localeCompare(b.k));
if (mode === “length”) cp.sort((a,b)=> a.k.length – b.k.length);
if (mode === “lengthDesc”) cp.sort((a,b)=> b.k.length – a.k.length);
return cp;
}

// ———- Events ———-
renderModifierBuckets();

$(“#clearBtn”).addEventListener(“click”, () => {
[“seed”,”prefix”,”suffix”,”exclude”,”cities”].forEach(id => $( “#” + id ).value = “”);
$(“#questions”).value = “yes”;
$(“#max”).value = “50”;
$(“#country”).value = “en”;
$(“#resultBody”).innerHTML = “”;
setCount(0);
});

$(“#sortSelect”).addEventListener(“change”, () => {
const mode = $(“#sortSelect”).value;
if (!window._lastResults) return;
const sorted = sortKeywords(window._lastResults, mode);
addRows(sorted);
});

$(“#copyBtn”).addEventListener(“click”, async () => {
if (!window._lastResults?.length) return;
const text = window._lastResults.map(r => r.k).join(“n”);
await navigator.clipboard.writeText(text);
$(“#copyBtn”).textContent = “Copied!”;
setTimeout(()=> $(“#copyBtn”).textContent = “Copy All”, 900);
});

$(“#csvBtn”).addEventListener(“click”, () => {
if (!window._lastResults?.length) return;
csvDownload(window._lastResults);
});

$(“#generateBtn”).addEventListener(“click”, async () => {
const seed = sanitize($(“#seed”).value);
if (!seed) { alert(“Please enter a seed keyword.”); return; }

const prefixes = uniq(sanitize($(“#prefix”).value).split(“,”)).map(s=>sanitize(s)).filter(Boolean);
const suffixes = uniq(sanitize($(“#suffix”).value).split(“,”)).map(s=>sanitize(s)).filter(Boolean);
const excludes = uniq(sanitize($(“#exclude”).value).split(“,”)).map(s=>sanitize(s)).filter(Boolean);
const cities = uniq(sanitize($(“#cities”).value).split(“,”)).map(s=>sanitize(s)).filter(Boolean);
const lang = $(“#country”).value;
const withQuestions = $(“#questions”).value === “yes”;
const limit = parseInt($(“#max”).value, 10) || 50;

// 1) Local generation
let ideas = expandWithModifiers(seed, prefixes, suffixes, cities);

// 2) Optional questions
if (withQuestions) {
ideas = ideas.concat(generateQuestions(seed, lang));
}

// 3) External related suggestions (Datamuse)
let ext = [];
try {
ext = (await datamuseIdeas(seed, limit))
.filter(w => w && w.toLowerCase() !== seed.toLowerCase())
.slice(0, limit);
} catch(e){}
ext.forEach(w => ideas.push({k: w, type: “related”}));

// 4) Dedupe + exclude + present
ideas = dedupeAndFilter(ideas, excludes);

// Save & render
window._lastResults = ideas;
setCount(ideas.length);
const mode = $(“#sortSelect”).value;
addRows(sortKeywords(ideas, mode));
});