This page documents, in a spirit of sharing known recipes, my current and older desktop setups. You can also read a narrative of the history behind all this an more in history.

  1. Current setup
    1. Window manager: i3
    2. Web browser: Firefox
    3. Emails: notmuch
    4. News: feed2exec
    5. Editor: emacs or vim
    6. Backups: borg
    7. Color theme: solarized
    8. Other apps
  2. The GNOME exception
  3. Older setups

Current setup

Window manager: i3

I have switched from xmonad to i3. I (again) don't quite remember why: but I probably got tired of battling Haskell configuration files. In comparison, i3 is much easier to configure and closer to what I had with awesome all the way back then.

One nice thing with i3 is the way it handles external monitors: they're just other workspaces.

You can review my i3 configuration here.

I was first using the built-in i3status bar, but eventually switched to taffybar because it had a lot of cool fancy stuff like historic graphs for the CPU. But taffybar is difficult to maintain in Debian and has weird bugs, like the scaling and background of the notification area. The styling of the windows list was also especially troublesome to figure out.

So I eventually gave up on taffybar and gave py3status a shot. The results are pretty cool, althoguh it doesn't have historical graphs and probably never will, because of a limitation in i3status. Performance benchmarks seem to show that py3status and i3status (when used together) use sligthly more resources than taffybar, for what it's worth.

I have high hopes in polybar but it is not packaged in Debian yet. Update: it's now in NEW and might just be the right thing.

It looks like it's the fastest of all three in terms of CPU usage although it uses slightly more memory than py3status/i3status:

anarcat@curie:bin(master)$ date
lundi 2 mars 2020, 16:29:17 (UTC-0500)
anarcat@curie:bin(master)$ ps axfu | grep -e polybar -e status -e CPU -e taffybar
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
anarcat   4685  0.6  0.5 1074556760 90908 pts/4 Sl  16:09   0:08          \_ /home/anarcat/.cache/taffybar/taffybar-linux-x86_64 +RTS -I0 -V0 --RTS --dyre-master-binary=/usr/bin/taffybar
anarcat   4686  0.5  0.1 1267248 30804 pts/4   Sl   16:09   0:06          \_ polybar example
anarcat  24629  0.0  0.0   6032   888 pts/4    S+   16:29   0:00          \_ grep -e polybar -e status -e CPU -e taffybar
anarcat   4658  0.0  0.0   2388   756 ?        S    16:09   0:00      \_ /bin/sh -c py3status
anarcat   4659  1.1  0.1 552932 26964 ?        Sl   16:09   0:13          \_ py3status
anarcat   4664  0.0  0.0 374532  6296 ?        Sl   16:09   0:00              \_ /usr/bin/i3status -c /tmp/py3status_vs2xhih_
anarcat@curie:bin(master)$

Web browser: Firefox

I always have a web browser opened, so that is a key tool for me since, unfortunately, everything seems to be moving inside a browser window... After using chromium for a few years, I am now back to using Firefox, see the firefox page for more details.

Emails: notmuch

Boy oh boy that one is crazy. Not enough space for this here, but let's just say I have piles of lisp code that allow me to have 83k mails in my inbox and not notice, which makes the sysadmin in me quite angry.

I have improved on that setup and documented it in 2016-05-12-email-setup.

News: feed2exec

I tried Liferea and Tiny Tiny RSS, both would take up too much resources - how hard can RSS be really?? Unbelievable. I ended up using a simple feed2imap cron job (@hourly nice feed2imap). The ?configuration is fairly simple, and I imported an old OPML feed I had lying around from Liferea.

Eventually, however, feed2imap wasn't enough: I wanted to do more things on the RSS feeds I use, like checking for broken links on my new posts or archiving them automatically to the Internet Archive. So I ended up writing my own RSS feed reader, feed2exec.

Editor: emacs or vim

I am not a religious zealot, except when it's about fighting religion. Therefore, I use vim for quick edits on server, but Emacs for everything else. I have a long history of emacs programming that I have only begun to document in emacs. See also the Emacs wiki.

My Emacs configuration files are in this git repository.

Backups: borg

I used to have a custom script to do a rsync to a crypted drive regularly - but it was not that regular, and i was worried about not having an incremental history.

I started to work on using Bup and ended up writing a whole wrapper around it named bup-cron. Then I found out about attic, tried to help, which ended up creating a fork called borg which ended up being used by everyone and more active, so I'm using that now.

I contributed to borg for a while (see borg for reports) as well.

I also considered Obnam but it seems it doesn't scale so well.

See backup for details on backups.

Color theme: solarized

That is just crazy - I started using Solarized, mostly because it makes by desktop usable in plain daylight. But it's a huge pain in the butt. I wonder if I shouldn't go back to my regular color theme and just use redshift instead. Quite confusing that thing. If you are in montreal, this is the magic formula: redshift -l 45.5:-73.7.

Other apps

My session also automatically starts a few more tools, through .xsession which also loads a host-specific .xsession-$(hostname) file to allow per-host customizations.

Here are the other tools that are generally running in my session:

The GNOME exception

When I don't want to feel like an exotic little snowflake that spends hours needlessly configuring his desktop environment, I go back to the default, which is usually GNOME. I work with the following configuration:

I still have to figure out how to enable the nice shortcuts I have in my normal setup. In particular, I should bind the same keybindings to rofi. I found the keyboard navigation manual very useful to get familiar with the platform.

Finally, a big blocker is how to configure GPG agent so that it properly talks with my Yubikey, otherwise I can't talk to any SSH server. So far I figured out how to disable GNOME Keyring by doing this:

( cat /etc/xdg/autostart/gnome-keyring-ssh.desktop ; echo Hidden=true ) > ~/.config/autostart/gnome-keyring-ssh.desktop

It disables the gnome-keyring startup routine. Then GPG-agent starts supervised, but doesn't show up in the environment, so we fail. Apparently, the following shell snippet is supposed to fix that problem:

# Needed for GPG2 to bridge with ssh-agent
#export SSH_AUTH_SOCK=/run/user/1000/gnupg/S.gpg-agent.ssh
#unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
    export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi

export GPG_TTY="$(tty)"

# So annoying to need to do this every time
gpg-connect-agent updatestartuptty /bye > /dev/null

This is all so weird and broken and confusing that I found about ten different guides trying to tell people how to do this kind of stuff:

Older setups

Created . Edited .