< the skull

AMON: HOW I MADE FEDORA FEEL RIGHT ON THE MSI PULSE 16 AI
=========================================================
2026-06-30

I wiped the notebook and installed Fedora KDE because I wanted a fast, clean and
current machine. The idea was not to turn the installation into an eternal lab
project. I wanted it ready for work, writing, coding, server access, IRC, cloud
storage and full use of the hardware without fighting drivers all day.

The machine was named Amon. The goal was simple: install the system, get the
NVIDIA driver right, build a strong writing environment, make SSH and Tailscale
work, configure power behavior without annoying surprises and customize KDE
without filling the system with questionable themes.

This text does not include passwords, private domains, IP addresses, tokens or
sensitive details. Commands only appear when they help document what was
actually done.

The machine
-----------

The notebook is an MSI Pulse 16 AI C1VGKG. According to the official MSI
specification for the Pulse 16 AI C1V line, the configuration includes a 16 inch
QHD+ 2560x1600 display at 240 Hz, an NVIDIA GeForce RTX 4070 Laptop GPU with 8
GB GDDR6 in the C1VGKG model, DDR5 5600 memory with two slots and support for up
to 96 GB, two M.2 NVMe PCIe Gen4 slots, Wi-Fi 6E with Bluetooth 5.3, a 90 Wh
battery, a 240 W power adapter and a weight of 2.5 kg.

Source: MSI Pulse 16 AI C1V Specification,
https://www.msi.com/Laptop/Pulse-16-AI-C1VX/Specification [1]

Item

Specification

Model

MSI Pulse 16 AI C1VGKG

Display

16 inch QHD+ 2560x1600, 240 Hz, IPS-Level

CPU

Intel Core Ultra 9, with Intel AI Boost NPU

GPU

NVIDIA GeForce RTX 4070 Laptop GPU, 8 GB GDDR6

Memory

DDR5 5600, two slots, up to 96 GB

Storage

2 M.2 NVMe PCIe Gen4 slots

Network

Wi-Fi 6E and Bluetooth 5.3

Battery and power

90 Wh battery and 240 W adapter

Weight

2.5 kg

First step: hostname and a clean base
-------------------------------------

After the installation, the first thing I did was give the machine a proper
name. That avoids the usual mess of generic hostnames in the network, terminal,
Tailscale and SSH.

  sudo hostnamectl set-hostname amon
  hostnamectl
  sudo dnf upgrade --refresh -y

RPM Fusion and NVIDIA without the manual installer
--------------------------------------------------

The sensitive part was NVIDIA. Instead of downloading the `.run` installer from
NVIDIA and creating a maintenance problem for myself, I used RPM Fusion and
`akmod-nvidia`. That is the cleaner path on Fedora because the module follows
kernel updates instead of becoming a manual hack.

Before installing the driver, I checked that Secure Boot was disabled. That
avoids the whole module signing soap opera. Then I installed the driver, let
`akmods` build the module, regenerated initramfs and validated everything with
`nvidia-smi`.

  mokutil --sb-state
  sudo dnf install -y akmod-nvidia xorg-x11-drv-nvidia-cuda nvidia-settings kernel-devel-matched
  sudo akmods --force
  sudo dracut --force
  sudo reboot
  nvidia-smi
  lsmod | grep nvidia
  __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep "OpenGL renderer"

Multimedia, codecs and video acceleration
-----------------------------------------

Fedora is more careful with codecs by default. That is nice in theory, but in
real use I want video working, media players behaving and hardware acceleration
doing its job. So I finished the multimedia setup through RPM Fusion and
installed VA-API pieces for Intel and NVIDIA.

  sudo dnf swap -y ffmpeg-free ffmpeg --allowerasing
  sudo dnf group install -y multimedia
  sudo dnf install -y libva libva-utils intel-media-driver libva-nvidia-driver
  vainfo

DNF and diagnostic tools
------------------------

