news-ycombinator

Use when reading Hacker News — top stories, new posts, Ask HN, Show HN, or comments. Pre-mapped selectors eliminate screenshot loops on news.ycombinator.com.

Hacker News — AI Navigation Skill

What This Skill Does

Provides AI browser agents with pre-mapped selectors, page structures, and navigation flows for news.ycombinator.com. Eliminates the need to visually scan the page — use these selectors directly.

Site Overview

PropertyValue
Domainnews.ycombinator.com
Site TypeMulti-page / MPA
Auth RequiredNo (public access)
Mapped2026-02-20

Site Map

PageURLPurpose
Homepagehttps://news.ycombinator.comHacker News
newshttps://news.ycombinator.com/newsHacker News
newesthttps://news.ycombinator.com/newestNew Links
fronthttps://news.ycombinator.com/front2026-02-19 front

Page Structures

Homepage: Hacker News

Form Inputs

ElementSelectorNotes
q[name="q"]

Content Links (Sample)

Link TextSelectorNotes
Hacker Newsa:has-text("Hacker News")news
commentsa:has-text("comments")newcomments
submita:has-text("submit")submit
gist.github.coma:has-text("gist.github.com")from?site=gist.github.com
interpiduseda:has-text("interpidused")user?id=interpidused
5 hours agoa:has-text("5 hours ago")item?id=47082496
88 commentsa:has-text("88 comments")item?id=47082496
bbc.coma:has-text("bbc.com")from?site=bbc.com
tartorana:has-text("tartoran")user?id=tartoran
2 hours agoa:has-text("2 hours ago")item?id=47083735
19 commentsa:has-text("19 comments")item?id=47083735
together.aia:has-text("together.ai")from?site=together.ai
zagwdta:has-text("zagwdt")user?id=zagwdt
6 commentsa:has-text("6 comments")item?id=47083648
gustedt.wordpress.coma:has-text("gustedt.wordpress.com")from?site=gustedt.wordpress.com

For content-heavy sites, iterate with: page.locator('a').filter({ hasText: /pattern/ })

news: Hacker News

Inputs

ElementSelectorNotes
q[name="q"]

newest: New Links | Hacker News

Inputs

ElementSelectorNotes
q[name="q"]

front: 2026-02-19 front | Hacker News

Inputs

ElementSelectorNotes
q[name="q"]

Navigation Flows

Flow 1: Browse Homepage Content

1. Navigate to https://news.ycombinator.com
   wait: networkidle OR domcontentloaded

2. Content loads automatically
   wait: page has settled (500ms)

3. Scroll to explore content
   action: page.evaluate(() => window.scrollBy(0, 500))
   wait: 300ms for lazy content

Authentication

Public access — no authentication required for main content.

Dynamic Content Patterns

PatternDescriptionHow to Handle
Lazy loadingContent loads on scrollpage.evaluate(() => window.scrollBy(0, 500)) then wait 500ms
SPA navigationURL changes without full reloadWait for networkidle or specific element visibility
Infinite scrollMore items load at bottomScroll loop until no new items appear

Timing & Waiting

ActionWait ForTypical Delay
Page navigationwaitUntil: 'domcontentloaded'1-3s
After clickElement visibility change300-800ms
After form submitURL change or success message1-4s
After scrollNew content appearance300-600ms
Dynamic contentwaitForSelector() on target element500-2000ms

Common Gotchas

  1. Rate limiting — news.ycombinator.com may throttle rapid requests. Add 1-2s delays between page loads.
  2. Cookie consent — If a consent banner appears, click "Accept all" or equivalent before interacting: page.locator('[class*="consent"] button, button:has-text("Accept")').first().click()
  3. Dynamic class names — Avoid selectors based on hashed class names (e.g. .a3f8b). Use aria-label, data-testid, or text-based selectors instead.
  4. Viewport-dependent layout — These selectors were mapped at 1280×800. Mobile layout may differ.
  5. Stale selectors — Sites update their markup. If a selector fails, fall back to text-based: page.locator('text="Button Label"')

Element Finding Strategy (Fallback Order)

1. data-testid / data-cy        → most stable
2. aria-label / role            → semantic, stable
3. id attribute                 → usually stable
4. name attribute (forms)       → stable for inputs
5. text content                 → :has-text("...")
6. CSS class (first class only) → fragile, last resort