Relevance
Usefulness &
Importance
Evaluator
A native desktop inbox for reviewing new Hacker News posts, built with Rust,
GPUI Kit, and Wry. The application opens as HN Review; the Cargo package and
binary are named ruie-studio.
What it does
- Fetches the newest posts in batches of 50 and refreshes every minute.
- Organizes posts into Inbox, Upvote, Upvote + comment, Spam, and All posts.
- Searches by title, site, or author.
- Shows the Hacker News discussion above the article in two equally sized embedded browsers without toolbars, labels, or URL bars.
- Saves review decisions locally, with undo for reviews.
- Supports light and dark appearances and compact window layouts.
Review labels are local queues. Marking a post as Spam does not flag it on HN, and selecting Upvote does not cast a vote. Use the upper discussion pane to vote or reply on Hacker News. No API key is required.
On macOS, the app disables keychain authorization dialogs so embedded websites cannot interrupt reading with a “WebCrypto Master Key” password prompt. Cookies and website storage remain persistent. Keychain operations that need approval fail instead; if a site's sign-in or encrypted storage requires that access, use your default browser.
Build and run
Install Rust and Cargo with support for the Rust 2024 edition, along with the
native build dependencies for GPUI Kit and Wry. On macOS, install Xcode Command
Line Tools with xcode-select --install. See the GPUI Kit checkout's
website/docs/installation.md for platform requirements. Linux also needs GTK 3
and WebKitGTK 4.1 development libraries; the embedded browser requires X11 or
XWayland.
The project uses a local path dependency on ../gpui-kit/crates/kit. Clone both
repositories into the same parent directory:
git clone https://github.com/longbridge/gpui-kit.git
git clone https://github.com/andrewarrow/ruie.git
cd ruie
cargo run --lockedExpected layout:
parent/
├── gpui-kit/
│ └── crates/kit/
└── ruie/
To build a release binary:
cargo build --release --locked ./target/release/ruie-studio
An internet connection is needed to fetch posts and load article and discussion pages. Previously saved posts and reviews are loaded on startup.
Reviewing posts
Select a post to read its article. Right-click a row or use the keyboard shortcuts to move it into a queue. Choose Go to post from a row's context menu to open that post's Hacker News discussion in the upper reader pane. Reviewed posts can be moved back to Inbox or restored with Undo.
Keyboard shortcuts
These review shortcuts apply when the workspace has focus, outside the search field and embedded browser.
| Key | Action |
|---|---|
1 |
Mark as Spam |
2 |
Queue for Upvote |
3 |
Queue for Upvote + comment |
J / ↓ |
Select the next post |
K / ↑ |
Select the previous post |
R |
Refresh posts |
/ |
Focus search |
Esc |
Return to the post list in compact layouts |
Cmd+Z on macOS |
Undo the last review |
On macOS, Cmd+Shift+T toggles appearance and Cmd+Q quits the app. Appearance
and Undo also have buttons in the window.
Local data
Cached posts, review decisions, comment drafts, and the last sync timestamp are
stored in reviews.json:
| Environment | Location |
|---|---|
XDG_DATA_HOME is set |
$XDG_DATA_HOME/ruie-review/reviews.json |
| macOS, otherwise | ~/Library/Application Support/ruie-review/reviews.json |
| Other platforms, otherwise | ~/.local/share/ruie-review/reviews.json |
The cache keeps reviewed posts, posts with drafts, and the newest 500 remaining
posts. Undo history is held in memory for the current session.
Back up reviews.json to preserve your reviews and drafts.
Development
Run the tests with the sibling GPUI Kit checkout available:
The suite covers queue filtering, persistence, URL validation, and context-menu review actions at several window sizes.
The active application code lives in:
src/main.rs: application startup, menu, and global shortcuts.src/workspace.rs: inbox, reader, review actions, and synchronization.src/browser.rs: embedded Wry browser and native window integration.src/hn.rs: public Hacker News API client and item types.src/model.rs: review queues, search, cache retention, and JSON storage.src/theme.rs: light and dark themes.
