This is a similar post to Rebuilding my MacBook, but this time I’ll keep track of how I’ve installed Fedora Sway on my T480s. I was running Pop!_OS before and although pretty much everything worked out of the box, I decided to complicate my life a little bit more in the name of science and “fuckraroundery”. I chose Fedora mainly out of nostalgia. If memory serves me well, Fedora Core 2 was the distro I was taught on during my Telecom diploma circa 2004. It was the first time I ever used Linux and I had no idea what I was doing. I guess that hasn’t changed… but I’m working on it!
I’m not sure going the atomic route was the right call, as it introduces other layers of complexity. But so far I’m happy, and I’ve particularly enjoyed the workflow Sway provides, even if it comes out of the box with a very minimalistic configuration. I’m basically on my own trying to make things work. Fun!
I’ll keep this post as a living document and update it as things change.
Adding packages to the base#
This is the first time I’ve run an atomic OS, so I’m not too familiar with how things should be set up. The way I understand it is that the base system should be kept as clean as possible, with everything managed via Flatpaks for GUI apps or Toolbox for CLI tools. So I decided to install Alacrity (my terminal of choice for now) along with tmux, C compilers and the tools needed to install Mullvad and Brew, which apparently doesn’t mess up much with the “atomic way of doing things”.
rpm-ostree install gcc gcc-c++ glibc-langpack-en tmux alacrittyMullvad#
Mullvad installation is a bit more finicky, the repo needs to be added manually and the app needs to be run as a daemon after installation.
sudo -s
cd /etc/yum.repos.d/
wget https://repository.mullvad.net/rpm/stable/mullvad.repo
rpm-ostree install mullvad-vpn
systemctl reboot
systemctl enable --now mullvad-daemonBrew#
Brew can then be installed by fetching it:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"adding the environment variables to the shell configuration:
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bash_profile
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"GNU Stow#
GNU Stow can then be installed via brew.
❯ brew install stow
✔︎ JSON API formula.jws.json Downloaded 32.8MB/ 32.8MB
✔︎ JSON API cask.jws.json Downloaded 16.8MB/ 16.8MBMake the shell look prettier#
Sway is very minimalistic out of the box. Going down the rabbit hole of ricing and making things look better is an odyssey in itself. After a quick research session, I decided to go with Starship, Iosevka fonts, and Gruvbox material colour theme.
Configure nerd fonts#
mkdir -p ~/.local/share/fonts
curl -s 'https://api.github.com/repos/be5invis/Iosevka/releases/latest' | jq -r ".assets[] | .browser_download_url" | grep PkgTTC-Iosevka | xargs -n 1 curl -L -O --fail --silent --show-error
unzip PkgTTC-Iosevka-34.6.1.zip -d ~/.local/share/fonts
sudo fc-cacheOr I guess one can just install them using brew
brew install --cask font-iosevka-nerd-fontInstall theme for alacritty#
In search of a more earthy tone, I changed my color scheme to Gruvbox Material, which has been very pleasant on the eyes in both dark and light versions.
# We use Alacritty's default Linux config directory as our storage location here.
mkdir -p ~/.config/alacritty/themes
git clone https://github.com/alacritty/alacritty-theme ~/.config/alacritty/themesThe theme has to be added to Alacritty’s config file ~/.config/alacritty/.config
[general]
import = [
"~/.config/alacritty/themes/themes/gruvbox_material.toml"]
[env]
TERM = "xterm-256color"
[window]
padding.x = 10
padding.y = 10
decorations = "none"
opacity = 0.8
blur = true
option_as_alt = "Both"
[font]
size = 14.0
[font.bold]
family = "Iosevka Nerd Font"
style = "Bold"
[font.bold_italic]
family = "Iosevka Nerd Font"
style = "Bold Italic"
[font.italic]
family = "Iosevka Nerd Font"
style = "Italic"
[font.normal]
family = "Iosevka Nerd Font"
style = "Regular"Starship#
Minimalistic shell prompt written in Rust!
curl -sS https://starship.rs/install.sh | sh
# ~/.bashrc
eval "$(starship init bash)"mise-en-place#
Mise-en-Place is used for dev environment version control. So far I’ve used it to install bash autocompletion and LazyVim.
curl https://mise.run | sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10390 100 10390 0 0 21841 0 --:--:-- --:--:-- --:--:-- 21873
mise: installing mise...
######################################################################## 100.0%
mise: run `mise doctor` to verify this is set up correctly
~/.local/bin/mise --version
_ __
____ ___ (_)_______ ___ ____ ____ / /___ _________
/ __ `__ \/ / ___/ _ \______/ _ \/ __ \______/ __ \/ / __ `/ ___/ _ \
/ / / / / / (__ ) __/_____/ __/ / / /_____/ /_/ / / /_/ / /__/ __/
/_/ /_/ /_/_/____/\___/ \___/_/ /_/ / .___/_/\__,_/\___/\___/
/_/ by @jdx
2026.2.22 linux-x64 (2026-02-27)
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
source ~/.bashrcBash autocompletion#
mise completion bash --include-bash-completion-lib
echo 'eval "$(mise completion bash --include-bash-completion-lib)"' >> ~/.bashrcLazyvim#
mise use -g neovim@nightly
mise use -g git
mise use -g ripgrep
mise use -g fd
mise use -g lazygit # Optional: for built-in lazygit support
mise use -g nodejs # Recommended: for Copilot and other plugins
git clone https://github.com/LazyVim/starter ~/.config/nvimBat#
Cat files in a fancy way!!
mise use --global bat@latestNow that everything looks pretty we can start configuring and ricing
Sway config (WIP)#
output eDP-1 mode 3840x2160@60Hz scale 2
output *allow_tearing yes
output* max_render_time off
Move windows to monitor when lid is closed.
bindswitch lid:on output eDP-1 disable
bindswitch lid:off output eDP-1 enable
# Start Thunar file manager
bindsym Mod4+p exec thunarWaybar (WIP)#
Flatpak#
GUI apps are installed via Flatpak.
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepoObsidian#
flatpak install flathub md.obsidian.ObsidianSolaar#
I use Solaar to configure my logitech MX mouse and personalize gestures
flatpak install flathub io.github.pwr_solaar.solaar
sudo vi /etc/udev/rules.d/42-logitech-unify-permissions.rules# This rule was added by Solaar.
#
# Allows non-root users to have raw access to Logitech devices.
# Allowing users to write to the device is potentially dangerous
# because they could perform firmware updates.
KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess", OPTIONS+="static_node=uinput"
ACTION == "remove", GOTO="solaar_end"
SUBSYSTEM != "hidraw", GOTO="solaar_end"
# USB-connected Logitech receivers and devices
ATTRS{idVendor}=="046d", GOTO="solaar_apply"
# Lenovo nano receiver
ATTRS{idVendor}=="17ef", ATTRS{idProduct}=="6042", GOTO="solaar_apply"
# Bluetooth-connected Logitech devices
KERNELS == "0005:046D:*", GOTO="solaar_apply"
GOTO="solaar_end"
LABEL="solaar_apply"
# Allow any seated user to access the receiver.
# uaccess: modern ACL-enabled udev
TAG+="uaccess"
# Grant members of the "plugdev" group access to receiver (useful for SSH users)
#MODE="0660", GROUP="plugdev"
LABEL="solaar_end"
# vim: ft=udevrulesAdd your user to the plugdev group so it can manage connected peripherals.
sudo groupadd plugdev
sudo usermod -a -G plugdev $USER
groups $USER
sudo udevadm control --reload-rulesNow the mouse should show up in the device list and gestures can be configured.
If natural scrolling is all you need to configure, you can just update sway config file with this which may be way simpler
input "<device_identifier>" {
natural_scroll enabled
}Things to work on#
- Stow the damn dot files!
- Make the fingerprint reader work
- Configure noise alerts when the battery is below 25% and 10%
