Retro terminal Hacker News client. Successor to
vimify-hackernews, a retake on the same topic.
- Feeds: Top / New / Best / Ask / Show / Jobs.
- Fast navigation: keyboard-first UI with vim-style movement, count prefixes, and a
?help overlay. - Story list: select rows, open comments or the external link (same tab or new tab).
- Item view: story metadata + sanitized HTML, threaded comments with expand/collapse.
- Login actions: JWT-backed HN login via
hn-api.yukai.dev, powered byhn-auth-proxy, with item-page vote/unvote actions and account lists. - Progressive loading: load more stories / comments; optional recursive comment prefetch.
- State restore: remembers scroll + selection per feed/item (session-based).
- Themes & UI: Commander/Dark/Light themes + adjustable font size.
- Offline-friendly PWA: installable, runtime-caches HN API responses, prompts when updates are available.
| Theme | Desktop | Mobile |
|---|---|---|
| Dark | ![]() |
![]() |
| Light | ![]() |
![]() |
| Commander | ![]() |
![]() |
bun installbun run dev(Vite @http://localhost:5173)
Local development proxies auth requests through Vite at /auth-proxy, avoiding browser CORS issues. The default proxy target is https://hn-api.yukai.dev.
Auth configuration:
HN_AUTH_PROXY_TARGET: dev-server proxy target for/auth-proxy.VITE_HN_AUTH_PROXY_URL: browser-facing auth API base URL. Leave unset locally to use/auth-proxy; set it when you need the client to call a specific origin directly.
Generate PWA icons from public/pwa.svg:
node scripts/render-icons.mjs- Rounded-corner variants (for iOS):
node scripts/render-icons.mjs --rounded - Custom radius / inset / background:
node scripts/render-icons.mjs --rounded --rounded-radius 0.22 --inset 0.10 --background "#fff"
Shortcuts are ignored while typing in inputs.
Global
?toggle shortcuts overlayEscclose menus/helpF1..F6switch feedsg1..g6go to feed[/]prev/next feedF9open About / System Setuprrefresh (current page action)PgUp/PgDnprev/next (or load more)Ctrl+o/Ctrl+iback/forwardCtrl+y/Ctrl+escroll one rowCtrl+u/Ctrl+dscroll half pageCtrl+b/Ctrl+fscroll full pageCtrl+rhard reload
Feed list
j/kmove selectiongg/Gjump to top/bottom[count]j/[count]k/[count]Gnumeric prefixzt/zz/zbscroll active row to top/center/bottomEnter/dopen comments;Dopens in new taboopen link;Oopens in new tabvvote/unvote the selected story when logged in
Item page (comments)
j/knext/prev commentgg/Gtop/bottom comment[count]Gjump to commenthjump to parent{/}prev/next threadHcollapse commentlexpand + load one level + go to first childLexpand + load recursively + go to first childvvote/unvote the selected story or comment when logged inzt/zz/zbscroll active comment to top/center/bottom
- Search: integrate HN Algolia search (title/author), plus filters.
- Bookmarks & history: read-later list, “mark as read”, hide stories, and a local reading history.
- Better offline mode: persist more UI state across sessions, prefetch comment threads, background cache warming.
- Power-user UX: command palette, jump-to feed/item, configurable keybindings.
- Performance: list virtualization for very long feeds; smarter comment prefetch caps.
- Accessibility: more ARIA coverage, focus management, and high-contrast theme tuning.
- Sharing: share target (receive shared URLs) and richer share metadata.
- More HN actions: favorite/unfavorite, reply form integration, and hide/unhide once those actions are promoted from raw
/hn/*proxy links.
MIT





