Compare commits

..

3 Commits

Author SHA1 Message Date
Fabio Scotto di Santolo
ae8a6161cd Remove i3 desktop profile and st terminal
Elimina completamente la sessione desktop i3 (X11), ormai non più usata
(gli host espongono solo sway e Hyprland su Wayland):
- ruolo profile_desktop_i3 e voce emptty i3.desktop
- desktop_i3_packages e i guard 'i3' in desktop_sessions_enabled
- desktop_i3_dotfiles e host_i3_dotfiles (autorandr X11)
- dotfiles i3/X11: .xinitrc, i3, i3blocks, picom, polybar, autorandr
- task host-specifici i3 (copy dotfiles, wrap prime-run su nymph)
- rimuove st (terminale X11 da sorgente) da desktop_void_source_tools
- consolida lo script live in scripts/remove_i3.sh, elimina cleanup-i3.sh
- aggiorna la documentazione (README/AGENTS/CLAUDE/knowledge)

Config Emacs lasciata invariata di proposito.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 16:59:08 +02:00
Fabio Scotto di Santolo
01840c82e0 Merge branch 'cleanup/remove-deadalus-win-ubuntu' 2026-06-21 16:32:20 +02:00
Fabio Scotto di Santolo
a135edaa3f Remove deadalus-win and deadalus-ubuntu profiles
Rimuove completamente i due host non più in uso dal playbook:
- inventory: gruppi ubuntu_workstation, workstation_dev_ubuntu,
  workstation_host_windows e relative entry host
- host_vars deadalus-ubuntu/deadalus-win e group_vars windows
- play workstation_dev_ubuntu e workstation_host_windows in site.yml
- ruolo profile_workstation_host_windows e bootstrap PowerShell
- var PSRP nel vault.yml.example, pacchetti python pypsrp/pyspnego WSL
- collection ansible.windows/community.windows
- riferimenti nella documentazione (README/AGENTS/CLAUDE)

Workstation Linux nativa: resta solo deadalus-fedora.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 16:30:30 +02:00
58 changed files with 54 additions and 2453 deletions

View File

@@ -1,6 +1,6 @@
# AGENTS.md
Ansible-driven personal infrastructure repo for Void desktops, Linux workstations, Windows+WSL, and an Ubuntu server.
Ansible-driven personal infrastructure repo for Void desktops, Linux workstations, WSL, and an Ubuntu server.
## Source Of Truth
- Main orchestration: `ansible/site.yml`
@@ -12,8 +12,8 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
## Topology
- Void desktops: `ikaros`, `nymph`
- Native Linux workstations: `deadalus-ubuntu`, `deadalus-fedora`
- Windows host + WSL dev: `deadalus-win`, `deadalus-wsl`
- Native Linux workstation: `deadalus-fedora`
- WSL dev: `deadalus-wsl`
- Ubuntu server: `prometheus`
- Hosts intentionally belong to multiple groups; trust `ansible/site.yml` over hostname assumptions.
@@ -21,7 +21,7 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
- Preserve layering `all -> OS -> profile -> host`.
- Keep `ansible/site.yml` small; orchestration belongs there, implementation belongs in roles.
- Prefer minimal, targeted edits. Preserve idempotency and existing ordering.
- Most hosts use `ansible_connection: local`; Windows host is the exception.
- All hosts use `ansible_connection: local`.
- Treat `secrets/` as sensitive. Never print secret values.
- Tmux plugins are bootstrapped by TPM on the host; the repo only keeps tmux config and custom helper scripts.
- Read the relevant role tasks, templates, vars, and deployed dotfiles before editing.
@@ -35,14 +35,12 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
- `yamllint ansible/`
- Host-focused dry runs:
- Void desktop work: `ansible-playbook ansible/site.yml --limit ikaros --check --diff` or `--limit nymph --check --diff`
- Ubuntu workstation: `ansible-playbook ansible/site.yml --limit deadalus-ubuntu --check --diff`
- Fedora workstation: `ansible-playbook ansible/site.yml --limit deadalus-fedora --check --diff`
- WSL dev: `ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff`
- Server: `ansible-playbook ansible/site.yml --limit prometheus --check --diff`
- Focused checks:
- Emacs dotfiles only: `ansible-playbook ansible/site.yml --limit ikaros --tags emacs --check --diff` or `--limit nymph --tags emacs --check --diff`
- Mail bootstrap: `sh -n scripts/bootstrap_mail.sh` and `shellcheck scripts/bootstrap_mail.sh`
- Windows bootstrap parse: `pwsh -NoProfile -Command "[void][System.Management.Automation.Language.Parser]::ParseFile('scripts/bootstrap_windows_workstation.ps1', [ref]$null, [ref]$null)"`
- Server compose render: `docker compose -f /opt/docker/server/docker-compose.yml config`
## Conventions
@@ -54,32 +52,28 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
- Use `no_log: true` for secret-bearing task inputs or outputs.
## Desktop Notes
- `profile_desktop_common` owns the shared desktop bootstrap; `profile_desktop_i3` (X11), `profile_desktop_sway` (Wayland/SwayFX), and `profile_desktop_hyprland` (Wayland) install their respective sessions in parallel and are wired into the `void` play in `ansible/site.yml`. `desktop_sessions_enabled` and `desktop_default_session` in host vars decide which sessions are exposed in `emptty` and which is preselected.
- `profile_desktop_common` owns the shared desktop bootstrap; `profile_desktop_sway` (Wayland/SwayFX) and `profile_desktop_hyprland` (Wayland) install their respective sessions in parallel and are wired into the `void` play in `ansible/site.yml`. `desktop_sessions_enabled` and `desktop_default_session` in host vars decide which sessions are exposed in `emptty` and which is preselected.
- `.emacs.d` is deployed by a dedicated `profile_desktop_common` task tagged `emacs`.
- NTFS filesystem support is provided by `ntfs-3g` in `ansible/inventory/group_vars/void.yml`.
- Void user services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`.
- `ssh-agent` keeps the stable socket `~/.local/state/ssh-agent/socket`.
- Critical session entrypoints:
- `dotfiles/desktop/.xinitrc` (i3 / X11)
- `dotfiles/desktop/.config/sway/config` plus `host.conf` and `session-env` deployed via `host_sway_dotfiles` (sway / Wayland)
- `dotfiles/desktop/.config/hypr/hyprland.conf` plus `host.conf` and `session-env` deployed via `host_hyprland_dotfiles` (Hyprland / Wayland)
- Do not auto-restart `emptty` during playbook runs on active Void desktop hosts; restart it manually from another TTY/SSH session if needed.
- `nymph` is a Void laptop with NVIDIA Optimus, running sway (Wayland) and Hyprland (Wayland); host-specific tasks in `profile_desktop_host/tasks/nymph.yml` handle GRUB NVIDIA cmdline params, `prime-run` wrapper, and the WirePlumber camera priority config. Multi-monitor on X11 is driven by `autorandr`; on sway it is driven by `kanshi` (config deployed via `host_sway_dotfiles`), and on Hyprland by host-specific Hyprland monitor/workspace rules.
- `nymph` is a Void laptop with NVIDIA Optimus, running sway (Wayland) and Hyprland (Wayland); host-specific tasks in `profile_desktop_host/tasks/nymph.yml` handle GRUB NVIDIA cmdline params, `prime-run` wrapper, and the WirePlumber camera priority config. Multi-monitor on sway is driven by `kanshi` (config deployed via `host_sway_dotfiles`), and on Hyprland by host-specific Hyprland monitor/workspace rules.
## Void Package And Dotfile Bucket Rules
The four Void desktop package lists in `ansible/inventory/group_vars/void.yml` are kept disjoint by role:
- `void_packages_base` — system runtime only (init/services, kernel, audio core, networking, filesystem, firewall, hardware daemons, runit logging).
- `desktop_common_packages` — WM-agnostic GUI infra (GTK theme, polkit, keyring, NM-applet, blueman, audio GUI, file manager backend + GVFS, portal, flatpak, printing/scanning).
- `desktop_i3_packages` / `desktop_sway_packages` / `desktop_hyprland_packages` — binaries specific to each session. Cross-WM packages used by both (`dunst`, `rofi`, `alacritty`) are intentionally duplicated in the two lists.
- `desktop_sway_packages` / `desktop_hyprland_packages` — binaries specific to each session. Cross-WM packages used by both (`dunst`, `rofi`, `alacritty`) are intentionally duplicated in the two lists.
`profile_packages` in the same file is cross-distro and is overridden by `group_vars/server.yml` and the workstation group vars; do not move desktop-specific Void entries through it.
The dotfile vars follow the same split: `desktop_common_dotfiles` (in `group_vars/desktop.yml`) carries WM-agnostic GUI config and user scripts (Thunar, mimeapps, GTK theme setup, Udiskie, fontconfig, WirePlumber, mpv, …); `desktop_void_dotfiles` (in `group_vars/void.yml`) is reserved for files that need Void runtime (turnstile services, bash runit/dbus/ssh-agent fragments, `update-turnstile-env`).
## Workstation / Windows Notes
## Workstation Notes
- Native Linux workstation hosts can combine `workstation_host_linux` with an OS-specific dev group.
- `deadalus-fedora` keeps GNOME managed settings in `ansible/inventory/host_vars/deadalus-fedora.yml`.
- Ubuntu workstation follow-up work is still open around YubiKey/GPG/SSH-FIDO2 package verification, GPG signing setup on the YubiKey, and evaluating `ed25519-sk` SSH key generation.
- `workstation_host_windows` runs with `gather_facts: false` and validates PSRP settings plus `windows_package_backend` before role execution.
- Windows taskbar pins are driven by `windows_taskbar_pins` in `ansible/inventory/group_vars/workstation_host_windows.yml`; validate identifiers from a real Windows session before changing them.
## Coding Agent Notes
- Shared agent packages live in `ai_agents_npm_packages` in `ansible/inventory/group_vars/all.yml`.
@@ -92,7 +86,7 @@ The dotfile vars follow the same split: `desktop_common_dotfiles` (in `group_var
- Install local tooling with:
- `python3 -m pip install ansible ansible-lint yamllint shellcheck-py`
- `ansible-galaxy collection install -r ansible/collections/requirements.yml`
- Required collections currently include `ansible.posix`, `ansible.windows`, `community.general`, and `community.windows`.
- Required collections currently include `ansible.posix` and `community.general`.
- `.yamllint` treats `line-length` as a warning at 120 chars and disables `document-start` and `comments-indentation`.
## When Updating Docs

View File

@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## What this repo is
Ansible-driven personal infrastructure as code for Void Linux desktops (`ikaros`, `nymph`), Linux/Windows workstations (`deadalus-*`), and an Ubuntu server (`prometheus`). See `AGENTS.md` for topology and `README.md` for full profile descriptions.
Ansible-driven personal infrastructure as code for Void Linux desktops (`ikaros`, `nymph`), Linux workstations (`deadalus-fedora`, `deadalus-wsl`), and an Ubuntu server (`prometheus`). See `AGENTS.md` for topology and `README.md` for full profile descriptions.
## Validation commands
@@ -15,7 +15,6 @@ ansible-playbook ansible/site.yml --syntax-check
# Dry-run per host
ansible-playbook ansible/site.yml --limit ikaros --check --diff
ansible-playbook ansible/site.yml --limit nymph --check --diff
ansible-playbook ansible/site.yml --limit deadalus-ubuntu --check --diff
ansible-playbook ansible/site.yml --limit deadalus-fedora --check --diff
ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff
ansible-playbook ansible/site.yml --limit prometheus --check --diff
@@ -34,7 +33,7 @@ sh -n scripts/bootstrap_mail.sh && shellcheck scripts/bootstrap_mail.sh
## Architecture
Configuration is composed in layers: `all → OS → profile → host`. Most hosts use `ansible_connection: local`; `deadalus-win` is the PSRP/Windows exception.
Configuration is composed in layers: `all → OS → profile → host`. All hosts use `ansible_connection: local`.
`ansible/site.yml` is the sole orchestration entry point — keep it thin. Implementation belongs in roles under `ansible/roles/`.
@@ -56,7 +55,7 @@ Dotfiles under `dotfiles/` mirror the same layer split: `common/`, `desktop/`, `
- `void_packages_base` — system runtime (init, kernel, audio core, networking, firewall, hw daemons)
- `desktop_common_packages` — WM-agnostic GUI infra (GTK theme, polkit, keyring, portals, flatpak, printing)
- `desktop_i3_packages` / `desktop_sway_packages` — session-specific binaries; cross-WM packages used by both (`dunst`, `rofi`, `alacritty`) are intentionally duplicated
- `desktop_sway_packages` / `desktop_hyprland_packages` — session-specific binaries; cross-WM packages used by both (`dunst`, `rofi`, `alacritty`) are intentionally duplicated
- `profile_packages` — cross-distro; do not move desktop-only Void entries into it
Dotfile var split follows the same logic: `desktop_common_dotfiles` (WM-agnostic), `desktop_void_dotfiles` (Void runtime — turnstile services, bash fragments).

View File

@@ -55,13 +55,13 @@ Il repository è diviso in due componenti principali:
# Macchine gestite
Il repository modella attualmente tre tipologie di profilo e prepara due filoni workstation: Linux nativa e Windows + WSL.
Il repository modella attualmente tre tipologie di profilo, con i filoni workstation Linux nativa e WSL.
Nota sullo stato attuale del playbook principale:
- `ansible/site.yml` applica oggi in automatico il profilo desktop su host Void Linux
- `ansible/site.yml` applica la workstation Linux nativa separando il layer dev comune dal layer host GNOME
- `ansible/site.yml` applica anche il ramo `workstation_host_windows` + `workstation_dev_wsl` per il modello Windows 11 + WSL
- `ansible/site.yml` applica anche il ramo `workstation_dev_wsl` per il modello dev in WSL
- `ansible/site.yml` applica anche il profilo `ubuntu_server` con baseline apt, systemd, dotfiles server e firewall UFW
## Desktop
@@ -90,7 +90,7 @@ Lo stato attuale del profilo desktop include, tra le altre cose:
- pacchetti Void Linux e servizi runit; le liste pacchetti Void desktop sono separate per criterio:
- `void_packages_base` per il runtime sistema (init, kernel, audio core, networking, firewall, hw daemons)
- `desktop_common_packages` per l'infrastruttura GUI WM-agnostic (tema, polkit, keyring, NM-applet, blueman, audio GUI, file manager backend, portal, flatpak, printing/scanning)
- `desktop_i3_packages`, `desktop_sway_packages` e `desktop_hyprland_packages` per i binari specifici di ciascuna sessione
- `desktop_sway_packages` e `desktop_hyprland_packages` per i binari specifici di ciascuna sessione
- `turnstile` per i servizi utente, inclusi `emacs` e `ssh-agent`
- `ssh-agent` con socket stabile condiviso tra shell, SSH ed Emacs in `~/.local/state/ssh-agent/socket`
- `.emacs.d` distribuito da un task dedicato Ansible con tag `emacs`
@@ -98,7 +98,7 @@ Lo stato attuale del profilo desktop include, tra le altre cose:
- Flatpak con remoto Flathub
- GNOME Keyring e bootstrap della posta via script dedicato
- `udiskie` come backend per automount/LUKS
- `autorandr` per profili monitor X11 host-specifici (`nymph` ha profili `dual` e `solo`); sotto sway il multi-monitor è gestito da `kanshi` (config host-specifica in `host_sway_dotfiles` su `nymph`); sotto Hyprland gli override monitor vivono in `host_hyprland_dotfiles`
- multi-monitor: sotto sway è gestito da `kanshi` (config host-specifica in `host_sway_dotfiles` su `nymph`); sotto Hyprland gli override monitor vivono in `host_hyprland_dotfiles`
- override NVIDIA Optimus su `nymph`: parametri kernel GRUB iniettati in modo idempotente in `GRUB_CMDLINE_LINUX`, wrapper `prime-run` e config WirePlumber per priorità telecamera
---
@@ -107,9 +107,8 @@ Lo stato attuale del profilo desktop include, tra le altre cose:
Sistemi operativi supportati:
- Ubuntu LTS nativa
- Fedora Workstation nativa
- Windows 11 host + Ubuntu WSL
- Ubuntu WSL
Desktop environment host Linux:
@@ -117,9 +116,8 @@ Desktop environment host Linux:
Macchine attuali:
- `deadalus-ubuntu` come workstation Ubuntu nativa
- `deadalus-fedora` come workstation Fedora nativa
- supporto attivo per host Windows 11 + WSL tramite `deadalus-win` e `deadalus-wsl`
- `deadalus-wsl` come ambiente dev Ubuntu in WSL
Questo profilo è pensato per sviluppo e lavoro, con separazione tra layer host e layer dev.
@@ -127,13 +125,12 @@ Nel modello Ansible usato qui, un singolo inventory host puo appartenere intenzi
Il profilo workstation e agganciato al playbook principale e ora distingue:
- layer dev Ubuntu condiviso tra workstation Linux nativa e Ubuntu in WSL
- layer dev Fedora nativo parallelo a Ubuntu
- layer dev Ubuntu condiviso tra WSL e server
- layer dev Fedora nativo
- layer host Linux GNOME
- layer host Windows 11 con bootstrap WSL, remoting `PSRP` su `HTTPS/5986`, gestione app via `winget` con backend configurabile e VS Code lato Windows
- layer WSL dedicato per sviluppo con `systemd`
Per esempio, lo stesso host Linux puo stare in `workstation_host_linux` e in `workstation_dev_fedora` oppure `workstation_dev_ubuntu`, a seconda del layering che vuoi comporre.
Per esempio, lo stesso host Linux puo stare in `workstation_host_linux` e in `workstation_dev_fedora`, a seconda del layering che vuoi comporre.
Lo stato attuale del profilo workstation include:
@@ -141,42 +138,18 @@ Lo stato attuale del profilo workstation include:
- installazione pacchetti base Fedora via dnf per il ramo workstation nativo
- installazione e configurazione di Docker dal repository ufficiale
- gestione dei dotfiles workstation e rendering dei template dev condivisi
- installazione di Google Chrome su Ubuntu e Fedora, `VS Code` su Fedora via repository RPM Microsoft, `IntelliJ IDEA Ultimate` su Fedora via COPR RPM, e applicazioni workstation residue su Fedora via Flatpak
- installazione di applicazioni workstation su Ubuntu nativa via Snap, oltre alle estensioni GNOME sul solo host Linux nativo
- configurazione del ramo Windows 11 host con app installate dal playbook via `winget`, con backend predefinito `winget_psrp`, tema scuro, pin della taskbar gestiti via policy locale e profilo predefinito di Windows Terminal impostato su `Ubuntu`
- installazione di Google Chrome su Fedora, `VS Code` su Fedora via repository RPM Microsoft, `IntelliJ IDEA Ultimate` su Fedora via COPR RPM, e applicazioni workstation residue su Fedora via Flatpak
- estensioni GNOME sul solo host Linux nativo
- preparazione del ramo WSL Ubuntu con `systemd` per il toolchain di sviluppo
- attivazione del firewall UFW su Ubuntu nativa e `firewalld` su Fedora nativa
- attivazione del firewall `firewalld` su Fedora nativa
- gestione di `gsettings` GNOME host-specifici su `deadalus-fedora`, inclusi shell, Files/Nautilus, file chooser GTK e GNOME Text Editor, allineati allo stato reale della macchina
Workflow Windows + WSL previsto:
Workflow WSL previsto:
Prima di eseguire il bootstrap Windows, apri PowerShell come amministratore e verifica la policy di esecuzione:
```powershell
Get-ExecutionPolicy -List
```
Se necessario, abilita l'esecuzione degli script per l'utente corrente:
```powershell
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
```
Se Windows ha bloccato il file di bootstrap, sbloccalo esplicitamente:
```powershell
Unblock-File .\scripts\bootstrap_windows_workstation.ps1
```
1. eseguire `scripts/bootstrap_windows_workstation.ps1` su Windows come amministratore
2. riavviare Windows se richiesto dalle feature WSL
3. avviare Ubuntu WSL almeno una volta e completare la creazione dell'utente Linux
4. installare Ansible dentro WSL Ubuntu
5. lanciare il playbook da WSL su `deadalus-wsl` per configurare l'ambiente dev locale
6. lanciare da WSL anche il playbook su `deadalus-win` via `psrp` per configurare l'host Windows; per default il backend pacchetti Windows e `winget_psrp`
7. usare VS Code con le estensioni Remote (`WSL`, `SSH`, `Dev Containers`) dal lato Windows
Per il remoting Windows il repository usa di default `PSRP` con `Negotiate` su `HTTPS/5986`. L'utente di default puo essere un `MicrosoftAccount\...`, con host, utente e password forniti via vault o extra vars. Il backend pacchetti Windows e configurabile con `windows_package_backend` oppure `vault_windows_package_backend`; il default e `winget_psrp`.
1. avviare Ubuntu WSL almeno una volta e completare la creazione dell'utente Linux
2. installare Ansible dentro WSL Ubuntu
3. lanciare il playbook da WSL su `deadalus-wsl` per configurare l'ambiente dev locale
4. usare VS Code con le estensioni Remote (`WSL`, `SSH`, `Dev Containers`) dal lato Windows
---
@@ -274,14 +247,12 @@ I principali ruoli attualmente presenti sono:
| services_runit | gestione servizi runit |
| services_systemd | gestione servizi systemd |
| profile_desktop_common | bootstrap desktop Void condiviso |
| profile_desktop_i3 | sessione desktop i3 (X11) |
| profile_desktop_sway | sessione desktop sway / SwayFX (Wayland) |
| profile_desktop_hyprland | sessione desktop Hyprland (Wayland) |
| profile_desktop_host | override desktop specifici per host |
| profile_workstation_dev_common | configurazione dev workstation condivisa |
| profile_workstation_gnome | configurazione host workstation GNOME |
| profile_workstation_dev_wsl | configurazione WSL Ubuntu per sviluppo |
| profile_workstation_host_windows | configurazione host Windows 11 workstation |
| profile_server | configurazione server |
| dotfiles_common | distribuzione dotfiles comuni |
| dotfiles | distribuzione configurazioni utente |
@@ -290,25 +261,22 @@ I principali ruoli attualmente presenti sono:
# Stato attuale del playbook principale
Il playbook `ansible/site.yml` e attualmente composto da sette blocchi:
Il playbook `ansible/site.yml` e attualmente composto da sei blocchi:
```text
all:!workstation_host_windows -> dotfiles_common
void -> packages_void + services_runit + profile_desktop_common + profile_desktop_i3 + profile_desktop_sway + profile_desktop_hyprland + profile_desktop_host
workstation_dev_ubuntu -> packages_ubuntu + services_systemd + profile_workstation_dev_common
all -> dotfiles_common
void -> packages_void + services_runit + profile_desktop_common + profile_desktop_sway + profile_desktop_hyprland + profile_desktop_host
workstation_dev_fedora -> packages_fedora + services_systemd + profile_workstation_dev_common
workstation_host_linux -> profile_workstation_gnome
workstation_dev_wsl -> packages_ubuntu + services_systemd + profile_workstation_dev_common + profile_workstation_dev_wsl
workstation_host_windows -> profile_workstation_host_windows
ubuntu_server -> packages_ubuntu + services_systemd + profile_server
```
Questo significa che, allo stato attuale:
- i desktop Void (`ikaros`, `nymph`) restano il target operativo piu completo
- la workstation Ubuntu (`deadalus-ubuntu`) e gestita separando ambiente dev e layer host GNOME
- la workstation Fedora (`deadalus-fedora`) usa lo stesso principio di composizione a gruppi con il ramo Fedora dedicato e con `gsettings` host-specifici dichiarati in inventory
- il ramo Windows + WSL e predisposto con bootstrap PowerShell e play Windows/WSL dedicati
- la workstation Fedora (`deadalus-fedora`) usa il principio di composizione a gruppi con il ramo Fedora dedicato e con `gsettings` host-specifici dichiarati in inventory
- il ramo WSL (`deadalus-wsl`) e predisposto con play dev dedicato
- il server Ubuntu (`prometheus`) e gestito con pacchetti, servizi, dotfiles server e firewall
- lo stack container server include `navidrome`, `postgres`, `gitea`, `nginx-proxy-manager` e `syncthing`, con GUI Syncthing raggiungibile tramite la rete Docker `web`
@@ -366,7 +334,6 @@ Gestione segreti:
- `secrets/vault.yml.example` funge da template/esempio
- se `secrets/vault.yml` non e presente, il playbook continua comunque senza caricare variabili locali opzionali
- se `secrets/.vault_pass.gpg` esiste viene usato automaticamente per sbloccare i vault tramite `gpg`; in alternativa resta supportato `secrets/.vault_pass` come fallback legacy locale; se nessuno dei due file esiste Ansible richiede la password in modo interattivo
- per il ramo Windows puoi anche definire `vault_windows_package_backend`, con valori supportati `winget_psrp` e `winget_wsl_local`; il default e `winget_psrp`
---
@@ -381,12 +348,10 @@ ansible-playbook ansible/site.yml
Allo stato attuale questo comando:
- distribuisce i dotfiles comuni a tutti gli host
- per gli host Void applica bootstrap desktop condiviso, sessione i3 e override specifici per host
- per `workstation_dev_ubuntu` applica pacchetti Ubuntu, servizi systemd e profilo dev comune
- per gli host Void applica bootstrap desktop condiviso, sessioni sway/Hyprland e override specifici per host
- per `workstation_dev_fedora` applica pacchetti Fedora, servizi systemd e profilo dev comune
- per `workstation_host_linux` applica il layer host Linux GNOME
- per `workstation_dev_wsl` applica pacchetti Ubuntu, servizi systemd, profilo dev comune e tweak WSL dedicati
- per `workstation_host_windows` applica il layer host Windows 11 via PSRP, con installazione pacchetti Windows eseguita di default tramite `winget_psrp`
- per gli host `ubuntu_server` applica pacchetti Ubuntu, servizi systemd, profilo server, UFW, dotfiles e template dedicati
- non riavvia automaticamente `emptty`; le modifiche al display manager vanno applicate manualmente da SSH o da una TTY separata
- carica `secrets/vault.yml` solo se presente
@@ -398,7 +363,6 @@ Per validare prima di applicare:
ansible-playbook ansible/site.yml --syntax-check
ansible-playbook ansible/site.yml --limit ikaros --check --diff
ansible-playbook ansible/site.yml --limit nymph --check --diff
ansible-playbook ansible/site.yml --limit deadalus-ubuntu --check --diff
ansible-playbook ansible/site.yml --limit deadalus-fedora --check --diff
ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff
ansible-playbook ansible/site.yml --limit prometheus --check --diff
@@ -435,7 +399,7 @@ Allo stato attuale `ansible/site.yml` espone questi tag:
| Tag | Scopo | Ambito principale |
| --- | --- | --- |
| `always` | pre-task sempre eseguiti, inclusi caricamento vault e validazioni preliminari | common, Windows |
| `always` | pre-task sempre eseguiti, inclusi caricamento vault e validazioni preliminari | common |
| `dotfiles` | distribuzione/configurazione dotfiles | tutti i profili |
| `dotfiles:common` | dotfiles comuni condivisi | common, workstation, server |
| `dotfiles:desktop` | dotfiles desktop | desktop Void |
@@ -444,20 +408,19 @@ Allo stato attuale `ansible/site.yml` espone questi tag:
| `dotfiles:workstation` | dotfiles dedicati alle workstation | workstation Linux, WSL |
| `emptty` | gestione display manager `emptty` | desktop Void |
| `gnome` | configurazione host GNOME | workstation host Linux, parte desktop |
| `i3` | sessione/configurazione i3 (X11) | desktop Void |
| `sway` | sessione/configurazione sway / SwayFX (Wayland) | desktop Void |
| `hyprland` | sessione/configurazione Hyprland (Wayland) | desktop Void |
| `npm` | installazione pacchetti npm globali | desktop Void, workstation Linux, WSL |
| `nvidia` | componenti NVIDIA desktop | desktop Void |
| `packages` | installazione e aggiornamento pacchetti | tutti i profili |
| `services` | gestione servizi runit/systemd/Windows | tutti i profili |
| `vscode` | installazione/configurazione VS Code | Fedora, host Linux, Windows |
| `wsl` | bootstrap e configurazione WSL | WSL, Windows |
| `services` | gestione servizi runit/systemd | tutti i profili |
| `vscode` | installazione/configurazione VS Code | Fedora, host Linux |
| `wsl` | bootstrap e configurazione WSL | WSL |
Esempi pratici:
```bash
ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,i3 --check --diff
ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,sway --check --diff
ansible-playbook ansible/site.yml --limit ikaros --tags sway,portal --check --diff
ansible-playbook ansible/site.yml --limit ikaros --tags hyprland,portal --check --diff
ansible-playbook ansible/site.yml --limit deadalus-fedora --tags packages,vscode --check --diff

