my computer setup

2023/05/31 by huck boles

os

i use gentoo on almost all of my devices currently (i have one debian server/media center), i can’t say that i’ll use it forever, but i am currently extremely happy with it. i previously used arch, which remains my distro of choice if i need to get something working quick.

the main reason i stick with gentoo is the customizability, especially USE flags. it really cuts down on cruft and distractions for things that i don’t need or even have the ability to use. i don’t see why i need or want bluetooth support in any of the programs running on my desktop, which doesn’t even have any ability to connect if i wanted to.

that’s just one thing that makes portage so amazing. another of my favorites is the ability to have testing flags on single packages, while keeping the base system stable. this gives you bleeding edge releases for packages that you need, without the inherent instability that can result from using them system wide.

portage’s packages also have very few changes from upstream sources. this is nice for a variety of reasons, but my favorite is how well everything works with just default settings. this leads to a much more stable and navigable system in my experience. i don’t end up with extra directories deep in random places, and can easily find a file i’m looking by consulting the man page or documentation, rather than needing to go to a distro wiki.

overall i prefer my os to stay out of the way as much as possible, and gentoo is the best i’ve found for that. i enjoy the simplicity and scriptability that gentoo provides, as it lets me set and forget things without much worry.

window manager

i use i3 with no decorations, and pretty extensive hotkey customizations. any program i use at least daily has a hotkey assigned to it. i customize all of my environments hotkeys to be as close as possible to one another, except for the leader/combination key. for example my window manager shortcuts all happen in combination with the SUPER key, all of my tmux bindings have a CTL + SPACE leader, and my vim leader key is set to SPACE. this lets me control each level of my environment with the exact same controls, i use hjkl to focus, and HJKL to move windows and panes in all my programs, just with a different leader key. this lets muscle memory take over everywhere i work, but keep contexts separate.

a typical view of my desktop

for gui apps that i don’t use often i have a dmenu application launcher that i can call with a hotkey. i don’t have any files or icons on a my desktop, and basically use it like an easily toggleable low security screensaver.

i don’t use a compositor, as i love how snappy i3 is all by itself, and dislike window stacking. i find transparency distracting, and rounded corners and gaps eat up a lot of extra space that i’d prefer to use. i don’t use borders or title panes on my windows, and have a very small polybar setup running at the bottom of my screen that displays some useful info about my system and windows open. i make heavy use of virtual desktops, generally having around 5-7 open at a time, each one dedicated to a separate task.

terminal

recently i’ve been trying alacritty, after using st as my main terminal for a long time. so far i really like the yaml config with live reloading, and alacritty seems to start up about equally fast as st (i have not done any benchmarks). i’ve noticed alacritty typically takes up more ram per instance, but it’s a negligible amount (3-5MB) that doesn’t impact performance. alacritty’s font handling is also extremely clear and crisp, and was the main reason i initially started looking for a replacement for st. i slightly miss the ability to use ligatures, but everything else is always perfectly proportioned and aligned, so i’m willing to give up some eye candy for that.

shell

i use zsh for an interactive shell, but do any shell scripting in bash i’m a really big fan of the completion system in zsh, and always find myself disappointed at the tab completion in other shells.

my zsh prompt

i don’t use a plugin manager, and just have a file that clones the few external repositories i use if they don’t already exist. i have a relatively small .zshrc that calls a bunch of scripts from an include folder for a more modularized setup.

zshmux is a script i wrote that runs whenever i open a new shell to check for running tmux sessions. i can then connect to one, make a new session, or drop into a bare shell depending on what i need to do.

opening a new shell

i have a tmux server running continuously on all of my machines, both for persistent environments across sessions, as well as multiplexing/window splitting and scrollback. any project or self-contained task gets it’s own tmux session, allowing me to leave a project at any time, while still keeping the context and history available for picking back up in the future. a session on my computer can run anywhere from a few minutes to indefinitely, depending on what it’s used for. i use tmux-resurrect to keep sessions alive across reboots, letting me keep that context for as long as i need it.

editor

i use neovim, a fork of vim for all of my text editing needs. it’s extremely fast, both computationally, and for actually writing code. there’s no perceptable lag between keypresses, even on extremely underpowered computers, which really helps me keep up my flow while typing. it also really speeds up the editing process itself, as the combition of motions and text objects alone is overwhelmingly powerful.

neovim is also extremely customizable. my config tends towards minimalist at first glance, but everything i need is available using hotkeys. i don’t use a filetree plugin, instead relying on fuzzy finding with telescope, or tab completion in ex mode.

opening a new nvim session

any heavier filesystem work gets done in a tmux split, or using toggleterm if it’s quick.

i’ve mapped <SPACE> as my leader key, and i’ve remapped <CAPS_LOCK> to <ESC> on a system level, giving me a much more comfortable experience that let’s me stay on the home row more. i’ve also remapped window movements to use <CTL> + hjkl, and use tmux-vim-navigator to move seamlessly between neovim and tmux splits.

a typical nvim session

a big reason i use neovim over vim is the LSP and treesitter integration, which you can see in effect in the screenshot above. i really enjoy the ability to jump around between areas of the project with out opening the file browser, just <CTL-[> and you’re at the definition.

at this point i reflexively use vim motions whenever i’m typing, littering my documents and emails with ‘:w’ and ‘ZZ’. but i think this is a small price to pay for the massive advantage these motions give you when writing and editing.

web browser

for accessing the internet i mainly use firefox, with a customized userChrome.css and quite a few extensions.

the most important extension i use in my setup is tree-style-tabs which gives you a nesting vertical sidebar for your tabs. it allows you to fit way more tabs on a single screen, and gives much better organization due to the nesting and collapsibility of tab trees.

in combination with tree-style-tabs, i modified my userChrome.css to dynamically, hide the sidebar and address bar unless i mouse over them. this lets me browse the web without any browser decorations, but still have access to them at a moments notice.

another extension i use heavily is multi-account-containers, which lets me isolate webpages into their own separate ‘accounts’. this allows separation between multiple contexts, and gives me contextual account credentials and cookies. for example, accessing my email provider in my work container opens my work email, while doing the same in a personal container opens my personal email. i can have these open right next to each other, and switch between them without logging in and out, or needing two separate browsers.

extras

color scheme

i use a theme called X::DotShare by crshd that i found here. you can see it use in any screenshots with a terminal. i enjoy a color scheme that has highly distinctive colors, and this satisfies that, while simultaneously being easy on my eyes.

in addition, i use dark reader in firefox to force dark mode on any website i visit. in combination with redshift, this helps a lot with eye strain.

font

i use a customized version of iosevka, with changes mainly focused on the ability to quickly and accurately distinguish similar glyphs at a glance.

personlized iosevka

music

i have music playing at all times, unless i’m doing something that requires me to listen intently or record something. i mainly use cmus running in a tmux session on the device connected to my speakers, as i can control my music from any device i can ssh from for ad-hoc wireless control. cmus reads from a nfs directory on one of my servers, which also hosts a private airsonic instance that lets me listen to my music when i’m away from home.

monitoring

i monitor my devices using a split screen of htop and btop++, to watch processes and performance respectively.

monitoring setup

all of my computers have a tmux session with this setup running in the background so i can easily check on performance at a glance or kill a misbehaving program over ssh.

i also maintain a personal log server that all of my devices sync their logs with for long term storage, with a pretty aggressive log rotation on each device to minimize space while still collecting detailed logs.

end

these are the things that i use the most in my day to day computer usage. i really try to streamline every process that i use often, and i feel my desktop setup shows that. i plan to write more in depth on each piece in the future, with deeper explorations around the environments for each program.