Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Hyprland desktop setup on Fedora Linux, styled with Catppuccin Mocha. Built for
│ │ ├── reload.sh # Reload compositor, bar, and notifications
│ │ └── wallpaper.sh # Per-workspace wallpaper listener
│ ├── kitty/
│ │ └── kitty.conf # GPU terminal with 144Hz input tuning
│ │ └── kitty.conf # GPU terminal with configured redraw delays
│ ├── rofi/
│ │ ├── config.rasi # Application launcher
│ │ ├── scripts/
Expand Down Expand Up @@ -109,11 +109,11 @@ https://github.com/user-attachments/assets/e41b7de6-2717-4371-a81f-c4a124757f12
|---|---|
| [Hyprland](https://github.com/hyprwm/Hyprland) | Wayland tiling compositor |
| [Waybar](https://github.com/Alexays/Waybar) | Floating status bar with workspace indicators |
| [awww](https://codeberg.org/LGFae/awww) | Wallpaper daemon running 144 FPS bezier transitions |
| [awww](https://codeberg.org/LGFae/awww) | Wallpaper daemon with transitions configured at 144 FPS |
| [SwayNC](https://github.com/ErikReider/SwayNotificationCenter) | Notification center and quick settings |
| [hyprlock](https://github.com/hyprwm/hyprlock) | Screen locker with screenshot blur |
| [hypridle](https://github.com/hyprwm/hypridle) | Idle listener and sleep controller |
| [Kitty](https://github.com/kovidgoyal/kitty) | Terminal emulator running 6ms refresh and 1ms input latency |
| [Kitty](https://github.com/kovidgoyal/kitty) | Terminal emulator with 6ms repaint and 1ms input delay settings |
| [Rofi](https://github.com/davatorium/rofi) | App launcher, power menu, and picker scripts |
| [Fastfetch](https://github.com/fastfetch-cli/fastfetch) | System information summary |

Expand Down Expand Up @@ -160,7 +160,7 @@ To link all configuration directories (`hypr`, `waybar`, `kitty`, `rofi`, `swayn
./scripts/install-symlinks.sh
```

Existing conflicting configuration files or directories will be safely backed up automatically with a timestamp before creating the symlinks.
Existing conflicting files, directories, and symlinks are preserved in unique backup directories before replacement.

## System optimizations

Expand Down Expand Up @@ -206,3 +206,10 @@ deduplication. Git identity, credentials, signing, and differing local overrides
stay local and take precedence. Symlinked `.bashrc` or `.gitconfig` require manual
integration. Backups use unique `.backup-*` names; link conflicts are stored under
`BACKUP/original`. Restore backups to undo installation, then open a new shell.


### Performance evidence

See [the performance baseline](docs/performance-baseline.md) for recorded shell
startup samples, their sandbox limitations, and the remaining host checks. Current
visual and redraw settings are preferences; they do not establish measured latency.
75 changes: 75 additions & 0 deletions docs/performance-baseline.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Workstation performance baseline

## TL;DR

Preserve the current visuals and target balanced responsiveness. Configuration is
not a benchmark. The measurements below were captured in a restricted agent
sandbox, not a complete Hyprland session; no desktop performance gain is claimed.

## Recorded evidence

| Check | Observation | Limit |
|---|---|---|
| OS | Fedora 43 KDE edition | Read from host os-release |
| Memory/storage | About 30 GiB RAM, 8 GiB zram, Btrfs on NVMe | Snapshot, not a pressure test |
| Shell with current startup | 20 samples; median 39.32 ms; range 38.53–41.25 ms | Non-login interactive Bash, no PTY, output discarded |
| Shell without Fastfetch | 20 samples; median 33.95 ms; range 32.84–35.54 ms | Temporary rc file; original startup untouched |
| Fastfetch difference | 5.37 ms between medians | Sandbox observation only; retain current behavior |
| Codec package | mesa-va-drivers-freeworld installed; mesa-va-drivers absent | Package inventory does not prove application decoding |
| Power configuration | `/etc/tuned/active_profile`: balanced; EPP: balance_performance | Live TuneD activation could not be queried |
| Monitor/compositor | Unverified | Hyprland socket access denied |
| Boot/failed services | Unverified | System and user bus access denied |
| Desktop idle CPU/power | Unverified | Process visibility excludes the live desktop |

## Repeat shell startup measurement

Run from your normal host terminal. This measures startup without terminal
rendering, so also compare perceived opening time in Kitty. The temporary variant
intercepts the direct Fastfetch startup invocation; it never edits dotfiles.

```python
import pathlib, statistics, subprocess, tempfile, time

original = pathlib.Path.home().joinpath('.bashrc').read_text()
with tempfile.TemporaryDirectory() as directory:
for variant in ('current', 'without_fastfetch'):
rc = pathlib.Path(directory) / variant
# Intercept only direct fastfetch calls in this disposable child shell.
# The tracked fragment and existing rc both use direct calls.
rc.write_text(('fastfetch() { :; }\n' if variant == 'without_fastfetch' else '') + original)
samples = []
for _ in range(20):
start = time.perf_counter()
subprocess.run(['bash', '--noprofile', '--rcfile', str(rc), '-ic', 'exit'],
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True)
samples.append((time.perf_counter() - start) * 1000)
assert len(samples) == 20
print(variant, 'median/range ms:', statistics.median(samples), min(samples), max(samples))
```

This temporary function does not intercept an explicit `command fastfetch` or
absolute executable path; inspect customized startup files before using it.
Retain Fastfetch unless repeated host measurements or your preference justify
moving it to an on-demand command.

## Complete the host baseline

- Capture `systemd-analyze`, `systemd-analyze critical-chain`, and failed system/user
units across three comparable cold boots. Report medians and ranges, not a single
longest service: services can start in parallel.
- Run `hyprctl monitors`, `hyprctl configerrors`, `tuned-adm active`, and
`tuned-adm verify`. Confirm actual resolution/refresh and power-profile activation.
- Count `wallpaper.sh` listener processes after login and after ten `SUPER+A`
refreshes. There should be one listener.
- With the same apps open and no builds/downloads, capture three sixty-second
idle samples using `pidstat -u -r 1 60` if installed. Record compositor, bar,
wallpaper, CPU activity, and available hardware power readings separately.
- Inspect `vainfo` and the browser's media diagnostics during the same video test.
Confirm the codec, rendering/decoding device, CPU use, and dropped frames.

## Change policy

Keep blur, transparency, animations, VRR, Kitty delays, and wallpaper transition
rate unchanged in this series. Test one proposed tuning change at a time with the
same workload. Adopt it only if improvement is repeatable beyond baseline variation,
and record any visual, latency, or idle-power tradeoff plus rollback.
Loading