View File

@@ -1,6 +1,4 @@
---
collections:
- name: ansible.posix
- name: ansible.windows
- name: community.general
- name: community.windows

View File

@@ -140,44 +140,6 @@ desktop_emacs_dotfiles:
dest: .emacs.d/
mode: preserve
desktop_i3_dotfiles:
- name: i3 config
src: .config/i3/
dest: .config/i3/
mode: preserve
- name: dunst config
src: .config/dunst/
dest: .config/dunst/
mode: preserve
- name: i3blocks config
src: .config/i3blocks/
dest: .config/i3blocks/
mode: preserve
- name: rofi config
src: .config/rofi/
dest: .config/rofi/
mode: preserve
- name: picom config
src: .config/picom/picom.conf
dest: .config/picom/picom.conf
mode: "0644"
- name: polybar config
src: .config/polybar/config.ini
dest: .config/polybar/config.ini
mode: "0644"
- name: polybar launcher
src: .config/polybar/launch.sh
dest: .config/polybar/launch.sh
mode: "0755"
- name: alacritty config
src: .config/alacritty/
dest: .config/alacritty/
mode: preserve
- name: .xinitrc
src: .xinitrc
dest: .xinitrc
mode: "0644"
desktop_sway_dotfiles:
- name: alacritty config
src: .config/alacritty/

View File

@@ -3,13 +3,6 @@ void_xbps_repositories:
- name: hyprland-void
url: https://raw.githubusercontent.com/sofijacom/hyprland-void/repository-x86_64-glibc
desktop_void_source_tools:
- name: st
repo: https://codeberg.org/fscotto/st
build_cmd: make
binary_name: st
install_name: st
void_packages_base:
- 7zip
- NetworkManager
@@ -133,31 +126,6 @@ desktop_common_packages:
- xdg-user-dirs
- xfce-polkit
desktop_i3_packages:
- arandr
- autorandr
- feh
- i3
- i3blocks
- i3blocks-blocklets
- i3lock-color
- i3status
- dunst
- picom
- polybar
- rofi
- scrot
- setxkbmap
- volumeicon
- xclip
- xfce4-clipman-plugin
- xfce4-screenshooter
- xkbutils
- xorg-fonts
- xorg-minimal
- xss-lock
- xdotool
desktop_sway_packages:
- cliphist
- dunst

View File

@@ -19,9 +19,7 @@ workstation_removed_snap_packages: []
workstation_snap_packages:
- name: glab
classic: true
workstation_dev_wsl_python_packages:
- pypsrp
- pyspnego
workstation_dev_wsl_python_packages: []
workstation_wsl_systemd_enabled: true
workstation_dev_wsl_dotfiles:
- src: .gnupg/gpg-agent.conf

View File

@@ -1,71 +0,0 @@
---
ansible_connection: psrp
ansible_psrp_auth: negotiate
ansible_psrp_cert_validation: ignore
ansible_psrp_protocol: https
ansible_port: 5986
ansible_shell_type: powershell
windows_enable_dark_theme: true
windows_hide_taskbar_search: true
windows_hide_taskbar_widgets: true
windows_terminal_default_profile_name: Ubuntu
windows_taskbar_layout_directory: 'C:\ProgramData\Infra\Windows'
windows_taskbar_layout_path: '{{ windows_taskbar_layout_directory }}\taskbar-layout.xml'
windows_taskbar_reapply_every_logon: false
windows_taskbar_pins:
- type: desktop_application_id
id: Chrome
- type: desktop_application_id
id: Microsoft.Windows.Explorer
- type: app_user_model_id
id: Microsoft.OutlookForWindows_8wekyb3d8bbwe!Microsoft.OutlookforWindows
- type: app_user_model_id
id: MSTeams_8wekyb3d8bbwe!MSTeams
- type: app_user_model_id
id: 5319275A.WhatsAppDesktop_cv1g1gvanyjgm!App
- type: desktop_application_id
id: Telegram.TelegramDesktop
- type: desktop_application_id
id: Microsoft.VisualStudioCode
- type: desktop_application_link_path
path: '%APPDATA%\Microsoft\Windows\Start Menu\Programs\JetBrains Toolbox\IntelliJ IDEA Ultimate.lnk'
- type: desktop_application_id
id: com.squirrel.Postman.Postman
- type: app_user_model_id
id: Microsoft.WindowsTerminal_8wekyb3d8bbwe!App
- type: desktop_application_link_path
path: '%APPDATA%\Microsoft\Windows\Start Menu\Programs\DBeaver Community\DBeaver.lnk'
windows_winget_packages:
- id: 7zip.7zip
name: 7-Zip
- id: Adobe.Acrobat.Reader.64-bit
name: Adobe Acrobat Reader
- id: DBeaver.DBeaver.Community
name: DBeaver Community
- id: Google.Chrome
name: Google Chrome
- id: JetBrains.IntelliJIDEA.Ultimate
name: IntelliJ IDEA Ultimate
- id: Logitech.OptionsPlus
name: Logitech Options+
- id: Microsoft.VisualStudioCode
name: Visual Studio Code
- id: Microsoft.WindowsTerminal
name: Windows Terminal
- id: Postman.Postman
name: Postman
- id: Telegram.TelegramDesktop
name: Telegram Desktop
- id: 9NKSQGP7F2NH
name: WhatsApp
source: msstore
windows_vscode_extensions:
- ms-vscode-remote.remote-containers
- ms-vscode-remote.remote-ssh
- ms-vscode-remote.remote-wsl
windows_wsl_distribution_name: Ubuntu

View File

@@ -1,319 +0,0 @@
---
hostname: deadalus-ubuntu
host_packages: []
host_enabled_services: []
workstation_host_vscode_extensions:
- ms-vscode-remote.remote-containers
- ms-vscode-remote.remote-ssh
- ms-azuretools.vscode-docker
- redhat.vscode-yaml
- redhat.ansible
workstation_gnome_managed_settings:
- schema: org.gnome.shell
key: favorite-apps
value: "['google-chrome.desktop', 'org.gnome.Nautilus.desktop', 'spotify_spotify.desktop', 'thunderbird_thunderbird.desktop', 'telegram-desktop_telegram-desktop.desktop', 'code_code.desktop', 'intellij-idea-ultimate_intellij-idea-ultimate.desktop', 'dbeaver-ce_dbeaver-ce.desktop', 'postman_postman.desktop', 'org.gnome.Ptyxis.desktop']"
- schema: org.gnome.shell
key: app-picker-layout
value: "[{'Utilities': <{'position': <0>}>, 'System': <{'position': <1>}>, 'a3b499f3-e2cc-40ac-9145-7db9c827dff2': <{'position': <2>}>, 'org.gnome.Calculator.desktop': <{'position': <3>}>, 'com.mattjakeman.ExtensionManager.desktop': <{'position': <4>}>, 'org.gnome.clocks.desktop': <{'position': <5>}>, 'htop.desktop': <{'position': <6>}>, 'org.gnome.Characters.desktop': <{'position': <7>}>, 'gnome-language-selector.desktop': <{'position': <8>}>, 'org.gnome.Meld.desktop': <{'position': <9>}>, 'net.nokyan.Resources.desktop': <{'position': <10>}>, 'org.gnome.TextEditor.desktop': <{'position': <11>}>, 'org.gnome.tweaks.desktop': <{'position': <12>}>, 'vim.desktop': <{'position': <13>}>, 'snap-store_snap-store.desktop': <{'position': <14>}>, 'org.gnome.Yelp.desktop': <{'position': <15>}>}]"
- schema: org.gnome.desktop.app-folders
key: folder-children
value: "['System', 'Utilities', 'YaST', 'Pardus', 'a3b499f3-e2cc-40ac-9145-7db9c827dff2']"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/System/
key: name
value: "'X-GNOME-Shell-System.directory'"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/System/
key: translate
value: "true"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/System/
key: categories
value: "@as []"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/System/
key: apps
value: "['nm-connection-editor.desktop', 'org.gnome.baobab.desktop', 'org.gnome.DiskUtility.desktop', 'im-config.desktop', 'org.gnome.Logs.desktop', 'org.gnome.Sysprof.desktop', 'gufw.desktop', 'firmware-updater_firmware-updater.desktop', 'org.gnome.Settings.desktop', 'update-manager.desktop', 'desktop-security-center_desktop-security-center.desktop']"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/Utilities/
key: name
value: "'X-GNOME-Shell-Utilities.directory'"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/Utilities/
key: translate
value: "true"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/Utilities/
key: categories
value: "@as []"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/Utilities/
key: apps
value: "['org.gnome.Papers.desktop', 'org.gnome.font-viewer.desktop', 'org.gnome.Loupe.desktop', 'org.gnome.seahorse.Application.desktop']"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/YaST/
key: name
value: "'suse-yast.directory'"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/YaST/
key: translate
value: "true"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/YaST/
key: categories
value: "['X-SuSE-YaST']"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/YaST/
key: apps
value: "@as []"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/Pardus/
key: name
value: "'X-Pardus-Apps.directory'"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/Pardus/
key: translate
value: "true"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/Pardus/
key: categories
value: "['X-Pardus-Apps']"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/Pardus/
key: apps
value: "@as []"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/a3b499f3-e2cc-40ac-9145-7db9c827dff2/
key: name
value: "'Office'"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/a3b499f3-e2cc-40ac-9145-7db9c827dff2/
key: translate
value: "false"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/a3b499f3-e2cc-40ac-9145-7db9c827dff2/
key: categories
value: "@as []"
- schema: org.gnome.desktop.app-folders.folder
path: /org/gnome/desktop/app-folders/folders/a3b499f3-e2cc-40ac-9145-7db9c827dff2/
key: apps
value: "['libreoffice-calc.desktop', 'libreoffice-base.desktop', 'libreoffice-draw.desktop', 'libreoffice-impress.desktop', 'libreoffice-math.desktop', 'libreoffice-writer.desktop', 'xournalpp_xournalpp.desktop', 'libreoffice-startcenter.desktop', 'pdfarranger_pdfarranger.desktop']"
- schema: org.gnome.desktop.input-sources
key: sources
value: "[('xkb', 'us')]"
- schema: org.gnome.desktop.interface
key: accent-color
value: "'orange'"
- schema: org.gnome.desktop.interface
key: clock-format
value: "'24h'"
- schema: org.gnome.desktop.interface
key: clock-show-date
value: "true"
- schema: org.gnome.desktop.interface
key: color-scheme
value: "'prefer-dark'"
- schema: org.gnome.desktop.interface
key: cursor-theme
value: "'Adwaita'"
- schema: org.gnome.desktop.interface
key: document-font-name
value: "'Adwaita Sans 12'"
- schema: org.gnome.desktop.interface
key: font-name
value: "'Adwaita Sans 11'"
- schema: org.gnome.desktop.interface
key: gtk-theme
value: "'Yaru-dark'"
- schema: org.gnome.desktop.interface
key: icon-theme
value: "'Yaru-dark'"
- schema: org.gnome.desktop.interface
key: monospace-font-name
value: "'Ubuntu Sans Mono 11'"
- schema: org.gnome.desktop.interface
key: show-battery-percentage
value: "false"
- schema: org.gnome.desktop.interface
key: text-scaling-factor
value: "1.0"
- schema: org.gnome.desktop.privacy
key: report-technical-problems
value: "false"
- schema: org.gnome.desktop.wm.preferences
key: button-layout
value: "'appmenu:close'"
- schema: org.gnome.desktop.wm.preferences
key: focus-mode
value: "'click'"
- schema: org.gnome.desktop.wm.preferences
key: focus-new-windows
value: "'smart'"
- schema: org.gnome.desktop.wm.preferences
key: num-workspaces
value: "4"
- schema: org.gnome.nautilus.preferences
key: click-policy
value: "'double'"
- schema: org.gnome.nautilus.preferences
key: date-time-format
value: "'simple'"
- schema: org.gnome.nautilus.preferences
key: default-folder-viewer
value: "'icon-view'"
- schema: org.gnome.nautilus.preferences
key: default-sort-order
value: "'name'"
- schema: org.gnome.nautilus.preferences
key: recursive-search
value: "'local-only'"
- schema: org.gnome.nautilus.preferences
key: show-create-link
value: "true"
- schema: org.gnome.nautilus.preferences
key: show-delete-permanently
value: "true"
- schema: org.gnome.nautilus.preferences
key: show-directory-item-counts
value: "'local-only'"
- schema: org.gnome.nautilus.preferences
key: show-hidden-files
value: "false"
- schema: org.gnome.nautilus.preferences
key: show-image-thumbnails
value: "'local-only'"
- schema: org.gnome.nautilus.preferences
key: thumbnail-limit
value: "uint64 50"
- schema: org.gnome.nautilus.icon-view
key: captions
value: "['none', 'none', 'none']"
- schema: org.gnome.nautilus.icon-view
key: default-zoom-level
value: "'medium'"
- schema: org.gtk.gtk4.Settings.FileChooser
key: clock-format
value: "'24h'"
- schema: org.gtk.gtk4.Settings.FileChooser
key: date-format
value: "'regular'"
- schema: org.gtk.gtk4.Settings.FileChooser
key: location-mode
value: "'path-bar'"
- schema: org.gtk.gtk4.Settings.FileChooser
key: show-hidden
value: "false"
- schema: org.gtk.gtk4.Settings.FileChooser
key: show-size-column
value: "true"
- schema: org.gtk.gtk4.Settings.FileChooser
key: show-type-column
value: "true"
- schema: org.gtk.gtk4.Settings.FileChooser
key: sort-column
value: "'name'"
- schema: org.gtk.gtk4.Settings.FileChooser
key: sort-directories-first
value: "true"
- schema: org.gtk.gtk4.Settings.FileChooser
key: sort-order
value: "'ascending'"
- schema: org.gtk.gtk4.Settings.FileChooser
key: startup-mode
value: "'recent'"
- schema: org.gtk.gtk4.Settings.FileChooser
key: type-format
value: "'category'"
- schema: org.gtk.gtk4.Settings.FileChooser
key: view-type
value: "'list'"
- schema: org.gnome.settings-daemon.plugins.color
key: night-light-schedule-automatic
value: "false"
- schema: org.gnome.settings-daemon.plugins.power
key: sleep-inactive-ac-timeout
value: "3600"
- schema: org.gnome.settings-daemon.plugins.power
key: sleep-inactive-ac-type
value: "'nothing'"
- schema: org.gnome.system.location
key: enabled
value: "false"
- schema: org.gnome.TextEditor
key: auto-indent
value: "true"
- schema: org.gnome.TextEditor
key: auto-save-delay
value: "uint32 3"
- schema: org.gnome.TextEditor
key: custom-font
value: "'Monospace 11'"
- schema: org.gnome.TextEditor
key: discover-settings
value: "true"
- schema: org.gnome.TextEditor
key: draw-spaces
value: "@as []"
- schema: org.gnome.TextEditor
key: enable-snippets
value: "false"
- schema: org.gnome.TextEditor
key: highlight-current-line
value: "false"
- schema: org.gnome.TextEditor
key: highlight-matching-brackets
value: "true"
- schema: org.gnome.TextEditor
key: indent-style
value: "'tab'"
- schema: org.gnome.TextEditor
key: indent-width
value: "-1"
- schema: org.gnome.TextEditor
key: keybindings
value: "'default'"
- schema: org.gnome.TextEditor
key: line-height
value: "1.2"
- schema: org.gnome.TextEditor
key: recolor-window
value: "true"
- schema: org.gnome.TextEditor
key: restore-session
value: "true"
- schema: org.gnome.TextEditor
key: right-margin-position
value: "uint32 80"
- schema: org.gnome.TextEditor
key: show-grid
value: "false"
- schema: org.gnome.TextEditor
key: show-line-numbers
value: "false"
- schema: org.gnome.TextEditor
key: show-map
value: "false"
- schema: org.gnome.TextEditor
key: show-right-margin
value: "false"
- schema: org.gnome.TextEditor
key: spellcheck
value: "true"
- schema: org.gnome.TextEditor
key: style-scheme
value: "'Adwaita'"
- schema: org.gnome.TextEditor
key: style-variant
value: "'follow'"
- schema: org.gnome.TextEditor
key: tab-width
value: "uint32 8"
- schema: org.gnome.TextEditor
key: use-system-font
value: "true"
- schema: org.gnome.TextEditor
key: wrap-text
value: "true"

View File

@@ -1,2 +0,0 @@
---
hostname: deadalus-win

View File

@@ -33,10 +33,5 @@ host_sshd_allow_users:
host_authorized_ssh_keys: "{{ vault_ikaros_authorized_ssh_keys | default([]) }}"
host_i3_dotfiles:
- src: .config/autorandr/
dest: .config/autorandr/
mode: preserve
host_enabled_services:
- sshd

View File

@@ -24,14 +24,6 @@ host_packages:
host_enabled_services:
- tlp
host_i3_dotfiles:
- src: .config/autorandr/
dest: .config/autorandr/
mode: preserve
- src: .config/wireplumber/wireplumber.conf.d/60-camera-priority.conf
dest: .config/wireplumber/wireplumber.conf.d/60-camera-priority.conf
mode: "0644"
host_sway_dotfiles:
- src: .config/sway/host.conf
dest: .config/sway/host.conf

View File

@@ -17,7 +17,6 @@ all:
ubuntu:
children:
ubuntu_workstation:
workstation_dev_wsl:
ubuntu_server:
@@ -33,11 +32,9 @@ all:
workstation_host:
children:
workstation_host_linux:
workstation_host_windows:
workstation_dev:
children:
workstation_dev_ubuntu:
workstation_dev_fedora:
workstation_dev_wsl:
@@ -45,11 +42,6 @@ all:
children:
ubuntu_server:
ubuntu_workstation:
hosts:
deadalus-ubuntu:
ansible_connection: local
fedora_workstation:
hosts:
deadalus-fedora:
@@ -57,25 +49,14 @@ all:
workstation_host_linux:
hosts:
deadalus-ubuntu:
ansible_connection: local
deadalus-fedora:
ansible_connection: local
workstation_dev_ubuntu:
hosts:
deadalus-ubuntu:
ansible_connection: local
workstation_dev_fedora:
hosts:
deadalus-fedora:
ansible_connection: local
workstation_host_windows:
hosts:
deadalus-win:
workstation_dev_wsl:
hosts:
deadalus-wsl:

View File

@@ -115,11 +115,6 @@
else []
)
+ (desktop_common_packages | default([]))
+ (
(desktop_i3_packages | default([]))
if 'i3' in (desktop_sessions_enabled | default([]))
else []
)
+ (host_packages | default([]))
)
| difference(

View File

@@ -56,11 +56,6 @@
+ (void_packages_base | default([]))
+ (profile_packages | default([]))
+ (desktop_common_packages | default([]))
+ (
(desktop_i3_packages | default([]))
if 'i3' in (desktop_sessions_enabled | default([]))
else []
)
+ (
(desktop_sway_packages | default([]))
if 'sway' in (desktop_sessions_enabled | default([]))
@@ -83,4 +78,4 @@
community.general.xbps:
name: "{{ host_packages_absent | default([]) }}"
state: absent
when: (host_packages_absent | default([])) | length > 0
when: (host_packages_absent | default([])) | length > 0

View File

@@ -4,21 +4,6 @@
ansible.builtin.include_tasks: nymph.yml
when: hostname == 'nymph'
- name: Copy host-specific i3 dotfiles
tags: [dotfiles, dotfiles:desktop, dotfiles:host, i3]
ansible.builtin.copy:
src: "{{ playbook_dir }}/../dotfiles/{{ hostname }}/{{ item.src }}"
dest: "{{ user_home }}/{{ item.dest }}"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "{{ item.mode }}"
loop: "{{ host_i3_dotfiles | default([]) }}"
loop_control:
label: "{{ item.dest }}"
when:
- "'i3' in (desktop_sessions_enabled | default([]))"
- (host_i3_dotfiles | default([])) | length > 0
- name: Copy host-specific sway dotfiles
tags: [dotfiles, dotfiles:desktop, dotfiles:host, sway]
ansible.builtin.copy:

View File

@@ -53,11 +53,3 @@
group: "{{ user_group }}"
mode: "0755"
force: false
- name: Wrap alacritty with prime-run for NVIDIA PRIME offload
tags: [nvidia, dotfiles, dotfiles:desktop, dotfiles:host]
ansible.builtin.lineinfile:
path: "{{ user_home }}/.config/i3/config"
regexp: '^bindsym \$mod\+Return exec --no-startup-id /usr/bin/alacritty'
line: 'bindsym $mod+Return exec --no-startup-id ~/.local/bin/prime-run /usr/bin/alacritty'
when: "'i3' in (desktop_sessions_enabled | default([]))"

View File

@@ -1,8 +0,0 @@
[Desktop Entry]
Name=i3
Comment=improved dynamic tiling window manager
Exec=i3
TryExec=i3
Type=Application
DesktopNames=i3
Keywords=tiling;wm;windowmanager;window;manager;

View File

@@ -1,41 +0,0 @@
---
- name: Ensure i3 config directories exist
tags: [dotfiles, dotfiles:desktop, i3]
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0755"
loop:
- "{{ user_home }}/.config/alacritty"
- "{{ user_home }}/.config/dunst"
- "{{ user_home }}/.config/i3"
- "{{ user_home }}/.config/i3blocks"
- "{{ user_home }}/.config/picom"
- "{{ user_home }}/.config/polybar"
- "{{ user_home }}/.config/rofi"
when: "'i3' in (desktop_sessions_enabled | default([]))"
- name: Install allowed emptty X11 sessions
tags: [packages, services, emptty, i3]
ansible.builtin.copy:
src: i3.desktop
dest: /etc/emptty/xsessions/i3.desktop
owner: root
group: root
mode: "0644"
when: "'i3' in (desktop_sessions_enabled | default([]))"
- name: Copy i3 desktop dotfiles
tags: [dotfiles, dotfiles:desktop, i3]
ansible.builtin.copy:
src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}"
dest: "{{ user_home }}/{{ item.dest }}"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "{{ item.mode }}"
loop: "{{ desktop_i3_dotfiles | default([]) }}"
loop_control:
label: "{{ item.dest }}"
when: "'i3' in (desktop_sessions_enabled | default([]))"

View File

@@ -1,411 +0,0 @@
---
- name: Enable required Windows features for WSL
tags: [packages, services, wsl]
ansible.windows.win_optional_feature:
name:
- Microsoft-Windows-Subsystem-Linux
- VirtualMachinePlatform
state: present
include_parent: true
- name: Gather Windows host version details
tags: [packages]
ansible.windows.win_powershell:
script: |
$os = Get-ComputerInfo
$buildNumber = [int]$os.OsBuildNumber
$Ansible.Result = @{
product_name = $os.WindowsProductName
build_number = $buildNumber
is_windows_11 = $buildNumber -ge 22000
}
$Ansible.Changed = $false
register: windows_host_version_state
- name: Fail when Windows host is not Windows 11
tags: [packages]
ansible.builtin.fail:
msg: >-
workstation_host_windows is supported only on Windows 11. Detected {{ windows_host_version_state.result.product_name }}
build {{ windows_host_version_state.result.build_number }}.
when: not (windows_host_version_state.result.is_windows_11 | default(false))
- name: Enable dark mode for Windows apps
tags: [packages]
ansible.windows.win_regedit:
path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize
name: AppsUseLightTheme
data: 0
type: dword
register: windows_apps_dark_mode_state
when: windows_enable_dark_theme | default(false)
- name: Enable dark mode for Windows system surfaces
tags: [packages]
ansible.windows.win_regedit:
path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize
name: SystemUsesLightTheme
data: 0
type: dword
register: windows_system_dark_mode_state
when: windows_enable_dark_theme | default(false)
- name: Hide Windows taskbar search box
tags: [packages]
ansible.windows.win_regedit:
path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Search
name: SearchboxTaskbarMode
data: 0
type: dword
register: windows_taskbar_search_state
when: windows_hide_taskbar_search | default(false)
- name: Hide Windows 11 taskbar widgets
tags: [packages]
ansible.windows.win_regedit:
path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
name: TaskbarDa
data: 0
type: dword
register: windows_11_widgets_state
when: windows_hide_taskbar_widgets | default(false)
- name: Disable Windows 11 widgets via policy
tags: [packages]
ansible.windows.win_regedit:
path: HKLM:\SOFTWARE\Policies\Microsoft\Dsh
name: AllowNewsAndInterests
data: 0
type: dword
register: windows_11_widgets_policy_state
when: windows_hide_taskbar_widgets | default(false)
- name: Note when Windows shell settings may require sign out
tags: [packages]
ansible.builtin.debug:
msg: >-
Windows shell appearance settings changed. Sign out and back in, or restart explorer.exe,
if taskbar or theme updates do not appear immediately. Windows 11 widget policy changes can require
signing out before the widget button disappears from the taskbar.
changed_when: false
when: >-
(windows_apps_dark_mode_state is changed)
or (windows_system_dark_mode_state is changed)
or (windows_taskbar_search_state is changed)
or (windows_11_widgets_state is changed)
or (windows_11_widgets_policy_state is changed)
- name: Ensure winget is executable on Windows host through PSRP
tags: [packages]
when: windows_package_backend == 'winget_psrp'
ansible.windows.win_powershell:
script: |
$winget = Get-Command winget.exe -ErrorAction SilentlyContinue
if ($null -eq $winget) {
throw 'winget.exe is not available on the Windows host. Install App Installer or rerun the bootstrap script.'
}
& $winget.Source --info *> $null
if ($LASTEXITCODE -ne 0) {
throw 'winget.exe is not executable through the current PSRP session. Set windows_package_backend to winget_wsl_local on WSL-managed hosts.'
}
$Ansible.Changed = $false
- name: Ensure winget is executable through local Windows PowerShell from WSL
tags: [packages]
when: windows_package_backend == 'winget_wsl_local'
block:
- name: Ensure winget_wsl_local backend is running inside WSL
ansible.builtin.assert:
that:
- lookup('ansible.builtin.env', 'WSL_DISTRO_NAME') | length > 0
fail_msg: >-
winget_wsl_local requires running the playbook from inside the
target machine's WSL environment.
- name: Get local Windows host name through WSL interop
ansible.builtin.shell: |
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command '$env:COMPUTERNAME'
args:
executable: /bin/bash
delegate_to: localhost
register: local_windows_host_name_state
changed_when: false
- name: Get local Windows host IP addresses through WSL interop
ansible.builtin.shell: |
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command '
Get-NetIPAddress -AddressFamily IPv4, IPv6 -ErrorAction SilentlyContinue |
Where-Object {
$_.IPAddress -notin @("127.0.0.1", "::1") -and
$_.IPAddress -notlike "169.254.*" -and
$_.IPAddress -notlike "fe80:*"
} |
Select-Object -ExpandProperty IPAddress
'
args:
executable: /bin/bash
delegate_to: localhost
register: local_windows_host_ip_state
changed_when: false
- name: Ensure winget_wsl_local backend targets the local Windows host
ansible.builtin.assert:
that:
- >-
(ansible_host | lower) in ['localhost', '127.0.0.1', '::1']
or (local_windows_host_name_state.stdout | trim | upper)
== ((ansible_host | regex_replace('\\..*$', '')) | upper)
or (ansible_host | lower)
in (local_windows_host_ip_state.stdout_lines | map('trim') | map('lower') | list)
fail_msg: >-
winget_wsl_local can only target the local Windows host reached
through WSL interop. Local Windows host '{{ local_windows_host_name_state.stdout | trim }}'
with addresses {{ local_windows_host_ip_state.stdout_lines | map('trim') | list }}
does not match ansible_host '{{ ansible_host }}'.
- name: Ensure winget is executable through local Windows PowerShell
ansible.builtin.shell: |
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command '
$ErrorActionPreference = "Stop"
$winget = Get-Command winget.exe -ErrorAction SilentlyContinue
if ($null -eq $winget) {
throw "winget.exe is not available on the local Windows host. Install App Installer or rerun the bootstrap script."
}
& $winget.Source --info *> $null
if ($LASTEXITCODE -ne 0) {
throw "winget.exe is not executable through local Windows PowerShell interop."
}
'
args:
executable: /bin/bash
delegate_to: localhost
changed_when: false
- name: Ensure WSL 2 is the default backend
tags: [packages, services, wsl]
ansible.windows.win_powershell:
script: |
$status = & wsl --status 2>$null
if ($LASTEXITCODE -eq 0 -and $status -match 'Default Version:\s*2') {
$Ansible.Changed = $false
return
}
& wsl --set-default-version 2
if ($LASTEXITCODE -ne 0) {
throw 'Failed to set WSL default version to 2.'
}
$Ansible.Changed = $true
- name: Install Windows workstation applications with winget through PSRP
tags: [packages]
when: windows_package_backend == 'winget_psrp'
ansible.windows.win_powershell:
script: |
$packageId = '{{ item.id }}'
$packageName = '{{ item.name | default(item.id) }}'
$packageSource = '{{ item.source | default('') }}'
$listArgs = @(
'list'
'--id', $packageId
'--exact'
'--accept-source-agreements'
'--disable-interactivity'
)
$installArgs = @(
'install'
'--id', $packageId
'--exact'
'--silent'
'--accept-package-agreements'
'--accept-source-agreements'
'--disable-interactivity'
)
if (-not [string]::IsNullOrWhiteSpace($packageSource)) {
$listArgs += @('--source', $packageSource)
$installArgs += @('--source', $packageSource)
}
$installed = & winget @listArgs 2>$null
if ($LASTEXITCODE -eq 0 -and $installed -match [regex]::Escape($packageId)) {
$Ansible.Changed = $false
return
}
& winget @installArgs
if ($LASTEXITCODE -ne 0) {
throw "Failed to install $packageName with winget"
}
$Ansible.Changed = $true
loop: "{{ windows_winget_packages | default([]) }}"
loop_control:
label: "{{ item.id }}"
- name: Install Windows workstation applications with winget through WSL local backend
tags: [packages]
when: windows_package_backend == 'winget_wsl_local'
ansible.builtin.shell: |
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command '
$ErrorActionPreference = "Stop"
$packageId = "{{ item.id }}"
$packageName = "{{ item.name | default(item.id) }}"
$packageSource = "{{ item.source | default('') }}"
$winget = Get-Command winget.exe -ErrorAction Stop
$listArgs = @(
"list"
"--id", $packageId
"--exact"
"--accept-source-agreements"
"--disable-interactivity"
)
$installArgs = @(
"install"
"--id", $packageId
"--exact"
"--silent"
"--accept-package-agreements"
"--accept-source-agreements"
"--disable-interactivity"
)
if (-not [string]::IsNullOrWhiteSpace($packageSource)) {
$listArgs += @("--source", $packageSource)
$installArgs += @("--source", $packageSource)
}
$installed = & $winget.Source @listArgs 2>$null
if ($LASTEXITCODE -eq 0 -and $installed -match [regex]::Escape($packageId)) {
[Console]::Out.WriteLine("changed=false")
exit 0
}
& $winget.Source @installArgs
if ($LASTEXITCODE -ne 0) {
throw "Failed to install $packageName with winget"
}
[Console]::Out.WriteLine("changed=true")
'
args:
executable: /bin/bash
delegate_to: localhost
register: windows_wsl_local_winget_install_state
changed_when: "'changed=true' in windows_wsl_local_winget_install_state.stdout"
loop: "{{ windows_winget_packages | default([]) }}"
loop_control:
label: "{{ item.id }}"
- name: Configure Windows taskbar pin layout
tags: [packages]
when: (windows_taskbar_pins | default([])) | length > 0
block:
- name: Ensure Windows taskbar layout directory exists
ansible.windows.win_file:
path: "{{ windows_taskbar_layout_directory }}"
state: directory
- name: Render Windows taskbar layout policy file
ansible.windows.win_template:
src: taskbar-layout.xml.j2
dest: "{{ windows_taskbar_layout_path }}"
register: windows_taskbar_layout_file_state
- name: Enable Windows taskbar layout policy
ansible.windows.win_regedit:
path: HKCU:\Software\Policies\Microsoft\Windows\Explorer
name: LockedStartLayout
data: 1
type: dword
register: windows_taskbar_layout_policy_state
- name: Set Windows taskbar layout policy file path
ansible.windows.win_regedit:
path: HKCU:\Software\Policies\Microsoft\Windows\Explorer
name: StartLayoutFile
data: "{{ windows_taskbar_layout_path }}"
type: expandstring
register: windows_taskbar_layout_policy_path_state
- name: Set Windows taskbar layout policy refresh behavior
ansible.windows.win_regedit:
path: HKCU:\Software\Policies\Microsoft\Windows\Explorer
name: ReapplyStartLayoutEveryLogon
data: "{{ (windows_taskbar_reapply_every_logon | default(false)) | ternary(1, 0) }}"
type: dword
register: windows_taskbar_layout_policy_reapply_state
- name: Note when Windows taskbar pin layout may require sign out
ansible.builtin.debug:
msg: >-
Windows taskbar pin policy changed. Sign out and back in if the updated pin order does not appear immediately.
changed_when: false
when: >-
(windows_taskbar_layout_file_state is changed)
or (windows_taskbar_layout_policy_state is changed)
or (windows_taskbar_layout_policy_path_state is changed)
or (windows_taskbar_layout_policy_reapply_state is changed)
- name: Install VS Code WSL extensions on Windows host
tags: [packages, vscode]
ansible.windows.win_powershell:
script: |
$extensionId = '{{ item }}'
$code = Get-Command code.cmd -ErrorAction SilentlyContinue
if ($null -eq $code) {
throw 'code.cmd is not available. Ensure Visual Studio Code is installed before managing extensions.'
}
$installedExtensions = & $code.Source --list-extensions
if ($installedExtensions -contains $extensionId) {
$Ansible.Changed = $false
return
}
& $code.Source --install-extension $extensionId --force
if ($LASTEXITCODE -ne 0) {
throw "Failed to install VS Code extension $extensionId"
}
$Ansible.Changed = $true
loop: "{{ windows_vscode_extensions | default([]) }}"
loop_control:
label: "{{ item }}"
- name: Set Windows Terminal default profile to Ubuntu
tags: [packages, wsl]
ansible.windows.win_powershell:
script: |
$terminalSettingsPath = Join-Path $env:LOCALAPPDATA 'Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json'
if (-not (Test-Path $terminalSettingsPath)) {
throw 'Windows Terminal settings.json was not found. Launch Windows Terminal once before applying the default profile configuration.'
}
$settings = Get-Content -Path $terminalSettingsPath -Raw | ConvertFrom-Json
if ($null -eq $settings.profiles -or $null -eq $settings.profiles.list) {
throw 'Windows Terminal settings.json does not contain a profiles.list section.'
}
$targetProfile = $settings.profiles.list |
Where-Object {
$_.name -eq '{{ windows_terminal_default_profile_name }}' -and -not ($_.PSObject.Properties.Name -contains 'hidden' -and $_.hidden)
} |
Select-Object -First 1
if ($null -eq $targetProfile) {
throw "Windows Terminal visible profile '{{ windows_terminal_default_profile_name }}' was not found. Ensure the Ubuntu WSL profile exists and is not hidden in Windows Terminal first."
}
if ($settings.defaultProfile -eq $targetProfile.guid) {
$Ansible.Changed = $false
return
}
$settings.defaultProfile = $targetProfile.guid
$settings | ConvertTo-Json -Depth 100 | Set-Content -Path $terminalSettingsPath -Encoding utf8
$Ansible.Changed = $true

View File

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LayoutModificationTemplate
xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification"
xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout"
xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout"
xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout"
Version="1">
<CustomTaskbarLayoutCollection PinListPlacement="Replace">
<defaultlayout:TaskbarLayout>
<taskbar:TaskbarPinList>
{% for pin in windows_taskbar_pins %}
{% if pin.type == 'desktop_application_id' %}
<taskbar:DesktopApp DesktopApplicationID="{{ pin.id }}" />
{% elif pin.type == 'desktop_application_link_path' %}
<taskbar:DesktopApp DesktopApplicationLinkPath="{{ pin.path }}" />
{% elif pin.type == 'app_user_model_id' %}
<taskbar:UWA AppUserModelID="{{ pin.id }}" />
{% endif %}
{% endfor %}
</taskbar:TaskbarPinList>
</defaultlayout:TaskbarLayout>
</CustomTaskbarLayoutCollection>
</LayoutModificationTemplate>

View File

@@ -1,5 +1,5 @@
---
- hosts: all:!workstation_host_windows
- hosts: all
become: true
pre_tasks:
- name: Load local vault variables when available
@@ -24,19 +24,10 @@
- packages_void
- services_runit
- profile_desktop_common
- profile_desktop_i3
- profile_desktop_sway
- profile_desktop_hyprland
- profile_desktop_host
- hosts: workstation_dev_ubuntu
become: true
roles:
- packages_ubuntu
- services_systemd
- profile_workstation_dev_common
- hosts: workstation_dev_fedora
become: true
@@ -60,53 +51,6 @@
- profile_workstation_dev_common
- profile_workstation_dev_wsl
- hosts: workstation_host_windows
gather_facts: false
pre_tasks:
- name: Load local vault variables when available
tags: [always]
ansible.builtin.include_vars:
file: "{{ playbook_dir }}/../secrets/vault.yml"
when: lookup('ansible.builtin.fileglob', playbook_dir + '/../secrets/vault.yml', errors='ignore', wantlist=True) | length > 0
- name: Load machine-local vault variables when available
tags: [always]
ansible.builtin.include_vars:
file: "{{ playbook_dir }}/../secrets/vault.local.yml"
when: lookup('ansible.builtin.fileglob', playbook_dir + '/../secrets/vault.local.yml', errors='ignore', wantlist=True) | length > 0
- name: Resolve Windows PSRP connection settings
tags: [always]
ansible.builtin.set_fact:
ansible_host: "{{ windows_psrp_host | default(vault_windows_psrp_host | default('')) }}"
ansible_user: "{{ windows_psrp_user | default(vault_windows_psrp_user | default('')) }}"
ansible_password: "{{ windows_psrp_password | default(vault_windows_psrp_password | default('')) }}"
windows_package_backend: "{{ windows_package_backend | default(vault_windows_package_backend | default('winget_psrp')) }}"
- name: Ensure Windows PSRP connection settings are defined
tags: [always]
ansible.builtin.assert:
that:
- (ansible_host | default('') | length) > 0
- (ansible_user | default('') | length) > 0
fail_msg: >-
Define windows_psrp_host and windows_psrp_user via extra vars, secrets/vault.yml,
or secrets/vault.local.yml
before running the workstation_host_windows play.
- name: Ensure Windows package backend is supported
tags: [always]
ansible.builtin.assert:
that:
- windows_package_backend in ['winget_psrp', 'winget_wsl_local']
fail_msg: >-
Unsupported windows_package_backend '{{ windows_package_backend }}'.
Supported values are winget_psrp and winget_wsl_local.
roles:
- profile_workstation_host_windows
- hosts: ubuntu_server
become: true

View File

@@ -1,4 +1,4 @@
# Desktop
- i3 primary
- XFCE components selectively
- Wayland only: sway (SwayFX) and Hyprland
- Hyprland is the default session

View File

@@ -1,249 +0,0 @@
# i3 config for nymph
set $mod Mod4
set $refresh_i3status killall -SIGUSR1 i3status
font pango:LiterationMono Nerd Font 10
# Start XDG autostart entries (.desktop), useful on Void for pipewire/wireplumber/etc.
exec --no-startup-id dex --autostart --environment i3
exec --no-startup-id gnome-keyring-daemon --start --components=secrets
exec_always --no-startup-id setxkbmap -layout us -variant intl
exec_always --no-startup-id feh --bg-center ~/.config/i3/wallpapers/wallpaper-161664.jpg
exec_always --no-startup-id ~/.config/i3/scripts/setup-gtk-theme.sh
exec --no-startup-id /usr/libexec/xdg-desktop-portal
# Audio
exec --no-startup-id pipewire
exec --no-startup-id pipewire-pulse
exec --no-startup-id wireplumber
# Compositor
exec_always --no-startup-id picom -b
# Status bar
exec_always --no-startup-id ~/.config/polybar/launch.sh
# Monitor configuration
exec --no-startup-id autorandr --persistent --change
# Tray services
exec --no-startup-id dunst
exec --no-startup-id /usr/libexec/xfce-polkit
exec --no-startup-id nm-applet
exec --no-startup-id blueman-applet
exec --no-startup-id udiskie
exec --no-startup-id volumeicon
exec --no-startup-id xfce4-clipman
# Lock screen on suspend (handled by elogind)
exec --no-startup-id xss-lock -- ~/.config/i3/scripts/lockscreen
# General behavior
focus_follows_mouse no
mouse_warping none
floating_modifier $mod
tiling_drag modifier titlebar
# Borders
default_border pixel 2
default_floating_border pixel 2
new_window pixel 2
new_float pixel 2
hide_edge_borders none
# Gaps (i3 >= 4.22)
gaps inner 10
gaps outer 4
smart_gaps on
smart_borders on
# vim-like directions
set $left h
set $down j
set $up k
set $right l
# Terminal
bindsym $mod+Return exec --no-startup-id /usr/bin/alacritty
# Emergency terminal fallback
bindsym $mod+Shift+Return exec --no-startup-id st
# Emacs client
bindsym $mod+Shift+e exec --no-startup-id emacsclient -c -n
# Launcher
#bindsym $mod+d exec --no-startup-id "rofi -modi drun,run -show drun"
bindsym $mod+d exec --no-startup-id "rofi -show drun -theme ~/.config/rofi/config.rasi"
# Audio panel control
bindsym $mod+Shift+v exec --no-startup-id pavucontrol
# File manager
bindsym $mod+Shift+f exec thunar
# Manual lock screen
bindsym $mod+Shift+x exec ~/.config/i3/scripts/lockscreen
# Kill focused window
bindsym $mod+Shift+q kill
# Screenshot
bindsym Print exec xfce4-screenshooter
bindsym Shift+Print exec xfce4-screenshooter -r
bindsym Alt+Print exec xfce4-screenshooter -w
# Focus
bindsym $mod+$left focus left
bindsym $mod+$down focus down
bindsym $mod+$up focus up
bindsym $mod+$right focus right
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# Move windows
bindsym $mod+Shift+$left move left
bindsym $mod+Shift+$down move down
bindsym $mod+Shift+$up move up
bindsym $mod+Shift+$right move right
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# Split
bindsym $mod+b split h
bindsym $mod+v split v
# Layouts
bindsym $mod+f fullscreen toggle
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# Floating / focus mode
bindsym $mod+Shift+space floating toggle
bindsym $mod+space focus mode_toggle
bindsym $mod+a focus parent
# Scratchpad
bindsym $mod+Shift+minus move scratchpad
bindsym $mod+minus scratchpad show
# Volume (PipeWire / PulseAudio compatibility)
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle
# Brightness
bindsym XF86MonBrightnessUp exec --no-startup-id brightnessctl set +10% && pkill -RTMIN+5 i3blocks
bindsym XF86MonBrightnessDown exec --no-startup-id brightnessctl set 10%- && pkill -RTMIN+5 i3blocks
# Media keys
bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause
bindsym XF86AudioNext exec --no-startup-id playerctl next
bindsym XF86AudioPrev exec --no-startup-id playerctl previous
# Workspaces
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"
workspace $ws1 output primary
workspace $ws2 output primary
workspace $ws3 output primary
workspace $ws4 output primary
workspace $ws5 output primary
workspace $ws6 output primary
workspace $ws7 output primary
workspace $ws8 output primary
workspace $ws9 output primary
workspace $ws10 output primary
bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3
bindsym $mod+4 workspace number $ws4
bindsym $mod+5 workspace number $ws5
bindsym $mod+6 workspace number $ws6
bindsym $mod+7 workspace number $ws7
bindsym $mod+8 workspace number $ws8
bindsym $mod+9 workspace number $ws9
bindsym $mod+0 workspace number $ws10
bindsym $mod+comma workspace prev
bindsym $mod+period workspace next
bindsym $mod+Shift+1 move container to workspace number $ws1
bindsym $mod+Shift+2 move container to workspace number $ws2
bindsym $mod+Shift+3 move container to workspace number $ws3
bindsym $mod+Shift+4 move container to workspace number $ws4
bindsym $mod+Shift+5 move container to workspace number $ws5
bindsym $mod+Shift+6 move container to workspace number $ws6
bindsym $mod+Shift+7 move container to workspace number $ws7
bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10
# Reload / restart / exit
bindsym $mod+Shift+c reload
bindsym $mod+Shift+r restart
bindsym $mod+Shift+BackSpace exec --no-startup-id i3-msg exit
bindsym $mod+Shift+Escape exec --no-startup-id ~/.config/i3/scripts/powermenu.sh
# Resize mode
mode "resize" {
bindsym $left resize shrink width 10 px or 10 ppt
bindsym $down resize grow height 10 px or 10 ppt
bindsym $up resize shrink height 10 px or 10 ppt
bindsym $right resize grow width 10 px or 10 ppt
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+r mode "default"
}
bindsym $mod+r mode "resize"
# i3bar + i3status (disabilitato: ora gestito da polybar)
# bar {
# status_command i3blocks
# position bottom
# tray_output primary
# font pango:Liberation Mono 10
#
# colors {
# background #1f1f28
# statusline #d0d0d0
# separator #3a3a46
#
# focused_workspace #4a90d9 #4a90d9 #ffffff
# active_workspace #3a3a46 #2b2b36 #d0d0d0
# inactive_workspace #1f1f28 #1f1f28 #9a9a9a
# urgent_workspace #c7162b #c7162b #ffffff
# }
# }
client.focused #4a90d9 #4a90d9 #ffffff #4a90d9 #4a90d9
client.focused_inactive #3a3a46 #2b2b36 #eeeeee #3a3a46 #3a3a46
client.unfocused #2b2b36 #1f1f28 #bcbcbc #2b2b36 #2b2b36
client.urgent #c7162b #c7162b #ffffff #c7162b #c7162b
client.placeholder #1f1f28 #1f1f28 #bcbcbc #1f1f28 #1f1f28
client.background #1f1f28

View File

@@ -1,94 +0,0 @@
#!/usr/bin/env bash
battery_json() {
local total_now=0
local total_full=0
local overall_status=""
local now full status bat capacity icon color
shopt -s nullglob
for bat in /sys/class/power_supply/BAT*; do
[[ -d "$bat" ]] || continue
if [[ -r "$bat/energy_now" && -r "$bat/energy_full" ]]; then
now=$(<"$bat/energy_now")
full=$(<"$bat/energy_full")
elif [[ -r "$bat/charge_now" && -r "$bat/charge_full" ]]; then
now=$(<"$bat/charge_now")
full=$(<"$bat/charge_full")
else
continue
fi
status=$(<"$bat/status")
(( total_now += now ))
(( total_full += full ))
case "$status" in
Charging)
overall_status="Charging"
;;
Discharging)
[[ "$overall_status" != "Charging" ]] && overall_status="Discharging"
;;
Full)
[[ -z "$overall_status" ]] && overall_status="Full"
;;
*)
[[ -z "$overall_status" ]] && overall_status="$status"
;;
esac
done
(( total_full > 0 )) || return 1
capacity=$(( 100 * total_now / total_full ))
case "$overall_status" in
Charging) icon="⚡" ;;
Discharging) icon="🔋" ;;
Full) icon="✔" ;;
*) icon="?" ;;
esac
if (( capacity <= 15 )); then
color="#ff5555"
elif (( capacity <= 30 )); then
color="#f1fa8c"
else
color="#ffffff"
fi
printf '{"full_text":"%s %s%%","name":"battery","color":"%s"}' \
"$icon" "$capacity" "$color"
}
i3status | while IFS= read -r line; do
case "$line" in
'{"version":'* | '[')
printf '%s\n' "$line"
;;
,*)
batt="$(battery_json)"
if [[ -n "$batt" ]]; then
line="${line#,}"
printf ',[%s,%s\n' "$batt" "${line#\[}"
else
printf '%s\n' "$line"
fi
;;
\[*)
batt="$(battery_json)"
if [[ -n "$batt" ]]; then
printf '[%s,%s\n' "$batt" "${line#\[}"
else
printf '%s\n' "$line"
fi
;;
*)
printf '%s\n' "$line"
;;
esac
done

View File

@@ -1,37 +0,0 @@
#!/bin/sh
wallpaper="$HOME/.config/i3/wallpapers/maxresdefault.jpg"
cached="$HOME/.cache/i3lock/wallpaper.png"
dims_cache="$HOME/.cache/i3lock/dims.txt"
dims=$(xdotool getdisplaygeometry | tr ' ' 'x')
if [ ! -f "$cached" ] || \
[ "$(stat -c %Y "$wallpaper")" -gt "$(stat -c %Y "$cached")" ] || \
[ "$dims" != "$(cat "$dims_cache" 2>/dev/null)" ]; then
mkdir -p "$HOME/.cache/i3lock"
convert "$wallpaper" -resize "$dims^" -extent "$dims" PNG:- > "$cached"
echo -n "$dims" > "$dims_cache"
fi
i3lock \
--image "$cached" \
--clock \
--indicator \
--radius 100 \
--ring-width 8 \
--color=000000ff \
--ring-color=2f4058ff \
--inside-color=1f1f28ff \
--line-color=00000000 \
--separator-color=3a3a46ff \
--keyhl-color=6daeeaff \
--bshl-color=c7162bff \
--ringver-color=4a90d9ff \
--insidever-color=1f1f28ff \
--ringwrong-color=c7162bff \
--insidewrong-color=1f1f28ff \
--time-color=d0d0d0ff \
--date-color=9a9a9aff \
--layout-color=d0d0d0ff \
--verif-color=d0d0d0ff \
--wrong-color=d0d0d0ff

View File

@@ -1,29 +0,0 @@
#!/bin/sh
choice="$(printf "⏻ Shutdown\n Reboot\n Logout\n Lock\n⏾ Suspend" \
| rofi -dmenu \
-i \
-p "Power" \
-theme ~/.config/rofi/config.rasi \
-theme-str 'window { width: 20%; location: center; anchor: center; } listview { columns: 1; spacing: 6px; }')"
[ -z "$choice" ] && exit 0
case "$choice" in
*Lock)
~/.config/i3/scripts/lockscreen
;;
*Logout)
i3-msg exit
;;
*Suspend)
~/.config/i3/scripts/lockscreen
loginctl suspend
;;
*Reboot)
loginctl reboot
;;
*Shutdown)
loginctl poweroff
;;
esac

View File

@@ -1,53 +0,0 @@
#!/bin/sh
THEME="Yaru-blue-dark"
ICONS="Yaru-blue-dark"
CURSOR="Yaru"
FONT_UI="Liberation Sans 10"
mkdir -p "$HOME/.config/gtk-3.0"
mkdir -p "$HOME/.config/gtk-4.0"
cat > "$HOME/.gtkrc-2.0" <<EOF
gtk-theme-name="$THEME"
gtk-icon-theme-name="$ICONS"
gtk-cursor-theme-name="$CURSOR"
gtk-font-name="$FONT_UI"
gtk-button-images=1
gtk-menu-images=1
EOF
cat > "$HOME/.config/gtk-3.0/settings.ini" <<EOF
[Settings]
gtk-theme-name=$THEME
gtk-icon-theme-name=$ICONS
gtk-cursor-theme-name=$CURSOR
gtk-font-name=$FONT_UI
gtk-application-prefer-dark-theme=1
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintslight
gtk-xft-rgba=rgb
EOF
cat > "$HOME/.config/gtk-4.0/settings.ini" <<EOF
[Settings]
gtk-theme-name=$THEME
gtk-icon-theme-name=$ICONS
gtk-cursor-theme-name=$CURSOR
gtk-font-name=$FONT_UI
gtk-application-prefer-dark-theme=1
EOF
# esporta variabili utili
export GTK_THEME=$THEME
export XCURSOR_THEME=$CURSOR
export XCURSOR_SIZE=24
if command -v gsettings >/dev/null 2>&1; then
gsettings set org.gnome.desktop.interface gtk-theme "$THEME" >/dev/null 2>&1 || true
gsettings set org.gnome.desktop.interface icon-theme "$ICONS" >/dev/null 2>&1 || true
gsettings set org.gnome.desktop.interface cursor-theme "$CURSOR" >/dev/null 2>&1 || true
gsettings set org.gnome.desktop.interface color-scheme prefer-dark >/dev/null 2>&1 || true
fi

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 553 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

View File

@@ -1,31 +0,0 @@
separator=true
separator_block_width=15
[memory]
command=~/.config/i3blocks/scripts/memory
interval=10
color=#d0d0d0
[temperature]
command=~/.config/i3blocks/scripts/temperature
interval=10
[backlight]
command=~/.config/i3blocks/scripts/backlight
interval=once
signal=5
color=#7dcfff
[essid]
command=~/.config/i3blocks/scripts/wifi
interval=10
color=#4a90d9
[battery]
command=~/.config/i3blocks/scripts/battery
interval=30
[time]
command=date '+%Y-%m-%d %H:%M'
interval=60
color=#d0d0d0

View File

@@ -1,14 +0,0 @@
#!/bin/sh
cur="$(brightnessctl g 2>/dev/null)"
max="$(brightnessctl m 2>/dev/null)"
[ -n "$cur" ] || exit 0
[ -n "$max" ] || exit 0
[ "$max" -gt 0 ] || exit 0
pct=$((100 * cur / max))
echo "BL ${pct}%"
echo "BL ${pct}%"
echo "#6daeea"