I also tuned DNF a little and installed diagnostic tools. Not because I want to
stare at pretty graphs all day, but because it is useful when something heats
up, freezes or starts eating resources without asking permission.

  sudo tee -a /etc/dnf/dnf.conf >/dev/null <<'EOF'
  # Amon tuning
  max_parallel_downloads=10
  fastestmirror=True
  defaultyes=True
  keepcache=False
  EOF
  
  sudo dnf clean all
  sudo dnf makecache
  sudo dnf install -y btop htop fastfetch inxi lm_sensors pciutils usbutils lshw nvtop powertop tuned tuned-ppd tuned-utils mesa-demos vulkan-tools mangohud goverlay akmods kernel-devel-matched

Power profile
-------------

For performance, I enabled `tuned` and used `throughput-performance`. It is
great on AC power, but it is not magic. More performance usually means more heat
and more power draw. For normal use, `balanced` is still the smarter default.

  sudo systemctl enable --now tuned
  sudo tuned-adm profile throughput-performance
  tuned-adm active
  sudo tuned-adm profile balanced

Ghostty as the default terminal
-------------------------------

Ghostty became the default terminal. I wanted something modern, fast and good
looking. The only small trap was the theme name. On Linux, theme names are
literal. `catppuccin-latte` did not work. `Catppuccin Latte` did.

  mkdir -p ~/.config/ghostty
  
  cat > ~/.config/ghostty/config <<'EOF'
  font-family = JetBrains Mono
  font-size = 12
  theme = light:Catppuccin Latte,dark:Catppuccin Mocha
  window-padding-x = 8
  window-padding-y = 8
  copy-on-select = clipboard
  confirm-close-surface = false
  EOF
  
  ghostty +list-themes | grep -i cat

Writing, PDF and EPUB
---------------------

The machine was also built as a writing workstation. I installed ghostwriter for
Markdown, LibreOffice for traditional documents, Okular for reading and
annotating PDFs, PDF Arranger for simple PDF surgery, Calibre for ebook
management and conversion, Sigil for proper EPUB editing and Zotero for
references.

In the terminal, I installed the tools that actually solve problems: Pandoc for
document conversion, qpdf and poppler-utils for PDF work, OCRmyPDF and Tesseract
for OCR, ImageMagick for images, ExifTool for metadata and TeX Live for PDF
generation through LaTeX.

  flatpak install -y flathub org.kde.ghostwriter org.libreoffice.LibreOffice org.kde.okular com.github.jeromerobert.pdfarranger com.calibre_ebook.calibre com.sigil_ebook.Sigil org.zotero.Zotero
  
  sudo dnf install -y pandoc qpdf poppler-utils ocrmypdf tesseract tesseract-langpack-por tesseract-langpack-eng ImageMagick djvulibre perl-Image-ExifTool unpaper texlive-scheme-medium texlive-collection-fontsrecommended texlive-collection-latexrecommended texlive-collection-latexextra

IRC with Halloy
---------------

For IRC, I installed Halloy through Flatpak and replicated my Windows
configuration into `config.toml`. The important part was not publishing
passwords or private server details. Anything with credentials stays local.

  mkdir -p ~/.var/app/org.squidowl.halloy/config
  nano ~/.var/app/org.squidowl.halloy/config/config.toml
  chmod 600 ~/.var/app/org.squidowl.halloy/config/config.toml

Tailscale and SSH
-----------------

Remote access is handled through Tailscale and SSH. That lets me work on the
machine from Windows without exposing SSH to the whole internet. `sshd` was
enabled, and the machine became reachable through the Tailnet address.

  sudo dnf install -y openssh-server
  sudo systemctl enable --now sshd
  systemctl status sshd --no-pager
  tailscale ip -4
  tailscale status

Cloud storage on Fedora KDE
---------------------------

I did not want to depend on KDE native Google Drive integration. It exists, but
it is not something I would build my whole workflow around. To mount cloud
services as a local filesystem, I installed ExpanDrive through its RPM. The
installation completed properly and left the binary available on the system.

  mkdir -p ~/Downloads
  cd ~/Downloads
  curl -L -A "Mozilla/5.0" -o ExpanDrive.rpm "https://www.expandrive.com/api/download/expandrive?platform=linux&ext=rpm"
  file ExpanDrive.rpm
  sudo dnf install -y ./ExpanDrive.rpm
  rpm -qa | grep -i expandrive
  command -v expandrive

Dark KDE, fonts and icons
-------------------------

