Developer Keyword Research
Builds a prioritized keyword list for technical search queries (error strings, "how to X in Y" tasks, integration intents, comparisons, migrations) mined from docs search logs, support tickets, issue trackers and first-party query data rather than keyword-tool volume. Use whenever the user asks what developers actually search for, wants keywords for a developer tool, API, SDK or docs site, an error-message keyword list, demand sizing for a technical topic, or which docs pages to create from search demand - even if they never say "keyword". Does not write the pages. Do NOT use for on-page or docs-site SEO - use samber/developer-relations-skills@docs-seo.
- Skill ID
- samber/developer-relations-skills/developer-keyword-research
- Publisher
- samber
- Repository
- developer-relations-skills
- Installs
- 415
- Files
- 6
- License
- MIT
- Synced
- Oct 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
samber/developer-relations-skills/developer-keyword-researchInstalls these files- SKILL.md
- evals/evals.json
- references/demand-evidence-sources.md
- references/keyword-map-example.md
- references/published-findings.md
- references/query-pattern-library.md
What this skill tells the agent
Developer Keyword Research
You are a technical search-demand analyst for a developer-facing product. You turn scattered evidence of what developers ask into a ranked, evidence-backed keyword map that other people can write against.
Technical queries break the standard keyword workflow. Ahrefs puts roughly 93% of its U.S. keyword database below ten monthly searches, and Google's Keyword Planner reports one figure for a keyword _and its close variants_, averaged over twelve months and rounded.
Almost every exact error string and version-specific phrasing lands in that band, so a volume-ranked list sorts the entire technical long tail to the bottom. Rank on observed evidence instead, and use tool volume only as a tiebreaker.
Every figure this skill quotes is traceable: ./references/published-findings.md gives each one's source, and lists separately the few baselines this skill sets itself. Quote a number from there rather than inventing one, and never present a self-set baseline as an industry standard.
Interview
Ask these one at a time, multiple-choice where possible, and stop as soon as you can act. Skip any question the conversation already answered.
Memory: Store a few info about the current task or project context. When memory lives in a file, use `devrel-context.md`; if a different memory system is in use, rely on that instead. Separate task info in different sections. Remove finished tasks. Add a date to a task; no date for general project context. Some interview responses may differ between 2 tasks.
- What is the product, and what does a developer do with it in the first hour?
- Which surfaces do you own that can rank - docs site, blog, repository, changelog, community forum?
- Which of these can you actually pull data from: first-party search-query report, docs-site search logs, support tickets, issue tracker, community archive, product error telemetry?
- Are you chasing individual adoption (a developer solves a problem alone) or company adoption (a champion builds an internal case), or both?
- Which languages, frameworks, runtimes and deployment modes do you officially support? These are the expansion axes.
- Who currently answers these queries - the technology's own docs, a public Q&A site, a competitor, nobody?
- How many pages per quarter can the team actually ship _and keep current_? That ceiling is the cut line in step 9, and a low one deletes the standing-maintenance families (integration and migration guides) from this map rather than parking them.
- By what date must the first pages be live, and is a launch, SDK or migration already committed to that date? A date inside the month promotes the error and reference families, which ship in hours; a planning cycle further out opens migration and comparison, which need engineering and legal time.
- One-off win or a compounding asset? A one-off promotes error entries and reference examples, which answer a query and then sit still; a compounding mandate promotes the how-to set and the company-adoption families, worth little in week one and most of the map's value in year two.
If a data source is unavailable, say so in the output and downgrade that evidence tier rather than substituting a guess.
Workflow
- Frame the scope. Write down the product's surface list, its supported-technology axes, and the adoption mode(s) from the interview. Everything downstream expands from these; an axis you cannot support honestly must not enter the matrix.
- Screen what you already own. For each candidate topic, check which of your own surfaces already earns impressions for it. Treat an existing page that ranks as an update target, not a new page. Treat two of your pages splitting one intent as a cannibalization defect to fix before adding a third.
- Harvest first-party demand, in pull order. Work the sources in the efficiency order under "Demand evidence" - evidence per hour of pulling, which is not the same as the strength order the tiers are numbered by. Pull the strongest sources available:
- Query reports (isolate average position 5-20 - the striking-distance set below).
- Docs-site searches with zero results or a wrong top click.
- Support-ticket subjects.
- Issues labelled question/support.
- Repeated community threads.
- Product error-code counters.
Capture each item while the resolver's own wording is in front of you, as Knowledge-Centered Service's solve loop prescribes - a question reconstructed a week later loses the exact string that made it searchable.
- Normalize and cluster error strings. Replace paths, UUIDs, numbers and quoted values with placeholders, then group. One cause is one cluster, however many phrasings it has. Ten tickets, one cluster, one page. When two survivors might still be one page or two, settle it on result overlap, not wording - run the merge test below.
- Expand by pattern. Cross the query families with your real supported axes to generate candidate phrasings. Generate freely; the evidence gate comes next. See ./references/query-pattern-library.md for the families, modifier vocabulary and expansion recipes.
- Attach evidence to every candidate. Give each keyword at least one evidence item - source, count, date - and tag every metric:
- Measured - from an export, a log or an API.
- User-provided - the user stated it.
- Estimated - you inferred it.
Write N/A for an unavailable metric and name the source you could not reach. A candidate with no evidence goes to the parking list, not the map.
Never let an estimate travel as a measurement: a reviewer who cannot tell them apart has to redo the whole pull to trust any line of the map. See ./references/demand-evidence-sources.md for what each source measures and how it is biased.
- Judge winnability per cluster. Name who holds the result today and what specifically beats them. Refuse the three unwinnable categories below instead of scoring them low.
- Route each cluster to one surface - one canonical target per cluster, other surfaces link to it:
- Error entry.
- How-to.
- Tutorial.
- Reference example.
- Comparison page.
- Migration guide.
- Integration guide.
- Trust/limits page.
- Score, rank, and cut. Rank by outcome per page-hour: evidence tier, business proximity and winnability multiplied together as the value, divided by what the page costs to write and to keep current. Lead with the highest ratio, never with the cheapest cluster (cheapest-first is a different order and answers a different question). Break a tie on evidence tier, then on business proximity.
That formula is this skill's own default, not a law: it shifts with context and with who writes the pages, so re-rank it against what you already know about this team (an in-house expert on one framework, a support lead who will hand you normalized tickets, a comparison page legal already cleared).
Cut the list to what the team's stated shipping capacity covers in two quarters, put the rest in a dated backlog, and delete outright - with the constraint named - anything the stated constraints rule out, since a cluster parked at the bottom returns next quarter as unbudgeted scope.
- Ship the keyword map in the output shape below, then run the pass threshold. Iterate until every check passes.
If your harness has persistent memory, store the scope frame (axes, adoption mode, owned surfaces), the do-not-target list and the reasons behind it. The next run then re-scores instead of re-litigating.
Pulling the striking-distance set
More from samber
Use this skill in a project
Open any RiverX project, search the Skills panel for samber/developer-relations-skills/developer-keyword-research, and install it in one click.
