Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Dotfiles

Personal Arch Linux configuration for an ASUS ROG Strix G17 G713 (Ryzen 9 5900HX, RTX 3070). Windows dual boot retained for Fusion 360 and other Windows-only software. Every decision is documented here with rationale, tradeoffs, and links.

Setup Workflow

  1. Install Arch via archinstall (dual boot, see below)
  2. git clone ~/dotfiles
  3. cd ~/dotfiles && bash install.sh (Needed the first time. After that, use the ,install_dotfiles alias.)
  4. Work through the manual steps printed at the end

install.sh is fully idempotent — safe to re-run at any time to sync a machine to the current state of this repo.

TODOs

  • Make themes work with Zen
  • Dual boot bluetooth setup
  • Maybe explicitly add audio (pipewire and so on) to dotfiles?
  • Maybe explicitly add printing to dotfiles?
  • Gnome Extensions setup complete?
  • In the archinstall configuration, a swap partition was defined but not enabled?! Check that.
  • Look over other solutions for the timezone thingy with dualboot. I dont want it to be wrong forever.
  • Add signing to git for GitHub
  • Add signing to mail for i.e. jakob@schluse.com
  • Revisit Outlook calendar
  • Add iCloud calendar

Boot & Installation

Dual Boot with Windows

Bootloader: systemd-boot (not GRUB)

  • Why: A Windows update can silently overwrite GRUB in the EFI partition, breaking the boot menu. systemd-boot lives in a separate EFI entry and is immune to this. The official asus-linux.org guide also explicitly recommends systemd-boot and says to avoid GRUB.
  • When GRUB is worth it: Complex multi-OS setups, or if Btrfs snapshots need to be bootable from the menu (requires grub-btrfs). Neither applies here.
  • Reference:

Filesystem: Ext4 (not Btrfs)

  • Why: Avoiding Btrfs removes the need for GRUB entirely (Btrfs boot-menu snapshots require grub-btrfs), keeps the setup simpler, and avoids Btrfs's write amplification on the SSD for this use case.
  • Tradeoff: Timeshift runs in rsync mode instead of snapshot mode. Snapshots on Btrfs are near-instant and storage-efficient; rsync copies are slower and use more disk. Acceptable for a personal laptop.
  • Revisit if: Reinstalling from scratch — Btrfs + snapshot-mode Timeshift is a meaningful upgrade if GRUB is acceptable.

Kernels: linux

  • While a linux + linux-lts setup was considered for a long time, it was finally overturned as it would be too big for the EFI partition and the additional complexitly was not deemed wothy. So this is the totally normal install.

Firmware & Microcode

  • linux-firmware: required for hardware firmware blobs (WiFi, etc.)
  • amd-ucode: CPU microcode updates for the Ryzen 9 5900HX. Loaded by the bootloader at early boot. intel-ucode would be used instead on Intel systems.
  • Reference: Microcode — ArchWiki

Installer: archinstall

  • Why: Fast, reproducible, no manual partitioning required. Manual installation is only worth the time for highly custom partition layouts.
  • Configuration for this install can be found in archinstall_config.json.
  • Reference: archinstall — ArchWiki

Time setup

As the ArchWiki points out, you have to put some care into how you set up you time so that the OS's don't interfere with each other. Here are the steps I took to make this work:

  1. Windows
    1. Open the Registry Editor as Administrator
    2. Create a new key called RealTimeIsUniversal of the type DWORD32 at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
    3. Set this key to 1
  2. BIOS
    1. Boot into the BIOS
    2. For my machine, at the top, I can set the clock to some value manually. Open a time website on another device and set it pretty accurately.
  3. Arch Linux
    1. Run timedatectl
    2. It should output something like this:
                     Local time: Wed 2026-06-24 16:11:41 CEST
                 Universal time: Wed 2026-06-24 14:11:41 UTC
                       RTC time: Wed 2026-06-24 14:11:41
                      Time zone: Europe/Brussels (CEST, +0200)
      System clock synchronized: yes
                    NTP service: active
                RTC in local TZ: no
      
    3. Set the timezone with: timedatectl set-timezone Europe/Brussels
    4. If "RTC in local TZ" is set to yes, run timedatectl set-local-rtc 0. This tells Arch the hardware clock is set to UTC instead of the local time.

Desktop Environment

