<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>crod.me</title><link>https://crod.me/</link><description>Recent content in Home on crod.me</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>contact@crod.org (Chris Rodríguez)</managingEditor><webMaster>contact@crod.org (Chris Rodríguez)</webMaster><lastBuildDate>Wed, 02 Oct 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://crod.me/index.xml" rel="self" type="application/rss+xml"/><item><title>Creating a Hollistic Work Environment</title><link>https://crod.me/posts/desktop/</link><pubDate>Wed, 02 Oct 2024 00:00:00 +0000</pubDate><author>contact@crod.org (Chris Rodríguez)</author><guid>https://crod.me/posts/desktop/</guid><description>&lt;p&gt;In this post, I provide details on my after-installation OpenBSD configuration, software I use, and details on my Firefox configuration.&lt;/p&gt;
&lt;h2 id="afterboot8-extras--on-openbsd"&gt;afterboot(8) Extras — On Openbsd&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://openbsd.org/"&gt;
&lt;img src="https://crod.me/images/puffy.webp" alt="OpenBSD 5.6"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These are some things I do after a clean installation of &lt;a href="https://openbsd.org"&gt;OpenBSD&lt;/a&gt; for desktop use. As the title alludes to, these are things I do after reading the &lt;em&gt;&lt;a href="https://man.openbsd.org/afterboot"&gt;afterboot&lt;/a&gt;&lt;/em&gt; man page. All of this info is in the man pages and &lt;a href="https://openbsd.org/faq/"&gt;FAQ&lt;/a&gt; already, but this document should lay out some other things you may want to have up and running in a dissectable manner.&lt;/p&gt;
&lt;h3 id="root-permissions-for-user"&gt;Root Permissions For &lt;em&gt;user&lt;/em&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# echo &amp;#34;permit persist keepenv :wheel&amp;#34; &amp;gt;/etc/doas.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In case you did not add your user to the &lt;code&gt;:wheel&lt;/code&gt; group during the installation, you can do so like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# usermod -G wheel user
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now you can do your whole system configuration as your user provided that you use the &lt;code&gt;doas&lt;/code&gt; command.&lt;/p&gt;
&lt;h3 id="wifi"&gt;WIFI&lt;/h3&gt;
&lt;p&gt;Identify your network card:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ifconfig
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, scan your local networks with:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ifconfig iwn0 scan # change &amp;#34;iwn0&amp;#34; for your network card
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once you&amp;rsquo;ve identified your network card, edit the file &lt;code&gt;/etc/hostname.iwn0&lt;/code&gt; adjusting the final iwn0 with your card. Finally, add your WIFI ssid and wpakey:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;join wifiname wpakey wifipassword
join anotherwifi wpakey &amp;#34;anotherpass$123&amp;#34;
# randomize mac address on untrusted networks
lladdr random join wifi-name-cool wpakey &amp;#34;password-cool&amp;#34;
# ipv4
inet autoconf
# ipv6
inet6 autoconf
up
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="audio"&gt;Audio&lt;/h3&gt;
&lt;p&gt;This is not necessary, but if you have a USB audio device, this is what you would use for sndiod to recognize which audio device to use:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# echo &amp;#34;sndiod_flags=-f rsnd/0 -F rsnd/1&amp;#34; &amp;gt;/etc/rc.conf.local
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It may come useful when you least expect it.&lt;/p&gt;
&lt;h3 id="firewall"&gt;Firewall&lt;/h3&gt;
&lt;p&gt;The following is a sane firewall configuration for your average desktop user and it will be placed in &lt;code&gt;/etc/pf.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;set block-policy drop
set skip on lo
match in all scrub (no-df random-id max-mss 1440)
antispoof quick for egress
# block all traffic
block
# access ipv4 and ipv6
pass out quick inet
pass out quick inet6
# for use with mail transfer agents
pass in proto icmp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Test your config and then apply:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# pfctl -fn /etc/pf.conf &amp;amp;&amp;amp; pfctl -f /etc/pf.conf
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="performance-optimizations"&gt;Performance Optimizations&lt;/h2&gt;
&lt;p&gt;Since OpenBSD is more security oriented, the default performance can be lacking even on newer hardware. These steps should alleviate the speed issues.&lt;/p&gt;
&lt;h3 id="becoming-a-staff-member"&gt;Becoming a Staff Member&lt;/h3&gt;
&lt;p&gt;Add your user to the :staff group in order to access more of your system resources:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# usermod -L staff user
# usermod -G staff user
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="hyper-threading"&gt;Hyper Threading&lt;/h3&gt;
&lt;p&gt;One thing that will actually increase your performance is enabling hyper threading. It is disabled by default due to some &lt;a href="https://news.ycombinator.com/item?id=17350278"&gt;security concerns&lt;/a&gt;. My laptop at the time of writing is a relatively slow computer, so I can tell the difference. If your laptop is newer, say 2016 and up, you might not need it. You can test it with:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# sysctl hw.smt=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On a thinkpad x61, the performance is immediately noticeable. &lt;code&gt;firefox&lt;/code&gt; becomes usable with it enabled.&lt;/p&gt;
&lt;p&gt;Enable it permanently on next boot:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# echo hw.smt=1 &amp;gt;&amp;gt;/etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For further performance optimizations, watch this &lt;a href="https://www.youtube.com/watch?v=f8lloCtrpdk"&gt;video&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="laptop-lid"&gt;Laptop Lid&lt;/h3&gt;
&lt;p&gt;I prefer to close the lid and work on my monitor. To close the lid without sending the laptop to sleep, you do the following:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# echo machdep.lidaction=0 &amp;gt;&amp;gt;/etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can always run &lt;code&gt;zzz&lt;/code&gt; if you enabled &lt;code&gt;apmd&lt;/code&gt; whenever if you want to put your device to sleep, which does not require root permission in any case.&lt;/p&gt;
&lt;h3 id="sending-mail-with-opensmtpd"&gt;Sending mail with &lt;code&gt;OpenSMTPD&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;OpenBSD comes with &lt;a href="https://www.opensmtpd.org/"&gt;OpenSMTPD&lt;/a&gt; as the smtpd server and client. The following configuration will be used to send mail to the web from any accounts you wish to configure. Note that this configuration does not handle local mail. Read &lt;a href="https://man.openbsd.org/smtpd.conf"&gt;smtpd.conf(5)&lt;/a&gt; for that info.&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;/etc/mail/smtpd.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# your credentials for your accounts go in this file (the &amp;#34;passwd&amp;#34; bit can be named anything):
table passwd file:/etc/mail/passwd
# configure your accounts&amp;#39; email, authentication protocol, port, and credentials (which
# are held in the &amp;#34;passwd&amp;#34; table) for opensmtpd to use when sending mail:
action &amp;#34;outbound_user&amp;#34; relay host smtp+tls://user@example.com:587 auth &amp;lt;passwd&amp;gt;
action &amp;#34;outbound_gmail&amp;#34; relay host smtp+tls://gmail@smtp.gmail.com:587 auth &amp;lt;passwd&amp;gt;
# tell smtpd to use those actions when sending mail with the following emails
match mail-from &amp;#34;user@example.com&amp;#34; for any action &amp;#34;outbound_user&amp;#34;
match mail-from &amp;#34;username@gmail.com&amp;#34; for any action &amp;#34;outbound_gmail&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, to edit &lt;code&gt;/etc/mail/passwd&lt;/code&gt;, you need to create the file and edit its permissions.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# touch /etc/mail/passwd
# chmod 640 /etc/mail/passwd
# chown root:_smtpd /etc/mail/passwd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The credentials themselves &lt;code&gt;/etc/mail/passwd&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# the first argument matches the name you gave it: smtp+tls://user@example.com:587
# the second is the username for the mail server
# also, some email servers do not acclimate your username to the server. see example
# with the first email server, and gmail
user user@.example.com:yourpassword
gmail username:yourapppassword
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Everything should be in working order now. Test the configuration and restart the daemon to load your changes:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# smtpd -n &amp;amp;&amp;amp; rcctl restart smtpd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Test your configuration:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ echo world | mail -r your@mail.org -s hello your@mail.org
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now you should have OpenSMTPD working in order to send mail even when offline!&lt;/p&gt;
&lt;p&gt;My preferred mail client is listed in the &lt;a href="https://crod.me/posts/desktop#software"&gt;&lt;em&gt;software&lt;/em&gt;&lt;/a&gt; section.&lt;/p&gt;
&lt;h3 id="virtual-machines-vmd"&gt;Virtual Machines: &lt;code&gt;vmd&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;To use software not supported in OpenBSD, Windows programs with &lt;code&gt;wine&lt;/code&gt;, or maybe even test software you are not sure whether you trust, you cat use virtual machines as a secondary environment. The native hyper visor has no graphical support, meaning it can only connect to the console and control it through &lt;code&gt;ssh&lt;/code&gt; with your private interfaces. The substitute for using graphical applications is to use ssh with X11 Forwarding enabled or vnc. The latter is not worth the trouble to setup in my opinion.&lt;/p&gt;
&lt;p&gt;I will not go into much detail, for this you best visit the &lt;a href="https://openbsd.org/faq/"&gt;faq&lt;/a&gt;. To get networking working, add this to the firewall at &lt;code&gt;/etc/pf.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;match out on egress from 100.64.0.0/10 to any nat-to (egress)
pass in proto { udp tcp } from 100.64.0.0/10 to any port domain \
rdr-to 9.9.9.9 port domain
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For our pf.conf the &amp;ldquo;9.9.9.9&amp;rdquo; part is the DNS server, Quad9&amp;rsquo;s to be specific. This could be changed to your ISPs DNS servers which are located at &lt;code&gt;/etc/resolv.conf&lt;/code&gt; and or any other DNS server.&lt;/p&gt;
&lt;p&gt;Next, we modify our VM settings at &lt;code&gt;/etc/vm.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vm &amp;#34;alpine&amp;#34; {
disable # don&amp;#39;t start up at boot
memory 4096M # max that can be used
disk &amp;#34;/home/user/vm/alpine.qcow2&amp;#34; # disk
cdrom &amp;#34;/home/user/isos/alpine-virt-3.17.3-x86_64.iso&amp;#34; # this cannot be a .img
owner user:user # control vm without root privs
local interface # give networking to the vm
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add the following lines to &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; to allow the VM to use the internet:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="vm-guests"&gt;VM Guests&lt;/h3&gt;
&lt;p&gt;For my choice of VM operating system, I use &lt;a href="https://www.alpinelinux.org/"&gt;Alpine Linux&lt;/a&gt; as it is plenty sufficient for my needs. If you need something more feature-full, I would recommend &lt;a href="https://www.debian.org/"&gt;Debian Linux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I usually like to configure X11 Forwarding on the VM so that I can use GUI programs on the native OS via any &lt;code&gt;ssh&lt;/code&gt; connection. It is not instant, but it is good for basic tasks. Now, to setup X11 Forwarding on your VM&amp;rsquo;s, you need to have Xorg installed, and you must activate it in &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; on the VM side. Uncomment or add the following line to the mentioned file:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;X11Forwarding yes
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And test on your local machine with:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ssh -X user@100.64.1.3 gui-program # 100.64.1.3 is the local ip your vm was given
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In case it asks you that the host is missing some keys, run on your local machine:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ssh-keygen -R 100.64.1.3
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="notes-on-alpine-linux-for-virtualization"&gt;Notes on Alpine Linux for Virtualization&lt;/h3&gt;
&lt;p&gt;Add this to &lt;code&gt;/boot/extlinux.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;console=ttyS0,115200
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It should be placed in the following highlighted section of the &lt;code&gt;/boot/extlinux.conf&lt;/code&gt; file:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;...
TIMEOUT 5
LABEL lts
...
APPEND root=.......... console=ttyS0,115200
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This allows the VM&amp;rsquo;s console mode to be matched with the VM guest, making the console mode much snappier.&lt;/p&gt;
&lt;p&gt;If you want to do X11 Forwarding, then on the VM running alpine, setup xorg:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# setup-xorg-base
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next, install some packages:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# apk add wine git
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="using-wine"&gt;Using &lt;code&gt;wine&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;wine&lt;/code&gt; is a Windows program emulator that works well in alpine linux for 64 bit programs.&lt;/p&gt;
&lt;p&gt;Firstly, &lt;code&gt;wine&lt;/code&gt; can create separate environments to store your data and Windows programs on that folder. To create these environments for you to actually run .exe programs, you will need to run an environmental variable before executing your program or installer:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ WINEPREFIX=&amp;#34;$HOME/.wine/program-folder-name&amp;#34; WINEARCH=win32 wine setup.exe
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To further explain, the WINEPREFIX is where the setup will extract its files and where everything will be saved from there on (except for .desktop files), and the WINEARCH=win32 specifies that the program is 32-bit. The latter only needs to be done once to specify that the WINEPREFIX is a 32-bit Windows system per se. After that, depending on whether it is a simple .exe or a setup wizard, you can launch it in various ways. I launch the programs by finding the local .exe in the WINEPREFIX folder and creating an alias for it for easy launching.&lt;/p&gt;
&lt;h2 id="notes-on-my-home"&gt;Notes On My $HOME&lt;/h2&gt;
&lt;p&gt;I try to keep things simple and rely on defaults whenever possible. Most of my programs are installed via the OpenBSD package manager. This configuration is universal for most unix systems that can build the following programs.&lt;/p&gt;
&lt;p&gt;From here on out, it is basically a poor man&amp;rsquo;s git server. I do not modify my system enough to justify trusting GitHub or setting up a git server. So this will do.&lt;/p&gt;
&lt;h3 id="x-configuration"&gt;X Configuration&lt;/h3&gt;
&lt;p&gt;Because OpenBSD&amp;rsquo;s &lt;code&gt;xorg&lt;/code&gt; fork has a built-in login screen, I do not go into the console directly, so, what you might place in a &lt;code&gt;.xinitrc&lt;/code&gt; and &lt;code&gt;.profile&lt;/code&gt; I condensed here into &lt;code&gt;$HOME/.xsession&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;export PATH=&amp;#34;$PATH:$HOME/.local/bin&amp;#34;
# make our oksh configuration visible in our X session
export ENV=$HOME/.kshrc
# Default programs:
export EDITOR=&amp;#34;vim&amp;#34;
export TERMINAL=&amp;#34;st&amp;#34;
export BROWSER=&amp;#34;firefox&amp;#34;
export READER=&amp;#34;zathura&amp;#34;
# ~/ Clean-up:
export XDG_CONFIG_HOME=&amp;#34;$HOME/.config&amp;#34;
export XDG_DATA_HOME=&amp;#34;$HOME/.local/share&amp;#34;
export XDG_CACHE_HOME=&amp;#34;$HOME/.cache&amp;#34;
export PASSWORD_STORE_DIR=&amp;#34;$XDG_DATA_HOME/passwords&amp;#34;
# UTF-8 everywhere
export LC_CTYPE=en_US.UTF-8
export LANG=en_US.UTF-8
# firefox
export MOZ_X11_EGL=1
export MOZ_ACCELERATED=1
export MOZ_WEBRENDER=1
export DBUS_SESSION_BUS_ADDRESS=&amp;#34;no&amp;#34; # this might break stuff
# Commands go after environment variables
# Disable caps and change it to compose key.
setxkbmap -option compose:caps,compose:nocaps
# Turn off caps lock if on since there is no longer a key for it.
xset -q | grep -q &amp;#34;Caps Lock:\s*on&amp;#34; &amp;amp;&amp;amp; xdotool key Caps_Lock
# Decrease key repeat delay to 300ms and increase key repeat rate to 50 per second.
xset r rate 300 50
# Blue light filter. Modify &amp;#34;-l&amp;#34; flag to your coordinates
redshift -l 1.0:-1.0 -t 4800:2700 -g 0.8 -m randr -v &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
# Disable core dumps
ulimit -Sc 0 &amp;amp;
# no more bell sound
xset b off
# when X is loaded, check for external monitor on displayport.
# If detected, switch to it and shutdown laptop screen
xrandr | grep &amp;#39;DP-2 connected&amp;#39; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;amp;
xrandr --output DP-2 --auto --output LVDS-1 --off &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
# Dwm status bar
slstatus &amp;amp;
# Wallpaper
xwallpaper --zoom ~/pics/bg &amp;amp;
# Exec WM
exec dwm
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="shell-oksh"&gt;Shell: &lt;a href="https://man.openbsd.org/ksh"&gt;oksh&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;oksh&lt;/code&gt; is the default shell for OpenBSD. There is a &lt;a href="https://github.com/ibara/oksh"&gt;port&lt;/a&gt; to run on other operating systems. &lt;code&gt;oksh&lt;/code&gt; has a default configuration which can be found at &lt;code&gt;/etc/ksh.kshrc&lt;/code&gt; that has some nice aliases to manage your jobs and a nice title bar configured.&lt;/p&gt;
&lt;p&gt;Source the file locally in &lt;code&gt;$HOME/.kshrc&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;. /etc/ksh.kshrc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is my configuration:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;set -o vi
alias \
v=&amp;#34;$EDITOR&amp;#34; \
dv=&amp;#34;doas $EDITOR&amp;#34; \
p=&amp;#34;nsxiv&amp;#34; \
z=&amp;#34;zathura&amp;#34; \
news=&amp;#39;newsraft&amp;#39; \
t=&amp;#34;transmission-remote&amp;#34; \
mpa=&amp;#34;mpv --no-video&amp;#34; \
mpb=&amp;#34;mpv --save-position-on-quit&amp;#34; \
yt=&amp;#39;yt-dlp --embed-metadata -i -f &amp;#34;bestvideo[height&amp;lt;=?1080][fps&amp;lt;=?60]+bestaudio/best[height&amp;lt;=?1080][fps&amp;lt;=?60]&amp;#34;&amp;#39; \
yta=&amp;#34;yt -f bestaudio/best -x --audio-format mp3 --embed-metadata --embed-thumbnail --audio-quality 320k&amp;#34; \
wttr=&amp;#39;curl wttr.in/$LOCATION&amp;#39; \
ipp=&amp;#39;curl ifconfig.me&amp;#39; \
sdn=&amp;#34;doas shutdown -h now&amp;#34;
# Bash-like syntax
PS1=&amp;#39;$(print -n &amp;#34;`logname`@`hostname -s`:&amp;#34;; [[ &amp;#34;${PWD#$HOME}&amp;#34; != &amp;#34;$PWD&amp;#34; ]] &amp;amp;&amp;amp; print -n &amp;#34;~${PWD#$HOME}&amp;#34; || print -n &amp;#34;$PWD&amp;#34;; print &amp;#34;$ &amp;#34;)&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="software"&gt;Software&lt;/h2&gt;
&lt;h3 id="web-browser-firefox"&gt;Web Browser: &lt;a href="https://www.mozilla.org/firefox/"&gt;firefox&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This browser does not truly respect your privacy until you tweak a couple of things. I go in depth in below in &lt;a href="https://crod.me/posts/desktop#working-with-firefox"&gt;Working with &lt;code&gt;Firefox&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="mail-client-aerc"&gt;Mail Client: &lt;a href="https://aerc-mail.org/"&gt;aerc&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;aerc&lt;/code&gt;&amp;rsquo;s defaults are quite sensible, so most of my configuration comes from how I send and receive mail. The following account configuration example is using &lt;code&gt;aerc&lt;/code&gt;&amp;rsquo;s built-in mail fetching and sending protocols:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[john]
source = imaps://user:PasswordExample123@mail.example.com
outgoing = smtps://user:PasswordExample123@mail.example.com
default = INBOX
from = &amp;#34;John Doe&amp;#34; &amp;lt;john@example.com&amp;gt;
cache-headers = true
[cath]
source = imaps://cath:PasswordExample123@mail.example.com
outgoing = smtps://cath:PasswordExample123@mail.example.com
default = INBOX
from = &amp;#34;Cath Doe&amp;#34; &amp;lt;cath@example.com&amp;gt;
cache-headers = true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The passwords are encrypted by default if you follow the wizard on startup.&lt;/p&gt;
&lt;p&gt;If you have OpenSMTPD setup, or an equivalent like Postfix, you can send mail with &lt;code&gt;sendmail&lt;/code&gt; linked in &lt;code&gt;aerc&lt;/code&gt;&amp;rsquo;s account.conf file. Just change the &lt;em&gt;outgoing&lt;/em&gt; section to the following for one or multiple accounts. And for offline mail, use your Maildir folder to access your offline mail. Modify the &lt;em&gt;source&lt;/em&gt; section and add your mail fetch command for aerc to run automatically:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[john]
check-mail-cmd = fdm fetch
source = maildir://~/mail
outgoing = /usr/sbin/sendmail
default = INBOX
from = &amp;#34;John Doe&amp;#34; &amp;lt;john@example.com&amp;gt;
cache-headers = true
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="mail-fetcher-fdm"&gt;Mail Fetcher: &lt;a href="https://github.com/nicm/fdm"&gt;fdm&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;fdm&lt;/code&gt; is easier to use than the more popular alternative &lt;code&gt;mbsync/isync&lt;/code&gt; and is developed by a &lt;a href="https://github.com/tmux/tmux"&gt;&lt;code&gt;tmux&lt;/code&gt;&lt;/a&gt; developer which was first developed for OpenBSD.&lt;/p&gt;
&lt;p&gt;The default config file is found in &lt;code&gt;$HOME/.fdm.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# define your maildir location
action &amp;#34;inbox&amp;#34; maildir &amp;#34;%h/mail&amp;#34;
# configure which accounts to fetch mail from
account &amp;#34;example&amp;#34; imaps server &amp;#34;example.com&amp;#34; user &amp;#34;user@example.com&amp;#34; pass &amp;#34;yourpassword&amp;#34;
account &amp;#34;gmail&amp;#34; imaps server &amp;#34;imap.gmail.com&amp;#34; user &amp;#34;yourGmail@gmail.com&amp;#34; pass &amp;#34;yourgmailapppassword&amp;#34;
# every mail fetched goes to the defined maildir folder
match all action &amp;#34;inbox&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To set the proper permissions on the file, run:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ chmod 600 .fdm.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And that should be it. Beware though, by default, fdm fetches your mail from your server onto your device, meaning mail will be deleted on your server and stored locally. You can now fetch and manage your mail with fdm and your preferred mail client. To fetch your mail:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$ fdm fetch&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="videomusic-player-mpv"&gt;Video/Music Player: &lt;a href="https://mpv.io"&gt;mpv&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The configuration file can be found in &lt;code&gt;$HOME/.config/mpv/mpv.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# choose english audio if available
alang=eng
# turn 5.1 surround to 2.0 stereo
audio-channels=stereo
# set the highest quality video to 1080p 60fps
ytdl-format=bestvideo[height&amp;lt;=?1080][fps&amp;lt;=?60]+bestaudio/best[height&amp;lt;=?1080][fps&amp;lt;=?60]
# sane beginning size
autofit=50%
# less output
quiet
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And to change a couple of keyboard bindings, change &lt;code&gt;$HOME/.config/mpv/input.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# vim bindings
l seek 5
h seek -5
j seek -60
k seek 60
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="other-software"&gt;Other Software&lt;/h3&gt;
&lt;p&gt;Here I will put software that I do not modify or have personal configurations as such.&lt;/p&gt;
&lt;h4 id="window-manager-dwm"&gt;Window Manager: &lt;a href="https://dwm.suckless.org/"&gt;dwm&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A very small and concise window manager. I run &lt;code&gt;dwm&lt;/code&gt; with no patches. Just bindings and default to floating mode.&lt;/p&gt;
&lt;h4 id="terminal-st"&gt;Terminal: &lt;a href="https://st.suckless.org/"&gt;st&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A very feature-less terminal that just works. For &lt;code&gt;st&lt;/code&gt;, I use the &lt;a href="https://st.suckless.org/patches/scrollback/"&gt;scrollback&lt;/a&gt; patch to enable scrolling.&lt;/p&gt;
&lt;h4 id="dynamic-menu-dmenu"&gt;Dynamic Menu: &lt;a href="https://tools.suckless.org/dmenu"&gt;dmenu&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Highly versatile menu used for scripting. Look at the &lt;a href="https://tools.suckless.org/dmenu/scripts/"&gt;dmenu scripts&lt;/a&gt; section for inspiration.&lt;/p&gt;
&lt;h4 id="text-editing-and-text-composer-vi-and-vim"&gt;Text Editing and Text Composer: &lt;a href="https://man.openbsd.org/vi.1"&gt;vi&lt;/a&gt; and &lt;a href="https://www.vim.org/"&gt;vim&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;vim&lt;/code&gt; for composing text as it supports utf-8 and &lt;code&gt;vi&lt;/code&gt; for everything else.&lt;/p&gt;
&lt;h4 id="musicaudio-player-cmus-and-mpv"&gt;Music/Audio Player: &lt;a href="https://cmus.github.io/"&gt;cmus&lt;/a&gt; and &lt;a href="https://mpv.io/"&gt;mpv&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;I use &lt;code&gt;cmus&lt;/code&gt; for local storage and &lt;code&gt;mpv&lt;/code&gt; for web based music or podcast.&lt;/p&gt;
&lt;p&gt;Checkout &lt;a href="https://somafm.com/"&gt;SomaFM&lt;/a&gt; if you haven&amp;rsquo;t already. You can stream the radio stations on the terminal with &lt;code&gt;mpv&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="rss-reader-newsraft"&gt;RSS Reader: &lt;a href="https://codeberg.org/newsraft/newsraft"&gt;newsraft&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Great tool to keep you off the browser.&lt;/p&gt;
&lt;h4 id="torrent-client-transmission"&gt;Torrent Client: &lt;a href="https://transmissionbt.com/"&gt;Transmission&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;There are GUI and TUI interfaces out there, but the terminal client &lt;code&gt;transmission-remote&lt;/code&gt; works for me.&lt;/p&gt;
&lt;h4 id="presentations-sent"&gt;Presentations: &lt;a href="https://tools.suckless.org/sent/"&gt;sent&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The easiest way to make presentations; just a paragraph per page. It also supports images. I use the &lt;a href="https://tools.suckless.org/sent/patches/pdf/"&gt;pdf patch&lt;/a&gt; in order to compile it into a pdf and be able to send it to another person.&lt;/p&gt;
&lt;h4 id="documentpdf-viewer-zathura"&gt;Document/PDF Viewer: &lt;a href="https://pwmt.org/projects/zathura/"&gt;zathura&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A great document reader that remembers your reading progress, shows tabs, and reloads files automatically for work with TeX. After installing some &lt;a href="https://pwmt.org/projects/zathura/plugins/"&gt;plugins&lt;/a&gt; you can open PDF, Postscript, DJVU, EPUB, and more!&lt;/p&gt;
&lt;h4 id="writing-documents-tex"&gt;Writing Documents: &lt;a href="https://tug.org/texlive/"&gt;TeX&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;To write documents in PDF format, I use TeX, the precursor of the popular &lt;a href="https://www.latex-project.org/"&gt;LaTeX&lt;/a&gt;. &lt;a href="https://petr.olsak.net/optex/"&gt;OpTeX&lt;/a&gt; is a great addition to use more advanced features with the same small footprint of TeX.&lt;/p&gt;
&lt;h4 id="office-365-replacement-libreoffice"&gt;Office 365 Replacement: &lt;a href="https://www.libreoffice.org/"&gt;Libreoffice&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The open source, free alternative to Office 365. I do not create content with this, but this will take care of the occasional Microsoft document you have to open.&lt;/p&gt;
&lt;h4 id="image-viewer-nsxiv"&gt;Image Viewer: &lt;a href="https://nsxiv.codeberg.page/"&gt;nsxiv&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Simple Image viewer with a nice thumbnail mode.&lt;/p&gt;
&lt;h4 id="image-editing-gimp-and-imagemagick"&gt;Image Editing: &lt;a href="https://www.gimp.org/"&gt;gimp&lt;/a&gt; and &lt;a href="https://imagemagick.org/"&gt;ImageMagick&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;gimp&lt;/code&gt; for photoshop-like image editing and &lt;code&gt;magick&lt;/code&gt; for simple edits in the command line.&lt;/p&gt;
&lt;h2 id="working-with-firefox"&gt;Working with Firefox&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;firefox&lt;/code&gt; is known to &lt;a href="https://spyware.neocities.org/articles/firefox"&gt;phone home&lt;/a&gt; back to their servers. We can mitigate the tracking by customizing our profile through a &lt;em&gt;user.js&lt;/em&gt; file.&lt;/p&gt;
&lt;p&gt;Note that you should be able to configure your &lt;code&gt;firefox&lt;/code&gt; straight from this document without having to fall back to other resources. Of course, I encourage you to read the documentation for these projects, but, if you are in a hurry, this will do fine.&lt;/p&gt;
&lt;h3 id="userjs"&gt;user.js&lt;/h3&gt;
&lt;p&gt;For this configuration, you will need the &lt;a href="https://github.com/arkenfox/user.js"&gt;arkenfox user.js&lt;/a&gt; file in your profile. Your profile is your advanced configuration for &lt;code&gt;firefox&lt;/code&gt;. If you do not know where your profile is stored, go to &lt;em&gt;about:profiles&lt;/em&gt; in the url bar. Once you&amp;rsquo;re in that directory, fetch the user.js file:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ curl -sL &amp;#34;https://raw.githubusercontent.com/arkenfox/user.js/master/user.js&amp;#34; &amp;gt; user.js
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Read the &lt;a href="https://github.com/arkenfox/user.js/wiki/"&gt;arkenfox wiki&lt;/a&gt;, it details the important bits about the user.js file and what problems you might be faced with in the future. Personally, I&amp;rsquo;ve done everything with this user.js without any issues, what might break stuff is any further privacy configurations added to the &lt;em&gt;user.js&lt;/em&gt; file, which will be explained in a bit.&lt;/p&gt;
&lt;p&gt;Now, I append more settings to the user.js from these sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/Firefox/Privacy"&gt;Arch Linux Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sciops.net/information/technology/firefox"&gt;Sciops&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is my &lt;a href="https://crod.me/files/extra.js"&gt;extra.js&lt;/a&gt; which you can put in the original user.js. If you &lt;strong&gt;do not&lt;/strong&gt; have a router of some sort with dns blocking capabilities, uncomment the last line and change the second-to-last value to 2. This will help route your dns queries through a more trustworthy source.&lt;/p&gt;
&lt;p&gt;If the additional user.js configurations cause some mishap on your browsing, you can do without the extra.js.&lt;/p&gt;
&lt;h3 id="extensions"&gt;Extensions&lt;/h3&gt;
&lt;h4 id="ublock-origin"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/"&gt;uBlock Origin&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you could only have one extension installed to your browser, uBlock Origin would be the one. It is, as the description says, a wide-spectrum blocker.&lt;/p&gt;
&lt;p&gt;Set up your preferred &lt;a href="https://github.com/gorhill/uBlock/wiki/Blocking-mode"&gt;blocking mode&lt;/a&gt;. There are a couple of them, ranging from very easy, to hard mode. I opt for the &lt;a href="https://github.com/gorhill/uBlock/wiki/Blocking-mode:-easy-mode"&gt;&lt;em&gt;Easy&lt;/em&gt; mode&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="skip-redirect"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/skip-redirect/"&gt;Skip Redirect&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This add-on skips intermediary pages found in redirect links to go straight to the target. These type of links are solely used to track you.&lt;/p&gt;
&lt;p&gt;If you use the &lt;a href="https://web.archive.org/"&gt;web archive&lt;/a&gt;, you need to add an exception rule, which can be done so in the &lt;strong&gt;No-skip-urls-list&lt;/strong&gt; section of the extension:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;web.archive.org/
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="true-sight"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/detect-cloudflare-plus/"&gt;True Sight&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Used to find out what content delivery network (CDN) is serving your content. This is a great tool for informational purposes.&lt;/p&gt;
&lt;h4 id="vimium"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/vimium-ff/"&gt;Vimium&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Adds vim-like bindings to your browsing experience. This is one of the most minimal and functional vim keybinding add-on for &lt;code&gt;firefox&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="privacy-oriented-origin-policy"&gt;&lt;a href="https://claustromaniac.github.io/poop/"&gt;Privacy-Oriented Origin Policy&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This add-on replaces disabling Referrer Headers in the user.js allowing you to whitelist affected pages. I run it in &lt;em&gt;aggressive&lt;/em&gt; mode with rare site breakage. The &lt;a href="https://claustromaniac.github.io/poop/"&gt;P.O.O.P&lt;/a&gt; website explains it clearly, though.&lt;/p&gt;
&lt;h4 id="flagfox"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/flagfox/"&gt;Flagfox&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Another great informational add-on that shows you a flag in the url bar with the country of origin of where the server is being hosted. It can also pipe the current url to many services.&lt;/p&gt;
&lt;h4 id="localcdn"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/localcdn-fork-of-decentraleyes/"&gt;LocalCDN&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Loads CDN resources locally to speed up load times and connect to these external resources less often.&lt;/p&gt;
&lt;h4 id="play-with"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/play-with/"&gt;play-with&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;I use this add-on to pipe videos, including YouTube and audio to &lt;code&gt;mpv&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="list-feeds"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/list-feeds/"&gt;List Feeds&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Searches for RSS and Atom feeds in a page and lists them in the url icon.&lt;/p&gt;
&lt;h4 id="open-in-sci-hub"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/open-in-sci-hub/"&gt;Open in Sci-Hub&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Puts a &lt;a href="https://sci-hub.st/"&gt;Sci-Hub&lt;/a&gt; icon in the url bar when visiting paywalled academic articles to easily view it in the Sci-Hub database.&lt;/p&gt;
&lt;h3 id="openbsd-specifics"&gt;OpenBSD Specifics&lt;/h3&gt;
&lt;h4 id="unveil-directories"&gt;Unveil directories&lt;/h4&gt;
&lt;p&gt;If you are using OpenBSD, you would know that &lt;code&gt;firefox&lt;/code&gt; can only see directories in which you give it access to. To edit this website locally, I do:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# echo &amp;#34;~/content r&amp;#34; &amp;gt;&amp;gt;/etc/firefox/unveil.content
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once you restart &lt;code&gt;firefox&lt;/code&gt; you should be able to have read access to everything in the &lt;code&gt;content&lt;/code&gt; folder.&lt;/p&gt;
&lt;h4 id="unveil-software"&gt;Unveil Software&lt;/h4&gt;
&lt;p&gt;If you want to read pdf&amp;rsquo;s directly from a document viewer instead of the &lt;code&gt;firefox&lt;/code&gt; pdf viewer, you need to &lt;a href="https://why-openbsd.rocks/fact/unveil/"&gt;&lt;em&gt;unveil&lt;/em&gt;&lt;/a&gt;&lt;a href="https://man.openbsd.org/unveil.2"&gt;(2)&lt;/a&gt; the package itself, as well as making it a &amp;ldquo;default application&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;To &lt;em&gt;unveil&lt;/em&gt; your preferred document reader, do the following:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# echo &amp;#34;/usr/local/bin/zathura rx&amp;#34; &amp;gt;&amp;gt;/etc/firefox/unveil.main
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Notice the file we are writing to. It will be &lt;code&gt;unveil.main&lt;/code&gt; instead of &lt;code&gt;unveil.content&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;firefox&lt;/code&gt; is now able to read and execute &lt;code&gt;zathura&lt;/code&gt;, but it does not know it to be the pdf viewer. To make &lt;code&gt;firefox&lt;/code&gt; understand so, we do the following:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ echo &amp;#34;application/pdf; /usr/local/bin/zathura %s&amp;#34; &amp;gt;~/.mailcap
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Restart &lt;code&gt;firefox&lt;/code&gt;, go to the settings page, search for &lt;strong&gt;default applications&lt;/strong&gt;, and you can now choose the option that says &lt;strong&gt;Use system default application&lt;/strong&gt; next to the pdf section. You should now be able to open pdf docs directly from &lt;code&gt;firefox&lt;/code&gt; with a document viewer.&lt;/p&gt;
&lt;h4 id="video-conferences"&gt;Video Conferences&lt;/h4&gt;
&lt;p&gt;If this is something you must do, it can be setup quite easily. You need to permit video and audio recording down to the kernel and make your webcam usable by your user:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# sysctl kern.audio.record=1
# sysctl kern.video.record=1
# chown user /dev/video0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;chown&lt;/code&gt; bit only needs to be done once for your device. After a reboot, the only steps you would need to take are the first two commands. Also, the webcam can also be &lt;code&gt;/dev/video1&lt;/code&gt; for example.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://suckless.org/rocks/"&gt;Software that Rocks&lt;/a&gt; — Brought to you by &lt;a href="https://suckless.org/"&gt;Suckless&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@TheOpenBSDguy"&gt;The OpenBSD Guy&lt;/a&gt; — More OpenBSD guides.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://why-openbsd.rocks/fact/"&gt;Why OpenBSD Rocks&lt;/a&gt; — Stuff that rocks.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://permacomputing.net/"&gt;Permacomputing&lt;/a&gt; — Keepin&amp;rsquo; it sensible.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.k58.uk/openbsd.html"&gt;Running OpenBSD on your laptop is really hard (not)&lt;/a&gt; — It really isn&amp;rsquo;t.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>