<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tim's blog (Posts about BSD)</title><link>https://blog.thechases.com</link><description></description><atom:link href="https://blog.thechases.com/categories/bsd.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2025 &lt;a href="mailto:blog@tim.thechases.com"&gt;Tim Chase&lt;/a&gt; </copyright><lastBuildDate>Thu, 02 Oct 2025 19:32:44 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Setting up a terminal screen-reader on OpenBSD</title><link>https://blog.thechases.com/posts/bsd/setting-up-a-terminal-screen-reader-on-openbsd/</link><dc:creator>Tim Chase</dc:creator><description>&lt;p&gt;
 This post walks through installing the screen-reader
 &lt;code&gt;yasr&lt;/code&gt;
 and configuring it to use
 &lt;code&gt;speech-dispatcher&lt;/code&gt;
 with a
 &lt;abbr title="text to speech"&gt;TTS&lt;/abbr&gt;
 engine.
&lt;/p&gt;

&lt;!-- TEASER_END --&gt;

&lt;p&gt;
 This assumes you have successfully installed a stock OpenBSD system
 and that your user has
 &lt;kbd&gt;doas&lt;/kbd&gt;
 access to install software.
&lt;/p&gt;

&lt;h2&gt;Install required packages&lt;/h2&gt;
&lt;p&gt;
 First, install the requisite packages from the repos:
&lt;figure&gt;
&lt;pre&gt;
$ doas pkg_add speech-dispatcher espeak flite
&lt;/pre&gt;
&lt;/figure&gt;
 The
 &lt;code&gt;flite&lt;/code&gt;
 package is optional,
 but can provide you with an alternate set of voices.
&lt;/p&gt;

&lt;p&gt;
 Currently
 &lt;code&gt;yasr&lt;/code&gt;
 isn't available as an OpenBSD package,
 but it's fairly easy to install.
 You should be able to obtain
 the source code from the
 &lt;a href="https://github.com/mgorse/yasr"&gt;
 &lt;code&gt;yasr&lt;/code&gt;
 source repository&lt;/a&gt;.
&lt;/p&gt;&lt;pre&gt;
&lt;label class="user"&gt;$ &lt;/label&gt; git clone https://github.com/mgorse/yasr
&lt;/pre&gt;
 and to build it
&lt;figure&gt;
&lt;pre&gt;
$ cd yasr/yasr
$ make
&lt;/pre&gt;
&lt;/figure&gt;
 At some point, hopefully
 &lt;code&gt;yasr&lt;/code&gt;
 will be in the package repositories,
 making it as easy as
 &lt;kbd&gt;pkg_add yasr&lt;/kbd&gt;.


&lt;h2&gt;Ensure that sound works&lt;/h2&gt;
&lt;p&gt;
 If you haven't already,
 make sure that your OpenBSD box can play audio.
 You can check this by using 
&lt;figure&gt;
&lt;pre&gt;
$ aucat -i &lt;var&gt;somefile.wav&lt;/var&gt;
&lt;/pre&gt;
&lt;/figure&gt;
 If you don't have any
 &lt;code&gt;.wav&lt;/code&gt;
 files on your machine,
 &lt;code&gt;speech-dispatcher&lt;/code&gt;
 provides
 &lt;code&gt;/usr/local/share/sounds/speech-dispatcher/test.wav&lt;/code&gt;
 so
&lt;figure&gt;
&lt;pre&gt;
aucat -i /usr/local/share/sounds/speech-dispatcher/test.wav
&lt;/pre&gt;
&lt;/figure&gt;
 should play a short flourish.
 If it is too quiet,
 use
 &lt;a href="https://man.openbsd.org/mixerctl.1"&gt;
 &lt;code&gt;mixerctl&lt;/code&gt;
 &lt;/a&gt;
 to set the volume
 or try
 &lt;a href="https://www.openbsd.org/faq/faq13.html"&gt;
 additional OpenBSD audio troubleshooting
 &lt;/a&gt;
 techniques.
&lt;/p&gt;

