{"slug": "show-hn-rexfeed-a-tech-feed-in-a-rex-side-pane-while-your-coding-agent-works", "title": "Show HN: Rexfeed – A tech feed in a Rex side pane while your coding agent works", "summary": "Developer Alpcan Aydın released rexfeed, an unofficial open-source add-on for the Rex terminal that opens a side pane of rotating tech cards — news, tips, product launches, and YouTube and Reddit videos — while a coding agent works. rexfeed hooks into Claude Code, Codex, OpenCode and Pi via each agent's lifecycle hooks, opening the pane when a prompt is sent and closing it when the agent finishes, and requires a Mac with Apple silicon, Rex, Homebrew and Python 3. The add-on is opt-in per session through /rexfeed-start and /rexfeed-stop, uses Rex's own rex CLI to open a rex split without modifying Rex, and is not affiliated with Rex maker Superlogical.", "body_md": "*Something worth a glance while your coding agent works, in a side pane of [Rex](https://rex.superlogical.com). For Claude Code, Codex, OpenCode and Pi.*\n\n[How it works](#how-it-works) • [Install](#install) • [Usage](#usage) • [Sources](#sources) • [Video](#how-video-works) • [Config](#config) • [FAQ](#faq)\n\n## demo.mp4\n\n<sub>Three Claude Code turns, sped up 4×: the pane opens as the agent starts and closes when it's done. No player? [Download the video](https://github.com/alpcanaydin/rexfeed/blob/main/assets/demo.mp4).</sub>\n\nWhile your agent thinks, you wait. rexfeed fills that wait: a pane opens beside the agent and rotates short tech cards (news, tips, product launches, YouTube and Reddit videos). Images and videos play right in the terminal through the kitty graphics protocol. When the agent finishes, the pane pauses, so your attention goes back to the agent.\n\nNote\n\nrexfeed is an unofficial add-on, not made by or affiliated with Superlogical. It uses Rex's own\n`rex` CLI to open its pane and doesn't modify Rex.\n\nrexfeed is opt-in per session. Turn it on in an agent session inside Rex; from then on the agent's hooks drive the pane:\n\n| Agent | How it hooks in | Opt-in | \n|---|---|---|\n| Claude Code | `UserPromptSubmit` /`Stop` /`SessionEnd` hooks | `/rexfeed-start` ,`/rexfeed-stop` | \n| Codex | the same hooks in `~/.codex/hooks.json` (trust them once with`/hooks` ) | `!rexfeed on` ,`!rexfeed off` | \n| OpenCode | server plugin + TUI plugin | `/rexfeed-start` ,`/rexfeed-stop` (or`!rexfeed on` ) | \n| Pi | extension ( `before_agent_start` ,`agent_settled` ,`session_shutdown` ) | `/rexfeed-start` ,`/rexfeed-stop` | \n\n| Event | Pane | \n|---|---|\n| `/rexfeed-start` | Turns rexfeed on for this session; no pane yet | \n| Prompt sent (the agent starts working) | Opens the pane | \n| Agent finishes | Closes the pane; the next prompt opens it again with unseen cards | \n| Pane has focus | Pauses so you can read; resumes when focus leaves | \n| 30 cards shown | Loads the next batch of unseen cards | \n| No unseen cards left | Starts a background refresh and closes | \n| `/rexfeed-stop` (`rexfeed off` ) | Closes and turns off for this session | \n| Session ends (Claude Code, Codex, Pi) | Closes | \n\nWithout opting in the hooks do nothing, so other sessions stay untouched. State is kept per\nRex pane in `~/.cache/rexfeed/state/`. Claude Code, Codex and Pi run inside their pane, so the hooks\nread the pane id from `$REX_BLOCK`. OpenCode runs plugins in one shared background server, so its TUI\nplugin records which pane shows each session (`~/.cache/rexfeed/opencode/<session>`) and the server\nplugin passes that pane as `rexfeed hook … --block <pane>`. The pane is a `rex split` beside the agent's\npane, opened without taking focus.\n\nCards are picked round-robin across sources, so one feed doesn't take over, and a card you've seen\ndoesn't come back. When the cache is older than `refresh_minutes`, a prompt starts a fetch in the\nbackground.\n\nYou need a Mac with Apple silicon, [Rex](https://rex.superlogical.com), at least one of Claude Code,\nCodex, OpenCode or Pi, [Homebrew](https://brew.sh) and Python 3 (the installer edits the agents' JSON\nconfig with it).\nFor images and videos: `ffmpeg` and `yt-dlp` (Homebrew installs them for you).\n\nWith Homebrew:\n\n```\nbrew trust --tap alpcanaydin/rexfeed   # Homebrew asks you to trust third-party taps\nbrew install alpcanaydin/rexfeed/rexfeed\nrexfeed-setup\n```\n\n`rexfeed-setup` hooks rexfeed into your agents. Upgrades need nothing else: the hooks point at\nHomebrew's stable `opt` path.\n\nFrom a release: download `rexfeed-<version>-aarch64-apple-darwin.tar.gz` from\n[Releases](https://github.com/alpcanaydin/rexfeed/releases), unpack it and run `./install.sh` inside.\nKeep the folder where it is: `~/.local/bin/rexfeed` links to the binary in it.\n\nFrom a checkout (needs Rust):\n\n```\ngit clone https://github.com/alpcanaydin/rexfeed && cd rexfeed\n./install.sh\nbrew install ffmpeg yt-dlp   # if you don't have them\n```\n\n## What the installer does\n\n- Builds the binary (from a checkout) and links `~/.local/bin/rexfeed` to it.\n- Tells you if `ffmpeg` or`yt-dlp` is missing.\n- Runs `scripts/install-hooks.sh` , which hooks into each agent it finds (command on`PATH` or config\ndir present). JSON files are backed up to`*.bak-rexfeed` first; running it again doesn't\nduplicate anything. Config dirs follow`CLAUDE_CONFIG_DIR` ,`CODEX_HOME` ,`OPENCODE_CONFIG_DIR` (or`XDG_CONFIG_HOME` ) and`PI_CODING_AGENT_DIR` .\n  - Claude Code: `UserPromptSubmit` ,`Stop` and`SessionEnd` hooks in`~/.claude/settings.json` ;`/rexfeed-start` and`/rexfeed-stop` in`~/.claude/commands/` .\n  - Codex: the same three hooks in `~/.codex/hooks.json` .\n  - OpenCode: `plugins/rexfeed.js` and`plugins/rexfeed-tui/tui.js` in`~/.config/opencode` , the TUI\nplugin listed in`tui.json` (OpenCode 1) and`cli.json` (OpenCode 2), and`/rexfeed-start` and`/rexfeed-stop` in`commands/` .\n  - Pi: `~/.pi/agent/extensions/rexfeed.ts` , which also registers`/rexfeed-start` and`/rexfeed-stop` .\n- Claude Code: \n- Migrates an older *techfeed* install: removes its hooks, commands and link, and moves`~/.cache/techfeed` to`~/.cache/rexfeed` .\n- Runs a first `rexfeed fetch` .\n\n`~/.local/bin` has to be on your `PATH` for the Claude Code commands and `!rexfeed on` to find\n`rexfeed`.\n\nImportant\n\nCodex runs new hooks only after you trust them: start Codex and run `/hooks` once. OpenCode loads\nplugins when its background server starts, so quit OpenCode once after installing (or run\n`pkill -f 'opencode serve'`). Pi picks up the extension on its next start.\n\nIn an agent session in Rex, run `/rexfeed-start` (Claude Code, OpenCode, Pi) or `!rexfeed on`\n(Codex). Send prompts as usual. `/rexfeed-stop` or `!rexfeed off` turns it off again.\n\n| Keys | What | \n|---|---|\n| `n``→``↓`` l``j` | Next card | \n| `p``←``↑`` h``k` | Previous card | \n| `space` | Pause / resume | \n| `o` /`enter` | Open the link in your browser | \n| `q` /`esc` /`ctrl+c` | Close the pane | \n\nThe link line is also an OSC 8 hyperlink, so `⌘`-click opens it too.\n\n```\nrexfeed fetch                refresh the cache (~/.cache/rexfeed)\nrexfeed on | off [--block B] enable or disable for the current Rex pane\nrexfeed pane                 run the pane by hand (never pauses for the agent)\nrexfeed list                 print cached items\nrexfeed hook start|stop|end [--block B]\n                             agent hook entry points; the pane defaults to $REX_BLOCK\n```\n\n- **News:** Hacker News, Show HN, Lobsters, TLDR Tech/AI, The Verge, Ars Technica, TechCrunch, 9to5Mac, Hackaday, Changelog, JavaScript Weekly, This Week in Rust, GitHub Trending, dev.to\n- **Reddit:** r/programming, ClaudeAI, LocalLLaMA, commandline, rust, webdev, neovim, selfhosted, MachineLearning (one combined RSS request; Reddit rate-limits hard)\n- **Products:** Product Hunt\n- **Blogs:** Simon Willison, GitHub, OpenAI, Hugging Face, Vercel, Cloudflare, Rust, Latent Space, Smashing, Josh Comeau\n- **Tips:** Simon's TIL, tldr-pages, jbranchaud/til (both cloned locally, refreshed every 3 days)\n- **Releases:** Claude Code\n- **Video:** Fireship, Beyond Fireship, ThePrimeTime, Theo, Two Minute Papers, Computerphile, Low Level, Linus Tech Tips, Web Dev Simplified, Kurzgesagt\n\nCards without media get the page's `og:image`. Code in tips is syntax-highlighted.\n\nEach refresh downloads the first seconds of the next few unseen videos in the background (YouTube\nthrough `yt-dlp`, Reddit from its `v.redd.it/<id>/HLSPlaylist.m3u8` playlist, both with `ffmpeg`),\nand a video card only joins the queue once its clip is on disk. So a video starts the moment its\ncard shows.\n\n`ffmpeg` decodes the clip into small frames (at most 640px wide). Each frame is zlib-compressed and\nsent with the kitty graphics protocol under a new image id, and the previous frame is deleted only\nafter the new one is placed, so there's no flicker. The terminal scales it to the card. Playback\nstops after `video_max` seconds, pauses with the pane, and has no sound. Images are converted with\n`ffmpeg` and drawn the same way.\n\n`~/.config/rexfeed/config.json`, every key optional:\n\n```\n{\n  \"dwell\": 10,\n  \"video_max\": 20,\n  \"queue_size\": 30,\n  \"refresh_minutes\": 45,\n  \"pane_ratio\": 38,\n  \"idle_close_minutes\": 30\n}\n```\n\n| Key | What | \n|---|---|\n| `dwell` | Seconds a card without video stays | \n| `video_max` | Seconds of a video to play (and to download ahead) | \n| `queue_size` | Cards per batch | \n| `refresh_minutes` | Cache age that triggers a background fetch | \n| `pane_ratio` | Pane size passed to `rex split --ratio` | \n| `idle_close_minutes` | Minutes paused (pane focused) before it closes | \n\nTo keep rexfeed out of a single session, start it with `REXFEED_OFF=1`.\n\n## The pane doesn't open\n\nIt only opens inside Rex after you opt in for the session, and only when there are unseen cards.\nCodex: run `/hooks` once to trust the hooks. OpenCode: restart it after installing so the plugins load,\nand keep the session open in its TUI (the TUI plugin tells rexfeed which pane it's in). Run `rexfeed list` to see the cache and `rexfeed fetch` to fill it. Errors go to\n`~/.cache/rexfeed/log.txt`.\n\n## Videos don't play\n\nCheck `ffmpeg` and `yt-dlp` are on your `PATH`. YouTube changes often, so `brew upgrade yt-dlp`\nfixes most failures.\n\n## Does it work outside Rex, or with other agents?\n\nIt works with the agents Rex supports: Claude Code, Codex, OpenCode and Pi. It doesn't work outside\nRex: the pane is opened with `rex split` and keyed on Rex's pane id. `rexfeed pane` runs in any\nterminal with kitty graphics, but nothing pauses it.\n\n## Does it send anything anywhere?\n\nNo account, no telemetry. It fetches the public feeds above (and linked pages, for their `og:image`) and keeps everything in `~/.cache/rexfeed`.\n\n```\n./uninstall.sh            # hooks, plugins, commands, ~/.local/bin/rexfeed\n./uninstall.sh --purge    # also ~/.cache/rexfeed and ~/.config/rexfeed\n```\n\nIt runs `scripts/install-hooks.sh --remove`, which takes out only rexfeed's own pieces: hook entries\nwhose command contains `rexfeed hook` (or an old `techfeed hook`) in Claude Code's and Codex's JSON,\nbacked up first, the OpenCode plugins and their `tui.json` / `cli.json` entries, the Pi extension and\nthe `/rexfeed-start` / `/rexfeed-stop` commands.", "url": "https://wpnews.pro/news/show-hn-rexfeed-a-tech-feed-in-a-rex-side-pane-while-your-coding-agent-works", "canonical_source": "https://github.com/alpcanaydin/rexfeed", "published_at": "2026-11-04 09:44:35+00:00", "updated_at": "2026-11-04 09:50:17.833335+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools"], "entities": ["rexfeed", "Rex", "Superlogical", "Claude Code", "Codex", "OpenCode", "Pi", "Alpcan Aydın"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-rexfeed-a-tech-feed-in-a-rex-side-pane-while-your-coding-agent-works", "markdown": "https://wpnews.pro/news/show-hn-rexfeed-a-tech-feed-in-a-rex-side-pane-while-your-coding-agent-works.md", "text": "https://wpnews.pro/news/show-hn-rexfeed-a-tech-feed-in-a-rex-side-pane-while-your-coding-agent-works.txt", "jsonld": "https://wpnews.pro/news/show-hn-rexfeed-a-tech-feed-in-a-rex-side-pane-while-your-coding-agent-works.jsonld"}}