The crudest way possible (via custom filters) - when that stops working I'll likely just do a browser plugin.
news.ycombinator.com##tr.athing:has(a:has-text(/AI/i))
news.ycombinator.com##tr.athing:has(a:has-text(/AI/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/claude/i))
news.ycombinator.com##tr.athing:has(a:has-text(/claudeI/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/llm/i))
news.ycombinator.com##tr.athing:has(a:has-text(/llm/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/vibecode/i))
news.ycombinator.com##tr.athing:has(a:has-text(/vibecode/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/agi/i))
news.ycombinator.com##tr.athing:has(a:has-text(/agi/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/deep learning/i))
news.ycombinator.com##tr.athing:has(a:has-text(/deep learning/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/agent/i))
news.ycombinator.com##tr.athing:has(a:has-text(/agent/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/TPU/i))
news.ycombinator.com##tr.athing:has(a:has-text(/TPU/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/GPT/i))
news.ycombinator.com##tr.athing:has(a:has-text(/GPT/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/DeepSeek/i))
news.ycombinator.com##tr.athing:has(a:has-text(/DeepSeak/i)) + tr
news.ycombinator.com##tr.athing:has(a:has-text(/Anthropic/i))
news.ycombinator.com##tr.athing:has(a:has-text(/Anthropic/i)) + tr
It makes HN more like what I appreciated about HN in the first place by removing (what to me) is noise and increasing the signal.