Search Console, Google Autocomplete, and the forums your audience posts in will beat a $99/month keyword tool for long-tail research on a niche site, because paid tools round long-tail volume down to zero and zero-volume queries are the whole opportunity. Google's own figure: about 15% of daily queries have never been searched before. Individually those queries are invisible to every tool; in aggregate they are where a small site wins.

Search Console is the keyword tool you already have

The Performance report holds 16 months of real queries against your own site — not estimates, actuals. Two filters do most of the work:

Position 8–30 with meaningful impressions. These are pages that nearly rank. Improving an existing page that sits at position 12 is reliably faster than ranking a new page from nothing; a monthly pass over this list is the highest-ROI hour in content SEO.

Question mining with regex. The query filter accepts regular expressions:

^(how|what|which|why|can|does|is|vs)\b

That surfaces every question-shaped query you already get impressions for — each one a candidate H2, FAQ entry, or standalone post, pre-validated by the fact that Google already shows you for it.

One trap: the UI caps exports at 1,000 rows, which on a large site is a rounding error. The Search Analytics API returns up to 25,000 rows per request with pagination beyond that — script the export monthly and keep the history, because 16 months of retention means the data deletes itself.

Autocomplete mining, scripted

Autocomplete suggestions are queries real people typed, which makes the suggest endpoint a free long-tail generator:

for c in {a..z}; do
  curl -s "https://suggestqueries.google.com/complete/search?client=firefox&q=self+hosted+$c" \
    | jq -r '.[1][]'
  sleep 2
done

Run the loop over seed patterns, not just the alphabet: "X vs", "X alternative", "X docker", "X raspberry pi", "X requirements". An evening of seeds yields 1,000+ deduplicated queries, every one guaranteed to have been typed by someone. The endpoint is unofficial — keep the sleep in, expect it to be rate-limited or reshaped eventually, and treat the output as raw material rather than infrastructure.

Forums tell you the words people actually use

Keyword tools normalise language; forums preserve it. Nobody in r/selfhosted asks about "photo management solutions" — they ask how to "get my photos out of Google". Titles and headings that mirror forum phrasing win long-tail queries that normalised phrasing never sees.

The mechanics are all free. Hacker News via the Algolia API, no key required:

curl -s 'https://hn.algolia.com/api/v1/search?query="alternative%20to"&tags=story' \
  | jq -r '.hits[].title'

Reddit search inside your niche subreddits for "alternative", "replace", and "vs"; GitHub issues titled "alternative to X" (a surprisingly strong signal, since it means users of X are actively shopping). I pipe subreddit search RSS feeds into FreshRSS so the monitoring runs itself and new phrasings show up with my morning feeds.

Cluster by intent, not by string

Fifty raw queries usually collapse into a handful of pages. The test for whether two queries share a page is not string similarity but SERP overlap: if they produce roughly the same top three results, Google considers them one intent — one page. For under ~2,000 keywords, manual spot-checking beats any embedding pipeline you'd build to avoid it.

The practical shortcut is pattern bucketing. "X vs Y", "X alternatives", "X requirements", and "how to install X" are four different intents demanding four different page archetypes — which is precisely the structure behind programmatic SEO, where each pattern becomes a template. Merge intents onto one page and you rank for neither; split one intent across two pages and they cannibalise. The "vs" pattern in particular has its own craft, covered in anatomy of a comparison page.

Prioritise with arithmetic, not intuition

A few hundred clustered intents still need an ordering. The score I use is deliberately crude: monthly impressions from GSC (or 10 as a floor for queries the site has never shown for), times a position multiplier — 3× for existing pages sitting at positions 8–15, 1× for new topics — divided by effort in units of "template section, new section, or new page." Crude beats none: it reliably pushes "improve the page at position 11" above "write something new," which is the correction most content plans need, and it stops the recency bias where whatever query you found last week feels most important.

What zero volume really means

A tool showing "0" means demand below the tool's resolution, not absence of demand. A page that answers forty zero-volume queries at ten impressions a month each is a 400-impression page — and a thousand such pages are a real channel. This arithmetic is the entire long-tail thesis: the tools cannot see the demand, so sites that need a tool's permission to publish never compete for it. Where impressions exist but clicks don't, the fix is usually the snippet, not the content — see meta descriptions in the AI-snippet era.

What I'd do

Monthly: script the GSC API export, work the position-8–30 list, ten pages per pass. Quarterly: an autocomplete run over every category's seed patterns, new queries bucketed by intent into the content plan. Continuous: forum feeds in an RSS reader, skimmed weekly for phrasing shifts. Total tooling cost: zero. The paid tools earn their keep for competitor gap analysis and backlink data — for long-tail discovery on a niche site, they are the least informed source in the room.