Void Linux Setup and Why I Moved On


My laptop is a Lenovo IdeaPad 120S with only 2GB of RAM — not exactly a powerhouse. NixOS was out of the question, so I turned to Void Linux, a minimal and fast distribution that felt right at home on constrained hardware.

Here’s how I set it up from scratch, and why I eventually moved on.

Installation

Installation was straightforward — I just followed the official Void Linux guide. After booting in, the first thing to do is a full system update:

sudo xbps-install -Su

Window Manager

I went with i3 as my tiling window manager, along with Rofi as a launcher and i3lock for the lock screen:

sudo xbps-install -Sy i3 i3lock rofi

Editors

sudo xbps-install -Sy neovim kakoune helix neovide

Shell

I use Fish as my default shell:

sudo xbps-install -Sy fish-shell

# Find the fish binary location
which fish

# Check available shells
cat /etc/shells

# Set fish as the default
chsh -s /usr/bin/fish

Git and SSH

git config --global user.name "Nekomangini"
git config --global user.email "nekomangini.dev@gmail.com"
git config --list

Setting up SSH for GitHub:

# Check for an existing key
ls -al ~/.ssh/id_ed25519.pub

# Generate a new one if needed
ssh-keygen -t ed25519 -C "nekomangini.dev@gmail.com"

# Start the SSH agent
eval (ssh-agent -c)

# Add the key
ssh-add ~/.ssh/id_ed25519

Then copy the output of cat ~/.ssh/id_ed25519.pub and add it under GitHub Settings → SSH and GPG Keys → New SSH Key.

Terminal Utilities

sudo xbps-install -Sy fzf zoxide eza fastfetch htop jq curl wget yazi lazygit cmake

zoxide — add this to ~/.config/fish/config.fish:

zoxide init fish | source

yazi — install its dependencies first:

sudo xbps-install -Sy ffmpeg 7zip jq poppler fd ripgrep fzf zoxide resvg ImageMagick xclip

Then create ~/.config/fish/functions/y.fish for the directory-switching wrapper:

function y
    set tmp (mktemp -t "yazi-cwd.XXXXXX")
    command yazi $argv --cwd-file="$tmp"
    if read -z cwd < "$tmp"; and [ "$cwd" != "$PWD" ]; and test -d "$cwd"
        builtin cd -- "$cwd"
    end
    rm -f -- "$tmp"
end

Emacs (Doom)

Install the dependencies:

sudo xbps-install -Sy ripgrep fd

Install the Symbola font (required by Doom):

sudo xbps-install -Sy unzip
mkdir -p ~/.local/share/fonts
cp ~/Downloads/symbola.zip ~/.local/share/fonts
cd ~/.local/share/fonts && unzip symbola.zip
fc-cache -fv

For Markdown and Bash support:

sudo xbps-install -Sy shellcheck pandoc shfmt bash-language-server

Clone and install Doom:

git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
~/.config/emacs/bin/doom install

Add Doom to your Fish path in ~/.config/fish/config.fish:

fish_add_path ~/.config/emacs/bin

Running Emacs as a daemon via runit:

sudo mkdir -p /etc/sv/emacs-daemon
sudo nano /etc/sv/emacs-daemon/run

Paste this into the run script:

#!/bin/sh
export HOME=/home/void-nekomangini
cd $HOME
exec chpst -u void-nekomangini:void-nekomangini /usr/bin/emacs --fg-daemon=void-nekomangini-emacsd 2>&1
sudo chmod +x /etc/sv/emacs-daemon/run

# Prevent auto-start before testing
sudo touch /etc/sv/emacs-daemon/down
sudo ln -s /etc/sv/emacs-daemon /var/service/

# Test it
sudo sv once emacs-daemon
sudo sv status emacs-daemon

# If it works, enable permanently
sudo rm /etc/sv/emacs-daemon/down

Add to your i3 keybinds:

bindsym $mod+e exec emacsclient --socket-name=void-nekomangini-emacsd -c -n

Programming Languages

sudo xbps-install -Sy go nodejs-lts lua rakudo
npm i -g @vue/language-server typescript

Go tools:

go install golang.org/x/tools/gopls@latest
go install github.com/go-delve/delve/cmd/dlv@latest
go install golang.org/x/tools/cmd/goimports@latest
go install mvdan.cc/gofumpt@latest
go install github.com/fatih/gomodifytags@latest
go install github.com/cweill/gotests/gotests@latest
go install github.com/x-motemen/gore/cmd/gore@latest
go install github.com/mdempsky/gocode@latest

fish_add_path ~/go/bin

Web LSP and tooling:

npm i -g typescript typescript-language-server @vue/language-server \
  vscode-langservers-extracted @astrojs/language-server \
  prettier js-beautify eslint stylelint stylelint-config-standard emmet-ls

sudo xbps-install -Sy tidy5

Why I Moved On

Void Linux worked well, but maintaining two separate sets of dotfiles — one for Void Linux and one for my NixOS desktop — was becoming a chore. That changed when I finally learned how to run Home Manager standalone on a non-NixOS system. Once I knew that was possible, I switched to Omarchy, an opinionated Arch-based distribution, and moved my laptop config entirely under Home Manager.

Now a single Home Manager configuration covers both my desktop (sylphiette, running NixOS) and my laptop (roxy, running Omarchy). No more drift, no more duplication.

In a future post, I’ll walk through exactly how I set up standalone Home Manager on Omarchy — including how I structure the config so it stays in sync with my NixOS flake.


Check out my full configuration in my nix-server dotfiles repo.

Support my Journey

If you enjoyed this post and want to support my descent into Linux madness, you can find me here:

If you found this helpful, consider supporting my work.