unrager

A calm Twitter/X client for the terminal. A local LLM drops rage-bait before it reaches your eyes.

$ curl -fsSL unrager.com/install.sh | bash

macOS · Linux · or cargo install unrager

unrager home feed, rage filter active: scrolling through tweets, opening a thread, with −N count persistently visible in the status bar
Home feed with the rage filter on. −N in the status bar is all that remains of the tweets the LLM dropped before they reached the screen.

─── what it does ───────────────────────

rage filter
Every tweet classified by a local Ollama model against your rubric. Matches are physically removed — not collapsed, not grayed, gone. Verdicts cache to SQLite; edit the rubric and the cache invalidates.
terminal-native
ratatui + crossterm. Inline photos, video posters, GIF frames via the kitty graphics protocol on Ghostty, Kitty, WezTerm. Falls back to glyphs elsewhere.
free reads
Browser cookies → X's own GraphQL endpoints, the same path the web client uses. No API key, no cost, no rate tier.
write via OAuth
Tweet & reply through the official X API v2 with your own registered client. Auto-likes on reply. Your identity, your rate limits.
four LLM hooks, one model
Filter classifies tweets. Translate (T) rewrites foreign-language posts in English. Ask (A) opens an inline gemma chat about the selected post with thread context auto-attached. Brief (B) generates a short profile analysis from someone's timeline. All the same local Ollama. Nothing leaves your machine.
Vim-mode composing
Every text input — reply, ask, command palette — is a miniature Vim editor. Insert / Normal, hjkl, w/b, dd/dw, counts, ^/$. Status line shows the mode and a live character count.
serve anywhere
Optional HTTP server + embedded Dioxus web client. Pair with Tailscale and you have the same feed on iOS, Android, and the browser — one binary, one codebase.

Your home feed, minus the 12 tweets the LLM quietly ate.