The visual side was handled carefully because I was doing it remotely over SSH.
I did not try to rebuild panels or install random KDE Store themes without
seeing the screen. I applied a safe base: Breeze Dark, Papirus Dark, Noto Sans
for the interface and JetBrains Mono for fixed-width text.

  sudo dnf install -y papirus-icon-theme google-noto-sans-fonts google-noto-serif-fonts jetbrains-mono-fonts kvantum qt6ct qt5ct breeze-gtk
  
  kwriteconfig6 --file kdeglobals --group General --key ColorScheme BreezeDark
  kwriteconfig6 --file kdeglobals --group KDE --key LookAndFeelPackage org.kde.breezedark.desktop
  kwriteconfig6 --file kdeglobals --group KDE --key widgetStyle Breeze
  kwriteconfig6 --file kdeglobals --group Icons --key Theme Papirus-Dark
  kwriteconfig6 --file kdeglobals --group General --key fixed "JetBrains Mono,10,-1,5,50,0,0,0,0,0"
  kwriteconfig6 --file kdeglobals --group General --key font "Noto Sans,10,-1,5,50,0,0,0,0,0"

Power: plugged in, no sleeping from idle
----------------------------------------

The power behavior ended up exactly how I wanted it. When plugged in, the
notebook should not turn off the display or suspend by itself because of
inactivity. But when I close the lid, it can suspend. That is the correct middle
ground for a notebook.

  kwriteconfig6 --file powerdevilrc --group AC --group DPMSControl --key idleTime 0
  kwriteconfig6 --file powerdevilrc --group AC --group DimDisplay --key idleTime 0
  kwriteconfig6 --file powerdevilrc --group AC --group SuspendSession --key idleTime 0
  kwriteconfig6 --file powerdevilrc --group AC --group HandleButtonEvents --key lidAction 1
  systemctl --user restart plasma-powerdevil.service 2>/dev/null || systemctl --user restart plasma-powerdevil
  
  sudo tee /etc/systemd/logind.conf.d/99-amon-power.conf >/dev/null <<'EOF'
  [Login]
  HandleLidSwitchExternalPower=suspend
  HandleLidSwitchDocked=suspend
  IdleAction=ignore
  EOF
  
  sudo systemctl restart systemd-logind

OpenPGP, development and AI in the terminal
-------------------------------------------

For OpenPGP, the natural choice on Fedora KDE was Kleopatra, together with GnuPG
and `pinentry-qt`. For development, I installed a Python and Go base. For AI in
the terminal, I installed Claude Code through the official repository, with the
rule of running it inside project directories, not across my whole home folder.

  sudo dnf install -y kleopatra gnupg2 pinentry-qt kgpg
  
  sudo dnf install -y python3 python3-pip python3-devel python3-virtualenv pipx golang git gcc gcc-c++ make cmake pkgconf-pkg-config openssl-devel libffi-devel zlib-devel bzip2-devel xz-devel sqlite-devel readline-devel
  
  claude doctor
  claude --version

Image work and visual creation
------------------------------

For images, GIMP, Krita and Inkscape already cover a lot of ground. GIMP is for
general editing, Krita is for art and covers, and Inkscape is for vector work.
darktable and RawTherapee are next candidates if I want a more serious
photography and RAW workflow.

  flatpak list --app | grep -Ei "gimp|krita|inkscape"

Amon now has Fedora KDE, working NVIDIA support, Wayland, RTX 4070 offload,
codecs, a complete writing setup, remote access through SSH and Tailscale, cloud
mounting prepared with ExpanDrive, Ghostty as the terminal, IRC in Halloy and a
clean KDE visual base.

There is still room to tune panels, wallpaper, widgets and small visual details
when I am physically in front of the machine. Over SSH, I stopped at the right
point. Going further with visuals without looking at the screen would be vanity
with a decent chance of breaking something that already works.

The best part is that the installation did not turn into a monster. It has
strong tools, but not random packages installed just because they looked nice in
a Reddit screenshot.

Source used only for the notebook specification: MSI, Pulse 16 AI C1V
Specification, https://www.msi.com/Laptop/Pulse-16-AI-C1VX/Specification [2]

Links:
  [1] https://www.msi.com/Laptop/Pulse-16-AI-C1VX/Specification
  [2] https://www.msi.com/Laptop/Pulse-16-AI-C1VX/Specification


< the skull