GNOME (with Hyprland planned)

  • Why GNOME first: Already familiar from VM use. Wayland-native, polished, zero configuration overhead.
  • Why not Hyprland immediately: Requires manual setup of every component (bar, launcher, notifications, screensharing, idle daemon). High value, high cost.
  • Migration note: When switching to Hyprland, GNOME Keyring PAM initialization needs manual setup (see SSH/GPG section).

System & Hardware Maintenance

Backups: Timeshift (rsync mode)

  • Why Timeshift: Simple GUI + CLI, well-documented restore from TTY.
  • Why rsync mode: Required for Ext4. Btrfs snapshot mode is faster but tied to Btrfs.
  • Reference: Timeshift — GitHub

Package Cache: paccache.timer

  • Why: pacman/paru accumulate old package versions in /var/cache/pacman/pkg/. paccache (from pacman-contrib) keeps the last 3 versions and ships a systemd timer for weekly automation.
  • Reference: paccache — ArchWiki

ASUS ROG Hardware

g14 Pacman Repo

  • What it is: A pacman repo maintained by the asus-linux.org team, providing asusctl, rog-control-center, and related packages as precompiled binaries. The name "g14" is historical — it applies to all ROG laptops.
  • Why use it over AUR: The guide explicitly states that asusctl-git and other AUR variants are not supported. The g14 repo is the only supported installation method.
  • Setup: Add the signing key, append the repo to /etc/pacman.conf, then run a full system sync before installing any packages from it. install.sh handles this.
  • Reference: asus-linux.org Arch guide — Repo

asusctl

  • What it does: Fan profiles, keyboard RGB, battery charge thresholds.
  • Install: sudo pacman -S asusctl (from g14 repo — not AUR)
  • asusd service: intentionally NOT enabled via systemctl. It is triggered automatically by a udev rule once the keyboard driver is ready. Enabling it manually can cause race conditions on boot.
  • Reference: asus-linux.org — asusctl

ROG Control Center

  • What it is: GUI frontend for asusctl. Previously bundled with asusctl, now a separate package in the g14 repo.
  • Install: sudo pacman -S rog-control-center
  • Reference: asus-linux.org — ROG Control Center

power-profiles-daemon

  • Why: asusctl is designed to work with power-profiles-daemon for power profile management. Other power management tools (e.g. TLP, auto-cpufreq) conflict with asusctl and must not be installed alongside it.
  • Reference: asus-linux.org — asusctl

supergfxctl — NOT installed (deprecated)

  • Why not: The asus-linux.org guide explicitly marks supergfxctl as deprecated and advises against installing it: "unless you require vfio for virtual machines or have problems turning off your dGPU don't install it."
  • The RTX 3070 (Ampere) handles dynamic power gating via nvidia-laptop-power-cfg and the nvidia power management services instead. supergfxctl is not needed.
  • Reference: asus-linux.org — supergfxctl (Deprecated)

NVIDIA (RTX 3070 — Ampere)

Driver

  • Package: nvidia-open — the open-source kernel module, appropriate for Ampere architecture and later. The proprietary nvidia package is only needed for Turing (RTX 2000) and older where GSP firmware must be disabled.
  • Also install: nvidia-utils (userspace libraries) and vulkan-icd-loader (Vulkan ICD loader, required).

nvidia-laptop-power-cfg

  • What it does: Provides udev rules and modprobe configuration for proper dGPU dynamic power gating on Ampere laptops. Without it, the GPU may not power down when idle, draining battery.

  • Install: This is also on the g14 repo. The guide on asus-linux.org is wrong about that.

  • [!NOTE] Copilot mentioned the following. Consider it when debugging. In the config files installed by this package, these options are commented out.

    NVIDIA Suspend/Hibernate parameters: You enable nvidia-suspend.service, nvidia-hibernate.service, and nvidia-resume.service. For these to actually work, NVIDIA requires you to pass NVreg_PreserveVideoMemoryAllocations=1 to the nvidia kernel module (usually via /etc/modprobe.d/nvidia.conf). Without this, saving VRAM to RAM on sleep will fail. (You will also want nvidia-drm.modeset=1 in your boot parameters for Wayland support when you move to Hyprland).

  • Reference:

NVIDIA systemd services

These four services are enabled to handle GPU state across power transitions:

nvidia-suspend.service    # saves GPU state before system suspend
nvidia-hibernate.service  # saves GPU state before hibernation
nvidia-resume.service     # restores GPU state on wake
nvidia-powerd             # runtime power management daemon (started immediately)

