SFEED_CURSES(1)
β¨ SFEED_CURSES(1) β¨
okay bestie, listen. this is sfeed_curses, straight out of the General Commands Manual, and it is literally the cutest way to read your feeds in a terminal. no cap. let's get into it π
πΈ NAME πΈ
sfeed_curses β a curses UI for viewing feed data π¦
π SYNOPSIS π
sfeed_curses [file ...]
β¨ DESCRIPTION β¨
so what it does: sfeed_curses formats feed data (TSV) from sfeed(1) β either from stdin or from each file β and shows it in a curses UI. iconic behavior honestly.
if you pass one or more file arguments, then the basename of the file becomes the feed name in the output, like in the feeds sidebar. the file arguments get processed and shown in the feeds sidebar in exactly the order you gave them. if you pass no file arguments, the data is read from stdin, the feed name is "stdin", and the sidebar is not visible by default in that case. periodt.
items with a timestamp from the last day (compared to the system time at the time of loading the feed) get marked as new and <bold-ish>bold</bold-ish>. that value can be overridden through environment variables, fyi. there's also an alternative mode that marks items as read by matching them against a list of URLs from a plain-text file. and items with an enclosure get a little @ symbol. slay.
<sfeed_curses> aligns the output. make sure the environment variable LC_CTYPE is set to a UTF-8 locale so it can figure out the proper column-width per rune, using mbtowc(3) and wcwidth(3). do not skip this step bestie π
π KEYBINDS π
k,ARROW UPβ go one row up β¬οΈj,ARROW DOWNβ go one row down β¬οΈKβ go to the previous <bold-ish>bold</bold-ish> rowJβ go to the next <bold-ish>bold</bold-ish> rowh,ARROW LEFTβ focus the feeds panel,ARROW RIGHTβ focus the items paneTABβ cycle the focused pane (between feeds and items) πgβ go to the first rowGβ go to the last rowPAGE UP,CTRL-Bβ scroll one page upPAGE DOWN,CTRL-F,SPACEβ scroll one page down/β prompt for a new search and search forward (case-insensitive)?β prompt for a new search and search backward (case-insensitive)nβ search forward with the previously set search termNβ search backward with the previously set search term[β go to the previous feed in the feeds pane and open it]β go to the next feed in the feeds pane and open itCTRL-Lβ redraw screen ποΈRβ reload all feed files that were specified as arguments on startup. ifSFEED_URL_FILEis set, it will reload the URLs from that file too.mβ toggle mouse-mode. it supports xterm X10 and extended SGR encoding. πsβ toggle between monocle layout and the previous non-monocle layout<β use a fixed sidebar size for the current layout and decrease the fixed width or height by 1 column>β use a fixed sidebar size for the current layout and increase the fixed width or height by 1 column=β reset the sidebar size to automatically adjust for the current layout. with the vertical layout the width is the longest feed name with the item counts right-aligned. with the horizontal layout the height is half of the window height (minus the status bar) or otherwise the total amount of visible feeds, whichever fits the best.tβ toggle showing only feeds with new items in the sidebar β¨a,e,@β plumb URL of the enclosure. the URL is passed as a parameter to the program specified inSFEED_PLUMBER.o,ENTER,RETURNβ feeds pane: load feed and its items. in the monocle layout it will also switch to the items pane after loading the feed items. items pane: plumb current item URL, the URL is passed as a parameter to the program specified inSFEED_PLUMBER.c,p,|β pipe the whole TAB-Separated Value line to a program. this program can be specified withSFEED_PIPER.yβ pipe the TAB-Separated Value field for yanking the URL to a program. this program can be specified withSFEED_YANKER.Eβ pipe the TAB-Separated Value field for yanking the enclosure to a program. this program can be specified withSFEED_YANKER.rβ mark item as read. this will only work whenSFEED_URL_FILEis set.uβ mark item as unread. this will only work whenSFEED_URL_FILEis set.fβ mark all items of the currently loaded feed as read. this will only work whenSFEED_URL_FILEis set.Fβ mark all items of the currently loaded feed as unread. this will only work whenSFEED_URL_FILEis set.1β set the current layout to a vertical mode. showing a feeds sidebar to the left and the feed items to the right.2β set the current layout to a horizontal mode. showing a feeds sidebar on the top and the feed items on the bottom.3β set the current layout to a monocle mode. showing either a feeds or a feed items pane.q,EOFβ quit π
π MOUSE ACTIONS π
when mouse-mode is enabled, the below actions are available bestie:
LEFT-CLICKβ feeds pane: select and load the feed and its items. in the monocle layout it will also switch to the items pane after loading the feed items. items pane: select item, when already selected then plumb it.RIGHT-CLICKβ feeds pane: select feed, but do not load it. items pane: pipe the item.SCROLL UPβ scroll one page upSCROLL DOWNβ scroll one page downFORWARDβ switch to the items paneBACKWARDβ switch to the feeds pane
π SIGNALS π
SIGHUPβ reload all feed files that were specified as arguments on startup. ifSFEED_URL_FILEis set, it will reload the URLs from that file too. cancels the line editor and handles the signal if received during a search.SIGINTβ interrupt: quit. when searching, it only cancels the line editor and doesn't quit.SIGTERMβ quitSIGWINCHβ resize the pane dimensions relative to the terminal size. when searching, it handles the signal after closing the line editor.
β οΈ signals are handled in the following order:SIGCHLD,SIGTERM,SIGINT,SIGHUP,SIGWINCH.
π ENVIRONMENT VARIABLES π
SFEED_AUTOCMDβ read and process a sequence of keys as input commands from this environment variable first, and afterwards it reads from the tty as usual. this can be useful to automate certain actions at the start. π€SFEED_NEW_AGEβ overwrite the maximum age in seconds to mark feeds as new. by default this is86400, which equals one day.SFEED_PIPERβ a program where the whole TAB-Separated Value line is piped to. by default this is"sfeed_content".SFEED_PIPER_INTERACTIVEβ handle the program interactively in the same terminal or not. by default this is set to"1".SFEED_PLUMBERβ a program that receives the link URL or enclosure URL as a parameter. by default this is"xdg-open".SFEED_PLUMBER_INTERACTIVEβ handle the program interactively in the same terminal or not. this option can be useful to open a text-mode browser in the same terminal. by default this is set to"0".SFEED_YANKERβ a program where the URL or enclosure field is piped to, to copy it to a clipboard. by default this is"xclip -r".SFEED_YANKER_INTERACTIVEβ handle the program interactively in the same terminal or not. by default this is set to"0".SFEED_URL_FILEβ if this variable is set then a different mode is used to mark items as read, instead of checking the timestamp, which is the default. the value specified is a plain-text file containing a list of read URLs, one URL per line. this URL is matched on the link field if it is set, otherwise it is matched on the id field.SFEED_MARK_READβ a program to mark items as read ifSFEED_URL_FILEis also set; if unset, the default program used is"sfeed_markread read". the marked items are piped to the program line by line. if the feed item has a link then this line is the link field, otherwise it is the id field. the program is expected to merge items in a safe/transactional manner. the program should return the exit status0on success or non-zero on failure.SFEED_MARK_UNREADβ a program to mark items as unread ifSFEED_URL_FILEis also set; if unset, the default program used is"sfeed_markread unread". the unmarked items are piped to the program line by line. if the feed item has a link then this line is the link field, otherwise it is the id field. the program is expected to merge items in a safe/transactional manner. the program should return the exit status0on success or non-zero on failure.SFEED_LAZYLOADβ lazyload items when reading the feed data from files. this can reduce memory usage but increases latency when seeking items, especially on slower disk drives. it can also cause a race-condition issue if the feed data on disk is changed while having the UI open and offsets for the lines are different. a workaround for the race-condition issue is by sending theSIGHUPsignal tosfeed_cursesafter the data was updated. this makessfeed_cursesreload the latest feed data and update the correct line offsets. by default this is set to"0".SFEED_FEED_PATHβ this variable is set bysfeed_curseswhen a feed is loaded. if the data was read from stdin this variable is unset. it can be used by the plumb or pipe program for scripting purposes.
π«Ά INTERACTIVE AND NON-INTERACTIVE PROGRAMS π«Ά
sfeed_curses can pipe content, plumb and yank interactively or in a non-interactive manner, and honestly that's the range π
in interactive mode sfeed_curses waits until the process exits. stdout and stderr of the program are written as output. it stores and restores the terminal attributes before and after executing the program. the signals SIGHUP and SIGWINCH will be handled after sfeed_curses has waited on the program. SIGINT is ignored while waiting on the program.
in non-interactive mode sfeed_curses doesn't wait until the process exits. stdout and stderr of the program are not written as output. when plumbing an URL then stdin is closed also.
β EXIT STATUS β
the sfeed_curses utility exits 0 on success, and >0 if an error occurs. the exit status is 130 on SIGINT and 143 on SIGTERM.
and bestieβ¦ there's more. stay tuned π
β¨ EXAMPLES β¨
Okay bestie, here's the vibe. Simplest possible thing first β just yeet all your feed files at it:
sfeed_curses ~/.sfeed/feeds/*
And now the fun one, the one that shows off a bunch of sfeed_curses features at once:
export SFEED_AUTOCMD="2tgo"
export SFEED_URL_FILE="$HOME/.sfeed/urls"
[ -f "$SFEED_URL_FILE" ] || touch "$SFEED_URL_FILE"
sfeed_curses ~/.sfeed/feeds/*
So what is all that even doing? Let me break it down fr fr:
- Set commands to execute automatically on startup:
Set the current layout to a horizontal mode (the 2 keybind). Showing a feeds sidebar on the top and the feed items on the bottom.
Toggle showing only feeds with new items in the sidebar (the t keybind).
Go to the first row in the current panel (the g keybind).
Load the currently selected feed (the o keybind).
- Set a file to use for managing read and unread items. This is a plain-text file containing a list of read URLs, one URL per line.
- Check if this file for managing the read and unread items exists. If it doesn't exist yet then create an empty file.
- Start sfeed_curses and read the specified feed files.
π SEE ALSO π
π AUTHORS π
Hiltjo Posthuma <hiltjo@codemadness.org>
That's the whole page bestie, you made it to the end, iconic behavior honestly π This one came from the Debian build, dated October 27, 2024, and it's the SFEED_CURSES(1) manual. Now go read your feeds, you absolute main character π¦β¨
π¦ where this page comes from
- alpine 3.24: sfeed-doc 2.4-r0 Β· ISC
- debian trixie: sfeed 2.2-1 Β· ISC
- nixos 26.05: sfeed 2.4
- nixpkgs unstable: sfeed 2.4
- ubuntu questing: sfeed 2.2-1
- ubuntu resolute: sfeed 2.3-1 Β· ISC
- ubuntu stonking: sfeed 2.3-1 Β· ISC
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms