My personal Linux desktop configuration files, managed with GNU Stow.
- Compositors: Hyprland (primary) and Niri
- Desktop Shell & UI: DankMaterialShell, Waybar, Rofi, Quickshell
- Terminals: Kitty, Ghostty
- Theming: Dynamic wallpaper-based material theming using Matugen and Wallust, with support for GTK applications
- Other utilities: Zsh, VS Code, Swaylock
-
Install dependencies: The required packages are listed in
pkglist.txt(Arch official repos) andaurlist.txt(AUR). Install them using pacman and an AUR helper (e.g., yay or paru):sudo pacman -S --needed - < pkglist.txt yay -S --needed - < aurlist.txt
-
Clone the repository:
git clone https://github.com/thalesraymond/dotfiles.git ~/dotfiles cd ~/dotfiles
-
Deploy configurations: Use GNU Stow to create symbolic links in your home directory. To deploy all configurations:
stow *(Note: To stow individual components, specify the folder name, e.g.,
stow hypr)
A self-hosted media automation stack lives in docker/media-server/. It is not part of the Stow model (excluded via docker/.stow-local-ignore) — it is a standalone Docker Compose project running against the secondary HDD at /mnt/media_storage.
| Service | Role | Port |
|---|---|---|
| qBittorrent | Torrent client (WebUI) | 8080 (TCP + UDP 6881) |
| FlareSolverr | Cloudflare challenge solver | internal (http://flaresolverr:8191) |
| Prowlarr | Indexer manager | 9696 |
| Sonarr | TV show automation | 8989 |
| Radarr | Movie automation | 7878 |
| Bazarr | Subtitle automation | 6767 |
| Maintainerr | Auto-cleanup rules (Jellyfin + *arrs) | 6246 |
| Jellyfin | Media server (transcoding) | 8096 |
/mnt/media_storage
├── downloads/ # qBittorrent downloads (shared with Sonarr/Radarr)
└── media/
├── movies/ # Radarr-managed movies → Jellyfin /data/movies
└── tv/ # Sonarr-managed shows → Jellyfin /data/tvshows
Initialize it (all containers run as PUID=1000/PGID=1000, so the HDD must be owned by UID/GID 1000):
sudo mkdir -p /mnt/media_storage/{downloads,media/movies,media/tv}
sudo chown -R 1000:1000 /mnt/media_storagecd docker/media-server
docker compose up -d # stop with: docker compose down- All services use
TZ=America/Sao_Pauloandrestart: unless-stopped. - Downloads and media are on the same filesystem, so Sonarr/Radarr use hardlinks/atomic moves (no copy + delete). Point them at
http://qbittorrent:8080on the compose network. - Bazarr (subtitles): WebUI at
6767→ Settings → Sonarr/Radarr, add both apps. It mounts the same/tv//moviespaths, so no path mapping is needed. - FlareSolverr (Cloudflare-protected indexers): in Prowlarr → Settings → Indexers, set the FlareSolverr API URL to
http://flaresolverr:8191, then enable Use FlareSolverr on the affected indexers. - Maintainerr (auto-cleanup): in its Settings, connect Jellyfin (
http://jellyfin:8096+ API key from Jellyfin → Dashboard → API Keys) and Radarr/Sonarr (API keys from their Settings → General). Media is mounted at the same/tv//moviespaths the *arrs report, so rules can delete files directly. - Per-service config lives in
docker/media-server/config/(gitignored) — back it up separately.
sudo systemctl link ~/dotfiles/docker/media-server/media-server.service
sudo systemctl enable --now media-server.serviceEdit WorkingDirectory= in the unit first if this repo is not at ~/dotfiles. Containers also self-restart via their restart: policy should the Docker daemon restart.
The compose file reserves the GPU for the jellyfin service via the NVIDIA container runtime — install the toolkit once on the host:
sudo pacman -S nvidia-container-toolkit # Arch official repos
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart dockerThen in Jellyfin → Dashboard → Playback → Transcoding, select NVIDIA NVENC and enable the codecs you want.
Run the stack on the native engine.
docker composemust use thedefaultcontext (system Docker Engine), not Docker Desktop: Desktop runs its engine inside a VM that cannot see the host's/dev/drior/dev/nvidia*, which fails witherror gathering device information while adding custom device "/dev/dri". The NVIDIA runtime is registered in/etc/docker/daemon.jsonfor the native daemon only.docker context use default
On an Intel/AMD-only host, delete the deploy: GPU reservation and the NVIDIA_* environment variables from the jellyfin service, and add devices: - /dev/dri:/dev/dri for VAAPI/QSV.