View File

@@ -1,47 +0,0 @@
#!/bin/sh
total_now=0
total_full=0
status=""
for bat in /sys/class/power_supply/BAT*; do
[ -d "$bat" ] || continue
if [ -r "$bat/energy_now" ] && [ -r "$bat/energy_full" ]; then
now=$(cat "$bat/energy_now")
full=$(cat "$bat/energy_full")
elif [ -r "$bat/charge_now" ] && [ -r "$bat/charge_full" ]; then
now=$(cat "$bat/charge_now")
full=$(cat "$bat/charge_full")
else
continue
fi
st=$(cat "$bat/status" 2>/dev/null)
total_now=$((total_now + now))
total_full=$((total_full + full))
case "$st" in
Charging) status="⚡" ;;
Discharging) [ -z "$status" ] && status="🔋" ;;
Full) [ -z "$status" ] && status="✔" ;;
esac
done
[ "$total_full" -gt 0 ] || exit 0
pct=$((100 * total_now / total_full))
[ -n "$status" ] || status="BAT"
text="$status $pct%"
if [ "$pct" -le 15 ]; then
color="#ff5555"
elif [ "$pct" -le 30 ]; then
color="#f1fa8c"
else
color="#9ece6a"
fi
printf '%s\n%s\n%s\n' "$text" "$text" "$color"

View File

@@ -1,17 +0,0 @@
#!/bin/sh
state="$(xset q 2>/dev/null)"
caps="$(printf '%s\n' "$state" | grep 'Caps Lock:' | awk '{print $4}')"
num="$(printf '%s\n' "$state" | grep 'Num Lock:' | awk '{print $8}')"
out=""
[ "$caps" = "on" ] && out="${out} CAPS"
[ "$num" = "on" ] && out="${out} NUM"
[ -n "$out" ] || exit 0
echo "$out"
echo "$out"
echo "#9a9a9a"

View File

@@ -1,19 +0,0 @@
#!/bin/sh
mem=$(free | awk '/^Mem:/ {print $3/$2 * 100.0}')
mem=${mem%.*}
if [ "$mem" -ge 90 ]; then
color="#c7162b"
elif [ "$mem" -ge 70 ]; then
color="#e95420"
else
color="#d0d0d0"
fi
used=$(free -h | awk '/^Mem:/ {print $3}')
total=$(free -h | awk '/^Mem:/ {print $2}')
echo "RAM $used/$total"
echo "RAM $used/$total"
echo "$color"

View File

@@ -1,18 +0,0 @@
#!/bin/sh
t=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null)
[ -n "$t" ] || exit 0
temp=$((t / 1000))
if [ "$temp" -ge 85 ]; then
color="#c7162b"
elif [ "$temp" -ge 70 ]; then
color="#e95420"
else
color="#d0d0d0"
fi
echo "CPU ${temp}°C"
echo "CPU ${temp}°C"
echo "$color"

View File

@@ -1,16 +0,0 @@
#!/bin/sh
mute=$(pactl get-sink-mute @DEFAULT_SINK@ 2>/dev/null | awk '{print $2}')
vol=$(pactl get-sink-volume @DEFAULT_SINK@ 2>/dev/null | awk '/Volume:/ {print $5; exit}')
[ -n "$vol" ] || exit 0
if [ "$mute" = "yes" ]; then
text="VOL mute"
color="#7aa2f7"
else
text="VOL $vol"
color="#c0caf5"
fi
printf '%s\n%s\n%s\n' "$text" "$text" "$color"

View File

@@ -1,9 +0,0 @@
#!/bin/sh
ssid=$(nmcli -t -f active,ssid dev wifi | awk -F: '$1=="yes"{print $2}')
[ -n "$ssid" ] || exit 0
echo "WIFI $ssid"
echo "WIFI $ssid"
echo "#4a90d9"

View File

@@ -1,57 +0,0 @@
backend = "glx";
vsync = true;
use-damage = true;
detect-rounded-corners = true;
detect-client-opacity = true;
detect-transient = true;
corner-radius = 10;
rounded-corners-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'",
"class_g = 'i3-frame'"
];
shadow = true;
shadow-radius = 18;
shadow-opacity = 0.55;
shadow-offset-x = -10;
shadow-offset-y = -10;
shadow-exclude = [
"name = 'Notification'",
"class_g = 'Conky'",
"class_g ?= 'Notify-osd'",
"class_g = 'Cairo-clock'",
"_GTK_FRAME_EXTENTS@:c",
"window_type = 'dock'",
"window_type = 'desktop'"
];
fading = true;
fade-in-step = 0.05;
fade-out-step = 0.05;
fade-delta = 6;
blur-method = "dual_kawase";
blur-strength = 5;
blur-background = true;
blur-background-frame = true;
blur-background-fixed = false;
blur-background-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'",
"class_g = 'i3-frame'",
"class_g = 'Dunst'",
"_GTK_FRAME_EXTENTS@:c"
];
opacity-rule = [];
wintypes:
{
tooltip = { fade = true; shadow = true; opacity = 0.95; focus = true; };
dock = { shadow = false; };
dnd = { shadow = false; };
popup_menu = { opacity = 0.95; };
dropdown_menu = { opacity = 0.95; };
};

View File

@@ -1,208 +0,0 @@
[colors]
background = #1f1f28
background-alt = #2b2b36
foreground = #d0d0d0
foreground-alt = #9a9a9a
primary = #4a90d9
secondary = #7dcfff
warm = #e0af68
success = #9ec07c
info = #bb9af7
alert = #c7162b
disabled = #3a3a46
[bar/main]
monitor = ${env:MONITOR:}
bottom = false
width = 100%
height = 24pt
radius = 0
background = ${colors.background}
foreground = ${colors.foreground}
line-size = 2pt
border-size = 0
padding-left = 1
padding-right = 1
module-margin = 1
font-0 = LiterationMono Nerd Font:size=10;2
font-1 = Symbols Nerd Font Mono:size=12;2
modules-left = i3
modules-center = date
modules-right = cpu memory disk temperature backlight wifi battery
tray-position = right
tray-padding = 2
cursor-click = pointer
wm-restack = i3
override-redirect = false
[module/i3]
type = internal/i3
pin-workspaces = false
show-urgent = true
strip-wsnumbers = true
enable-scroll = false
index-sort = true
ws-icon-0 = 1;I
ws-icon-1 = 2;II
ws-icon-2 = 3;III
ws-icon-3 = 4;IV
ws-icon-4 = 5;V
ws-icon-5 = 6;VI
ws-icon-6 = 7;VII
ws-icon-7 = 8;VIII
ws-icon-8 = 9;IX
ws-icon-9 = 10;X
ws-icon-default =
label-focused = %icon%
label-focused-foreground = #ffffff
label-focused-background = ${colors.primary}
label-focused-padding = 1
label-unfocused = %icon%
label-unfocused-foreground = ${colors.foreground-alt}
label-unfocused-padding = 1
label-visible = %icon%
label-visible-foreground = ${colors.foreground}
label-visible-background = ${colors.background-alt}
label-visible-padding = 1
label-urgent = %icon%
label-urgent-foreground = #ffffff
label-urgent-background = ${colors.alert}
label-urgent-padding = 1
[module/date]
type = internal/date
interval = 60
date = %Y-%m-%d
time = %H:%M
format-prefix = " "
format-prefix-foreground = ${colors.foreground-alt}
label = %date% %time%
label-foreground = ${colors.foreground}
[module/memory]
type = internal/memory
interval = 10
format = <label>
format-prefix = " "
format-prefix-foreground = ${colors.secondary}
label = %gb_used% / %gb_total%
label-foreground = ${colors.secondary}
[module/temperature]
type = internal/temperature
interval = 10
thermal-zone = 0
warn-temperature = 80
format = <label>
format-prefix = " "
format-prefix-foreground = ${colors.warm}
format-warn = <label-warn>
format-warn-prefix = " "
format-warn-prefix-foreground = ${colors.alert}
label = %temperature-c%
label-foreground = ${colors.warm}
label-warn = %temperature-c%
label-warn-foreground = ${colors.alert}
[module/backlight]
type = internal/backlight
card = intel_backlight
use-actual-brightness = true
enable-scroll = true
format = <label>
format-prefix = " "
format-prefix-foreground = ${colors.foreground}
label = %percentage%%
label-foreground = ${colors.foreground}
[module/wifi]
type = internal/network
interface-type = wireless
interval = 5
format-connected = <label-connected>
format-connected-prefix = " "
format-connected-prefix-foreground = ${colors.primary}
format-disconnected = <label-disconnected>
format-disconnected-prefix = " "
format-disconnected-prefix-foreground = ${colors.disabled}
label-connected = %essid% %signal%%
label-connected-foreground = ${colors.primary}
label-disconnected = offline
label-disconnected-foreground = ${colors.disabled}
[module/battery]
type = internal/battery
battery = BAT0
adapter = AC
full-at = 98
low-at = 15
format-charging = <animation-charging> <label-charging>
format-discharging = <ramp-capacity> <label-discharging>
format-full = <label-full>
format-low = <label-low>
format-full-prefix = " "
format-full-prefix-foreground = ${colors.success}
label-charging = %percentage%%
label-charging-foreground = ${colors.success}
label-discharging = %percentage%%
label-discharging-foreground = ${colors.foreground}
label-full = full
label-full-foreground = ${colors.success}
label-low = %percentage%%
label-low-foreground = ${colors.alert}
ramp-capacity-0 =
ramp-capacity-1 =
ramp-capacity-2 =
ramp-capacity-3 =
ramp-capacity-4 =
ramp-capacity-foreground = ${colors.foreground}
animation-charging-0 =
animation-charging-1 =
animation-charging-2 =
animation-charging-3 =
animation-charging-4 =
animation-charging-foreground = ${colors.success}
animation-charging-framerate = 750
[module/cpu]
type = internal/cpu
interval = 5
format = <label>
format-prefix = " "
format-prefix-foreground = ${colors.info}
label = %percentage%%
label-foreground = ${colors.info}
[module/disk]
type = internal/fs
mount-0 = /
interval = 60
format-mounted = <label-mounted>
format-mounted-prefix = " "
format-mounted-prefix-foreground = ${colors.success}
label-mounted = %used% / %total%
label-mounted-foreground = ${colors.success}
format-unmounted = <label-unmounted>
format-unmounted-prefix = " "
format-unmounted-prefix-foreground = ${colors.disabled}
label-unmounted = %mountpoint% n/a
label-unmounted-foreground = ${colors.disabled}
[settings]
screenchange-reload = true
pseudo-transparency = false

View File

@@ -1,20 +0,0 @@
#!/usr/bin/env bash
# Restart polybar on each connected monitor.
polybar-msg cmd quit >/dev/null 2>&1 || true
while pgrep -u "$UID" -x polybar >/dev/null; do
sleep 0.1
done
if command -v xrandr >/dev/null 2>&1; then
monitors=$(xrandr --query | awk '/ connected/ {print $1}')
fi
if [ -n "${monitors:-}" ]; then
for m in $monitors; do
MONITOR="$m" polybar main >/dev/null 2>&1 &
done
else
polybar main >/dev/null 2>&1 &
fi

View File

