Opportunity Observer
Read the evidence first, then decide whether to build
A personal research workbench for English-language AI, SaaS, and search-traffic site opportunities. It gathers scattered discussions, rankings, and new terms in one place, ties every signal to its source, and leaves the final call to me.

What it can do
- 01New-term radar
Compares 1–3 word phrases from every source title with the last 60 days, labeling them first seen, heating up, sustained, or baseline, each with source samples and check links.
- 02Demand cards
Picks real needs out of public discussions on Reddit, Hacker News, and more, distills them into who, wants to do what, stuck where, and lets me open the original post and replies at any time.
- 03Direction grouping
Demand cards are filed into 17 fixed directions such as automation workflows, e-commerce operations, and spreadsheet helpers, each showing its count and how many carry payment signals.
- 04Product watch
Roblox games, fast-growing revenue, App Store, Chrome extensions, and Product Hunt launches sit in separate columns, each with its numbers and change versus about a day ago.
- 05Three outcomes
Every item gets one of three outcomes: watch, skip, or not doable. A skipped item comes back when its numbers change sharply, so a single "not interested" never hides it forever.
- 06Daily brief
Summarizes three tracks: people asking (pain points), heating up (hot topics), and people already paying (validated). Look here first, then decide where to spend time.



Screenshots come from the live version. Anything revealing my own research directions is blurred; the rest is public third-party ranking and community data.
Why I built it
Finding a site idea tends to go wrong in two ways: scrolling feeds until something looks interesting, or trusting a feeling that a keyword “seems to be rising”. Neither leaves evidence, and neither leaves a record you can review later.
The observer collects signals in one place: rankings, community threads, launches, and new terms, each keeping its source and original text. It narrows step by step, from “lots of signals” to “a few directions with enough evidence”, and only then is it my turn to judge. As of the end of September 2026 it has triaged over ten thousand discussions and distilled more than two thousand demand cards from them.
From signal to judgment
- Collect: scheduled reads of public rankings, community threads, and launches. On failure it pauses and leaves a record.
- Triage: AI turns discussions into demand cards and files them under fixed directions.
- Pick: work through the list one item at a time. Read the original, watch it, file it under a direction, or mark it not a need.
- Research: once a direction has enough evidence, check search demand and competitors, then decide whether to build.
How it is built: collecting and triaging the signals
- Collection layer: 15 source adapters fetch on their own schedules — Hacker News hourly, GitHub trending daily, launch platforms on their own intervals. Duplicate checks against the same target within five minutes merge into one job; on failure collection pauses and leaves a record instead of silently losing data. Everything runs on public sources — no paid data APIs, no fabricated popularity numbers.
- Triage layer: each discussion passes three AI rounds — triage, “could this be a product”, and recheck. But AI conclusions are only labels, never the final call; the page has exactly my three states: to confirm, on hold, can build. What AI filtered out is kept in a collapsible row at the bottom, ready to spot-check or overturn at any time.
- The triage scope was tuned with data: two weeks after launch, sources were narrowed by real retention. Show HN / Launch HN turned out to be 1,400+ posts that are all self-promotion, so they no longer enter demand triage; a full Reddit subreddit stream kept only 2.2%, so triage switched to help-seeking posts found through Reddit site search, lifting the hit rate to 22%. Where the AI budget goes is decided by live data, not vibes.
- New-term radar: 1–3 word phrases are extracted from every source title and compared against the last 60 days of history, labeled first appearance / warming / persisting / baseline. Until a baseline has 14 full days, the system never calls anything “new” — it only labels the baseline period.
- Demand cards link back to the source: every card stores the original link; opening it pulls the full text and replies through public APIs (Reddit RSS, HN Algolia, Discourse JSON). I read the content before deciding, not the AI summary.
- Judgments are records, not flags: my call on each item lives in its own table, so a deleted post never re-enters the database no matter which source it reappears from; skipped items automatically return as “reappeared” when their numbers move, so one “not interested” never closes the door forever.
A few deliberate trade-offs
- No verdict without a baseline: with under 14 days of history, no term is called new. It is labeled baseline period.
- Counts are samples, not search volume: the page says outright that article counts are counts within the sample, so noise is not mistaken for demand.
- Evidence, not prediction: it does not tell me which keyword will take off. It shows signals earlier and lays out the evidence.
- Every step checkable: the original-text view supports paging through items and paragraph-level translation, moving straight to the next item after each decision.
Boundaries
- It is a personal research tool, and the whole site is limited to me.
- Judgments about payment signals and competition still need my own verification.
Under the hood
Runs on Cloudflare: Workers for pages and API, D1 for data, R2 for archives, Queues for collection jobs, plus daily backups. It works with the Chrome extension Keyword Discovery, handing it keywords to check on Google Trends.