Verifying S0ix Power Management

After first boot, verify that S0ix power management is active (critical for idle power consumption and sleep):

cat /proc/driver/nvidia/gpus/*/power
# Expected: "Status: Enabled" under "S0ix Power Management"

Use bash tab-completion on the path if the glob doesn't work.

Package Management

paru (AUR helper)

  • Why paru over yay: Written in Rust, actively maintained, feature-complete. But to be honest, it was just a vibe decision. And it does not really matter anyway.
  • Idempotency: paru -S --needed skips already-installed packages.
  • Reference: paru — GitHub

Programs

Editor: Visual Studio Code (visual-studio-code-bin)

  • Why the Microsoft AUR build, not code: The open-source code build uses OpenVSX, which lacks proprietary extensions (Copilot, official remote dev tools).
  • settings.json tracked at home/.config/Code/User/settings.json. Key settings:
    • "telemetry.telemetryLevel": "error" — error reporting only, no usage telemetry
    • ruff as default formatter and linter for Python
    • ty handles type checking (pylance type checking disabled)
    • rust-analyzer with clippy and inlay hints
    • Catppuccin Mocha theme (install the extension to activate)
  • Reference: VSCode — ArchWiki, Telemetry docs

VSCode Extensions Notes

  • "C/C++" by Microsoft (ms-vscode.cpptools):

    Using this extension for debugging, as it support the GDB compiler, which is installed on my system as opposed to LLVM.

Python: uv + ruff + ty

  • uv: Fast Python package and project manager. Replaces pip, virtualenv, pyenv. uv — GitHub
  • ruff: Linter and formatter, installed as a uv tool (globally available). ruff — GitHub
  • ty: Type checker from Astral. Fast, modern alternative to mypy/pyright. ty — GitHub
  • Both also installed as VSCode extensions for inline feedback.

AI Coding

OneDrive: abraunegg/onedrive

  • Key settings (tracked in home/.config/onedrive/config):
    • skip_size = "50": skip files over 50 MB to keep the local footprint small
    • sync_list_file: points to sync_list for whitelist-mode selective sync
  • sync_list (tracked in home/.config/onedrive/sync_list): template with commented-out example paths. Edit to add the folders you want synced locally, then run onedrive --sync --resync --verbose for the initial sync.
  • Note: First-time auth (onedrive browser flow) and the initial sync are manual steps — interactive by nature and cannot be scripted.
  • Reference: abraunegg/onedrive — GitHub, Usage docs

Password Manager: KeepassXC

  • Open-source, no cloud account. Database stored on OneDrive for cross-device access without trusting a third-party vault.
  • Reference: KeepassXC

Browser

Zen Browser

  • Primary browser
  • Zenful browsing experience

Brave

  • Secondary browser after Zen
  • Chromium support allows native PWA support, so this browser is kept for that.
PWAs
  1. WhatsApp
    • No native Linux client. Brave handles PWAs natively as a Chromium-based browser. Previous setup used Firefox + PWAs-for-Firefox extension, which caused WhatsApp to open in the foreground on startup. Brave solves this cleanly.
    • Setup: web.whatsapp.com in Brave → install icon in address bar.
  2. Deezer
    • Again, there is no official app. There seems to be a clone of the Electron-based Windows app, but to be honest, I do not need the struggle for that. This is fine. The only inconvenience are the missing downloads.
    • Setup: Note this is actually a tiny bit different as Deezer is no native PWA. This leads to us needing to go to deezer.com in Brave, Menu -> Save and Share -> Install page as app...
    • Reference: Deezer Community Forum - Can I use Deezer on Linux

Markdown Editor: MarkText

  • After trying Ghostwriter (moved to Fedora, outdated on Arch), Apostrophe (no syntax highlighting), and Zettlr (too publication-focused), MarkText best fits the minimal requirement.
  • Install: paru -S marktext-bin
  • Reference: MarkText — GitHub
  • [!NOTE] I am thinking about trying out Obsidian. It's just paru -S obsidian.

Music Notation: LilyPond + Frescobaldi

Containerization: Podman (not Docker)

  • Daemonless (saves battery), rootless by default (better security).
  • podman-docker aliases all docker commands to podman transparently.
  • Reference: Podman

Mail: Thunderbird

Shell

Terminal: Ghostty

  • GPU-accelerated, configured via a single text file at ~/.config/ghostty/config.ghostty (it was just config prior to version 1.2.3), works out of the box.
  • Reference:

Shell: Zsh (scripts stay in Bash)

  • Zsh for interactive use: better completion, richer plugins.
  • Bash for scripts: POSIX-compatible, available everywhere.
  • Reference: Zsh — ArchWiki

Prompt: Starship

  • Cross-shell, Rust-based, no perceptible latency.
  • Config at ~/.config/starship.tomlvendored directly in this repo. Based on the catppuccin-powerline preset, adjusted and documented inline. No manual preset command needed after install.
  • Why vendor instead of running a preset: A vendored config is version-controlled, reviewable, and doesn't depend on a network call during setup. Customisations are visible in git history rather than silently overwritten.
  • To swap to a different preset: starship preset <name> -o ~/.config/starship.toml then commit the result.
  • Reference: starship.rs, Presets

Zsh Plugins (pacman-managed, no plugin manager)

  • Why no Oh My Zsh / Zinit: Startup latency, extra dependency. Arch repos ship the main plugins; sourcing them directly in .zshrc is simpler and faster.
  • zsh-syntax-highlighting: real-time command highlighting
  • zsh-autosuggestions: Fish-like history suggestions
  • zsh-completions: extra completions for Docker, Git, Node, etc.

Modern CLI Utilities

Tool Replaces Why
fzf Ctrl+R history Fuzzy search over history, files, anything
zoxide cd Learns frecency, jump by partial name
eza ls Color-coded, Git status, tree view
bat cat Syntax highlighting, Git diff

Rust

  • Toolchain manager: rustup (installed via pacman)
  • Why base-devel: Rust crates with C dependencies need gcc, make, binutils.
  • VSCode: rust-analyzer extension.
  • Reference: Rust installation

SSH / GPG Keys

  • Managed via: GNOME Keyring (unlocks on login).
  • Hyprland migration note: GNOME Keyring needs a PAM snippet that GNOME sets up automatically. Must be added manually when switching to Hyprland, or replaced with another agent.

Dotfile Management

GNU Stow

  • home/ mirrors ~/ exactly. stow --restow home creates all symlinks in one call.
  • Why not bare git: Requires a custom alias instead of normal git commands; confusing to revisit.
  • Why not manual symlinks: More script code, same result.
  • --restow: Removes and recreates symlinks on each run — idempotent.
  • Reference: GNU Stow

Fonts

Mass-installing fonts on arch is not the way to do things, as it introduces a few bad practices for an Arch install:

  • Bloat: I would be installing hundreds of megabytes of fonts I would never look at or use.

  • Font Conflicts & Hierarchy Issues: When I install multiple major font families (like Arial alternatives ttf-liberation and ttf-croscore simultaneously), my browser and system configuration tools can get confused about which font to prioritize as the default system sans-serif. This can lead to ugly text rendering on certain web pages.

  • The Ghostty/Terminal Mess: Having too many monospace variants installed can sometimes make font selection menus cluttered and messy.

Instead, following my selection:

  1. **noto-fonts + emoji + cjk**: A bulletproof safety net. WhatsApp emojis work, and random foreign characters in GitHub code won't show up as boxes.
  2. ttf-liberation: Fulfills the standard system metrics so PDFs and document layouts don't break.
  3. inter-font: Makes your GNOME desktop environment look beautiful and incredibly clean.
  4. ttf-firacode-nerd: Your absolute daily driver for Ghostty and VSCode.

Post-install

Reboot first. The NVIDIA driver and asusd udev rule both need a clean boot.

  1. Verify NVIDIA S0ix — critical for battery life and sleep:

    cat /proc/driver/nvidia/gpus/*/power
    # Expected: "Status: Enabled" under "S0ix Power Management"

    If disabled, see asus-linux.org — Next steps.

  2. OneDrive auth: Run onedrive, follow browser flow. Config and sync_list are already in place via stow. Edit ~/.config/onedrive/sync_list to add your folders, then: onedrive --sync --resync --verbose.

  3. KeepassXC: Open the app and point it to the database on OneDrive.

  4. Setup Git for GitHub:

    gh auth login
    gh auth setup-git
  5. PWAs in Brave: Follow the instructions in the Brave PWA section above to install the different web apps.

  6. Timeshift: Open GUI → set snapshot location and schedule.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages