Computers are awesome.

Software I wrote

Thoughts on software

Below is a list of software I personally think is worth checking out. I use most of the software listed down below daily. The opinions on here are entirely my own.

This page will be frequently updated. Feel free to drop an email for suggestions, corrections... (contact info in the about page)

Last updated: 2023/10/18

Table of contents


This is just a list of software I enjoy for personal or enterprise use.


[Operating Systems]

[voidlinux]

voidlinux's homepage

I wouldn't recommend it to first time Linux users, not because it's particularly hard to use, but just because some things require reading skills (i.e. you have to make partitions manually, and you'll probably need a tutorial if it's the first time), but if you have some experience with Linux or alternatively have time to read the documentation, Void is a very comfortable distro for desktop usage. I've been using the same install for four years.

The package manager, XBPS, is hybrid: you can download binaries but it's easy to compile software yourself, and this feature is very well documented on the wiki.

I'm also one of those people who really enjoy being wholly in control of their system for some reason, and Void notably uses runit as system supervisor, instead of the much more complex systemd. It's also known for supporting musl, a less-bloated alternative to glibc, though I've never used it personally.

Void was also known for shipping with LibreSSL instead of OpenSSL (remember heartbleed?), but that practice was discontinued (see here)

[FreeBSD]

FreeBSD's homepage

It's no secret that many linux users after switching to BSD never come back. This website used to on FreeBSD. I still have to explore all the features it has to offer, but so far it's been great. In this list there are quite a few programs that run on FreeBSD, such as pf and bastille. The package manager is hybrid: you can either use ports and build your own packages or download binaries directly.

Apparenly in the BSD world compiling software is much more commonplace than on linux: most FreeBSD related tutorial will show both ways to install applications (pkg install thing or use ports). Despite this, I've never used ports myself because the package repository always contained anything I need.

It's also widely known and rumored that the network stack on FreeBSD is generally better than Linux's. pf, for instance, is very powerful and simple to use, and offers built-in jail2ban-like functionality. Containers on FreeBSD, namely jails, are very pleasant to use. I use Bastille to handle my jails, which despite being relatively new software works like a charm and is straightforward to use, ever for a FreeBSD beginner.

FreeBSD has a much smaller codebase than Linux. The Linux kernel alone had more than 27 million lines of code in 2020, partly thanks to SELinux, AppArmour, and other complex kernel modules developed to solve the exact same problem (containers). On the other hand, BSD tends to have less and less lines of code thanks to aggressive pruning. FreeBSD (not just the kernel, the entire OS) is 16 million lines of code. DragonFlyBSD, a fork of FreeBSD, has about 9 million lines of code. (Data taken from openhub, as 2022). Less code means more maintainable.

Recently FreeBSD added support for OCI container images, bridging a significant gap with Linux.


[Window Managers]

[Sway]

Sway's homepage

Sway is a tiling window manager meant to be used as a drop-in replacement for i3. The config file supports the same syntax, and if you're an i3 user thinking of switching to wayland you can just use your good old i3 config.

There's not much more to say: it's a wm and thus very minimalistic, you're pretty much in charge of everything else.

Sway rarely gets in the way of productivity. I find myself switching workspaces much faster on sway, even if I also had a similar setup on my old KDE install.


[Terminal Emulators]

[Kitty]

Kitty's homepage

Kitty is a GPU accelerated terminal emulator. It's fast, and it has a focus on shortcuts for keyboard-only users, and folks that enjoy living in their terminal. Kitty is also famous for having its own protocol to display images on the terminal. Thanks to kitty I have implemented image previews inside of fzf, which is pretty cool. You start to miss thumbnails after a while.


[Terminal Applications]

[Neovim]

Neovim's homepage

Neovim is a very extensible and powerful text editor. You can use it as a full fledged IDE (I do).

If you know to use vim, then you can skip this section. If you don't know how to use vim, learn it. Neovim supports vimscript entirely for retrocompatibility, but plugins are usually written in Lua.

The power of a infinitely customizable, terminal based text editor are not to be underestimated. I did not want to learn vim, but after using it for a while there is no turning back.

