Seirdy's dotfiles

371a77e Neomutt: fix sandboxed HTML preview

~seirdy pushed to ~seirdy/dotfiles git

18 days ago

dc11add CFLAGS: -fPIE and -fPIC, fix bad clang flags

~seirdy pushed to ~seirdy/dotfiles git

20 days ago


sourcehut GitLabmirror GitHubmirror

It's my dotfiles! This is me.

These dotfiles are managed using yadm and are primarily intended for Fedora. To install, simply clone the repo into $HOME and run the bootstrap scripts in Executables/shell-scripts/bootstrap. The scripts for building packages might max out your CPU all night, so be prepared.

This has been evolving since I was 14, yet nothing here lives that long before being rewritten.

My scripts generally have the #!/usr/bin/env dash shebang, but the syntax is all POSIX sh compatible.

screenshot of my tiling terminal music setup

#Bleeding edge

I like to be on the bleeding edge of programs I use often, but with a stable OS running underneath them. I worked out the following solution:

If I use a program that runs in the terminal very often, I'll likely build it from source and update to the latest git commit. Git repositories get cloned using ghq. This way, if a program has a bug or is missing a feature I want, I already have the latest snapshot of the repository cloned locally on my machine so I can better understand the issue, report the bug, and/or push a patch upstream. My update-all script runs these updates.

C/C++ programs get compiled with the -march=native flags, among others. Most packages are also compiled using link-time optimization. Rust packages containing C/C++ code use Clang instead of GCC.

I generally compile programs on my desktop and rsync them to my laptop.

#Mah stuff

Pretty much all my programs run in the terminal. Exceptions include my web browser (if I can't avoid it), image viewer (imv), and media player (mpv)). If I'm not browsing heavy websites or playing high-res video, this setup is lightweight enough to use comfortably on a cheap single-board computer like the Raspberry Pi.

Stuff labeled with * is built from source from the latest git commit.


  • WM: Sway*. Associated utilities are also built from source (e.g. swaybg*, swayidle*, grim*, and slurp*)
  • Terminal emulator: Foot* (Wayland) or st* (X11)
  • Terminal session manager: tmux*
  • News reader: Newsboat*
  • Mail client: aerc*, mbsync, and notmuch
  • $EDITOR: Neovim*
  • Launcher: custom (runs in a floating terminal window)
  • File manager: nnn*
  • Image viewer: imv*
  • IRC and Matrix: WeeChat* and weechat-matrix*, respectively. I prefer IRC.
  • Web browser: Firefox Nightly with Tridactyl, uMatrix, uBlock Origin, and others to make browsing slightly more tolerable.
  • Gopher/Gemini browser: bombadillo*


I use Neovim's built-in Tree-sitter implementation and Language Server Protocol (LSP) client along with the official nvim-lsp plugin containing pre-made configs for popular language servers. Settings are split between an init.vim and Lua files. Over time, I'll migrate more configs from Vim script to Lua.


  • shell (non-interactive): dash* for its ridiculously fast startup speed and minimal extensions over the POSIX spec. Statically-linked.
  • shell (interactive): custom static build of zsh* inside tmux*. By using a static binary with full link-time optimization that only sources user config files, my shell initialization time for the interactive prompt was cut in half.
  • plugin manager: zinit* loads plugins conditionally and asynchronously in the background to avoid slowing down startup time.
  • prompt: powerlevel10k* with instant-prompt mode displays a cached prompt while the git status/return status are still loading.


I have an MPD-based music setup; this README includes a screenshot of it near the top.

I've written several scripts to control MPD and build playlists. My setup depends heavily upon rating tracks on a scale of 1-10 in the MPD sticker database.

  • Backend: MPD
  • Frontend: clerk* + ncmpcpp*. I've been contemplating switching to ncmpc since I don't really use any of ncmpcpp's special features.
  • CLI control: mpc* + Playerctl*.
  • Visualizer: cli-visualizer*, cava* and/or projectM* depending on my mood.
  • Playlist dynamizer: cantata-dynamic* builds playlists up to a defined size according to rules. It automatically removes and adds tracks after they are played. I don't use cantata; I just use that Perl script.
  • MPRIS 2 gateway: mpd-mpris. Allows media keys to control mpd via Playerctl, and integrates with other MPRIS-aware software.
  • Album art viewer + notifier: personal fork of kunst*. My fork works with imv and displays notifications; I might re-name the project and spin it off into something of its own.


  • Player: mpv*, built with VapourSynth support using mpv-build. FFmpeg, dav1d, and libass are also built from master and statically linked with mpv. libaom, libvpx, libplacebo, and some others are built from master and dynamically linked in.
  • Upscaling filter: Anime4k* or RAVU, among others
  • MPRIS bridge: mpv-mpris*
  • Other scripts: blur-edges.lua, autocrop.lua