&lt;h2&gt;Set up &lt;code&gt;speech-dispatcher&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;
 To create a user configuration file in
 &lt;code&gt;~/.config/speech-dispatcher/&lt;/code&gt;
 use
&lt;figure&gt;
&lt;pre&gt;
$ spd-conf
&lt;/pre&gt;
&lt;/figure&gt;
 with the default output of "espeak"
 (you can later try changing this to "flite"
 but I leave that as an exercise for the reader)
 and output via
 &lt;code&gt;libao&lt;/code&gt;.
 You can also set the default output speed.
 I prefer it a little faster than the default
 but it might be good to start with the default
 and then tune it later.
 As you configure,
 it should offer you the option to run some tests.
 If you choose "yes" for the first test,
 you should hear
 "Speech dispatcher works."
 I recommend skipping the other tests.
 With this in place, you should now have a
 &lt;code&gt;~/.config/speech-dispatcher/&lt;/code&gt;
 directory with various configuration settings within.
&lt;/p&gt;

&lt;p&gt;
 The
 &lt;code&gt;yasr&lt;/code&gt;
 screen-reader requires 
 &lt;code&gt;speech-dispatcher&lt;/code&gt;
 to listen on an inet socket
 rather than a
 Unix socket,
 so edit the config file with your favorite text editor
 and uncomment/change the CommunicationMethod from
 "unix_socket"
 to
 "inet_socket"
&lt;figure&gt;
&lt;pre&gt;
$ ed ~/.config/speech-dispatcher/speechd.conf
&lt;kbd&gt;/CommunicationMethod.*unix_socket&lt;/kbd&gt;
&lt;kbd&gt;a
CommunicationMethod "inet_socket"
.
&lt;/kbd&gt;
wq
&lt;/pre&gt;
&lt;/figure&gt;
 This does open a local port (6560)
 allowing other processes on the same machine
 to connect to
 &lt;code&gt;speech-dispatcher&lt;/code&gt;
 just so you're aware.
 If you choose to change the port,
 just make sure to also change it in the
 &lt;code&gt;yasr&lt;/code&gt;
 configuration later.
&lt;/p&gt;

&lt;h2&gt;Configure &lt;code&gt;yasr&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;
 Copy the default
 &lt;code&gt;yasr&lt;/code&gt;
 configuration file for modification:
&lt;figure&gt;
&lt;pre&gt;
$ cp ~/tmp/yasr-0.6.9/yasr.conf ~/.yasr.conf
&lt;/pre&gt;
&lt;/figure&gt;
 Make the following changes:
 &lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;
   Comment out all the
   &lt;code&gt;synthesizer=…&lt;/code&gt;
   lines except the
   &lt;code&gt;synthesizer=speech dispatcher&lt;/code&gt;
   line, uncommenting that one
  &lt;/li&gt;
  &lt;li&gt;
   Uncomment the
   &lt;code&gt;synthesizer port=127.0.0.1:6560&lt;/code&gt;
   line
  &lt;/li&gt;
  &lt;li&gt;
   Set the
   &lt;code&gt;shell=…&lt;/code&gt;
   to your preferred shell.
   OpenBSD doesn't install
   &lt;code&gt;bash&lt;/code&gt;
   at
   &lt;code&gt;/bin/bash&lt;/code&gt;
   so you'll either want to use
   &lt;code&gt;/bin/ksh&lt;/code&gt;
   or,
   (if you have
   &lt;code&gt;bash&lt;/code&gt;
   installed)
   &lt;code&gt;/usr/local/bin/bash&lt;/code&gt;,
   or your preferred default shell.
  &lt;/li&gt;
 &lt;/ul&gt;
 You can change other aspects of
 &lt;code&gt;yasr&lt;/code&gt;
 in here,
 but for now,
 leave the defaults.


&lt;h2&gt;Testing&lt;/h2&gt;
&lt;p&gt;
 It took me a bit to figure out that
 &lt;code&gt;speech-dispatcher&lt;/code&gt;
 listens for a connection but times-out
 (by default, 5 seconds)
 and then quits.
 So you need to invoke it and then immediately launch
 &lt;code&gt;yasr&lt;/code&gt;
&lt;figure&gt;
&lt;pre&gt;
$ speech-dispatcher &amp;amp;&amp;amp; ~/tmp/yasr-0.6.9/yasr/yasr
&lt;/pre&gt;
&lt;/figure&gt;
 If all is working successfully
 it should start
 &lt;code&gt;yasr&lt;/code&gt;
 and you should hear it read your prompt.
&lt;/p&gt;

&lt;h2&gt;Getting started with &lt;code&gt;yasr&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;
 The
 &lt;code&gt;~/.yasr.conf&lt;/code&gt;
 file lists all of the keyboard commands
 for both normal/interactive mode
 (the default)
 and for review mode.
 Keys are given by ASCII value written in hex.
&lt;/p&gt;
&lt;table&gt;
 &lt;caption&gt;Normal/interactive mode commands&lt;/caption&gt;
 &lt;thead&gt;
  &lt;tr&gt;
   &lt;th&gt;Hex value(s)&lt;/th&gt;
   &lt;th&gt;Keyboard command&lt;/th&gt;
   &lt;th&gt;Action&lt;/th&gt;
  &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;0x01&lt;/td&gt;&lt;td&gt;Ctrl+A&lt;/td&gt;&lt;td&gt;say cursor&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x0c&lt;/td&gt;&lt;td&gt;Ctrl+L&lt;/td&gt;&lt;td&gt;say line&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x0e&lt;/td&gt;&lt;td&gt;Ctrl+N&lt;/td&gt;&lt;td&gt;bypass&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x18&lt;/td&gt;&lt;td&gt;Ctrl+X&lt;/td&gt;&lt;td&gt;flush&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b0b&lt;/td&gt;&lt;td&gt;Ctrl+Alt+K&lt;/td&gt;&lt;td&gt;keyboard wizard&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b0f&lt;/td&gt;&lt;td&gt;Ctrl+Alt+O&lt;/td&gt;&lt;td&gt;options menu&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b13&lt;/td&gt;&lt;td&gt;Ctrl+Alt+S&lt;/td&gt;&lt;td&gt;write configuration&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b30&lt;/td&gt;&lt;td&gt;Alt+0&lt;/td&gt;&lt;td&gt;say line:256&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b62&lt;/td&gt;&lt;td&gt;Alt+b&lt;/td&gt;&lt;td&gt;say character:-1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b63&lt;/td&gt;&lt;td&gt;Alt+c&lt;/td&gt;&lt;td&gt;say character&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b64&lt;/td&gt;&lt;td&gt;Alt+d&lt;/td&gt;&lt;td&gt;say word&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b65&lt;/td&gt;&lt;td&gt;Alt+e&lt;/td&gt;&lt;td&gt;read cursor to bottom&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b69&lt;/td&gt;&lt;td&gt;Alt+i&lt;/td&gt;&lt;td&gt;reinitialize&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b6b&lt;/td&gt;&lt;td&gt;Alt+k&lt;/td&gt;&lt;td&gt;say line:-1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b6c&lt;/td&gt;&lt;td&gt;Alt+l&lt;/td&gt;&lt;td&gt;say line&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b6d&lt;/td&gt;&lt;td&gt;Alt+m&lt;/td&gt;&lt;td&gt;say line:1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b72&lt;/td&gt;&lt;td&gt;Alt+r&lt;/td&gt;&lt;td&gt;toggle review mode&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b74&lt;/td&gt;&lt;td&gt;Alt+t&lt;/td&gt;&lt;td&gt;read top to cursor&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b77&lt;/td&gt;&lt;td&gt;Alt+w&lt;/td&gt;&lt;td&gt;read screen&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b78&lt;/td&gt;&lt;td&gt;Alt+x&lt;/td&gt;&lt;td&gt;flush:1&lt;/td&gt;&lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
 When you enter review-mode,
 commands go to
 &lt;code&gt;yasr&lt;/code&gt;
 directly instead of being passed to the application.
&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;table&gt;
 &lt;caption&gt;Review-mode commands&lt;/caption&gt;
 &lt;thead&gt;
  &lt;tr&gt;
   &lt;th&gt;Hex value(s)&lt;/th&gt;
   &lt;th&gt;Keyboard command&lt;/th&gt;
   &lt;th&gt;Action&lt;/th&gt;
  &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;0x20&lt;/td&gt;&lt;td&gt;space&lt;/td&gt;&lt;td&gt;say review cursor&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x24&lt;/td&gt;&lt;td&gt;$&lt;/td&gt;&lt;td&gt;end of line&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x28&lt;/td&gt;&lt;td&gt;(&lt;/td&gt;&lt;td&gt;previous paragraph&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x29&lt;/td&gt;&lt;td&gt;)&lt;/td&gt;&lt;td&gt;next paragraph&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x3c&lt;/td&gt;&lt;td&gt;&amp;lt;&lt;/td&gt;&lt;td&gt;search back&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x3e&lt;/td&gt;&lt;td&gt;&amp;gt;&lt;/td&gt;&lt;td&gt;search forward&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x5e&lt;/td&gt;&lt;td&gt;^&lt;/td&gt;&lt;td&gt;beginning of line&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x60&lt;/td&gt;&lt;td&gt;`&lt;/td&gt;&lt;td&gt;ascii&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x62&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;say character:-1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x63&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;td&gt;say character&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x65&lt;/td&gt;&lt;td&gt;e&lt;/td&gt;&lt;td&gt;read cursor to bottom&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x66&lt;/td&gt;&lt;td&gt;f&lt;/td&gt;&lt;td&gt;find&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x6a&lt;/td&gt;&lt;td&gt;j&lt;/td&gt;&lt;td&gt;say line:1:0&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x6b&lt;/td&gt;&lt;td&gt;k&lt;/td&gt;&lt;td&gt;say line:-1:0&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x6c&lt;/td&gt;&lt;td&gt;l&lt;/td&gt;&lt;td&gt;say line&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x6d&lt;/td&gt;&lt;td&gt;m&lt;/td&gt;&lt;td&gt;say line:1:0&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x6e&lt;/td&gt;&lt;td&gt;n&lt;/td&gt;&lt;td&gt;bypass&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x74&lt;/td&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;read top to cursor&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x76&lt;/td&gt;&lt;td&gt;v&lt;/td&gt;&lt;td&gt;set option:6&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x77&lt;/td&gt;&lt;td&gt;w&lt;/td&gt;&lt;td&gt;read screen&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x78&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;say word:1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x7a&lt;/td&gt;&lt;td&gt;z&lt;/td&gt;&lt;td&gt;say word:-1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b73&lt;/td&gt;&lt;td&gt;Alt+s&lt;/td&gt;&lt;td&gt;set option:5&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b5b41&lt;/td&gt;&lt;td&gt;Up arrow&lt;/td&gt;&lt;td&gt;say line:-1:1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b5b42&lt;/td&gt;&lt;td&gt;Down arrow&lt;/td&gt;&lt;td&gt;say line:1:1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b5b44&lt;/td&gt;&lt;td&gt;Left arrow&lt;/td&gt;&lt;td&gt;say character:-1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;0x1b5b43&lt;/td&gt;&lt;td&gt;Right arrow&lt;/td&gt;&lt;td&gt;say character:1&lt;/td&gt;&lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
 I'm not quite sure what several of those do,
 but feel free to experiment with them.
&lt;/p&gt;

&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;
 From here, you can tweak your
 &lt;code&gt;yasr&lt;/code&gt;
 keyboard commands in your
 &lt;code&gt;~/.yasr.conf&lt;/code&gt;
 or change your
 &lt;code&gt;speech-dispatcher&lt;/code&gt;
 settings in your
 &lt;code&gt;~/.config/speech-dispatcher/speechd.conf&lt;/code&gt;
 and
 &lt;code&gt;~/.config/speech-dispatcher/modules/espeak.conf&lt;/code&gt;
 files.
&lt;/p&gt;

&lt;p&gt;
 You might copy/link the
 &lt;code&gt;yasr&lt;/code&gt;
 binary into some place on your
 &lt;code&gt;$PATH&lt;/code&gt;
 such as
&lt;figure&gt;
&lt;pre&gt;
$ mkdir ~/bin
$ ln -s ~/tmp/yasr-0.6.9/yasr/yasr ~/bin
&lt;/pre&gt;
&lt;/figure&gt;
&lt;/p&gt;

&lt;p&gt;
 If you're feeling adventuous and prefer
 &lt;code&gt;flite&lt;/code&gt;
 you might try configuring
 &lt;code&gt;speech-dispatcher&lt;/code&gt;
 to use that instead.
&lt;/p&gt;

&lt;p&gt;
 Finally, it helps to have a suite of applications
 that play nicely with text-to-speech output.
 A few you might want to try:
 &lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;Local mail:
   &lt;a href="https://man.openbsd.org/mail.1"&gt;
   &lt;code&gt;mail&lt;/code&gt;/&lt;code&gt;mailx&lt;/code&gt;
   &lt;/a&gt;
   &lt;/li&gt;
  &lt;li&gt;Remote mail:
   &lt;code&gt;s-nail&lt;/code&gt;
   (available as a package)
   &lt;/li&gt;
  &lt;li&gt;Calendar:
   &lt;code&gt;remind&lt;/code&gt;
   (available as a package)
   &lt;/li&gt;
  &lt;li&gt;Web-browsing:
   &lt;code&gt;lynx&lt;/code&gt;
   or
   &lt;code&gt;edbrowse&lt;/code&gt;
   &lt;/li&gt;
  &lt;li&gt;RSS:
   &lt;code&gt;rss2email&lt;/code&gt;
   or 
   &lt;code&gt;newsboat&lt;/code&gt;
   (both available as as packages)
   &lt;/li&gt;
  &lt;li&gt;IRC:
   &lt;code&gt;ii&lt;/code&gt;
   (available as a package)
   or
   &lt;code&gt;tinyirc&lt;/code&gt;
   (not currently available as a package)
   &lt;/li&gt;
  &lt;li&gt;Task management:
   &lt;code&gt;taskwarrior&lt;/code&gt;
   or
   &lt;code&gt;devtodo&lt;/code&gt;
   (both available as as packages)
   &lt;/li&gt;
  &lt;li&gt;Music:
   &lt;code&gt;cmus&lt;/code&gt;
   or
   &lt;code&gt;mpd/mpc&lt;/code&gt;
   (both available as as packages)
   &lt;/li&gt;
  &lt;li&gt;Terminal multiplexing:
   &lt;a href="https://man.openbsd.org/tmux.1"&gt;
   &lt;code&gt;tmux&lt;/code&gt;
   &lt;/a&gt;
   or
   GNU &lt;code&gt;screen&lt;/code&gt;
   (available as packages)
   It helps to either hide the status-bar
   or remove the clock
   so that it doesn't constantly spam you with time updates
   &lt;/li&gt;
  &lt;li&gt;Games:
   &lt;ul&gt;
    &lt;li&gt;&lt;a href="https://man.openbsd.org/intro.6"&gt;bsdgames&lt;/a&gt; collection&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;frotz&lt;/code&gt; interpreter for Infocom-style text adventures&lt;/li&gt;
   &lt;/ul&gt;&lt;/li&gt;
 &lt;/ul&gt;</description><category>a11y</category><category>accessibility</category><category>BSD</category><category>ed</category><category>screen-reader</category><guid>https://blog.thechases.com/posts/bsd/setting-up-a-terminal-screen-reader-on-openbsd/</guid><pubDate>Sun, 19 May 2019 23:52:20 GMT</pubDate></item></channel></rss>