---
title: Keyword Research
description: 100% free · no signup       Runs in your browser       40+ keyword ideas per seed       6 intent groups       Copy · Markdown · download                        
url: https://moxseo.com/tools/keyword-research-tool
date_modified: 2026-07-31
author: Admin
language: en_US
---

.mox-kw{
  /* ============ MOXSEO BRAND TOKENS — edit here to rebrand ============
     MoxSEO identity: near-black ink, white canvas, single orange accent.
     Swap --mox-primary for your exact brand orange in one place. */
  --mox-bg:        #ffffff;   /* page base (white canvas) */
  --mox-panel:     #ffffff;   /* cards */
  --mox-ink:       #0e0f12;   /* near-black primary text */
  --mox-muted:     #5b6068;   /* secondary text */
  --mox-line:      #ececef;   /* hairline borders */
  --mox-primary:   #ff5a1f;   /* the single brand accent (orange) */
  --mox-primary-2: #ff7a47;   /* hover / glow partner */
  --mox-dark:      #0e0f12;   /* near-black ink for dark sections */
  --mox-dark-2:    #181a20;   /* card surface on dark */
  --mox-dark-3:    #1f2229;   /* raised surface on dark */
  --mox-soft:      #f6f6f7;   /* soft panel */
  --mox-risk:      #e34d5b;   /* used sparingly */
  --mox-warn:      #e8a20c;   /* used sparingly */
  --mox-font-d:    'Sora', system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
  --mox-font-b:    'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
  --mox-font-m:    'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  --mox-ease:      cubic-bezier(.2,.7,.2,1);
}
.mox-kw *{box-sizing:border-box}
.mox-kw{
  font-family:var(--mox-font-b);
  color:var(--mox-ink);
  background:var(--mox-bg);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
.mox-kw .mox-wrap{max-width:1180px;margin:0 auto;padding:0 22px}
.mox-kw .mox-sec{padding:84px 0}
.mox-kw .mox-sec--dark{background:var(--mox-dark);color:#fff}
.mox-kw .mox-sec--soft{background:var(--mox-soft)}
.mox-kw img{max-width:100%;display:block}

/* ---------- typography ---------- */
.mox-kw .mox-h1{font-family:var(--mox-font-d);font-weight:800;font-size:clamp(34px,4.6vw,56px);line-height:1.06;letter-spacing:-.02em;color:var(--mox-ink) !important;margin:0 0 18px}
.mox-kw .mox-h2{font-family:var(--mox-font-d);font-weight:700;font-size:clamp(26px,3vw,38px);line-height:1.15;letter-spacing:-.015em;color:var(--mox-ink) !important;margin:0 0 14px}
.mox-kw .mox-h3{font-family:var(--mox-font-d);font-weight:600;font-size:18px;line-height:1.3;color:var(--mox-ink) !important;margin:0 0 8px}
.mox-kw .mox-lead{font-size:clamp(16px,1.4vw,18.5px);line-height:1.65;color:#3a3e45 !important;max-width:760px;margin:0 0 24px}
.mox-kw .mox-sub{font-size:16px;line-height:1.6;color:#4a4e55 !important;max-width:780px;margin:0 0 36px}
.mox-kw .mox-eyebrow{display:inline-flex;align-items:center;gap:8px;font-family:var(--mox-font-m);font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--mox-primary) !important;font-weight:600;margin-bottom:14px}
.mox-kw .mox-eyebrow::before{content:"";width:22px;height:1.5px;background:var(--mox-primary);border-radius:2px}
.mox-kw .mox-chip{display:inline-block;font-family:var(--mox-font-m);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--mox-primary) !important;background:rgba(255,90,31,.10);border:1px solid rgba(255,90,31,.22);border-radius:999px;padding:4px 10px;font-weight:600}
.mox-kw .mox-tag{display:inline-block;font-family:var(--mox-font-m);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:#0e0f12 !important;background:#ffe2d3;border:1px solid #ffd0b8;border-radius:6px;padding:3px 8px;font-weight:600}
.mox-kw .mox-tag--soft{background:#eef0f3;color:#3a3e45 !important;border-color:#dee1e6}
.mox-kw .mox-tag--good{background:#e6f4ec;color:#1f7a4d !important;border-color:#cfe8d9}
.mox-kw .mox-tag--warn{background:#fff3dc;color:#9b6b00 !important;border-color:#f0dba8}
.mox-kw .mox-tag--risk{background:#fde6e9;color:#a52639 !important;border-color:#f4c2c8}

/* ---------- buttons ---------- */
.mox-kw .mox-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:13px 22px;border-radius:10px;font-family:var(--mox-font-d);font-weight:600;font-size:15px;text-decoration:none !important;border:1px solid transparent;cursor:pointer;transition:transform .15s var(--mox-ease),box-shadow .25s var(--mox-ease),background .25s var(--mox-ease),color .25s var(--mox-ease)}
.mox-kw .mox-btn--primary{background:var(--mox-primary);color:#fff !important;box-shadow:0 6px 18px -8px rgba(255,90,31,.55)}
.mox-kw .mox-btn--primary:hover{background:var(--mox-primary-2);transform:translateY(-1px);box-shadow:0 10px 24px -10px rgba(255,90,31,.65)}
.mox-kw .mox-btn--ghost{background:transparent;color:var(--mox-ink) !important;border-color:#d8dadf}
.mox-kw .mox-btn--ghost:hover{border-color:var(--mox-ink)}
.mox-kw .mox-btn--lime{background:#c8f54a;color:#0e0f12 !important}
.mox-kw .mox-btn--lime:hover{background:#b8ea36}
.mox-kw .mox-btn--full{width:100%}
.mox-kw .mox-btn--mini{padding:7px 12px;font-size:12.5px;border-radius:8px}

/* ---------- trust bar ---------- */
.mox-kw .mox-trust{background:#0e0f12;color:#fff;padding:12px 0;border-bottom:1px solid #1f2229}
.mox-kw .mox-trust__row{display:flex;flex-wrap:wrap;gap:8px 28px;justify-content:center;font-family:var(--mox-font-m);font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;color:#b8bcc4 !important}
.mox-kw .mox-trust__row span{display:inline-flex;align-items:center;gap:8px}
.mox-kw .mox-trust__row span::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--mox-primary)}

/* ---------- hero ---------- */
.mox-kw .mox-hero{padding:72px 0 56px;background:
  radial-gradient(900px 460px at 85% -10%,rgba(255,90,31,.10),transparent 60%),
  radial-gradient(700px 380px at 10% 10%,rgba(255,90,31,.06),transparent 60%)}
.mox-kw .mox-hero__grid{display:grid;grid-template-columns:1.1fr .9fr;gap:54px;align-items:center}
.mox-kw .mox-hero__cta{display:flex;gap:12px;flex-wrap:wrap;margin:6px 0 22px}
.mox-kw .mox-hero__ticks{display:flex;flex-wrap:wrap;gap:8px 18px;font-family:var(--mox-font-m);font-size:11.5px;letter-spacing:.06em;color:#5b6068 !important;text-transform:uppercase}
.mox-kw .mox-hero__ticks span{display:inline-flex;align-items:center;gap:7px}
.mox-kw .mox-hero__ticks span::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--mox-primary)}

/* sample output card on the right */
.mox-kw .mox-sample{background:#0e0f12;border:1px solid #1f2229;border-radius:18px;padding:22px;color:#fff;position:relative;transform:translateY(0);box-shadow:0 30px 60px -40px rgba(14,15,18,.5)}
.mox-kw .mox-sample::before{content:"";position:absolute;inset:-1px;border-radius:18px;padding:1px;background:linear-gradient(140deg,rgba(255,90,31,.5),transparent 40%);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}
.mox-kw .mox-sample__tag{font-family:var(--mox-font-m);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mox-primary) !important;margin-bottom:14px}
.mox-kw .mox-sample__score{display:flex;align-items:baseline;gap:14px;margin-bottom:14px}
.mox-kw .mox-sample__num{font-family:var(--mox-font-d);font-weight:800;font-size:64px;line-height:1;color:#fff !important}
.mox-kw .mox-sample__lbl{font-size:13.5px;color:#a7acb5 !important;max-width:170px;line-height:1.35}
.mox-kw .mox-sample__row{display:flex;justify-content:space-between;align-items:center;padding:9px 0;border-bottom:1px solid rgba(255,255,255,.07);font-size:13.5px;color:#a7acb5 !important}
.mox-kw .mox-sample__row b{color:#fff !important;font-weight:600;text-align:right;max-width:62%}
.mox-kw .mox-sample__row:last-of-type{border-bottom:0}
.mox-kw .mox-sample__note{margin-top:14px;padding:10px 12px;background:#181a20;border:1px solid #1f2229;border-radius:10px;font-size:12px;color:#a7acb5 !important;line-height:1.5}

/* ---------- scroll reveal ---------- */
.mox-kw .mox-rv{opacity:0;transform:translateY(14px);transition:opacity .7s var(--mox-ease),transform .7s var(--mox-ease)}
.mox-kw .mox-rv.mox-in{opacity:1;transform:none}

/* ---------- grids ---------- */
.mox-kw .mox-grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.mox-kw .mox-grid2{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}
.mox-kw .mox-card{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:16px;padding:22px}
.mox-kw .mox-card h3{font-family:var(--mox-font-d);font-size:17px;font-weight:600;color:var(--mox-ink) !important;margin:10px 0 6px}
.mox-kw .mox-card p{font-size:14.5px;color:#4a4e55 !important;margin:0;line-height:1.55}
.mox-kw .mox-surf{background:#181a20;border:1px solid #1f2229;border-radius:16px;padding:22px;color:#d4d6db;position:relative}
.mox-kw .mox-surf .mox-surf__ic{width:42px;height:42px;border-radius:11px;background:rgba(255,90,31,.16);color:var(--mox-primary);font-family:var(--mox-font-d);font-weight:700;font-size:17px;display:grid;place-items:center;margin-bottom:14px}
.mox-kw .mox-surf h3{font-family:var(--mox-font-d);font-weight:600;font-size:16.5px;color:#fff !important;margin:6px 0 6px}
.mox-kw .mox-surf ul{margin:10px 0 0;padding-left:18px;display:grid;gap:6px;font-size:13.5px;color:#a7acb5 !important}
.mox-kw .mox-surf ul li::marker{color:var(--mox-primary)}

/* ---------- comparison table ---------- */
.mox-kw .mox-cmp{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:16px;overflow:hidden}
.mox-kw .mox-cmp table{width:100%;border-collapse:collapse;font-size:14.5px}
.mox-kw .mox-cmp th,.mox-kw .mox-cmp td{padding:14px 18px;text-align:left;border-bottom:1px solid var(--mox-line);color:#3a3e45 !important;vertical-align:top}
.mox-kw .mox-cmp th{font-family:var(--mox-font-d);font-weight:600;font-size:13.5px;color:var(--mox-ink) !important;background:#fafafa}
.mox-kw .mox-cmp td:first-child{font-weight:600;color:var(--mox-ink) !important;width:30%}
.mox-kw .mox-cmp tr:last-child td{border-bottom:0}
.mox-kw .mox-cmp-aiso{color:var(--mox-primary) !important;font-weight:600}
.mox-kw .mox-cmp th.mox-cmp-aiso{background:#fff4ee}

/* ---------- the tool ---------- */
.mox-kw .mox-tool{padding:64px 0 88px;background:#0e0f12;color:#fff;position:relative}
.mox-kw .mox-tool::before{content:"";position:absolute;inset:0;background:radial-gradient(800px 400px at 50% -20%,rgba(255,90,31,.12),transparent 60%);pointer-events:none}
.mox-kw .mox-tool .mox-h2{color:#fff !important}
.mox-kw .mox-tool .mox-sub{color:#a7acb5 !important}
.mox-kw .mox-tool .mox-eyebrow{color:var(--mox-primary) !important}
.mox-kw .mox-tool__shell{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:34px;position:relative}
.mox-kw .mox-panel{background:#181a20;border:1px solid #1f2229;border-radius:18px;padding:26px}
.mox-kw .mox-panel h3{font-family:var(--mox-font-d);font-weight:600;font-size:18px;color:#fff !important;margin:0 0 14px}
.mox-kw .mox-steps{display:flex;gap:8px;margin-bottom:20px}
.mox-kw .mox-step{flex:1;text-align:center;font-family:var(--mox-font-m);font-size:11px;letter-spacing:.1em;text-transform:uppercase;padding:10px 8px;border-radius:9px;background:#1f2229;color:#85898f !important;font-weight:600;cursor:pointer;transition:all .25s var(--mox-ease)}
.mox-kw .mox-step.mox-on{background:var(--mox-primary);color:#fff !important}
.mox-kw .mox-pane{display:none}
.mox-kw .mox-pane.mox-show{display:block}
.mox-kw .mox-field{margin-bottom:14px}
.mox-kw .mox-field label{display:block;font-family:var(--mox-font-m);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#a7acb5 !important;margin-bottom:6px;font-weight:600}
.mox-kw .mox-field input[type=text],.mox-kw .mox-field select,.mox-kw .mox-field textarea{width:100%;padding:11px 13px;background:#0e0f12;border:1px solid #2a2e36;border-radius:10px;color:#fff !important;font-family:var(--mox-font-b);font-size:14.5px;transition:border-color .2s var(--mox-ease)}
.mox-kw .mox-field input[type=text]:focus,.mox-kw .mox-field select:focus,.mox-kw .mox-field textarea:focus{outline:0;border-color:var(--mox-primary)}
.mox-kw .mox-field small{display:block;margin-top:6px;font-size:12px;color:#85898f !important}
.mox-kw .mox-kwwrap{position:relative}
.mox-kw .mox-kwdetect{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-family:var(--mox-font-m);font-size:10.5px;letter-spacing:.06em;color:#85898f !important;background:#1f2229;border:1px solid #2a2e36;border-radius:6px;padding:3px 7px;text-transform:uppercase;pointer-events:none}
.mox-kw .mox-2col{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.mox-kw .mox-assets{display:grid;grid-template-columns:1fr 1fr;gap:9px}
.mox-kw .mox-asset{display:flex;gap:9px;align-items:center;background:#1f2229;border:1px solid #2a2e36;border-radius:10px;padding:10px 12px;font-size:13.5px;color:#d4d6db !important;cursor:pointer;transition:all .2s var(--mox-ease)}
.mox-kw .mox-asset input{accent-color:var(--mox-primary)}
.mox-kw .mox-asset.mox-picked{border-color:var(--mox-primary);background:rgba(255,90,31,.08);color:#fff !important}
.mox-kw .mox-nav{display:flex;justify-content:space-between;gap:10px;margin-top:18px}
.mox-kw .mox-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}
.mox-kw .mox-actions .mox-btn--mini{background:#1f2229;border:1px solid #2a2e36;color:#fff !important}
.mox-kw .mox-actions .mox-btn--mini:hover{border-color:var(--mox-primary)}

/* result panel */
.mox-kw .mox-result{background:#181a20;border:1px solid #1f2229;border-radius:18px;padding:24px;min-height:520px;position:sticky;top:18px}
.mox-kw .mox-result__empty{color:#a7acb5 !important;font-size:14px;line-height:1.6}
.mox-kw .mox-result__empty h3{font-family:var(--mox-font-d);font-weight:600;color:#fff !important;font-size:18px;margin:0 0 10px}
.mox-kw .mox-result__empty ul{margin:10px 0 0;padding-left:18px;display:grid;gap:6px;font-size:13.5px;color:#a7acb5 !important}
.mox-kw .mox-result__empty ul li::marker{color:var(--mox-primary)}

.mox-kw .mox-result .mox-headline{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;margin-bottom:14px}
.mox-kw .mox-result .mox-headline__h{font-family:var(--mox-font-d);font-weight:700;font-size:18px;color:#fff !important}
.mox-kw .mox-result .mox-headline__s{font-family:var(--mox-font-m);font-size:11px;letter-spacing:.08em;color:#a7acb5 !important;text-transform:uppercase;margin-top:4px}
.mox-kw .mox-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:16px}
.mox-kw .mox-summary div{background:#0e0f12;border:1px solid #1f2229;border-radius:11px;padding:11px 12px}
.mox-kw .mox-summary span{display:block;font-family:var(--mox-font-m);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:#85898f !important;margin-bottom:4px}
.mox-kw .mox-summary b{font-family:var(--mox-font-d);font-weight:700;font-size:20px;color:var(--mox-primary) !important;line-height:1}
.mox-kw .mox-summary em{font-style:normal;color:#a7acb5 !important;font-family:var(--mox-font-m);font-size:11px;margin-left:5px;font-weight:500}

.mox-kw .mox-bucket{margin-bottom:16px}
.mox-kw .mox-bucket__h{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.mox-kw .mox-bucket__h h4{font-family:var(--mox-font-m);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--mox-primary) !important;margin:0;font-weight:600}
.mox-kw .mox-bucket__h span{font-family:var(--mox-font-m);font-size:10.5px;letter-spacing:.06em;color:#85898f !important}
.mox-kw .mox-kwlist{display:grid;gap:7px}
.mox-kw .mox-kwitem{background:#0e0f12;border:1px solid #1f2229;border-radius:11px;padding:11px 13px;display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;transition:border-color .2s var(--mox-ease)}
.mox-kw .mox-kwitem:hover{border-color:var(--mox-primary)}
.mox-kw .mox-kwitem__top{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.mox-kw .mox-kwitem__kw{font-family:var(--mox-font-b);font-weight:600;font-size:14.5px;color:#fff !important}
.mox-kw .mox-kwitem__score{font-family:var(--mox-font-m);font-size:11px;font-weight:600;color:var(--mox-primary) !important;background:rgba(255,90,31,.12);border:1px solid rgba(255,90,31,.25);border-radius:6px;padding:2px 7px;min-width:34px;text-align:center}
.mox-kw .mox-kwitem__meta{font-size:12px;color:#a7acb5 !important;margin-top:4px;display:flex;gap:10px;flex-wrap:wrap}
.mox-kw .mox-kwitem__meta b{color:#fff !important;font-weight:600;font-family:var(--mox-font-m);font-size:11px}
.mox-kw .mox-kwitem__why{font-size:12.5px;color:#a7acb5 !important;margin-top:4px;line-height:1.5}

.mox-kw .mox-block{background:#0e0f12;border:1px solid #1f2229;border-radius:12px;padding:14px 15px;margin-bottom:11px}
.mox-kw .mox-block h4{font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--mox-primary) !important;margin:0 0 7px;font-family:var(--mox-font-m);font-weight:600}
.mox-kw .mox-block p,.mox-kw .mox-block li{font-size:13.5px;color:#d4d6db !important}
.mox-kw .mox-block ul{padding-left:18px;display:grid;gap:5px;margin:6px 0 0}
.mox-kw .mox-block ul li::marker{color:var(--mox-primary)}
.mox-kw .mox-block--seometa p{font-size:13px;color:#e6e7ea !important;font-family:var(--mox-font-b);line-height:1.5}
.mox-kw .mox-copymini{float:right;font-family:var(--mox-font-m);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--mox-primary) !important;background:none;border:1px solid rgba(255,255,255,.18);border-radius:5px;padding:2px 7px;cursor:pointer}
.mox-kw .mox-copymini:hover{border-color:var(--mox-primary)}
.mox-kw .mox-quickwin{display:flex;gap:11px;align-items:flex-start;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.07)}
.mox-kw .mox-quickwin:last-child{border-bottom:0}
.mox-kw .mox-quickwin__n{flex:none;width:22px;height:22px;border-radius:6px;background:rgba(255,90,31,.18);color:var(--mox-primary) !important;font-family:var(--mox-font-m);font-weight:600;font-size:11px;display:grid;place-items:center;margin-top:1px}
.mox-kw .mox-quickwin__t{font-weight:600;color:#fff !important;font-size:13.5px}
.mox-kw .mox-quickwin__d{font-size:12.5px;color:#a7acb5 !important;margin-top:3px;line-height:1.5}
.mox-kw .mox-imp{display:inline-block;margin-left:6px;font-family:var(--mox-font-m);font-size:9.5px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;padding:2px 6px;border-radius:4px;vertical-align:middle}
.mox-kw .mox-imp--h{background:rgba(227,77,91,.18);color:#ff8a95 !important}
.mox-kw .mox-imp--m{background:rgba(232,162,12,.18);color:#ffc759 !important}
.mox-kw .mox-imp--l{background:rgba(124,196,130,.18);color:#9be3a3 !important}
.mox-kw .mox-flash{animation:moxFlash .9s var(--mox-ease)}
@keyframes moxFlash{0%{box-shadow:0 0 0 0 rgba(255,90,31,.55)}100%{box-shadow:0 0 0 14px rgba(255,90,31,0)}}

/* history strip */
.mox-kw .mox-hist{margin-top:14px;padding-top:14px;border-top:1px solid rgba(255,255,255,.08)}
.mox-kw .mox-hist__h{font-family:var(--mox-font-m);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:#85898f !important;margin-bottom:7px;font-weight:600}
.mox-kw .mox-hist__row{display:flex;flex-wrap:wrap;gap:6px}
.mox-kw .mox-hist__pill{font-family:var(--mox-font-m);font-size:11px;color:#d4d6db !important;background:#1f2229;border:1px solid #2a2e36;border-radius:7px;padding:4px 9px;cursor:pointer}
.mox-kw .mox-hist__pill b{color:var(--mox-primary) !important;margin-right:5px}
.mox-kw .mox-hist__pill:hover{border-color:var(--mox-primary)}

/* ---------- process flow ---------- */
.mox-kw .mox-flow{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.mox-kw .mox-flow__step{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:16px;padding:24px;position:relative}
.mox-kw .mox-flow__n{font-family:var(--mox-font-m);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--mox-primary) !important;font-weight:600;margin-bottom:8px}
.mox-kw .mox-flow__step h3{font-family:var(--mox-font-d);font-weight:600;font-size:18px;color:var(--mox-ink) !important;margin:0 0 8px}
.mox-kw .mox-flow__step p{font-size:14.5px;color:#4a4e55 !important;margin:0;line-height:1.6}

/* ---------- examples ---------- */
.mox-kw .mox-ex{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:16px;padding:22px;display:flex;flex-direction:column;gap:10px}
.mox-kw .mox-ex__kw{font-family:var(--mox-font-m);font-size:12.5px;color:var(--mox-primary) !important;background:rgba(255,90,31,.08);border:1px solid rgba(255,90,31,.22);border-radius:7px;padding:5px 9px;align-self:flex-start;font-weight:600}
.mox-kw .mox-ex__row{display:flex;justify-content:space-between;font-size:13.5px;color:#4a4e55 !important;padding:6px 0;border-bottom:1px dashed var(--mox-line)}
.mox-kw .mox-ex__row:last-of-type{border-bottom:0}
.mox-kw .mox-ex__row b{color:var(--mox-ink) !important;font-weight:600;text-align:right;max-width:62%}
.mox-kw .mox-ex p{margin:6px 0 0;font-size:14px;color:#4a4e55 !important;line-height:1.6}

/* ---------- use cases ---------- */
.mox-kw .mox-use{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.mox-kw .mox-use__card{background:#181a20;border:1px solid #1f2229;border-radius:16px;padding:22px}
.mox-kw .mox-use__card h3{font-family:var(--mox-font-d);font-weight:600;color:#fff !important;font-size:17px;margin:8px 0 6px}
.mox-kw .mox-use__card p{font-size:14px;color:#a7acb5 !important;line-height:1.6;margin:0}
.mox-kw .mox-use__n{font-family:var(--mox-font-d);font-weight:700;font-size:30px;color:var(--mox-primary) !important;line-height:1}

/* ---------- FAQ ---------- */
.mox-kw .mox-faq{display:grid;gap:10px;margin-top:6px}
.mox-kw .mox-q{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:13px;overflow:hidden;transition:border-color .2s var(--mox-ease)}
.mox-kw .mox-q.mox-open{border-color:var(--mox-primary)}
.mox-kw .mox-q button{width:100%;text-align:left;background:none;border:0;padding:16px 18px;font-family:var(--mox-font-d);font-weight:600;font-size:15.5px;color:var(--mox-ink) !important;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:14px}
.mox-kw .mox-q__x{flex:none;width:26px;height:26px;border-radius:7px;background:#f0f1f3;color:#0e0f12 !important;font-size:16px;font-weight:600;display:grid;place-items:center;transition:transform .3s var(--mox-ease),background .3s var(--mox-ease)}
.mox-kw .mox-q.mox-open .mox-q__x{background:var(--mox-primary);color:#fff !important;transform:rotate(45deg)}
.mox-kw .mox-q__a{max-height:0;overflow:hidden;transition:max-height .35s var(--mox-ease)}
.mox-kw .mox-q__a p{margin:0;padding:0 18px 18px;font-size:14.5px;color:#3a3e45 !important;line-height:1.65}

/* ---------- honest scope (yes/no split) ---------- */
.mox-kw .mox-split{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.mox-kw .mox-split__col{background:#181a20;border:1px solid #1f2229;border-radius:16px;padding:24px}
.mox-kw .mox-split__col h3{font-family:var(--mox-font-d);font-weight:600;font-size:18px;color:#fff !important;margin:0 0 12px}
.mox-kw .mox-split__col ul{padding-left:18px;display:grid;gap:8px;font-size:14px;color:#d4d6db !important}
.mox-kw .mox-split__col ul li::marker{color:var(--mox-primary)}
.mox-kw .mox-split__col--yes{border-top:3px solid #6cc77f}
.mox-kw .mox-split__col--no{border-top:3px solid var(--mox-risk)}

/* ---------- related resources ---------- */
.mox-kw .mox-rel{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:16px;padding:22px;text-decoration:none !important;display:flex;flex-direction:column;gap:8px;transition:transform .2s var(--mox-ease),border-color .2s var(--mox-ease),box-shadow .2s var(--mox-ease)}
.mox-kw .mox-rel:hover{transform:translateY(-2px);border-color:var(--mox-primary);box-shadow:0 14px 30px -18px rgba(255,90,31,.35)}
.mox-kw .mox-rel__tag{display:inline-block;align-self:flex-start;font-family:var(--mox-font-m);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--mox-primary) !important;background:rgba(255,90,31,.10);border:1px solid rgba(255,90,31,.22);border-radius:6px;padding:3px 8px;font-weight:600}
.mox-kw .mox-rel h3{font-family:var(--mox-font-d);font-weight:600;font-size:16.5px;color:var(--mox-ink) !important;margin:0}
.mox-kw .mox-rel p{font-size:14px;color:#4a4e55 !important;margin:0;line-height:1.55}
.mox-kw .mox-rel__go{font-family:var(--mox-font-m);font-size:11.5px;letter-spacing:.06em;color:var(--mox-primary) !important;margin-top:4px;font-weight:600}

/* ---------- CTA ---------- */
.mox-kw .mox-cta{padding:88px 0;text-align:center;background:
  radial-gradient(800px 420px at 50% -10%,rgba(255,90,31,.20),transparent 60%),#0e0f12;color:#fff;position:relative}
.mox-kw .mox-cta .mox-eyebrow{justify-content:center}
.mox-kw .mox-cta .mox-eyebrow::before{display:none}
.mox-kw .mox-cta .mox-h2{margin:0 auto;color:#fff !important;max-width:760px}
.mox-kw .mox-cta .mox-hero__cta{justify-content:center;margin-top:26px}
.mox-kw .mox-cta small{display:block;margin-top:22px;font-size:12.5px;color:#85898f !important}

/* ---------- responsive ---------- */
@media(max-width:980px){
  .mox-kw .mox-hero__grid,.mox-kw .mox-tool__shell{grid-template-columns:1fr}
  .mox-kw .mox-grid3,.mox-kw .mox-flow,.mox-kw .mox-use{grid-template-columns:1fr 1fr}
  .mox-kw .mox-result{position:static}
}
@media(max-width:620px){
  .mox-kw .mox-sec{padding:64px 0}
  .mox-kw .mox-grid3,.mox-kw .mox-grid2,.mox-kw .mox-flow,.mox-kw .mox-use,.mox-kw .mox-2col,.mox-kw .mox-assets,.mox-kw .mox-split{grid-template-columns:1fr}
  .mox-kw .mox-hero{padding:52px 0 40px}
  .mox-kw .mox-summary{grid-template-columns:1fr 1fr}
  .mox-kw .mox-trust__row{font-size:10.5px}
  .mox-kw .mox-cmp th:first-child,.mox-kw .mox-cmp td:first-child{width:auto}
}

/* 3-TIER GRADED SECTIONS */
.mox-kw .mox-sec--white {
  background: #ffffff !important;
  color: #0e0f12 !important;
  border-top: 1px solid #eef0f3;
  border-bottom: 1px solid #eef0f3;
}
.mox-kw .mox-sec--white h2, .mox-kw .mox-sec--white h3 { color: #0e0f12 !important; }
.mox-kw .mox-sec--white p, .mox-kw .mox-sec--white li, .mox-kw .mox-sec--white .mox-sub, .mox-kw .mox-sec--white .mox-sec-sub { color: #525866 !important; }
.mox-kw .mox-sec--white .mox-card, .mox-kw .mox-sec--white .mox-usecase, .mox-kw .mox-sec--white .mox-method-card { background: #ffffff !important; border: 1px solid #e2e8f0 !important; box-shadow: 0 4px 20px rgba(0,0,0,0.03) !important; }
.mox-kw .mox-sec--white .mox-card:hover, .mox-kw .mox-sec--white .mox-usecase:hover, .mox-kw .mox-sec--white .mox-method-card:hover { transform: translateY(-4px); border-color: rgba(245, 131, 39, 0.4) !important; box-shadow: 0 18px 40px rgba(14,15,18,0.08) !important; }

.mox-kw .mox-sec--grey {
  background: #f1f3f7 !important;
  color: #0e0f12 !important;
  border-top: 1px solid #e2e8f0;
  border-bottom: 1px solid #e2e8f0;
}
.mox-kw .mox-sec--grey h2, .mox-kw .mox-sec--grey h3 { color: #0e0f12 !important; }
.mox-kw .mox-sec--grey p, .mox-kw .mox-sec--grey li, .mox-kw .mox-sec--grey .mox-sub, .mox-kw .mox-sec--grey .mox-sec-sub { color: #4b5563 !important; }
.mox-kw .mox-sec--grey .mox-card, .mox-kw .mox-sec--grey .mox-step-card, .mox-kw .mox-sec--grey .mox-tool-box, .mox-kw .mox-sec--grey .mox-usecase, .mox-kw .mox-sec--grey .mox-method-card {
  background: #ffffff !important;
  border: 1px solid #e2e8f0 !important;
  box-shadow: 0 10px 30px rgba(15,23,42,0.05) !important;
}
.mox-kw .mox-sec--grey .mox-card:hover, .mox-kw .mox-sec--grey .mox-usecase:hover, .mox-kw .mox-sec--grey .mox-method-card:hover {
  transform: translateY(-4px);
  border-color: rgba(245, 131, 39, 0.4) !important;
  box-shadow: 0 18px 40px rgba(15,23,42,0.09) !important;
}

.mox-kw .mox-sec--dark {
  background: #0b0d12 !important;
  color: #f4f4f6 !important;
  border-top: 1px solid rgba(255,255,255,0.06);
  border-bottom: 1px solid rgba(255,255,255,0.06);
}
.mox-kw .mox-sec--dark h2, .mox-kw .mox-sec--dark h3 { color: #ffffff !important; }
.mox-kw .mox-sec--dark p, .mox-kw .mox-sec--dark li, .mox-kw .mox-sec--dark .mox-sub, .mox-kw .mox-sec--dark .mox-sec-sub { color: #94a3b8 !important; }
.mox-kw .mox-sec--dark .mox-card, .mox-kw .mox-sec--dark .mox-step-card, .mox-kw .mox-sec--dark .mox-usecase, .mox-kw .mox-sec--dark .mox-method-card {
  background: #16181f !important;
  border: 1px solid rgba(255, 255, 255, 0.08) !important;
  box-shadow: 0 16px 36px rgba(0, 0, 0, 0.5) !important;
}
.mox-kw .mox-sec--dark .mox-card:hover, .mox-kw .mox-sec--dark .mox-usecase:hover, .mox-kw .mox-sec--dark .mox-method-card:hover {
  transform: translateY(-4px);
  border-color: rgba(245, 131, 39, 0.5) !important;
  box-shadow: 0 20px 48px rgba(0,0,0,0.8), 0 0 20px rgba(245, 131, 39, 0.15) !important;
}

  
    
      100% free · no signup
      Runs in your browser
      40+ keyword ideas per seed
      6 intent groups
      Copy · Markdown · download
    
  

  
    
      Free MoxSEO Tool
      
# Find the keywords that actually move your business forward

      
Enter one seed term, set your market and audience, and get a prioritized list of **keyword opportunities** — grouped by intent, scored on fit, with quick wins, long-tails, question queries, local variants, and a draft title & meta ready for your next content brief.

      
        [Research My Keywords](#mox-tool)
        [How Scoring Works](#mox-how)
      
      
        No signup, no API keys
        Runs in your browser
        Local + content focus
        Brief-ready export
      
    
    
      
        Sample output · "crm for real estate"
        
          42
          Keyword opportunities found, grouped and scored
        
        Top bucket**Long-tail (high fit)**
        Quick wins**7 keywords, score 70+**
        Primary intent**Commercial · B2B**
        Local variants**Auto-detected**
        Title draft**Best CRM for Real Estate…**
        Honest scope: this is a strategic keyword ideation tool driven by your seed and inputs. It does not pull live search volume or live difficulty from third-party APIs.
      
    
  

  
    
      What Gets Scored
      
## A keyword list isn't useful until you know which ones you can actually win

      
Volume and difficulty are useful — but they don't tell you whether a keyword fits your business, your audience, or the page you can realistically publish. The MoxSEO Keyword Research Tool reads nine signals your spreadsheet doesn't.

    
    
      SIGNAL 01
### Search intent

Classifies each idea as informational, commercial, transactional, navigational, or local — so every keyword lands in the right bucket and the right page type.

      SIGNAL 02
### Volume band (proxy)

Estimates a Low / Medium / High band from term length, modifiers, and patterns. Treated as a directional signal, not a live API number.

      SIGNAL 03
### Competition intensity

Reads how crowded a SERP is likely to be for this intent — short generic head terms score harder than specific long-tail patterns.

      SIGNAL 04
### Business fit

Scores how well each idea matches your business type, audience, and goal — the dimension your keyword tool can't read.

      SIGNAL 05
### Trend & freshness

Flags keywords with year modifiers, "vs", "best", or how-to patterns that tend to track intent shifts and refresh-worthy queries.

      SIGNAL 06
### Content gap estimate

Estimates how unrepresented the topic is in your audience's preferred format — comparison, tool, checklist, guide, local page.

      SIGNAL 07
### AI absorption risk

Marks which keywords an AI Overview or LLM can answer fully — so you prioritize the ones that still reward a real page.

      SIGNAL 08
### SERP feature fit

Predicts which result feature each idea competes against — AI Overview, Featured Snippet, PAA, Video, Local Pack — so you design the right container.

      SIGNAL 09
### Quick-win priority

Combines intent, volume band, competition, and business fit into a single 0–100 priority score so the brief writes itself.

    
  

  
    
      Keyword Tools vs. The MoxSEO Way
      
## Why a list of 500 keywords rarely tells you what to write first

      
Volume and difficulty are inputs, not strategy. The MoxSEO Keyword Research Tool runs after your research tool, between discovery and the content brief, to answer the question your spreadsheet can't: "which of these can we actually win, and which one should we write first?"

    
    
      
| Dimension | Traditional keyword tools | MoxSEO Keyword Research |
| --- | --- | --- |
| Main signal | Search volume + keyword difficulty | Intent + business fit + opportunity |
| Output shape | A flat list of N keywords | Grouped buckets with priorities & actions |
| Business context | Not read from your inputs | Scored against your type, audience, goal |
| AI-search awareness | Usually missing | Absorption risk + SERP feature per idea |
| Local handling | Same output for every market | Country-specific patterns surfaced |
| Export | CSV / API | Brief-ready plan, markdown, .md download |
| When to use it | Discovery & sizing | After discovery, before the content brief |

    
  

  
    
      Free Keyword Research Tool
      
## Build your prioritized keyword plan in three steps

      
Enter a seed, set your market and audience, and tell us what you can actually publish. You'll get a grouped keyword plan with intent, business fit, priority scores, quick wins, question queries, local variants, a title & meta draft, and a brief-ready action plan you can hand to a writer.

    
    
      
      
        
          1 · Seed & Market
          2 · Business
          3 · Strengths
        

        
        
          
            Seed keyword or topic
            
              
              auto: —
            
            A single seed produces 30–50 ideas. Use the term you would type into a search bar.
          
          
            
              Target market
              
                GlobalIndiaUnited StatesUnited KingdomCanadaAustraliaUAESingaporeGermanyOther country
              
            
            
              Language
              
                EnglishEnglish (India)English (UK)GermanSpanishFrenchArabicHindiOther language
              
            
          
          
            Niche (optional)
            
            Helps the tool prefer modifiers and proof patterns that match your space.
          
          
            
            Next: Business →
          
        

        
        
          
            
              Business type
              
                Local business
                SaaS / software
                Ecommerce / DTC
                Content / blog
                Agency / services
                Other
              
            
            
              Audience
              
                B2B
                B2C
                Both
              
            
          
          
            Primary goal
            
              Leads & signups
              Direct sales
              Awareness & traffic
              Authority & trust
            
            Goal changes which intents score highest — leads reward commercial, authority rewards informational depth.
          
          
            ← Back
            Next: Strengths →
          
        

        
        
          
            Content strengths you can ship (pick all that apply)
            
               Case studies & client results
               Original data or research
               Tool, calculator, or interactive demo
               Named expert author & credentials
               Video walkthroughs
               Comparison tables
               Local proof, reviews, service-area pages
               Templates & downloads
               Detailed FAQ & structured answers
               Screenshots & annotated processes
            
            Real assets lift your content moat score — and the priority of keywords that reward a moat.
          
          
            ← Back
            Generate Keyword Plan
          
        
      

      
      
        
          
### Your keyword plan will appear here

          
Fill in the three steps on the left. The tool generates a grouped list of ideas with intent, fit, priority scores, quick wins, local variants, a title & meta draft, and a copy-paste plan.

          
- 30–50 ideas per seed, across 6 intent buckets
- Priority score = intent + volume band + competition + fit + trend + gap
- AI-absorption risk flag per keyword
- Predicted SERP features for the seed
- Copy plan / Markdown / .md download

        
      
    
  

  
    
      How It Works
      
## From seed keyword to a brief-ready plan in under a minute

      
Three steps, no setup. The same approach a senior SEO would use to triage a list of 500 keywords into the seven you should publish this month.

    
    
      
        STEP 01 · INPUT
        
### Seed, market, audience

        
Drop in a seed keyword, pick your market and language, and tell us the niche. The tool already starts reading intent modifiers, geo cues, and topic patterns as you type.

      
      
        STEP 02 · SCORE
        
### Generate the prioritized plan

        
The tool expands the seed into 30–50 ideas across six buckets, scores each on intent, volume band, competition, business fit, trend, and content gap, then ranks the plan by opportunity.

      
      
        STEP 03 · BRIEF
        
### Hand the plan to your writer

        
Copy the plan as plain text or markdown, or download the .md. Your writer gets the seed, the angle, the buckets, the quick wins, the title, and the meta — everything to brief the page in one shot.

      
    
  

  
    
      Example Plans
      
## See how the same seed produces different plans for different businesses

      
The tool's recommendations change with your business type, audience, and goal. Here are three real plans it would generate — and the difference each context makes.

    
    
      
        Seed: "crm for real estate" · SaaS · B2B · Leads
        Top bucket**Long-tail (commercial)**
        Quick wins (70+)**9 keywords**
        Featured intent**Comparison · Best-of**
        Local variants**Auto-generated**
        Title draft**Best CRM for Real Estate…**
        
SaaS plan leans into "best crm for real estate agents", comparison terms, and feature-led long-tails. Local variants are down-weighted because SaaS buyers are national.

      
      
        Seed: "dentist near me" · Local · B2C · Leads
        Top bucket**Local (high fit)**
        Quick wins (70+)**12 keywords**
        Featured intent**Local · Transactional**
        Local variants**City & service-area**
        Title draft**Dentist in [City]…**
        
Local plan pushes city-scoped and service-specific variants, surfaces GBP-style terms, and elevates "emergency / open now" patterns that drive calls.

      
      
        Seed: "how to write seo content" · Blog · B2C · Authority
        Top bucket**Question (informational)**
        Quick wins (70+)**6 keywords**
        Featured intent**How-to · FAQ**
        Local variants**Suppressed**
        Title draft**How to Write SEO Content…**
        
Blog plan leans into question patterns, sub-topic long-tails, and template/tool keywords that an authority site can rank and re-revise over time.

      
    
  

  
    
      Improve The Plan
      
## Six ways to turn a flat list into a plan that ships traffic

      
A keyword list is only useful if it leads to publishing. These six tactics move the plan from "interesting ideas" to "the seven pages we publish this month" — and they're what separates a research output from a real strategy.

    
    
      Tactic 1
### Pick the page type per bucket

Don't write the same format for every bucket. Comparison bucket → comparison page. Question bucket → FAQ / guide. Local bucket → city or service-area page. Match the format to the intent.

      Tactic 2
### Cluster by topic, not by keyword

Group the plan into 3–7 topical clusters. One pillar, multiple supporting pages, internal links between them. Clusters build topical authority; one-off posts don't.

      Tactic 3
### Layer intent depth

Don't publish only "best of" terms. Pair every commercial keyword with a deep how-to, a comparison, and a local variant. AI-search rewards clusters, not isolated URLs.

      Tactic 4
### Anchor each cluster to a real asset

Each cluster should be backed by something an AI summary can't replicate — a calculator, a dataset, a case study, a template. The asset is the moat; the keyword is the door.

      Tactic 5
### Localize by market

If you target India and the US, run the tool twice — once per market. Pricing, terminology, and proof patterns are different, and the right cluster in one market is rarely the right cluster in the other.

      Tactic 6
### Re-research quarterly

Refresh the plan every quarter. Volume and intent shift, your strengths shift, the SERP shifts. Treat the keyword plan as a living document, not a one-off deliverable.

    
  

  
    
      Who It's For
      
## Built for the moment after research and before the content brief

      
Most teams know what they're going to write. Fewer teams know which seven terms deserve a real page this month. The MoxSEO Keyword Research Tool sits in that gap.

    
    
      01
### Content & SEO teams

Triage a flat keyword export into a ranked plan, drop the priority list into the editorial calendar, and brief writers with intent, page type, and angle in one place.

      02
### Local businesses & agencies

Surface city, service-area, and "near me" variants for every location, see which terms your competitors are weak on, and prioritize the ones that drive calls and visits.

      03
### Founders & marketers

Skip the spreadsheet spiral. Get a short, ranked plan from one seed, see what to publish first, and use the title & meta draft as the starting point for the brief.

      04
### AI-search-aware teams

Spot which keywords an AI Overview will absorb, prioritize the ones that still reward a real page, and use the gap and SERP-feature signals to design containers AI can't replace.

      05
### Ecommerce & DTC

Find commercial-intent terms by category, surface comparison and "best" patterns buyers actually use, and separate product-led keywords from blog-led ones in the same plan.

      06
### Agencies & consultants

Run it client-by-client with each one's business type, audience, and goal baked in. Hand the brief-ready plan to your writers and clients as the first artifact of every engagement.

    
  

  
    
      FAQ
      
## Questions about the MoxSEO Keyword Research Tool

    
    
      What does the MoxSEO Keyword Research Tool actually do?+
It takes one seed keyword, plus your market, business type, audience, goal, and content strengths, then generates a grouped plan of 30–50 keyword ideas with intent, volume band, competition, business fit, AI-absorption risk, predicted SERP features, and a priority score per idea. The output is brief-ready — copy as text, markdown, or download as a .md file.

      Does it pull real search volume from Google, Ahrefs, or Semrush?+
No, and we won't pretend it does. Pulling live volume requires API access to paid data providers. The tool uses transparent, deterministic rules from your seed and inputs to estimate volume bands and opportunity. For exact live numbers, pair this with your existing research tool.

      How is this different from any other free keyword tool?+
Most free keyword tools return a flat list sorted by estimated volume. This one reads your business context — type, audience, goal, strengths — and scores each idea on whether your business can actually win it. The output is grouped into intent buckets with priority scores, not just one long table.

      Should I still use a paid keyword research tool?+
Yes. Keep your paid tool for raw volume, difficulty, and SERP analysis at the discovery stage. Run the MoxSEO Keyword Research Tool after discovery, between finding the keyword and writing the brief — that's where most teams lose time picking the wrong page type or the wrong cluster.

      Where do the keyword ideas come from?+
From transparent modifier rules: intent cues (best, vs, how to, what is, near me, for, alternative), question patterns (who, what, when, why, how), commercial cues (price, cost, review, comparison), local cues (city / near me / in my area), and topical modifiers (year, niche, audience). No mystery black-box AI generation — every idea traces back to a rule you can see.

      How is the priority score calculated?+
Priority = (intent value × 0.22) + (volume band × 0.18) + (competition inverse × 0.20) + (business fit × 0.25) + (trend × 0.08) + (content gap × 0.07), clamped between 4 and 98. Every component is explained above the fold — there is no proprietary black box.

      Why does it ask for my business type, audience, and goal?+
Because the same keyword scores completely differently for a SaaS company vs. a local clinic, and the same query is irrelevant for B2B vs. B2C. Your context is the most important input — that's what turns a generic keyword list into a plan you can actually execute.

      What's a "quick win"?+
A keyword with priority score 70 or higher — strong intent match, low competition, strong business fit, and a clear content gap. Quick wins are the seven keywords you should publish first because they have the highest probability of ranking AND earning the click.

      Does it work for non-English markets?+
Yes for the planning logic — intent classification, modifier patterns, business-fit scoring, and SERP feature prediction all work regardless of language. The English keyword examples in the output will be in English unless your seed is in another language; the rules apply the same way.

      How should I use the title & meta draft?+
The title draft is tuned to your seed, intent, and market. Use it as the starting point for your title tag in Rank Math, Yoast, or your CMS, then refine for your brand voice. The meta description is a strong first draft — replace generic phrases with proof and specificity for the best click-through.

      Is the MoxSEO Keyword Research Tool really free?+
Yes — no signup, no API keys, no account. It runs entirely in your browser. MoxSEO builds free SEO and AI-search tools like this one to help marketers and founders plan content that's worth publishing.

      What's the best way to use this alongside the AISO Score Checker?+
Run this tool first to find the keywords worth pursuing. Then run the AISO Score Checker on the top three to validate which page type and angle each keyword actually rewards. The two together cover the full journey from "what should we write about" to "what's the right page for this keyword."

    
  

  
    
      Honest Scope
      
## What this tool does — and what it doesn't

      
We won't pretend this pulls live volume from paid APIs. Here's the honest line between a strategic keyword ideation tool and a full SEO platform.

    
    
      
        
### What it does

        
- Generates 30–50 keyword ideas from one seed in seconds
- Classifies intent and groups ideas into six buckets
- Scores business fit, opportunity, and quick-win priority
- Flags AI-absorption risk and predicted SERP features
- Surfaces local, question, and commercial variants automatically
- Drafts a title, meta, and copy-paste brief-ready plan

      
      
        
### What it doesn't do

        
- Pull live monthly search volume from Google, Ahrefs, or Semrush
- Replace your paid keyword research tool
- Track live rankings or AI-platform citations
- Read your site's actual authority or backlinks
- Guarantee a ranking or a traffic outcome
- Predict exact SERP outcomes per market

      
    
  

  
    
      Explore · More MoxSEO Tools
      
## After the keyword plan, these MoxSEO tools finish the job

      
A keyword plan is the start. These free MoxSEO tools help you pick the right page type, diagnose visibility issues, and execute the strategy end-to-end.

    
    
      [Free Tool
### AISO Score Checker

Take your top three keywords from the plan and score them for AI-search fit — get the recommended page type, SERP features, and a title & meta draft.

Open the AISO Checker →](https://moxseo.com/tools/aiso-score-checker/)
      [Free Tool
### Website Visibility Scorecard

If your published keywords aren't earning clicks, diagnose whether the issue is discovery, indexing, search clarity, or trust.

Open the scorecard →](https://moxseo.com/tools/website-visibility-scorecard/)
      [Guide
### How to Do Keyword Research in 2026

The full workflow we recommend: discovery, prioritization, page-type decision, and brief assembly — in the order that actually works.

Read the guide →](https://moxseo.com/blog/keyword-research-guide/)
      [Framework
### Source-of-Truth for AI Search

The framework behind the AISO Score — how to build pages that are clear to search engines, AI systems, and real buyers at the same time.

Explore the framework →](https://moxseo.com/ai-search-optimization/)
      [Guide
### Indexed But Not Ranking?

You built the plan, shipped the page, and it's still invisible. Diagnose the gap between indexed and earning clicks.

Read the guide →](https://moxseo.com/blog/indexed-but-not-ranking/)
      [Service
### SEO Services by MoxSEO

Want a team to run this end-to-end across your content map? MoxSEO handles research, prioritization, content, and visibility.

Talk to MoxSEO →](https://moxseo.com/seo-services/)
    
  

  
    Ready?
    
## Stop guessing what to write next. Plan it in 60 seconds.

    
      [Research My Keywords](#mox-tool)
    
    Free strategic keyword ideation by MoxSEO · no live API data · no fake volume claims
  

(function(){
  var root=document.getElementById('mox-kw-root');
  var HKEY='mox-kw-history-v1';

  /* ---------- scroll reveal ---------- */
  var io=new IntersectionObserver(function(es){es.forEach(function(e){if(e.isIntersecting){e.target.classList.add('mox-in');io.unobserve(e.target);}});},{threshold:.12});
  root.querySelectorAll('.mox-rv').forEach(function(el){io.observe(el);});

  /* ---------- FAQ accordion ---------- */
  root.querySelectorAll('.mox-q>button').forEach(function(btn){
    btn.addEventListener('click',function(){
      var q=btn.parentElement,a=q.querySelector('.mox-q__a'),open=q.classList.contains('mox-open');
      root.querySelectorAll('.mox-q.mox-open').forEach(function(o){o.classList.remove('mox-open');o.querySelector('.mox-q__a').style.maxHeight='0';});
      if(!open){q.classList.add('mox-open');a.style.maxHeight=a.scrollHeight+'px';}
    });
  });

  /* ---------- wizard ---------- */
  function goStep(n){
    root.querySelectorAll('.mox-pane').forEach(function(p){p.classList.toggle('mox-show',p.dataset.mpane==n);});
    root.querySelectorAll('.mox-step').forEach(function(s){s.classList.toggle('mox-on',+s.dataset.mstep city bank (small curated set, used to surface local variants) ---------- */
  var CITY_BANK={
    global:['local','near me'],
    in:['Mumbai','Bengaluru','Delhi','Hyderabad','Chennai','Kolkata','Pune','Ahmedabad'],
    us:['New York','Los Angeles','Chicago','Houston','Austin','Seattle','Boston','Miami','Denver','Atlanta'],
    uk:['London','Manchester','Birmingham','Leeds','Bristol','Edinburgh','Glasgow'],
    ca:['Toronto','Vancouver','Montreal','Calgary','Ottawa'],
    au:['Sydney','Melbourne','Brisbane','Perth','Adelaide'],
    ae:['Dubai','Abu Dhabi','Sharjah'],
    sg:['Singapore'],
    de:['Berlin','Munich','Hamburg','Frankfurt','Cologne'],
    other:['local','near me']
  };

  /* ---------- modifier banks ---------- */
  var MODS={
    question:['what is','what are','how to','how do','how can','why','when to','who is','which','how much','how long','how often'],
    commercial:['best','top','cheapest','most affordable','reviews','pricing','cost','vs','alternative to','alternatives','comparison','vs.','review'],
    longtail:['for beginners','for small business','for [audience]','step by step','examples','in 2026','free','online','software','services','tools','platform'],
    howto:['how to','step by step','tutorial','guide','walkthrough','checklist','process'],
    comparison:['vs','versus','alternative to','or','compared to','comparison'],
    local:['near me','in [city]','[city]','services','reviews','open now'],
    audience:['for small business','for startups','for enterprise','for agencies','for ecommerce','for freelancers','for beginners'],
    trend:['2026','latest','new','updated','trending']
  };

  /* ---------- asset weights (lift content gap / moat) ---------- */
  var ASSET_W={casestudy:14,originaldata:16,tool:15,author:10,video:9,cmp:12,localproof:11,template:12,faq:8,screenshot:8};

  /* ---------- intent value map ---------- */
  var INTENT_VAL={commercial:90,transactional:95,local:80,informational:55,comparison:75,question:50,navigational:35,general:45};

  /* ---------- generate ideas ---------- */
  function expand(kw,niche,country,btype){
    var base=kw.toLowerCase().trim();
    var n=niche?niche.toLowerCase().trim():'';
    var cities=CITY_BANK[country]||CITY_BANK.global;
    var ideas=[];
    function add(arr,bucket,intent,prefix,suffix){
      var skipPrefix=new RegExp('^('+(prefix?prefix.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'):'__none__')+')\\s+','i');
      arr.forEach(function(m){
        var expanded=m.replace('[city]',cities[Math.floor(Math.random()*Math.min(3,cities.length))]).replace('[audience]',(n||'small business'));
        var phrase=(prefix&&!skipPrefix.test(expanded)?prefix+' ':'')+expanded+(suffix?' '+suffix:'');
        ideas.push({kw:capitalize(phrase.trim()),bucket:bucket,intent:intent});
      });
    }

    /* question patterns: "what is crm for real estate" */
    add(MODS.question,'question','question','',base);
    /* commercial patterns: "best crm for real estate", "crm for real estate pricing" */
    add(['best','top','cheapest','most affordable'],'commercial','commercial','',base);
    add(['pricing','cost','reviews','review'],'commercial','commercial',base,'');
    /* how-to patterns: "how to use crm for real estate" */
    add(MODS.howto,'how-to','informational','',base);
    add(['process','examples','tutorial','steps','checklist','guide'],'how-to','informational',base,'');
    /* comparison patterns: "crm for real estate vs alternative" */
    add(['vs','versus','alternative','alternatives','comparison'],'comparison','comparison',base,'');
    add(['vs','versus','or'],'comparison','comparison',base,'');
    /* long-tail: "crm for real estate for small business" */
    add(MODS.audience,'long-tail','commercial',base,'');
    add(['in 2026','examples','ideas','tips'],'long-tail','informational',base,'');
    /* trend */
    add(MODS.trend,'long-tail','informational',base,'');
    /* local patterns */
    add(MODS.local,'local','local',base,'');
    add(['near me','in my area','open now'],'local','local',base,'');

    /* seed-rooted exact phrases */
    ideas.push({kw:capitalize(base),bucket:'core',intent:'general'});
    ideas.push({kw:capitalize(base+' meaning'),bucket:'core',intent:'informational'});
    ideas.push({kw:capitalize(base+' examples'),bucket:'core',intent:'informational'});
    ideas.push({kw:capitalize(base+' for '+ (n||'small business')),bucket:'long-tail',intent:'commercial'});
    ideas.push({kw:capitalize('best '+base),bucket:'commercial',intent:'commercial'});
    ideas.push({kw:capitalize(base+' pricing'),bucket:'commercial',intent:'commercial'});
    ideas.push({kw:capitalize(base+' vs alternatives'),bucket:'comparison',intent:'comparison'});
    ideas.push({kw:capitalize(base+' reviews'),bucket:'commercial',intent:'commercial'});

    /* niche-tinted long-tails */
    if(n){
      ideas.push({kw:capitalize(base+' for '+n),bucket:'long-tail',intent:'commercial'});
      ideas.push({kw:capitalize('best '+base+' for '+n),bucket:'commercial',intent:'commercial'});
      ideas.push({kw:capitalize(base+' '+n+' pricing'),bucket:'commercial',intent:'commercial'});
      ideas.push({kw:capitalize(n+' '+base+' guide'),bucket:'how-to',intent:'informational'});
    }

    /* business-type-tinted modifiers */
    if(btype==='local'){
      cities.slice(0,5).forEach(function(c){
        ideas.push({kw:capitalize(base+' in '+c),bucket:'local',intent:'local'});
        ideas.push({kw:capitalize(base+' '+c),bucket:'local',intent:'local'});
        ideas.push({kw:capitalize('best '+base+' in '+c),bucket:'local',intent:'local'});
      });
    } else if(btype==='saas'){
      ideas.push({kw:capitalize(base+' software'),bucket:'commercial',intent:'commercial'});
      ideas.push({kw:capitalize(base+' platform'),bucket:'commercial',intent:'commercial'});
      ideas.push({kw:capitalize(base+' free'),bucket:'commercial',intent:'transactional'});
      ideas.push({kw:capitalize(base+' api'),bucket:'commercial',intent:'commercial'});
      ideas.push({kw:capitalize(base+' integration'),bucket:'commercial',intent:'commercial'});
    } else if(btype==='ecom'){
      ideas.push({kw:capitalize(base+' online'),bucket:'commercial',intent:'transactional'});
      ideas.push({kw:capitalize(base+' buy'),bucket:'commercial',intent:'transactional'});
      ideas.push({kw:capitalize(base+' shop'),bucket:'commercial',intent:'transactional'});
      ideas.push({kw:capitalize(base+' deals'),bucket:'commercial',intent:'transactional'});
    } else if(btype==='blog'){
      ['ideas','examples','tips','strategies','mistakes','trends'].forEach(function(m){
        ideas.push({kw:capitalize(base+' '+m),bucket:'how-to',intent:'informational'});
      });
    } else if(btype==='agency'){
      ideas.push({kw:capitalize(base+' agency'),bucket:'commercial',intent:'commercial'});
      ideas.push({kw:capitalize(base+' consultant'),bucket:'commercial',intent:'commercial'});
      ideas.push({kw:capitalize(base+' services'),bucket:'commercial',intent:'commercial'});
    }

    /* de-duplicate (case-insensitive) */
    var seen={},uniq=[];
    ideas.forEach(function(it){var k=it.kw.toLowerCase();if(!seen[k]){seen[k]=1;uniq.push(it);}});
    return uniq;  /* no slice here — let compute() cap after scoring */
  }

  function capitalize(s){return s.split(' ').filter(Boolean).map(function(w){return w.charAt(0).toUpperCase()+w.slice(1);}).join(' ');}

  /* ---------- scoring ---------- */
  function scoreIdea(it,ctx){
    var k=it.kw.toLowerCase();
    var words=k.split(/\s+/).length;
    var intentV=INTENT_VAL[it.intent]||50;

    /* volume band proxy: short generic = high, long-tail = low/med, branded question = med */
    var vol=words=3)vol+=10;
    if(it.intent==='transactional')vol+=6;
    if(words>=6)vol-=6;
    vol=Math.max(8,Math.min(95,vol));

    /* competition proxy: short = high, long-tail = low, local=med */
    var comp=words<=2?78:words===3?60:words===4?42:24;
    if(it.intent==='local')comp+=8;
    if(it.bucket==='question')comp-=12;
    if(it.bucket==='how-to')comp-=8;
    comp=Math.max(10,Math.min(96,comp));

    /* business fit */
    var fit=50;
    if(ctx.btype==='local'&&it.intent==='local')fit=94;
    else if(ctx.btype==='saas'&&(it.intent==='commercial'||it.intent==='comparison'))fit=90;
    else if(ctx.btype==='ecom'&&it.intent==='transactional')fit=90;
    else if(ctx.btype==='blog'&&(it.intent==='informational'||it.intent==='question'))fit=84;
    else if(ctx.btype==='agency'&&it.intent==='commercial')fit=84;
    if(it.intent==='commercial'&&ctx.goal==='leads')fit+=6;
    if(it.intent==='commercial'&&ctx.goal==='sales')fit+=8;
    if(it.intent==='local'&&ctx.goal==='leads')fit+=4;
    if(it.intent==='informational'&&ctx.goal==='authority')fit+=8;
    if(ctx.aud==='b2b'&&(it.intent==='commercial'||it.intent==='comparison'))fit+=4;
    if(ctx.aud==='b2c'&&it.intent==='transactional')fit+=4;
    fit=Math.max(10,Math.min(96,fit));

    /* trend */
    var trend=42;
    if(/\b202\d\b/.test(k))trend+=30;
    if(it.intent==='comparison')trend+=12;
    if(it.bucket==='commercial')trend+=8;
    if(it.bucket==='how-to')trend+=6;
    trend=Math.max(10,Math.min(92,trend));

    /* content gap = fit + moat potential */
    var gap=34+(ctx.moatScore/3);
    if(it.bucket==='question')gap+=16;
    if(it.bucket==='how-to')gap+=12;
    if(it.bucket==='local')gap+=10;
    if(it.bucket==='comparison')gap+=8;
    gap=Math.max(10,Math.min(95,Math.round(gap)));

    var score=Math.round(intentV*0.22+vol*0.18+(100-comp)*0.20+fit*0.25+trend*0.08+gap*0.07);
    score=Math.max(4,Math.min(98,score));

    /* AI absorption risk: informational / definition / how-to absorbs most */
    var absorb=25;
    if(it.intent==='informational')absorb=70;
    if(it.intent==='question')absorb=72;
    if(it.intent==='definition'||it.intent==='general'&&words=70?'High':vol>=45?'Medium':'Low';
    var compBand=comp>=70?'High':comp>=45?'Medium':'Low';
    var fitBand=fit>=75?'Strong':fit>=55?'Moderate':'Developing';

    /* why-it-matters */
    var why='';
    if(it.intent==='local')why='Searches with a city or "near me" usually convert to calls and visits — local intent is the highest commercial signal you can rank for.';
    else if(it.intent==='commercial')why='Commercial intent terms have buyers attached. Match them with a comparison or proof page and they earn leads, not just clicks.';
    else if(it.intent==='transactional')why='Transactional terms signal the user is ready to act. Pair with a clean product, pricing, or signup page.';
    else if(it.intent==='comparison')why='Comparison queries are AI-search-ready — AI engines love to recommend, and a clear comparison table wins both the click and the citation.';
    else if(it.intent==='question')why='Question terms earn Featured Snippets and PAA real estate. A clean answer block plus depth underneath wins the long click.';
    else if(it.intent==='informational')why='Informational terms build authority and feed your topical cluster. Use them as supporting pages, not standalone traffic plays.';
    else why='Topic-rooted terms anchor the cluster and pass context to deeper pages through internal links.';

    /* action tag */
    var action='Pillar page';
    if(it.bucket==='local')action='Service-area page';
    else if(it.bucket==='commercial')action='Comparison / best-of page';
    else if(it.bucket==='comparison')action='Comparison page';
    else if(it.bucket==='question')action='FAQ / guide page';
    else if(it.bucket==='how-to')action='Step-by-step guide';
    else if(it.bucket==='core')action='Pillar page';

    return {
      kw:it.kw,bucket:it.bucket,intent:it.intent,
      score:score,vol:vBand,comp:compBand,fit:fitBand,
      volN:vol,compN:comp,fitN:fit,absorb:absorb,
      why:why,action:action
    };
  }

  /* ---------- SERP feature prediction ---------- */
  function predictSerp(qt,country,btype){
    var f=[];
    if(qt==='definition'||qt==='howto'||qt==='general'){f.push('AI Overview');f.push('Featured Snippet');}
    if(qt==='howto'||qt==='problem'){f.push('People Also Ask');f.push('Video Carousel');}
    if(qt==='best'||qt==='comparison'||qt==='review'){f.push('AI Overview');f.push('Reviews');f.push('PAA');}
    if(qt==='local'){f.push('Local Pack');f.push('Map');f.push('Reviews');}
    if(qt==='pricing'){f.push('Shopping');f.push('AI Overview');}
    if(qt==='template'||qt==='checklist'){f.push('Image Pack');f.push('PAA');}
    if(qt==='visual'){f.push('Video Carousel');f.push('Image Pack');}
    if(country!=='global')f.push('Local Pack');
    return Array.from(new Set(f));
  }

  /* ---------- SEO draft (title + meta) ---------- */
  function makeSeo(kw,qt,country){
    var y=2026;
    var countryLabel={in:'India',us:'the US',uk:'the UK',ca:'Canada',au:'Australia',ae:'the UAE',sg:'Singapore',de:'Germany',global:'2026',other:'2026'}[country]||'2026';
    var titles={
      definition:['What Is '+capitalize(kw)+'? A Clear, Honest Guide','What Is '+capitalize(kw)+' — Meaning, Examples & How It Works'],
      howto:[kw.toLowerCase().indexOf('how to')===0?capitalize(kw)+' — Step-by-Step Guide for '+y:'How to '+capitalize(kw)+' — Step-by-Step Guide for '+y,kw.toLowerCase().indexOf('how to')===0?capitalize(kw)+' the Right Way ('+y+')':'How to '+capitalize(kw)+' the Right Way ('+y+')'],
      best:['Best '+capitalize(kw)+' in '+y+' — Tested & Compared','Best '+capitalize(kw)+': Honest Picks for '+countryLabel],
      comparison:[capitalize(kw).replace(/ vs /i,' vs ')+' — Honest Comparison ('+y+')',capitalize(kw)+' Compared Side-by-Side'],
      pricing:[capitalize(kw)+' Pricing in '+y+' — Plans, Costs & What to Pick','How Much Does '+capitalize(kw)+' Cost in '+y+'?'],
      local:['Best '+capitalize(kw)+' Near You — '+countryLabel+' Guide','Top-Rated '+capitalize(kw)+' in '+countryLabel+' ('+y+')'],
      review:[capitalize(kw)+' Review: Is It Worth It in '+y+'?','Honest '+capitalize(kw)+' Review — Pros, Cons & Verdict'],
      alternative:['Top '+capitalize(kw)+' Alternatives in '+y+' — Tested Picks','Best Alternatives to '+capitalize(kw)+' in '+y],
      template:[capitalize(kw)+' Templates You Can Use Today — Free & Paid','Best '+capitalize(kw)+' Templates ('+y+' Edition)'],
      checklist:[capitalize(kw)+' Checklist — The Complete '+y+' Version','The '+capitalize(kw)+' Checklist (Printable, '+y+')'],
      faq:[capitalize(kw)+' — Frequently Asked Questions ('+y+')',capitalize(kw)+' FAQ: Clear Answers for '+y],
      problem:['How to Fix '+capitalize(kw)+' — Step-by-Step Troubleshooting','Why '+capitalize(kw)+' Happens & How to Solve It'],
      visual:[capitalize(kw)+' — Video Walkthrough, Screenshots & Examples',capitalize(kw)+': Visual Guide with Examples'],
      general:[capitalize(kw)+' — The Complete Guide for '+y,capitalize(kw)+': What It Is, How It Works, What to Use']
    };
    var metas={
      definition:['A clear, plain-English guide to '+kw+' — what it means, how it works, real examples, and when it actually matters. No filler, no jargon.','What does '+kw+' really mean? A clear definition with examples, common misconceptions, and when it actually matters for your work.'],
      howto:['A practical step-by-step guide to '+(kw.toLowerCase().indexOf('how to')===0?kw.replace(/^how to /i, ''):kw)+' — with examples, screenshots, and the exact process we use for clients. Updated for '+y+'.','Everything you need to '+(kw.toLowerCase().indexOf('how to')===0?kw.replace(/^how to /i, ''):kw)+' the right way in '+y+' — process, examples, pitfalls, and the checklist we ship with every project.'],
      best:['Honest picks for the best '+kw+' in '+y+' — compared on price, features, fit, and support. See which one we recommend and why.','The best '+kw+' in '+y+' — ranked after testing, with clear picks for different needs and budgets. No affiliate fluff.'],
      comparison:['A side-by-side comparison of '+kw+' — features, pricing, pros, cons, and which one wins for different buyers. '+y+' edition.',capitalize(kw)+' compared on the criteria that actually matter — features, pricing, support, and fit for different buyers.'],
      pricing:['How much '+kw+' really costs in '+y+' — plan breakdowns, hidden fees, and the cheapest way to get what you actually need.','A clear breakdown of '+kw+' pricing in '+y+' — every plan, every fee, and what you actually get for the money.'],
      local:['Find the best '+kw+' in '+countryLabel+' — top-rated picks, what to expect to pay, and the questions to ask before you book.','Looking for '+kw+' in '+countryLabel+'? Top-rated options, average pricing, and what to check before you book.'],
      review:['An honest, no-affiliate review of '+kw+' — features, pricing, real pros and cons, and whether it is worth it in '+y+'.','Is '+kw+' worth it in '+y+'? An honest review — features, pricing, who it is for, who it is not for, and the alternatives.'],
      alternative:['The best alternatives to '+kw+' in '+y+' — compared on price, features, fit, and who each one is actually for.','Looking beyond '+kw+'? These '+y+' alternatives cover different budgets, feature needs, and team sizes.'],
      template:['Free and paid '+kw+' templates you can use today — pick the one that matches your workflow and ship faster.','A curated set of '+kw+' templates for '+y+' — free and paid options, with notes on which one fits which workflow.'],
      checklist:['The complete '+kw+' checklist for '+y+' — print it, work through it, ship the result without missing the obvious steps.','Print this '+kw+' checklist and work through it step by step — every item you would otherwise forget, in one place.'],
      faq:['The most common questions about '+kw+' — answered clearly and concisely, with examples and links to deeper guides.',capitalize(kw)+' FAQ: clear answers to the '+y+' questions buyers actually ask, with examples and links to deeper reads.'],
      problem:['Step-by-step troubleshooting for '+kw+' — why it happens, how to fix it, and how to stop it from coming back.','Why '+kw+' happens and how to solve it — a clear walkthrough with the exact checks we run for clients.'],
      visual:['A visual walkthrough of '+kw+' — video, annotated screenshots, and the same steps we use for client projects.','Watch and follow along: a visual guide to '+kw+' with screenshots, video, and the exact process we use.'],
      general:['Everything you need to know about '+kw+' in '+y+' — meaning, examples, best tools, mistakes to avoid, and what to do next.','A complete '+y+' guide to '+kw+' — clear explanation, real examples, common mistakes, and what to do next.']
    };
    var qt2=qt==='general'?'general':qt;
    var tlist=titles[qt2]||titles.general;
    var mlist=metas[qt2]||metas.general;
    return {title:tlist[0],meta:mlist[0],titleAlt:tlist[1],metaAlt:mlist[1]};
  }

  /* ---------- main compute ---------- */
  function compute(){
    var kw=document.getElementById('mox-kw-seed').value.trim();
    if(!kw)return null;
    var country=document.getElementById('mox-country').value;
    var language=document.getElementById('mox-language').value;
    var niche=document.getElementById('mox-niche').value.trim();
    var btype=document.getElementById('mox-btype').value;
    var aud=document.getElementById('mox-aud').value;
    var goal=document.getElementById('mox-goal').value;
    var assets=Array.from(root.querySelectorAll('.mox-asset input:checked')).map(function(c){return c.value;});
    var moatScore=assets.reduce(function(t,a){return t+(ASSET_W[a]||0);},0);

    var qt=detectQueryType(kw);
    var ideas=expand(kw,niche,country,btype);
    var ctx={btype:btype,aud:aud,goal:goal,moatScore:moatScore,country:country};
    var scored=ideas.map(function(it){return scoreIdea(it,ctx);});
    scored.sort(function(a,b){return b.score-a.score;});
    /* cap to 55 after scoring, so high-score city items aren't dropped prematurely */
    if(scored.length>55)scored=scored.slice(0,55);

    var buckets={core:[],commercial:[],longtail:[],howto:[],comparison:[],question:[],local:[]};
    scored.forEach(function(s){
      if(s.bucket==='core')buckets.core.push(s);
      else if(s.bucket==='commercial')buckets.commercial.push(s);
      else if(s.bucket==='how-to')buckets.howto.push(s);
      else if(s.bucket==='comparison')buckets.comparison.push(s);
      else if(s.bucket==='question')buckets.question.push(s);
      else if(s.bucket==='local')buckets.local.push(s);
      else buckets.longtail.push(s);
    });

    var quickWins=scored.filter(function(s){return s.score>=65;}).slice(0,8);
    var serp=predictSerp(qt,country,btype);
    var seo=makeSeo(kw,qt,country);

    /* angle & plan */
    var angle;
    if(btype==='local')angle='Anchor "'+kw+'" in your service area: city-scoped pages, local proof, and GBP-ready content beat generic national pages on local intent.';
    else if(btype==='saas')angle='Position "'+kw+'" as a buyer-ready decision: clear comparison criteria, pricing context, integrations, and proof that it works for your audience.';
    else if(btype==='ecom')angle='Treat "'+kw+'" as a commercial-intent play: category pages, comparison content, and product-led guides that route to clean PDPs.';
    else if(btype==='agency')angle='Frame "'+kw+'" as a recommendation-ready page: services, proof, case studies, and a clear comparison against alternative ways to solve the same problem.';
    else if(btype==='blog')angle='Build "'+kw+'" as a topical pillar: a strong pillar page plus 5–8 supporting question / how-to pages that feed internal links and earn long-tail traffic.';
    else angle='Match "'+kw+'" intent precisely, then build the page type the keyword actually rewards — comparison, how-to, FAQ, or local — not a generic version of it.';

    var wins=[];
    wins.push({t:'Publish the top 7 quick wins first',d:'These are the keywords where your business fit is highest and the competition is lowest. Ship them as real, intent-matched pages, not generic blog posts.',impact:'h'});
    wins.push({t:'Build one pillar per cluster, not one page per keyword',d:'Group the plan into 3–7 topical clusters. One pillar page per cluster, supporting pages underneath. Internal links carry the authority up.',impact:'h'});
    wins.push({t:'Match the page type to the intent bucket',d:'Comparison bucket → comparison page. Question bucket → FAQ / guide. Local bucket → city or service-area page. Format mismatch is the #1 reason pages underperform.',impact:'m'});
    wins.push({t:'Add one irreplicable asset per cluster',d:'A calculator, dataset, case study, or template turns the page into something an AI summary cannot fully replace. The asset is the moat.',impact:'m'});
    wins.push({t:'Localize the plan by market',d:'If you target multiple countries, run this tool once per market. Pricing, terminology, and proof patterns differ — one list rarely fits every market.',impact:'l'});
    wins.push({t:'Re-run the plan quarterly',d:'Intent shifts, your strengths shift, the SERP shifts. Refresh the plan every 90 days and re-rank before each new content cycle.',impact:'l'});

    return {
      kw:kw,qt:qt,qtLabel:QTYPE_LABELS[qt]||'Topic',
      country:country,language:language,niche:niche,
      btype:btype,aud:aud,goal:goal,assets:assets,
      ideas:scored,buckets:buckets,
      quickWins:quickWins,serp:serp,seo:seo,
      angle:angle,wins:wins,moatScore:moatScore,
      count:scored.length,quickN:quickWins.length
    };
  }

  /* ---------- render ---------- */
  var last=null;
  var resEl=document.getElementById('mox-result');
  var emptyEl=document.getElementById('mox-empty');

  function render(r){
    last=r;
    var bucketLabels={core:'Core (seed-rooted)',commercial:'Commercial intent',longtail:'Long-tail patterns',howto:'How-to & guides',comparison:'Comparison terms',question:'Question queries',local:'Local variants'};
    var intentLabels={commercial:'Commercial',transactional:'Transactional',local:'Local',informational:'Informational',comparison:'Comparison',question:'Question',navigational:'Navigational',general:'Topic'};
    var bucketOrder=['quick','core','commercial','longtail','howto','comparison','question','local'];

    var h=''
      +''+escapeHtml(r.kw)+''
      +''+r.count+' ideas · '+r.quickN+' quick wins · '+intentLabels[r.ideas[0]?r.ideas[0].intent:'general']+' intent · '+r.qtLabel+' seed'
      +''
      +'Copy plan'
      +'Copy MD'
      +'Download .md'
      +'';

    h+=''
      +'Ideas**'+r.count+'**'
      +'Quick wins**'+r.quickN+'**'
      +'Moat score**'+r.moatScore+'**'
      +'';

    /* quick wins block */
    if(r.quickWins.length){
      h+='
#### Quick wins (priority 65+)

';
      r.quickWins.slice(0,5).forEach(function(s,i){
        h+=''+(i+1)+''+escapeHtml(s.kw)+' '+s.score+' '+intentLabels[s.intent]+''+escapeHtml(s.why)+'';
      });
      h+='';
    }

    /* buckets */
    bucketOrder.forEach(function(b){
      if(b==='quick')return;
      var arr=r.buckets[b];
      if(!arr||!arr.length)return;
      h+='
#### '+bucketLabels[b]+'

'+arr.length+' keywords';
      arr.slice(0,8).forEach(function(s){
        h+=''
          +''
          +''+escapeHtml(s.kw)+''+s.score+''
          +''
          +'**Intent** '+intentLabels[s.intent]+''
          +'**Volume** '+s.vol+''
          +'**KD** '+s.comp+''
          +'**Fit** '+s.fit+''
          +'**AI absorb** '+(s.absorb>=65?'High':s.absorb>=40?'Medium':'Low')+''
          +''
          +'→ '+escapeHtml(s.action)+'. '+escapeHtml(s.why)+''
          +''
          +'';
      });
      h+='';
    });

    /* SERP features */
    h+='
#### Predicted SERP features for "'+escapeHtml(r.kw)+'"

Design your page to win (or survive) these specific features.

';
    r.serp.forEach(function(f){h+=''+escapeHtml(f)+'';});
    h+='';

    /* content angle */
    h+='
#### Recommended angle

'+escapeHtml(r.angle)+'

';

    /* title & meta */
    h+='
#### Title & meta draft Copy title Copy meta

'
      +'
**Title:** '+escapeHtml(r.seo.title)+'  
'+r.seo.title.length+' chars · target ≤ 60

'
      +'
**Meta:** '+escapeHtml(r.seo.meta)+'  
'+r.seo.meta.length+' chars · target ≤ 160

'
      +'
Alt title: '+escapeHtml(r.seo.titleAlt)+'

'
      +'';

    /* 6 quick wins */
    h+='
#### Six ways to lift the plan

';
    r.wins.forEach(function(w,i){
      h+=''+(i+1)+''+escapeHtml(w.t)+' '+w.impact.toUpperCase()+''+escapeHtml(w.d)+'';
    });
    h+='';

    /* history strip */
    h+=paintHistoryHTML();

    resEl.innerHTML=h;

    /* wire copy buttons */
    var copyBtn=document.getElementById('mox-copy');
    var copyMdBtn=document.getElementById('mox-copy-md');
    var dlBtn=document.getElementById('mox-download');
    if(copyBtn)copyBtn.addEventListener('click',function(){clip(plainText(r));});
    if(copyMdBtn)copyMdBtn.addEventListener('click',function(){clip(markdown(r));});
    if(dlBtn)dlBtn.addEventListener('click',function(){
      var md=markdown(r),blob=new Blob([md],{type:'text/markdown'}),url=URL.createObjectURL(blob);
      var a=document.createElement('a');a.href=url;a.download='keyword-plan-'+r.kw.toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/^-|-$/g,'').slice(0,40)+'.md';
      document.body.appendChild(a);a.click();document.body.removeChild(a);setTimeout(function(){URL.revokeObjectURL(url);},1000);
    });
    root.querySelectorAll('.mox-copymini').forEach(function(btn){
      btn.addEventListener('click',function(){
        if(btn.dataset.copy==='title')clip(r.seo.title);
        else if(btn.dataset.copy==='meta')clip(r.seo.meta);
      });
    });
    root.querySelectorAll('.mox-hist__pill').forEach(function(p){
      p.addEventListener('click',function(){document.getElementById('mox-kw-seed').value=p.dataset.kw;document.getElementById('mox-kw-seed').dispatchEvent(new Event('input'));goStep(1);document.getElementById('mox-calc').click();});
    });

    saveHistory(r);
    flashResult();
    revealResult();
  }

  /* ---------- plain-text export ---------- */
  function plainText(r){
    var lines=[];
    lines.push('# Keyword Research Plan — '+r.kw);
    lines.push('Seed: '+r.kw+' · Market: '+r.country+' · Business: '+r.btype+' · Audience: '+r.aud+' · Goal: '+r.goal);
    lines.push('Ideas: '+r.count+' · Quick wins: '+r.quickN+' · Moat score: '+r.moatScore);
    lines.push('');
    lines.push('## Quick wins (priority 70+)');
    r.quickWins.slice(0,8).forEach(function(s){lines.push('- ['+s.score+'] '+s.kw+' — '+s.intent+' · vol '+s.vol+' · KD '+s.comp+' · fit '+s.fit);});
    lines.push('');
    var order=['core','commercial','longtail','howto','comparison','question','local'];
    var labels={core:'Core (seed-rooted)',commercial:'Commercial intent',longtail:'Long-tail patterns',howto:'How-to & guides',comparison:'Comparison terms',question:'Question queries',local:'Local variants'};
    order.forEach(function(b){
      var arr=r.buckets[b];if(!arr||!arr.length)return;
      lines.push('## '+labels[b]);
      arr.slice(0,12).forEach(function(s){lines.push('- ['+s.score+'] '+s.kw+' — '+s.intent+' · vol '+s.vol+' · KD '+s.comp+' · fit '+s.fit+' · AI absorb '+(s.absorb>=65?'high':s.absorb>=40?'med':'low')+' · '+s.action);});
      lines.push('');
    });
    lines.push('## Predicted SERP features');
    lines.push(r.serp.join(', '));
    lines.push('');
    lines.push('## Recommended angle');
    lines.push(r.angle);
    lines.push('');
    lines.push('## Title tag');lines.push(r.seo.title);
    lines.push('');lines.push('## Meta description');lines.push(r.seo.meta);
    lines.push('');lines.push('## Six ways to lift the plan');
    r.wins.forEach(function(w){lines.push('- ('+w.impact.toUpperCase()+') '+w.t+' — '+w.d);});
    return lines.join('\n');
  }

  function markdown(r){
    var md='# Keyword Research Plan — '+r.kw+'\n\n';
    md+='**Seed:** '+r.kw+'  \n**Market:** '+r.country+'  \n**Business:** '+r.btype+'  \n**Audience:** '+r.aud+'  \n**Goal:** '+r.goal+'\n\n';
    md+='**Ideas:** '+r.count+' · **Quick wins:** '+r.quickN+' · **Moat score:** '+r.moatScore+'\n\n';
    md+='## Quick wins (priority 70+)\n\n';
    r.quickWins.slice(0,8).forEach(function(s){md+='- **['+s.score+'] '+s.kw+'** — '+s.intent+' · vol '+s.vol+' · KD '+s.comp+' · fit '+s.fit+'\n';});
    md+='\n';
    var order=['core','commercial','longtail','howto','comparison','question','local'];
    var labels={core:'Core (seed-rooted)',commercial:'Commercial intent',longtail:'Long-tail patterns',howto:'How-to & guides',comparison:'Comparison terms',question:'Question queries',local:'Local variants'};
    order.forEach(function(b){
      var arr=r.buckets[b];if(!arr||!arr.length)return;
      md+='## '+labels[b]+'\n\n';
      arr.slice(0,12).forEach(function(s){md+='- **['+s.score+'] '+s.kw+'** — '+s.intent+' · vol '+s.vol+' · KD '+s.comp+' · fit '+s.fit+' · AI absorb '+(s.absorb>=65?'high':s.absorb>=40?'med':'low')+' · '+s.action+'\n';});
      md+='\n';
    });
    md+='## Predicted SERP features\n\n'+r.serp.map(function(f){return '`'+f+'`';}).join(' ')+'\n\n';
    md+='## Recommended angle\n\n'+r.angle+'\n\n';
    md+='## Title tag\n\n> '+r.seo.title+'\n\n## Meta description\n\n> '+r.seo.meta+'\n\n';
    md+='## Six ways to lift the plan\n\n';
    r.wins.forEach(function(w){md+='- **('+w.impact.toUpperCase()+') '+w.t+'** — '+w.d+'\n';});
    return md;
  }

  /* ---------- clipboard ---------- */
  function clip(txt){
    function fallback(t,done){var ta=document.createElement('textarea');ta.value=txt;ta.style.position='fixed';ta.style.opacity='0';document.body.appendChild(ta);ta.select();try{document.execCommand('copy');}catch(e){}document.body.removeChild(ta);done();}
    if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(txt).catch(function(){fallback(txt,function(){});});}
    else{fallback(txt,function(){});}
  }

  function escapeHtml(s){return String(s).replace(/[&"']/g,function(m){return {'&':'&','':'>','"':'"',"'":'''}[m];});}

  function flashResult(){resEl.classList.add('mox-flash');setTimeout(function(){resEl.classList.remove('mox-flash');},900);}
  function revealResult(){
    if(window.innerWidth>980)return;
    var rect=resEl.getBoundingClientRect();
    if(rect.topwindow.innerHeight*0.6){
      var top=window.pageYOffset+rect.top-24;
      try{window.scrollTo({top:top<0?0:top,behavior:'smooth'});}catch(e){window.scrollTo(0,top<0?0:top);}
    }
  }

  /* ---------- history ---------- */
  function loadHistory(){try{return JSON.parse(localStorage.getItem(HKEY)||'[]');}catch(e){return [];}}
  function saveHistory(r){
    var h=loadHistory();
    h.unshift({kw:r.kw,count:r.count,quick:r.quickN});
    h=h.filter(function(x,i,arr){return arr.findIndex(function(y){return y.kw===x.kw;})===i;}).slice(0,5);
    try{localStorage.setItem(HKEY,JSON.stringify(h));}catch(e){}
  }
  function paintHistoryHTML(){
    var h=loadHistory();
    if(!h.length)return '';
    var out='Recent keywords';
    h.forEach(function(x){out+='**'+x.quick+'**'+escapeHtml(x.kw)+'';});
    out+='';
    return out;
  }

  /* ---------- compute button ---------- */
  document.getElementById('mox-calc').addEventListener('click',function(){
    var r=compute();
    if(!r){var k=document.getElementById('mox-kw-seed');k.focus();flash(k);return;}
    render(r);
  });

})();