I try to use the vim keybindings in every application I use, firefox included, and I feel like they give less carpal tunnel syndrome than emacs style keybindings.

[Fish]

Fish's homepage

Fish is a shell which focuses on being user friendly. I really miss Fish when I'm not using it. You should just check it out, or read the features from their website.

[z]

z's homepage

z is a command line utility to quickly jump around your most frequently visited folders.

Right after you install it, z is completely useless. But after moving around in a few directories, z will keep note of them, and then you'll be able to jump back inside instantly by typing z keyword, where keyword is any part of the directory you're trying to move to.

For instance. if I type z down, z will take me to the Downloads folder: it's a folder I open very frequently and it has the word down in it. Z does fuzzy-matching.

It doesn't sound too spectacular, but nowadays I really rely heavily on z. It feels a bit like magic: I can type z proj faster than I can think "Oh, I need to go in the project folder right now..."

I really suggest trying it out. If you use Fish, here's the fish plugin I use. On zsh, I use xozide There are many z implementations out there.

[fzf]

fzf's homepage

In the same vein as z, which can be thought as a "fuzzy-cd", fzf is a fuzzy everything. Check the webpage for some examples. It's another one of those programs that radically changed the way I use the terminal.

Besides just finding files, fzf can be used to browse all the current environment variables and the command history too.

Another unorthodox way I use fzf is to preview files right off the terminal. Sometimes I just don't remember where some piece of code is, and I quickly call fzf to peek inside files.

If Fish is your shell, here's the fish plugin. There are also many fzf implementations, and since this article has been first written fzf is now integrated in a bunch of neovim distributions, emacs configs, and probably some other terminal tool.

[Bat]

Bat's homepage

Bat is a fancier version of cat. That's basically it. It has syntax highlighting, git integration, and a few other fancy features.

By default it also works as a pager when the file is too big to fit inside one screen, but I personally disabled that. I use it when I want to peek inside a file, but also want to see syntax highlighted. Not really a life changing tool, but very nice overall.

[ripgrep]

ripgrep's homepage

Ripgrep is just like grep, but recursive, and insanely fast. It also comes with some sane defaults, such as ignoring .gitignore and binary files. Quoting ripgrep's githup page,

In other words, use ripgrep if you like speed, filtering by default, fewer bugs and Unicode support.

It's also worth nothing that the author of Ripgrep is pretty good at searching text.

Ripgrep is also very useful in the real-world scenario of full text search in a codebase, you can rg <id> and find all occurrences in a snap.


[Programming languages]

[Haskell]

Haskell's homepage

Haskell is a purely functional programming language.

"Pure" in this context roughly means that there is no state and no variables: the behaviour of a function call solely depends on its (immutable) arguments. This has a bunch of benefits, going from not having to keep track of state in your head to allowing GHC to perform very aggressive optimizations (sometimes), but the list goes on.

Haskell is also a very good language for building eDSL, namely embedded domain-specific languages, which you can think as small languages within Haskell. This topic deserves its own post, but regardless, this allows for a lot of flexibility in the ways Haskell can be used. If that's not enough there's also a meta-programming system called template Haskell, which is fully type-checked.

Even if you're never going to write Haskell in production, Haskell proponents argue that learning Haskell will make you a better coder.

[Rust]

Rust's homepage

Rust is another language I use mostly because of the safety guarantees it offers: a safety system called "borrow checker" ensures that, despite not having a garbage collector, memory is automatically freed and no double free, use after free, and other memory errors can ever take place. The type system is strong enough to even prevent certain bugs in concurrent program (Send and Sync traits).

The Rust ecosystem isn't perfect, but there are some incredible libraries out there, and it's surely growing fast. Rust also has macros, which can help when Rust alone isn't enough, and sometime allow libraries to expose nice APIs to users (call this macro, which magically generates the appropriate Rust code for you).

Rust is also gaining an enormous traction, probably solely due to the virtue of being suitable for "systems programming" and having proper tooling, which makes it very appealing even if you don't care about safety. Many companies are embracing Rust and a lot of infrastructure is being built using the language.

top↑ end↓