Seirdy's dotfiles
Update spellfile
Switch mail to new maildir after prev one exploded
Mako: persist most notifications


browse  log 



You can also use your local clone with git send-email.


sourcehut GitLabmirror GitHubmirror Codeberg mirror

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