@@ -1,21 +0,0 @@
#!/bin/sh
[ $# -gt 0 ] || set -- i3
[ -r /etc/profile ] && . /etc/profile
[ -r "$HOME/.profile" ] && . "$HOME/.profile"
session_name=${1##*/}
export XDG_CURRENT_DESKTOP="$session_name"
export XDG_SESSION_DESKTOP="$session_name"
export XDG_SESSION_TYPE=x11
export SSH_AUTH_SOCK="$HOME/.local/state/ssh-agent/socket"
exec dbus-run-session sh -eu -c '
umask 077
printf "%s\n" "$DBUS_SESSION_BUS_ADDRESS" > "$HOME/.dbus-session-bus-address"
gpgconf --launch gpg-agent
"$HOME/.local/bin/update-turnstile-env"
exec "$@"
' sh "$@"

View File

@@ -1,28 +0,0 @@
output HDMI-A-0
off
output DisplayPort-0
off
output DisplayPort-1
off
output DisplayPort-2
off
output DisplayPort-3
off
output DisplayPort-4
off
output DisplayPort-5
off
output HDMI-A-1
crtc 0
mode 3440x1440
pos 0x0
primary
rate 99.99
x-prop-colorspace Default
x-prop-max_bpc 16
x-prop-non_desktop 0
x-prop-scaling_mode None
x-prop-tearfree auto
x-prop-underscan off
x-prop-underscan_hborder 0
x-prop-underscan_vborder 0

View File

@@ -1 +0,0 @@
HDMI-A-1 00ffffffffffff0061a9443400000000101e0103805021782a64f5ad5049a322135054adcf00714f81c0814081809500a9c0b300d1c0216870a0d0a02950302035001d4e3100001a000000fd0030791eaa3c000a202020202020000000fc004d69204d6f6e69746f720a2020000000ffd03030303030303030303030303001ae020335f14c010203040590111213141f3f23090707830100006a030c001000383c20000067d85dc40178c003681a000001013079ed40d070a0d0a02950584045001d4e3100001ea348b86861a03250304035001d4e3100001ef57c70a0d0a02950302035001d4e3100001a565e00a0a0a02950302035001d4d3100001a000038

View File

@@ -1,27 +0,0 @@
output HDMI-1
off
output DP-2
off
output HDMI-2
off
output eDP-1
crtc 0
mode 1920x1080
pos 0x0
rate 60.01
x-prop-broadcast_rgb Automatic
x-prop-colorspace Default
x-prop-max_bpc 12
x-prop-non_desktop 0
x-prop-scaling_mode Full aspect
output DP-1
crtc 1
mode 3440x1440
pos 1920x0
primary
rate 100.00
x-prop-audio auto
x-prop-broadcast_rgb Automatic
x-prop-colorspace Default
x-prop-max_bpc 12
x-prop-non_desktop 0

View File

@@ -1,2 +0,0 @@
DP-1 00ffffffffffff0061a9443400000000101e0104b55021783b64f5ad5049a322135054adcf00714f81c0814081809500a9c0b300d1c0226870a0d0a02950302035001d4e3100001a20fd70a0d0a03c50302035001d4e3100001e000000fd003090a0a03c010a202020202020000000fc004d69204d6f6e69746f720a202002ac020320f44c010203040590111213141f3f2309070783010000e6060701605d29023a801871382d40582c96001d4e3100001e20ac00a0a0382d40302035001d4e3100001ef0d270a0d0a03c50302035001d4e3100001ea348b86861a03250304035001d4e3100001ef57c70a0d0a02950302035001d4e3100001e00000000006b7012790000030014bf2f01046f0d9f002f001f009f053b000280040007000a0881000804000402100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e190
eDP-1 00ffffffffffff0006af3d1000000000001a0104951f117802c32592575a942a22505400000001010101010101010101010101010101143780b2703828403064310035ad100000180000000f0000000000000000000000000020000000fe0041554f0a202020202020202020000000fe004231343048414b30312e30200a00bd

View File

@@ -1,19 +0,0 @@
output DP-1
off
output HDMI-1
off
output DP-2
off
output HDMI-2
off
output eDP-1
crtc 0
mode 1920x1080
pos 0x0
primary
rate 60.01
x-prop-broadcast_rgb Automatic
x-prop-colorspace Default
x-prop-max_bpc 12
x-prop-non_desktop 0
x-prop-scaling_mode Full aspect

View File

@@ -1 +0,0 @@
eDP-1 00ffffffffffff0006af3d1000000000001a0104951f117802c32592575a942a22505400000001010101010101010101010101010101143780b2703828403064310035ad100000180000000f0000000000000000000000000020000000fe0041554f0a202020202020202020000000fe004231343048414b30312e30200a00bd

View File

@@ -1,163 +0,0 @@
#requires -RunAsAdministrator
param(
[string]$Distribution = 'Ubuntu',
[switch]$SkipUbuntuInstall
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
function Get-OrCreate-WinRMHttpsCertificate {
$dnsName = $env:COMPUTERNAME
$existingCertificate = Get-ChildItem -Path Cert:\LocalMachine\My |
Where-Object { $_.Subject -eq "CN=$dnsName" } |
Sort-Object NotAfter -Descending |
Select-Object -First 1
if ($null -ne $existingCertificate) {
return $existingCertificate
}
return New-SelfSignedCertificate `
-DnsName $dnsName `
-CertStoreLocation 'Cert:\LocalMachine\My' `
-FriendlyName 'WinRM HTTPS Listener' `
-KeyAlgorithm RSA `
-KeyLength 2048 `
-HashAlgorithm SHA256 `
-NotAfter (Get-Date).AddYears(5)
}
function Ensure-WinRMHttpsListener {
param(
[Parameter(Mandatory = $true)]
[string]$CertificateThumbprint
)
$listener = Get-ChildItem -Path WSMan:\localhost\Listener |
Where-Object {
$_.Keys -match 'Transport=HTTPS'
} |
Select-Object -First 1
if ($null -eq $listener) {
try {
New-WSManInstance -ResourceURI winrm/config/Listener `
-SelectorSet @{ Transport = 'HTTPS'; Address = '*' } `
-ValueSet @{ Hostname = $env:COMPUTERNAME; CertificateThumbprint = $CertificateThumbprint } | Out-Null
return $true
}
catch {
$existingHttpsListener = Get-ChildItem -Path WSMan:\localhost\Listener |
Where-Object {
$_.Keys -match 'Transport=HTTPS'
} |
Select-Object -First 1
if ($null -ne $existingHttpsListener) {
return $false
}
throw
}
}
return $false
}
function Test-WinRMHttpsListener {
$listener = Get-ChildItem -Path WSMan:\localhost\Listener |
Where-Object {
$_.Keys -match 'Transport=HTTPS'
} |
Select-Object -First 1
return $null -ne $listener
}
function Ensure-LocalAccountTokenFilterPolicy {
$registryPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
$propertyName = 'LocalAccountTokenFilterPolicy'
$currentValue = Get-ItemProperty -Path $registryPath -Name $propertyName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $propertyName -ErrorAction SilentlyContinue
if ($currentValue -ne 1) {
New-ItemProperty -Path $registryPath -Name $propertyName -Value 1 -PropertyType DWord -Force | Out-Null
return $true
}
return $false
}
function Ensure-CurrentUserInRemoteManagementGroup {
$groupName = 'Utenti gestione remota'
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$members = @(Get-LocalGroupMember -Name $groupName -ErrorAction Stop | Select-Object -ExpandProperty Name)
if ($members -contains $currentUser) {
return @{ Changed = $false; User = $currentUser; Group = $groupName }
}
Add-LocalGroupMember -Group $groupName -Member $currentUser -ErrorAction Stop
return @{ Changed = $true; User = $currentUser; Group = $groupName }
}
function Enable-FeatureIfNeeded {
param(
[Parameter(Mandatory = $true)]
[string]$FeatureName
)
$feature = Get-WindowsOptionalFeature -Online -FeatureName $FeatureName
if ($feature.State -ne 'Enabled') {
Enable-WindowsOptionalFeature -Online -FeatureName $FeatureName -All -NoRestart | Out-Null
return $true
}
return $false
}
$rebootRequired = $false
$rebootRequired = (Enable-FeatureIfNeeded -FeatureName 'Microsoft-Windows-Subsystem-Linux') -or $rebootRequired
$rebootRequired = (Enable-FeatureIfNeeded -FeatureName 'VirtualMachinePlatform') -or $rebootRequired
wsl --set-default-version 2
$installedDistributions = @(wsl --list --quiet) | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' }
$installedUbuntuDistribution = $installedDistributions | Where-Object { $_ -like 'Ubuntu*' } | Select-Object -First 1
if (-not $SkipUbuntuInstall -and $null -eq $installedUbuntuDistribution) {
wsl --install --distribution $Distribution --no-launch
$rebootRequired = $true
}
Enable-PSRemoting -SkipNetworkProfileCheck -Force
Set-Service -Name WinRM -StartupType Automatic
$winrmCertificate = Get-OrCreate-WinRMHttpsCertificate
$httpsListenerChanged = Ensure-WinRMHttpsListener -CertificateThumbprint $winrmCertificate.Thumbprint
$rebootRequired = (Ensure-LocalAccountTokenFilterPolicy) -or $rebootRequired
$remoteManagementGroupState = Ensure-CurrentUserInRemoteManagementGroup
$httpsFirewallRule = Get-NetFirewallRule -DisplayName 'WinRM HTTPS (5986)' -ErrorAction SilentlyContinue
if ($null -eq $httpsFirewallRule) {
New-NetFirewallRule -DisplayName 'WinRM HTTPS (5986)' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986 | Out-Null
}
if (-not (Test-WinRMHttpsListener)) {
throw 'WinRM HTTPS listener was not created successfully. Verify certificate creation and WSMan listener configuration.'
}
Write-Host ''
Write-Host 'Bootstrap completato.'
Write-Host 'Passi successivi:'
Write-Host '1. Riavvia Windows se richiesto dalle feature WSL.'
Write-Host '2. Avvia la distro Ubuntu almeno una volta e completa la creazione dell''utente Linux.'
Write-Host '3. Installa Ansible dentro WSL Ubuntu e lancia il playbook da li.'
Write-Host '4. Le applicazioni Windows saranno installate dal playbook Ansible; il backend predefinito e winget_psrp.'
Write-Host ''
Write-Host ('WSL distro Ubuntu rilevata: {0}' -f $(if ($null -ne $installedUbuntuDistribution) { $installedUbuntuDistribution } else { 'nessuna, verra installata ' + $Distribution }))
Write-Host ('PSRP transport consigliato: https://{0}:5986/wsman' -f $env:COMPUTERNAME)
Write-Host ('Certificato WinRM HTTPS: {0}' -f $winrmCertificate.Thumbprint)
Write-Host ('Utente aggiunto a Utenti gestione remota: {0}' -f $remoteManagementGroupState.User)
Write-Host ('Listener HTTPS creato in questo run: {0}' -f $(if ($httpsListenerChanged) { 'yes' } else { 'no' }))
Write-Host ('Riavvio consigliato: {0}' -f $(if ($rebootRequired) { 'yes' } else { 'no' }))

View File

@@ -1,103 +0,0 @@
#!/usr/bin/env sh
# Remove i3 session artifacts: exclusive packages, dotfiles and the emptty
# xsessions entry. Shared resources with sway (dunst, rofi, alacritty,
# xfce4-screenshooter) are left untouched.
set -eu
I3_PACKAGES="
arandr
autorandr
feh
i3
i3blocks
i3blocks-blocklets
i3lock-color
i3status
picom
polybar
scrot
setxkbmap
volumeicon
xclip
xfce4-clipman-plugin
xkbutils
xorg-fonts
xorg-minimal
xss-lock
xdotool
"
I3_DOTFILES="
$HOME/.config/i3
$HOME/.config/i3blocks
$HOME/.config/picom
$HOME/.config/polybar
$HOME/.xinitrc
"
EMPTTY_SESSION=/etc/emptty/xsessions/i3.desktop
confirm() {
printf '%s [y/N] ' "$1"
read -r answer
case "$answer" in
y|Y|yes|YES) return 0 ;;
*) return 1 ;;
esac
}
filter_installed() {
for p in $1; do
if xbps-query -p pkgver "$p" >/dev/null 2>&1; then
printf '%s\n' "$p"
fi
done
}
if ! command -v xbps-remove >/dev/null 2>&1; then
printf 'Error: xbps-remove not found (not a Void host?)\n' >&2
exit 1
fi
installed=$(filter_installed "$I3_PACKAGES" | tr '\n' ' ' | sed 's/ *$//')
printf '== i3 cleanup ==\n\n'
printf 'Packages to remove (installed only):\n'
if [ -n "$installed" ]; then
printf ' %s\n' $installed
else
printf ' (none)\n'
fi
printf '\nDotfiles to remove:\n'
for d in $I3_DOTFILES; do
if [ -e "$d" ] || [ -L "$d" ]; then
printf ' %s\n' "$d"
fi
done
printf '\nEmptty session entry:\n'
if [ -e "$EMPTTY_SESSION" ]; then
printf ' %s\n' "$EMPTTY_SESSION"
else
printf ' (absent)\n'
fi
printf '\nShared (NOT removed): dunst, rofi, alacritty, xfce4-screenshooter and their configs.\n\n'
confirm 'Proceed?' || { printf 'Aborted.\n'; exit 0; }
if [ -n "$installed" ]; then
# shellcheck disable=SC2086
sudo xbps-remove -Ry $installed
fi
for d in $I3_DOTFILES; do
if [ -e "$d" ] || [ -L "$d" ]; then
rm -rf -- "$d"
fi
done
if [ -e "$EMPTTY_SESSION" ]; then
sudo rm -f -- "$EMPTTY_SESSION"
fi
printf '\nDone.\n'

View File

@@ -1,11 +1,13 @@
#!/bin/sh
# Rimuove i3 e relativi dotfiles dall'host corrente.
# Eseguire dopo aver verificato che sway funzioni correttamente.
# Rimuove i3 (sessione X11) e relativi artefatti dall'host Void corrente:
# pacchetti i3-only, dotfiles, voce emptty e profili autorandr host-specifici.
# Eseguire dopo aver verificato che sway/Hyprland funzionino correttamente.
# I pacchetti condivisi con sway/Hyprland (dunst, rofi, alacritty) NON vengono rimossi.
set -e
HOSTNAME=$(hostname)
# Pacchetti i3-only (dunst e rofi sono condivisi con sway, non rimossi)
# Pacchetti i3-only (X11). dunst/rofi/alacritty sono condivisi e non vengono rimossi.
sudo xbps-remove -R arandr autorandr feh i3 i3blocks i3blocks-blocklets \
i3lock-color i3status picom polybar scrot setxkbmap volumeicon xclip \
xfce4-clipman-plugin xfce4-screenshooter xkbutils xorg-fonts xorg-minimal \
@@ -14,15 +16,15 @@ sudo xbps-remove -R arandr autorandr feh i3 i3blocks i3blocks-blocklets \
# Dotfiles i3-only
rm -rf ~/.config/i3 ~/.config/i3blocks
rm -f ~/.config/picom/picom.conf
rmdir --ignore-fail-on-non-empty ~/.config/picom
rmdir --ignore-fail-on-non-empty ~/.config/picom 2>/dev/null || true
rm -f ~/.config/polybar/config.ini ~/.config/polybar/launch.sh
rmdir --ignore-fail-on-non-empty ~/.config/polybar
rmdir --ignore-fail-on-non-empty ~/.config/polybar 2>/dev/null || true
rm -f ~/.xinitrc
# Session file emptty
# Session file emptty (X11)
sudo rm -f /etc/emptty/xsessions/i3.desktop
# Dotfiles host-specifici
# Dotfiles host-specifici (autorandr = multi-monitor X11)
case "$HOSTNAME" in
ikaros|nymph)
rm -rf ~/.config/autorandr

View File

@@ -8,10 +8,6 @@ vault_icloud_mail_password: "REPLACE_ME"
vault_git_work_email: "REPLACE_ME"
vault_git_work_gpg: "REPLACE_ME"
vault_openai_api_key: "REPLACE_ME"
vault_windows_psrp_host: "REPLACE_ME"
vault_windows_psrp_user: 'MicrosoftAccount\user@example.com'
vault_windows_psrp_password: "REPLACE_ME"
vault_windows_package_backend: "winget_psrp"
vault_navidrome_db_password: "REPLACE_ME"
vault_postgres_root_password: "REPLACE_ME"
vault_ikaros_authorized_ssh_keys: