9 Commits

Author SHA1 Message Date
Fabio Scotto di Santolo
60f177f51c Add targeted Gufw compatibility for Sway sessions
- Remove the global xhost call from start-sway-session to keep Wayland startup clean
- Add a dedicated gufw wrapper and desktop override that temporarily grants Xwayland access only for gufw
2026-04-24 10:27:57 +02:00
Fabio Scotto di Santolo
dc25960f08 Replace Noctalia screenshot plugin with flameshot
- Switch Sway screenshot keybinds to flameshot and start it with the session
- Replace the Noctalia screenshot plugin with the official clipboard plugin and dedicated clipboard shortcuts
2026-04-24 10:27:13 +02:00
Fabio Scotto di Santolo
a57685d377 Desktop Sway: add xhost for polkit authentication compatibility 2026-04-24 00:26:39 +02:00
Fabio Scotto di Santolo
781f366fe7 Desktop Sway: add xorg-server-xwayland for X11 app compatibility 2026-04-24 00:07:23 +02:00
Fabio Scotto di Santolo
53b7baf52f Noctalia: add Network and Bluetooth to systray 2026-04-24 00:03:25 +02:00
Fabio Scotto di Santolo
525b0b0e42 Profile i3: remove unnecessary dunst/rofi directory creation
These directories are created automatically by the dotfiles copy task
in profile_desktop_i3, so hardcoding them in profile_desktop_common
unnecessarily creates them on Sway hosts.
2026-04-23 23:22:56 +02:00
Fabio Scotto di Santolo
57a605587a Set fixed wallpaper for Noctalia via wallpapers.json cache 2026-04-23 23:17:49 +02:00
Fabio Scotto di Santolo
8acd8204b9 Add i3 cleanup script for post-migration hosts
- Add a manual oneshot script to remove i3-only packages and configs after moving a host to SwayFX and Noctalia
- Support dry-run by default with optional apply and aggressive cleanup modes
2026-04-23 21:24:05 +02:00
Fabio Scotto di Santolo
e5b24fdf2c Align desktop theming around Noctalia Ayu
- Move Sway, GTK, Qt, Alacritty, and Emacs toward the Noctalia-generated Ayu theme
- Add shared font/cursor settings, qt5ct/qt6ct templates, and Flatpak theme integration support
- Keep browser and Telegram theming manual while preserving generated Noctalia assets where useful
2026-04-23 20:52:58 +02:00
117 changed files with 2460 additions and 2289 deletions

View File

@@ -1,16 +0,0 @@
{
"permissions": {
"allow": [
"Bash(xargs ls -la)",
"Bash(command -v pacman)",
"Bash(command -v paclist)",
"Bash(command -v pacinfo)",
"Bash(git -C /home/fscotto/AnsiblePlaybook add ansible/inventory/group_vars/arch.yml ansible/roles/services_systemd/tasks/main.yml)",
"Bash(git -C /home/fscotto/AnsiblePlaybook commit -m ' *)",
"Bash(git -C /home/fscotto/AnsiblePlaybook diff --stat)",
"Bash(git -C /home/fscotto/AnsiblePlaybook status --short)",
"Bash(git -C /home/fscotto/AnsiblePlaybook log --oneline --all -- ansible/inventory/host_vars/nymph.yml ansible/roles/profile_desktop_host/tasks/nymph.yml 'dotfiles/nymph/*')",
"Bash(git *)"
]
}
}

0
.codex
View File

View File

@@ -6,9 +6,7 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
- Main orchestration: `ansible/site.yml` - Main orchestration: `ansible/site.yml`
- Inventory and layering inputs: `ansible/inventory/hosts.yml`, `ansible/inventory/group_vars/*.yml`, `ansible/inventory/host_vars/*.yml` - Inventory and layering inputs: `ansible/inventory/hosts.yml`, `ansible/inventory/group_vars/*.yml`, `ansible/inventory/host_vars/*.yml`
- Dotfiles live under `dotfiles/` - Dotfiles live under `dotfiles/`
- AI agent instructions (bootstrap, rules, knowledge) are centralized in `dotfiles/common/.config/ai/` and shared between OpenCode, Codex, and Gemini CLI. - OpenCode loads global instructions from `dotfiles/desktop/.config/opencode/opencode.json`
- OpenCode loads its entrypoint configuration from `dotfiles/common/.config/opencode/opencode.json`.
- Codex config is rendered from `dotfiles/common/.codex/config.toml.j2` so `model_instructions_file` points to the deployed `~/.config/ai/bootstrap.md`.
## Topology ## Topology
- Void desktops: `ikaros`, `nymph` - Void desktops: `ikaros`, `nymph`
@@ -41,6 +39,7 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
- Server: `ansible-playbook ansible/site.yml --limit prometheus --check --diff` - Server: `ansible-playbook ansible/site.yml --limit prometheus --check --diff`
- Focused checks: - Focused checks:
- Emacs dotfiles only: `ansible-playbook ansible/site.yml --limit ikaros --tags emacs --check --diff` or `--limit nymph --tags emacs --check --diff` - Emacs dotfiles only: `ansible-playbook ansible/site.yml --limit ikaros --tags emacs --check --diff` or `--limit nymph --tags emacs --check --diff`
- Sway/Noctalia bootstrap on nymph: `ansible-playbook ansible/site.yml --limit nymph --tags packages,dotfiles:desktop,sway --check --diff`
- Mail bootstrap: `sh -n scripts/bootstrap_mail.sh` and `shellcheck scripts/bootstrap_mail.sh` - 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)"` - 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` - Server compose render: `docker compose -f /opt/docker/server/docker-compose.yml config`
@@ -53,16 +52,19 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
- Put host-specific overrides in `host_vars`, not shared `group_vars`. - Put host-specific overrides in `host_vars`, not shared `group_vars`.
- Use `no_log: true` for secret-bearing task inputs or outputs. - Use `no_log: true` for secret-bearing task inputs or outputs.
## Desktop Notes ## Desktop Void Notes
- `profile_desktop_common` owns the shared desktop bootstrap. - `profile_desktop_common` owns the shared desktop bootstrap.
- `.emacs.d` is deployed by a dedicated `profile_desktop_common` task tagged `emacs`. - `.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`. - User services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`.
- Void user services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`. - `ssh-agent` runs under `turnstile` with stable socket `~/.local/state/ssh-agent/socket`.
- `ssh-agent` keeps the stable socket `~/.local/state/ssh-agent/socket`.
- Critical session entrypoints: - Critical session entrypoints:
- `dotfiles/desktop/.xinitrc` - `dotfiles/desktop/.xinitrc`
- Do not auto-restart `emptty` during playbook runs on active Void desktop hosts; restart it manually from another TTY/SSH session if needed. - `dotfiles/desktop/.local/bin/start-sway-session`
- `nymph` is an i3/X11 Void laptop with NVIDIA Optimus; host-specific tasks in `profile_desktop_host/tasks/nymph.yml` handle GRUB NVIDIA cmdline params, `prime-run` wrapper, and the WirePlumber camera priority config. - Do not auto-restart `emptty` during playbook runs on active desktop hosts; restart it manually from another TTY/SSH session if needed.
- `profile_desktop_sway` owns the Sway session, Noctalia config rendering, and official plugin linking.
- Noctalia shared config lives in `dotfiles/desktop/.config/noctalia/`; bar monitors and `screenOverrides` come from inventory (`noctalia_bar_monitors`, `noctalia_screen_overrides`).
- On Sway hosts, `udiskie` is the backend for automount/LUKS but runs without tray; USB device UI is handled by `usb-drive-manager`.
- Do not re-introduce `network-manager-applet` or `blueman` on Sway hosts without an explicit host-specific reason.
## Workstation / Windows Notes ## Workstation / Windows Notes
- Native Linux workstation hosts can combine `workstation_host_linux` with an OS-specific dev group. - Native Linux workstation hosts can combine `workstation_host_linux` with an OS-specific dev group.
@@ -71,13 +73,6 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
- `workstation_host_windows` runs with `gather_facts: false` and validates PSRP settings plus `windows_package_backend` before role execution. - `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. - 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`.
- Shared agent dotfiles live in `ai_agents_dotfiles`; rendered configs live in `ai_agents_templates`.
- Desktop, native workstation, and WSL profiles consume the shared agent package list; do not duplicate package entries in profile-specific vars.
- `dotfiles_common` copies common dotfiles plus `ai_agents_dotfiles`, then renders `ai_agents_templates`.
- Keep `.config/ai/` as the common instruction source; update agent-specific entrypoints to reference it rather than duplicating instruction text.
## Tooling Notes ## Tooling Notes
- Install local tooling with: - Install local tooling with:
- `python3 -m pip install ansible ansible-lint yamllint shellcheck-py` - `python3 -m pip install ansible ansible-lint yamllint shellcheck-py`

View File

@@ -31,11 +31,8 @@ infra/
│ ├── common/ │ ├── common/
│ ├── desktop/ │ ├── desktop/
│ ├── fedora/ │ ├── fedora/
│ ├── ubuntu/
│ ├── server/ │ ├── server/
│ ├── workstation/ │ ├── workstation/
│ ├── workstation_host_linux/
│ ├── workstation_dev_wsl/
│ ├── ikaros/ │ ├── ikaros/
│ └── nymph/ │ └── nymph/
@@ -73,7 +70,7 @@ Sistema operativo:
Sessioni desktop: Sessioni desktop:
- `ikaros`: i3 - `ikaros`: i3
- `nymph`: i3 - `nymph`: SwayFX
Macchine: Macchine:
@@ -85,8 +82,8 @@ Queste macchine condividono la stessa configurazione base desktop e vengono mant
Lo stato attuale del profilo desktop include, tra le altre cose: Lo stato attuale del profilo desktop include, tra le altre cose:
- dotfiles comuni e desktop - dotfiles comuni e desktop
- sessione i3 su entrambi gli host - sessione i3 su `ikaros` e sessione Sway su `nymph`
- `emptty` con default host-specific per il desktop attivo, con `XORG_SESSIONS_PATH` puntato a `/etc/emptty/xsessions` per esporre solo le sessioni esplicitamente whitelistate - `emptty` con default host-specific per il desktop attivo su ogni host
- pacchetti Void Linux e servizi runit - pacchetti Void Linux e servizi runit
- `turnstile` per i servizi utente, inclusi `emacs` e `ssh-agent` - `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` - `ssh-agent` con socket stabile condiviso tra shell, SSH ed Emacs in `~/.local/state/ssh-agent/socket`
@@ -94,9 +91,10 @@ Lo stato attuale del profilo desktop include, tra le altre cose:
- `tmux` con plugin gestiti da TPM al bootstrap del profilo desktop - `tmux` con plugin gestiti da TPM al bootstrap del profilo desktop
- Flatpak con remoto Flathub - Flatpak con remoto Flathub
- GNOME Keyring e bootstrap della posta via script dedicato - GNOME Keyring e bootstrap della posta via script dedicato
- `udiskie` come backend per automount/LUKS - shell Noctalia su Sway su `nymph`, con plugin ufficiali per clipboard (`clipper`, `clipboard`), polkit (`polkit-agent`) e gestione USB (`usb-drive-manager`); config condivisa in `dotfiles/desktop/.config/noctalia/` e `settings.json` renderizzato da template Ansible con variabili host-specifiche
- `autorandr` per profili monitor host-specifici (`nymph` ha profili `dual` e `solo`) - `udiskie` come backend per automount/LUKS su Sway, senza tray; la UI dei dispositivi removibili è demandata a `usb-drive-manager`
- 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 - `kanshi` su `nymph` per il profilo monitor Wayland, con workspace Sway deterministici: in dual monitor `1` resta su `eDP-1` e `2-10` vanno su `DP-1`, mentre in laptop-only tutti tornano su `eDP-1`
- monitor Noctalia e `screenOverrides` dichiarati in inventory (`noctalia_bar_monitors`, `noctalia_screen_overrides`) per host `nymph`
--- ---
@@ -272,6 +270,7 @@ I principali ruoli attualmente presenti sono:
| services_systemd | gestione servizi systemd | | services_systemd | gestione servizi systemd |
| profile_desktop_common | bootstrap desktop Void condiviso | | profile_desktop_common | bootstrap desktop Void condiviso |
| profile_desktop_i3 | sessione desktop i3 | | profile_desktop_i3 | sessione desktop i3 |
| profile_desktop_sway | sessione desktop Sway |
| profile_desktop_host | override desktop specifici per host | | profile_desktop_host | override desktop specifici per host |
| profile_workstation_dev_common | configurazione dev workstation condivisa | | profile_workstation_dev_common | configurazione dev workstation condivisa |
| profile_workstation_gnome | configurazione host workstation GNOME | | profile_workstation_gnome | configurazione host workstation GNOME |
@@ -289,7 +288,7 @@ Il playbook `ansible/site.yml` e attualmente composto da sette blocchi:
```text ```text
all:!workstation_host_windows -> dotfiles_common all:!workstation_host_windows -> dotfiles_common
void -> packages_void + services_runit + profile_desktop_common + profile_desktop_i3 + profile_desktop_host void -> packages_void + services_runit + profile_desktop_common + profile_desktop_i3 + profile_desktop_sway + profile_desktop_host
workstation_dev_ubuntu -> packages_ubuntu + services_systemd + profile_workstation_dev_common workstation_dev_ubuntu -> packages_ubuntu + services_systemd + profile_workstation_dev_common
workstation_dev_fedora -> packages_fedora + services_systemd + profile_workstation_dev_common workstation_dev_fedora -> packages_fedora + services_systemd + profile_workstation_dev_common
workstation_host_linux -> profile_workstation_gnome workstation_host_linux -> profile_workstation_gnome
@@ -317,10 +316,7 @@ dotfiles/
├── desktop ├── desktop
├── server ├── server
├── fedora ├── fedora
├── ubuntu
├── workstation ├── workstation
├── workstation_host_linux
├── workstation_dev_wsl
├── ikaros ├── ikaros
└── nymph └── nymph
``` ```
@@ -376,7 +372,7 @@ ansible-playbook ansible/site.yml
Allo stato attuale questo comando: Allo stato attuale questo comando:
- distribuisce i dotfiles comuni a tutti gli host - distribuisce i dotfiles comuni a tutti gli host
- per gli host Void applica bootstrap desktop condiviso, sessione i3 e override specifici per host - per gli host Void applica bootstrap desktop condiviso, sessioni i3/Sway e override specifici per host
- per `workstation_dev_ubuntu` applica pacchetti Ubuntu, servizi systemd e profilo dev comune - per `workstation_dev_ubuntu` applica pacchetti Ubuntu, servizi systemd e profilo dev comune
- per `workstation_dev_fedora` applica pacchetti Fedora, servizi systemd e profilo dev comune - 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_host_linux` applica il layer host Linux GNOME
@@ -440,17 +436,17 @@ Allo stato attuale `ansible/site.yml` espone questi tag:
| `emptty` | gestione display manager `emptty` | desktop Void | | `emptty` | gestione display manager `emptty` | desktop Void |
| `gnome` | configurazione host GNOME | workstation host Linux, parte desktop | | `gnome` | configurazione host GNOME | workstation host Linux, parte desktop |
| `i3` | sessione/configurazione i3 | desktop Void | | `i3` | sessione/configurazione i3 | desktop Void |
| `npm` | installazione pacchetti npm globali | desktop Void, workstation Linux, WSL |
| `nvidia` | componenti NVIDIA desktop | desktop Void | | `nvidia` | componenti NVIDIA desktop | desktop Void |
| `packages` | installazione e aggiornamento pacchetti | tutti i profili | | `packages` | installazione e aggiornamento pacchetti | tutti i profili |
| `services` | gestione servizi runit/systemd/Windows | tutti i profili | | `services` | gestione servizi runit/systemd/Windows | tutti i profili |
| `sway` | sessione/configurazione Sway | desktop Void |
| `vscode` | installazione/configurazione VS Code | Fedora, host Linux, Windows | | `vscode` | installazione/configurazione VS Code | Fedora, host Linux, Windows |
| `wsl` | bootstrap e configurazione WSL | WSL, Windows | | `wsl` | bootstrap e configurazione WSL | WSL, Windows |
Esempi pratici: Esempi pratici:
```bash ```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 deadalus-fedora --tags packages,vscode --check --diff ansible-playbook ansible/site.yml --limit deadalus-fedora --tags packages,vscode --check --diff
ansible-playbook ansible/site.yml --limit prometheus --tags services,dotfiles:server --check --diff ansible-playbook ansible/site.yml --limit prometheus --tags services,dotfiles:server --check --diff
``` ```

View File

@@ -50,42 +50,6 @@ common_dotfiles:
dest: .vimrc dest: .vimrc
mode: "0644" mode: "0644"
- name: bat config - name: bat config
src: .config/bat/ src: .config/bat/.config/bat/
dest: .config/bat/ dest: .config/bat/
mode: preserve mode: preserve
ai_agents_npm_packages:
- name: "opencode-ai"
state: latest
- name: "@anthropic-ai/claude-code"
state: latest
- name: "@openai/codex"
state: latest
- name: "@google/gemini-cli"
state: latest
ai_agents_enabled: true
ai_agents_dotfiles:
- name: AI common config
src: .config/ai/
dest: .config/ai/
mode: preserve
- name: Gemini CLI config
src: .gemini/
dest: .gemini/
mode: preserve
- name: OpenCode config
src: .config/opencode/
dest: .config/opencode/
mode: preserve
- name: Claude Code memory
src: .claude/
dest: .claude/
mode: preserve
ai_agents_templates:
- name: Codex config
src: .codex/config.toml.j2
dest: .codex/config.toml
mode: "0644"

View File

@@ -6,14 +6,147 @@ desktop_sessions_enabled:
desktop_default_session: i3 desktop_default_session: i3
desktop_default_session_env: xorg desktop_default_session_env: xorg
desktop_prompt_for_session: true desktop_restart_emptty_automatically: false
desktop_emptty_session_error_logging: disabled
desktop_ui_font_family: Noto Sans
desktop_ui_font_size: 10
desktop_fixed_font_family: Hack Nerd Font
desktop_sway_font_size: 10
desktop_alacritty_font_size: 12
desktop_emacs_font_size: 14
desktop_cursor_theme: Yaru
desktop_cursor_size: 24
desktop_icon_theme: Yaru-orange-dark
desktop_common_packages:
- brightnessctl
- dex
- emptty
- pinentry-emacs
- pinentry-gtk
- turnstile
- udiskie
- xdg-desktop-portal
- xdg-desktop-portal-gtk
- xdg-user-dirs
desktop_i3_packages:
- arandr
- autorandr
- feh
- i3
- i3blocks
- i3blocks-blocklets
- i3lock-color
- i3status
- dunst
- network-manager-applet
- rofi
- scrot
- setxkbmap
- blueman
- volumeicon
- xclip
- xfce-polkit
- xfce4-clipman-plugin
- xfce4-screenshooter
- xkbutils
- xorg-fonts
- xorg-minimal
- xss-lock
desktop_sway_packages:
- adw-gtk-theme
- flameshot
- grim
- kanshi
- qt5ct
- qt6ct
- slurp
- swayfx
- wl-clipboard
- xhost
- xdg-desktop-portal-wlr
- xorg-server-xwayland
profile_packages:
- alacritty
- bluez
- bridge-utils
- ctags
- firefox
- deluge-gtk
- dnsmasq
- emacs-gtk3
- poppler-glib
- poppler-utils
- exo
- fontconfig-devel
- freetype-devel
- gvfs-cdda
- gvfs-mtp
- gvfs-smb
- gufw
- libvirt
- libspa-bluetooth
- libreoffice
- liberation-fonts-ttf
- libvterm-devel
- libX11-devel
- libXft-devel
- meld
- mpv
- nerd-fonts-ttf
- nerd-fonts-symbols-ttf
- pdfarranger
- playerctl
- qemu
- qemu-firmware
- qemu-img
- qemu-tools
- remmina
- ripgrep
- rustup
- ristretto
- rsync
- shotwell
- ruff
- terminus-font
- texlive
- ty
- tumbler
- uv
- Thunar
- thunar-archive-plugin
- thunar-volman
- ffmpegthumbnailer
- virt-manager
- virt-manager-tools
- wireplumber
- xarchiver
- xournalpp
- yaru
- yaru-plus
- zstd
desktop_source_tools: desktop_source_tools:
- name: st
repo: https://codeberg.org/fscotto/st
build_cmd: make
binary_name: st
install_name: st
- name: gf - name: gf
repo: https://github.com/nakst/gf.git repo: https://github.com/nakst/gf.git
build_cmd: ./build.sh build_cmd: ./build.sh
binary_name: gf2 binary_name: gf2
install_name: gf install_name: gf
- name: bookokrat
repo: https://github.com/bugzmanov/bookokrat
build_cmd: cargo build --release
binary_name: bookokrat
install_name: bookokrat
build_output_path: target/release/bookokrat
- name: llmfit - name: llmfit
repo: https://github.com/AlexsJones/llmfit repo: https://github.com/AlexsJones/llmfit
build_cmd: cargo build --release build_cmd: cargo build --release
@@ -29,13 +162,27 @@ desktop_source_tools:
desktop_binary_tools: [] desktop_binary_tools: []
desktop_npm_packages: "{{ ai_agents_npm_packages + [] }}" desktop_npm_packages:
- name: "opencode-ai"
state: latest
desktop_common_dotfiles: desktop_common_dotfiles:
- name: XDG autostart entries - name: XDG autostart entries
src: .config/autostart/ src: .config/autostart/
dest: .config/autostart/ dest: .config/autostart/
mode: preserve mode: preserve
- name: alacritty config
src: .config/alacritty/
dest: .config/alacritty/
mode: preserve
- name: Thunar config
src: .config/Thunar/
dest: .config/Thunar/
mode: preserve
- name: MIME application defaults
src: .config/mimeapps.list
dest: .config/mimeapps.list
mode: "0644"
- name: fastfetch config - name: fastfetch config
src: .config/fastfetch/ src: .config/fastfetch/
dest: .config/fastfetch/ dest: .config/fastfetch/
@@ -52,38 +199,26 @@ desktop_common_dotfiles:
src: .config/yt-dlp/ src: .config/yt-dlp/
dest: .config/yt-dlp/ dest: .config/yt-dlp/
mode: preserve mode: preserve
- name: OpenCode config
src: .config/opencode/
dest: .config/opencode/
mode: preserve
- name: MPV config - name: MPV config
src: .config/mpv/ src: .config/mpv/
dest: .config/mpv/ dest: .config/mpv/
mode: preserve mode: preserve
- name: Bash cargo env fragment - name: Udiskie config
src: .bashrc.d/08-cargo-env.sh src: .config/udiskie/
dest: .bashrc.d/08-cargo-env.sh dest: .config/udiskie/
mode: "0644" mode: preserve
- name: Bash GPG TTY fragment - name: Turnstile user services
src: .bashrc.d/10-gpg-tty.sh src: .config/service/
dest: .bashrc.d/10-gpg-tty.sh dest: .config/service/
mode: "0644" mode: preserve
- name: Bash man page colors fragment - name: Bash profile fragments
src: .bashrc.d/12-manpages.sh src: .bashrc.d/
dest: .bashrc.d/12-manpages.sh dest: .bashrc.d/
mode: "0644" mode: preserve
- name: Bash editor fragment
src: .bashrc.d/20-editor-desktop.sh
dest: .bashrc.d/20-editor-desktop.sh
mode: "0644"
- name: Bash Emacs client fragment
src: .bashrc.d/25-emacs-client-desktop.sh
dest: .bashrc.d/25-emacs-client-desktop.sh
mode: "0644"
- name: Bash VM helper fragment
src: .bashrc.d/30-runvm.sh
dest: .bashrc.d/30-runvm.sh
mode: "0644"
- name: Bash Ansible playbook helper fragment
src: .bashrc.d/50-ap.sh
dest: .bashrc.d/50-ap.sh
mode: "0644"
- name: .gitignore_global - name: .gitignore_global
src: .gitignore_global src: .gitignore_global
dest: .gitignore_global dest: .gitignore_global
@@ -104,10 +239,26 @@ desktop_common_dotfiles:
src: .authinfo.gpg src: .authinfo.gpg
dest: .authinfo.gpg dest: .authinfo.gpg
mode: "0600" mode: "0600"
- name: Calibre database Flatpak wrapper - name: GTK theme setup script
src: .local/bin/calibredb src: .local/bin/setup-gtk-theme
dest: .local/bin/calibredb dest: .local/bin/setup-gtk-theme
mode: "0755" mode: "0755"
- name: Turnstile environment update script
src: .local/bin/update-turnstile-env
dest: .local/bin/update-turnstile-env
mode: "0755"
- name: Gufw Sway wrapper
src: .local/bin/run-gufw
dest: .local/bin/run-gufw
mode: "0755"
- name: Udiskie password helper
src: .local/bin/udiskie-password
dest: .local/bin/udiskie-password
mode: "0755"
- name: Desktop application overrides
src: .local/share/applications/
dest: .local/share/applications/
mode: preserve
- name: SSH config - name: SSH config
src: .ssh/config src: .ssh/config
dest: .ssh/config dest: .ssh/config
@@ -136,49 +287,48 @@ desktop_i3_dotfiles:
src: .config/rofi/ src: .config/rofi/
dest: .config/rofi/ dest: .config/rofi/
mode: preserve 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 - name: .xinitrc
src: .xinitrc src: .xinitrc
dest: .xinitrc dest: .xinitrc
mode: "0644" mode: "0644"
desktop_sway_dotfiles: desktop_sway_dotfiles:
- name: sway config - name: Sway config
src: .config/sway/ src: .config/sway/
dest: .config/sway/ dest: .config/sway/
mode: preserve mode: preserve
- name: dunst config - name: Sway wallpaper assets
src: .config/dunst/ src: .config/i3/wallpapers/
dest: .config/dunst/ dest: .config/sway/wallpapers/
mode: preserve mode: preserve
- name: rofi config - name: Noctalia wallpaper library
src: .config/rofi/ src: Pictures/Wallpapers/
dest: .config/rofi/ dest: Pictures/Wallpapers/
mode: preserve mode: preserve
- name: waybar config - name: Sway session wrapper
src: .config/waybar/ src: .local/bin/start-sway-session
dest: .config/waybar/ dest: .local/bin/start-sway-session
mode: preserve mode: "0755"
- name: alacritty config - name: Noctalia colors
src: .config/alacritty/ src: .config/noctalia/colors.json
dest: .config/alacritty/ dest: .config/noctalia/colors.json
mode: "0644"
- name: Noctalia plugins
src: .config/noctalia/plugins.json
dest: .config/noctalia/plugins.json
mode: "0644"
- name: Noctalia colorschemes
src: .config/noctalia/colorschemes/
dest: .config/noctalia/colorschemes/
mode: preserve mode: preserve
noctalia_bar_monitors:
- DP-1
noctalia_screen_overrides: []
noctalia_wallpaper: "{{ user_home }}/Pictures/Wallpapers/star-wars-trio.jpg"
desktop_flatpak_packages: desktop_flatpak_packages:
- be.alexandervanhee.gradia - be.alexandervanhee.gradia
- ch.protonmail.protonmail-bridge - ch.protonmail.protonmail-bridge
@@ -188,7 +338,16 @@ desktop_flatpak_packages:
- com.spotify.Client - com.spotify.Client
- io.github.flattool.Warehouse - io.github.flattool.Warehouse
- org.telegram.desktop - org.telegram.desktop
- org.mozilla.Thunderbird
desktop_flatpak_extensions: desktop_flatpak_extensions:
- org.gtk.Gtk3theme.Yaru-Blue-dark//stable - org.gtk.Gtk3theme.Yaru-Orange-dark//3.22
desktop_flatpak_global_filesystems:
- xdg-config/gtk-3.0:ro
- xdg-config/gtk-4.0:ro
- xdg-config/qt5ct:ro
- xdg-config/qt6ct:ro
desktop_flatpak_global_env:
- QT_QPA_PLATFORM=wayland
- QT_QPA_PLATFORMTHEME=qt6ct

View File

@@ -50,9 +50,6 @@ workstation_host_linux_packages_fedora:
- code - code
- firewall-config - firewall-config
- gnome-extensions-app - gnome-extensions-app
- gnome-shell-extension-appindicator
- gnome-shell-extension-just-perfection
- gnome-shell-extension-no-overview
- gnome-tweaks - gnome-tweaks
- libreoffice - libreoffice
- meld - meld
@@ -61,7 +58,6 @@ workstation_host_linux_packages_fedora:
- pinentry-gnome3 - pinentry-gnome3
- podman - podman
- podman-compose - podman-compose
- rclone
- yubikey-manager - yubikey-manager
workstation_flatpak_remote_name: flathub workstation_flatpak_remote_name: flathub

View File

@@ -6,7 +6,6 @@ effective_username: "{{ server_username }}"
effective_user_group: "{{ server_user_group }}" effective_user_group: "{{ server_user_group }}"
effective_user_home: "{{ server_user_home }}" effective_user_home: "{{ server_user_home }}"
server_container_stack_dir: /opt/docker/server server_container_stack_dir: /opt/docker/server
ai_agents_enabled: false
profile_packages: profile_packages:
- avahi-daemon - avahi-daemon
@@ -93,14 +92,6 @@ server_directories:
owner: "1000" owner: "1000"
group: "1000" group: "1000"
mode: "0755" mode: "0755"
- path: /srv/nextcloud
owner: root
group: root
mode: "0755"
- path: /srv/nextcloud/data
owner: root
group: root
mode: "0755"
server_ufw_rules: server_ufw_rules:
- rule: allow - rule: allow

View File

@@ -1,11 +1,4 @@
--- ---
desktop_void_source_tools:
- name: st
repo: https://codeberg.org/fscotto/st
build_cmd: make
binary_name: st
install_name: st
void_packages_base: void_packages_base:
- 7zip - 7zip
- NetworkManager - NetworkManager
@@ -25,25 +18,18 @@ void_packages_base:
- fuse3 - fuse3
- gcc - gcc
- gdb - gdb
- gist
- github-cli
- gnome-keyring - gnome-keyring
- go - go
- gvfs - gvfs
- hugo
- ImageMagick - ImageMagick
- isync - isync
- libsecret - libsecret
- libtool - libtool
- linux-mainline
- lm_sensors - lm_sensors
- man-pages-devel
- man-pages-posix
- msmtp - msmtp
- mu4e - mu4e
- network-manager-applet - network-manager-applet
- nodejs - nodejs
- ntfs-3g
- pavucontrol - pavucontrol
- pipewire - pipewire
- pkg-config - pkg-config
@@ -56,13 +42,13 @@ void_packages_base:
- simple-scan - simple-scan
- socklog - socklog
- socklog-void - socklog-void
- speech-dispatcher
- syncthing - syncthing
- system-config-printer - system-config-printer
- tmux - tmux
- tealdeer - tealdeer
- tree-sitter-grammars - tree-sitter-grammars
- ufw - ufw
- xdotool
- void-repo-nonfree - void-repo-nonfree
- vpm - vpm
- vsv - vsv
@@ -85,167 +71,3 @@ enabled_services:
- ufw - ufw
- virtlockd - virtlockd
- virtlogd - virtlogd
desktop_restart_emptty_automatically: false
desktop_emptty_session_error_logging: disabled
desktop_void_dotfiles:
- name: Turnstile user services
src: .config/service/
dest: .config/service/
mode: preserve
- name: Thunar config
src: .config/Thunar/
dest: .config/Thunar/
mode: preserve
- name: MIME application defaults
src: .config/mimeapps.list
dest: .config/mimeapps.list
mode: "0644"
- name: Bash DBus session fragment
src: .bashrc.d/14-dbus-session.sh
dest: .bashrc.d/14-dbus-session.sh
mode: "0644"
- name: Bash SSH agent socket fragment
src: .bashrc.d/16-ssh-agent-socket.sh
dest: .bashrc.d/16-ssh-agent-socket.sh
mode: "0644"
- name: Bash runit desktop fragment
src: .bashrc.d/15-runit-desktop.sh
dest: .bashrc.d/15-runit-desktop.sh
mode: "0644"
- name: GTK theme setup script
src: .local/bin/setup-gtk-theme
dest: .local/bin/setup-gtk-theme
mode: "0755"
- name: Udiskie password helper
src: .local/bin/udiskie-password
dest: .local/bin/udiskie-password
mode: "0755"
- name: Udiskie config
src: .config/udiskie/
dest: .config/udiskie/
mode: preserve
- name: Turnstile environment update script
src: .local/bin/update-turnstile-env
dest: .local/bin/update-turnstile-env
mode: "0755"
desktop_common_packages:
- blueman
- brightnessctl
- dex
- emptty
- network-manager-applet
- pinentry-emacs
- pinentry-gtk
- turnstile
- udiskie
- xdg-desktop-portal
- xdg-desktop-portal-gtk
- 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
- flameshot
- grim
- jq
- kanshi
- rofi
- slurp
- swayfx
- swaybg
- swayidle
- swaylock
- SwayOSD
- Waybar
- wl-clipboard
- xdg-desktop-portal-wlr
- xorg-server-xwayland
profile_packages:
- alacritty
- bluez
- bridge-utils
- ctags
- firefox
- deluge-gtk
- dnsmasq
- emacs-gtk3
- poppler-glib
- poppler-utils
- exo
- fontconfig-devel
- freetype-devel
- gvfs-cdda
- gvfs-mtp
- gvfs-smb
- gufw
- libvirt
- libspa-bluetooth
- libreoffice
- liberation-fonts-ttf
- libvterm-devel
- libX11-devel
- libXft-devel
- meld
- mpv
- nerd-fonts-ttf
- nerd-fonts-symbols-ttf
- pdfarranger
- playerctl
- qemu
- qemu-firmware
- qemu-img
- qemu-tools
- remmina
- ripgrep
- rustup
- ristretto
- rsync
- shotwell
- ruff
- terminus-font
- texlive
- ty
- tumbler
- uv
- Thunar
- thunar-archive-plugin
- thunar-volman
- ffmpegthumbnailer
- virt-manager
- virt-manager-tools
- wireplumber
- xarchiver
- xournalpp
- yaru
- yaru-plus
- zstd

View File

@@ -1,4 +1,6 @@
--- ---
workstation_manage_opencode: true workstation_manage_opencode: true
workstation_npm_packages: "{{ ai_agents_npm_packages + [] }}" workstation_npm_packages:
- name: "opencode-ai"
state: latest

View File

@@ -148,29 +148,3 @@ workstation_gnome_managed_settings:
- schema: org.gnome.TextEditor - schema: org.gnome.TextEditor
key: wrap-text key: wrap-text
value: "true" value: "true"
- schema: org.gnome.desktop.background
key: picture-uri
value: "'file:///usr/share/backgrounds/gnome/lcd-rainbow-l.jxl'"
- schema: org.gnome.desktop.background
key: picture-uri-dark
value: "'file:///usr/share/backgrounds/gnome/lcd-rainbow-d.jxl'"
workstation_gnome_extension_dconf_settings:
- path: /org/gnome/shell/extensions/paperwm/
key: selection-border-radius-bottom
value: "15"
- path: /org/gnome/shell/extensions/paperwm/
key: selection-border-radius-top
value: "15"
- path: /org/gnome/shell/extensions/paperwm/
key: selection-border-size
value: "5"
- path: /org/gnome/shell/extensions/paperwm/
key: show-window-position-bar
value: "false"
- path: /org/gnome/shell/extensions/paperwm/
key: show-workspace-indicator
value: "false"
- path: /org/gnome/shell/extensions/paperwm/
key: window-gap
value: "10"

View File

@@ -3,7 +3,6 @@ hostname: ikaros
desktop_sessions_enabled: desktop_sessions_enabled:
- i3 - i3
- sway
desktop_default_session: i3 desktop_default_session: i3
desktop_default_session_env: xorg desktop_default_session_env: xorg

View File

@@ -2,21 +2,26 @@
hostname: nymph hostname: nymph
desktop_sessions_enabled: desktop_sessions_enabled:
- i3
- sway - sway
desktop_default_session: i3 desktop_default_session: sway
desktop_default_session_env: xorg desktop_default_session_env: wayland
desktop_emptty_session_error_logging: rotate desktop_emptty_session_error_logging: rotate
host_xbps_repositories:
- name: noctalia
url: https://universalrepo.r1xelelo.workers.dev/void
host_packages: host_packages:
- nvidia580 - cliphist
- linux-mainline-headers - grimshot
- nvidia
- noctalia-shell
- power-profiles-daemon
- mesa-dri - mesa-dri
- vulkan-loader - vulkan-loader
- mesa-vulkan-intel - mesa-vulkan-intel
- intel-video-accel - intel-video-accel
- power-profiles-daemon
- tlp - tlp
- tlp-rdw - tlp-rdw
- upower - upower
@@ -24,14 +29,6 @@ host_packages:
host_enabled_services: host_enabled_services:
- tlp - 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: host_sway_dotfiles:
- src: .config/sway/host.conf - src: .config/sway/host.conf
dest: .config/sway/host.conf dest: .config/sway/host.conf
@@ -39,6 +36,20 @@ host_sway_dotfiles:
- src: .config/sway/session-env - src: .config/sway/session-env
dest: .config/sway/session-env dest: .config/sway/session-env
mode: "0644" mode: "0644"
- src: .config/kanshi/ - src: .config/kanshi/config
dest: .config/kanshi/ dest: .config/kanshi/config
mode: preserve mode: "0644"
noctalia_bar_monitors:
- DP-1
- eDP-1
noctalia_screen_overrides:
- name: DP-1
enabled: false
- name: eDP-1
enabled: false
host_packages_absent:
- network-manager-applet
- blueman

View File

@@ -14,16 +14,7 @@
group: "{{ effective_user_group }}" group: "{{ effective_user_group }}"
mode: "0755" mode: "0755"
loop: "{{ xdg_user_directories | default([]) }}" loop: "{{ xdg_user_directories | default([]) }}"
when: "'desktop' in group_names" when: "'void' in group_names"
- name: Extract templates kit to Templates directory
tags: [dotfiles, dotfiles:common]
ansible.builtin.unarchive:
src: "{{ playbook_dir }}/../dotfiles/common/templates_kit.zip"
dest: "{{ effective_user_home }}/Templates"
owner: "{{ effective_username }}"
group: "{{ effective_user_group }}"
when: "'desktop' in group_names"
- name: Ensure SSH socket directory exists - name: Ensure SSH socket directory exists
tags: [dotfiles, dotfiles:common] tags: [dotfiles, dotfiles:common]
@@ -42,41 +33,10 @@
owner: "{{ effective_username }}" owner: "{{ effective_username }}"
group: "{{ effective_user_group }}" group: "{{ effective_user_group }}"
mode: "{{ item.mode }}" mode: "{{ item.mode }}"
loop: >- loop: "{{ common_dotfiles | default([]) }}"
{{
(common_dotfiles | default([]))
+ ((ai_agents_dotfiles | default([])) if (ai_agents_enabled | default(false)) else [])
}}
loop_control: loop_control:
label: "{{ item.dest }}" label: "{{ item.dest }}"
- name: Ensure AI config directories exist
tags: [dotfiles, dotfiles:common]
ansible.builtin.file:
path: "{{ effective_user_home }}/{{ item }}"
state: directory
owner: "{{ effective_username }}"
group: "{{ effective_user_group }}"
mode: "0755"
loop:
- .codex
when:
- ai_agents_enabled | default(false)
- (ai_agents_templates | default([])) | length > 0
- name: Render AI agent templates
tags: [dotfiles, dotfiles:common]
ansible.builtin.template:
src: "{{ playbook_dir }}/../dotfiles/common/{{ item.src }}"
dest: "{{ effective_user_home }}/{{ item.dest }}"
owner: "{{ effective_username }}"
group: "{{ effective_user_group }}"
mode: "{{ item.mode }}"
loop: "{{ ai_agents_templates | default([]) }}"
loop_control:
label: "{{ item.dest }}"
when: ai_agents_enabled | default(false)
- name: Refresh bat cache - name: Refresh bat cache
tags: [dotfiles, dotfiles:common] tags: [dotfiles, dotfiles:common]
ansible.builtin.command: ansible.builtin.command:

View File

@@ -5,7 +5,6 @@
changed_when: true changed_when: true
when: when:
- not ansible_check_mode - not ansible_check_mode
- "'void' in group_names"
- desktop_restart_emptty_automatically | default(false) - desktop_restart_emptty_automatically | default(false)
- name: Report manual emptty restart requirement - name: Report manual emptty restart requirement
@@ -17,13 +16,10 @@
to avoid dropping the active graphical session. to avoid dropping the active graphical session.
when: when:
- not ansible_check_mode - not ansible_check_mode
- "'void' in group_names"
- not (desktop_restart_emptty_automatically | default(false)) - not (desktop_restart_emptty_automatically | default(false))
- name: Reload SSH service with runit - name: Reload SSH service
listen: Reload SSH service listen: Reload SSH service
ansible.builtin.command: sv reload sshd ansible.builtin.command: sv reload sshd
changed_when: true changed_when: true
when: when: not ansible_check_mode
- not ansible_check_mode
- "'void' in group_names"

View File

@@ -6,7 +6,6 @@
regexp: '^#?HandleLidSwitch=' regexp: '^#?HandleLidSwitch='
line: 'HandleLidSwitch=suspend' line: 'HandleLidSwitch=suspend'
state: present state: present
when: "'void' in group_names"
- name: Ensure common config directories exist - name: Ensure common config directories exist
tags: [dotfiles, dotfiles:desktop] tags: [dotfiles, dotfiles:desktop]
@@ -19,11 +18,13 @@
loop: loop:
- "{{ user_home }}/.config" - "{{ user_home }}/.config"
- "{{ user_home }}/.config/autostart" - "{{ user_home }}/.config/autostart"
- "{{ user_home }}/.bashrc.d" - "{{ user_home }}/.config/alacritty"
- "{{ user_home }}/.config/Thunar"
- "{{ user_home }}/.local/share"
- "{{ user_home }}/.local/share/applications"
- "{{ user_home }}/.tmux" - "{{ user_home }}/.tmux"
- "{{ user_home }}/.tmux/bin" - "{{ user_home }}/.tmux/bin"
- "{{ user_home }}/.tmux/plugins" - "{{ user_home }}/.tmux/plugins"
- "{{ user_home }}/.ssh"
- name: Ensure user local bin directory exists - name: Ensure user local bin directory exists
tags: [dotfiles, dotfiles:desktop, dotfiles:host] tags: [dotfiles, dotfiles:desktop, dotfiles:host]
@@ -41,7 +42,6 @@
insertafter: '^auth\s+include\s+system-local-login$' insertafter: '^auth\s+include\s+system-local-login$'
line: "auth optional pam_gnome_keyring.so" line: "auth optional pam_gnome_keyring.so"
state: present state: present
when: "'void' in group_names"
- name: Enable gnome-keyring PAM session hook - name: Enable gnome-keyring PAM session hook
tags: [packages, gnome] tags: [packages, gnome]
@@ -50,7 +50,6 @@
insertafter: '^session\s+include\s+system-local-login$' insertafter: '^session\s+include\s+system-local-login$'
line: "session optional pam_gnome_keyring.so auto_start" line: "session optional pam_gnome_keyring.so auto_start"
state: present state: present
when: "'void' in group_names"
- name: Enable gnome-keyring PAM password hook - name: Enable gnome-keyring PAM password hook
tags: [packages, gnome] tags: [packages, gnome]
@@ -59,7 +58,6 @@
insertafter: '^password\s+include\s+system-local-login$' insertafter: '^password\s+include\s+system-local-login$'
line: "password optional pam_gnome_keyring.so use_authtok" line: "password optional pam_gnome_keyring.so use_authtok"
state: present state: present
when: "'void' in group_names"
- name: Check whether SSH host ed25519 key exists - name: Check whether SSH host ed25519 key exists
tags: [services] tags: [services]
@@ -183,7 +181,6 @@
ansible.builtin.stat: ansible.builtin.stat:
path: /etc/sv/libvirtd path: /etc/sv/libvirtd
register: libvirtd_service_dir register: libvirtd_service_dir
when: "'void' in group_names"
- name: Enable libvirt daemon service - name: Enable libvirt daemon service
tags: [packages, services] tags: [packages, services]
@@ -191,9 +188,7 @@
src: /etc/sv/libvirtd src: /etc/sv/libvirtd
dest: /var/service/libvirtd dest: /var/service/libvirtd
state: link state: link
when: when: libvirtd_service_dir.stat.exists
- "'void' in group_names"
- libvirtd_service_dir.stat.exists
- name: Check virtualization group availability - name: Check virtualization group availability
tags: [packages] tags: [packages]
@@ -234,7 +229,6 @@
owner: root owner: root
group: root group: root
mode: "0755" mode: "0755"
when: "'void' in group_names"
- name: Ensure emptty session directories exist - name: Ensure emptty session directories exist
tags: [packages, services, emptty] tags: [packages, services, emptty]
@@ -247,7 +241,6 @@
loop: loop:
- /etc/emptty/xsessions - /etc/emptty/xsessions
- /etc/emptty/wayland-sessions - /etc/emptty/wayland-sessions
when: "'void' in group_names"
- name: Configure emptty - name: Configure emptty
tags: [packages, services, emptty] tags: [packages, services, emptty]
@@ -258,7 +251,6 @@
group: root group: root
mode: "0644" mode: "0644"
notify: Restart emptty notify: Restart emptty
when: "'void' in group_names"
- name: Copy common desktop dotfiles - name: Copy common desktop dotfiles
tags: [dotfiles, dotfiles:desktop] tags: [dotfiles, dotfiles:desktop]
@@ -268,11 +260,7 @@
owner: "{{ username }}" owner: "{{ username }}"
group: "{{ user_group }}" group: "{{ user_group }}"
mode: "{{ item.mode }}" mode: "{{ item.mode }}"
loop: >- loop: "{{ desktop_common_dotfiles | default([]) }}"
{{
(desktop_common_dotfiles | default([]))
+ ((desktop_void_dotfiles | default([])) if 'void' in group_names else [])
}}
loop_control: loop_control:
label: "{{ item.dest }}" label: "{{ item.dest }}"
@@ -464,28 +452,6 @@
- (desktop_flatpak_extensions | default([])) | length > 0 - (desktop_flatpak_extensions | default([])) | length > 0
- item | length > 0 - item | length > 0
- name: Ensure /etc/flatpak/overrides exists
tags: [packages, flatpak, theme]
ansible.builtin.file:
path: /etc/flatpak/overrides
state: directory
owner: root
group: root
mode: "0755"
when: (desktop_flatpak_packages | default([])) | length > 0
- name: Force dark GTK theme for Flatpak applications
tags: [packages, flatpak, theme]
ansible.builtin.copy:
dest: /etc/flatpak/overrides/global
content: |
[Environment]
GTK_THEME={{ desktop_flatpak_gtk_theme | default('Yaru-Blue-dark') }}
owner: root
group: root
mode: "0644"
when: (desktop_flatpak_packages | default([])) | length > 0
- name: Bootstrap rustup toolchain installer - name: Bootstrap rustup toolchain installer
tags: [packages] tags: [packages]
block: block:
@@ -494,9 +460,9 @@
path: "{{ user_home }}/.cargo/bin/rustc" path: "{{ user_home }}/.cargo/bin/rustc"
register: rustup_initialized register: rustup_initialized
- name: Run rustup-init - name: Run rustup-init with cargo env sourced
ansible.builtin.command: ansible.builtin.shell:
cmd: rustup-init -y --no-modify-path cmd: . ~/.cargo/env && rustup-init -y --no-modify-path
creates: "{{ user_home }}/.cargo/bin/rustc" creates: "{{ user_home }}/.cargo/bin/rustc"
become_user: "{{ username }}" become_user: "{{ username }}"
environment: environment:
@@ -521,8 +487,8 @@
file: source_tool.yml file: source_tool.yml
apply: apply:
tags: [packages] tags: [packages]
loop: "{{ desktop_source_tools + (desktop_void_source_tools | default([])) }}" loop: "{{ desktop_source_tools }}"
when: (desktop_source_tools + (desktop_void_source_tools | default([]))) | length > 0 when: desktop_source_tools | length > 0
loop_control: loop_control:
loop_var: source_tool loop_var: source_tool
label: "{{ source_tool.name }}" label: "{{ source_tool.name }}"
@@ -552,7 +518,7 @@
label: "{{ binary_tool.name }}" label: "{{ binary_tool.name }}"
- name: Install desktop npm packages - name: Install desktop npm packages
tags: [packages, npm] tags: [packages]
community.general.npm: community.general.npm:
name: "{{ item.name }}" name: "{{ item.name }}"
global: true global: true

View File

@@ -19,7 +19,7 @@
- "'i3' in (desktop_sessions_enabled | default([]))" - "'i3' in (desktop_sessions_enabled | default([]))"
- (host_i3_dotfiles | default([])) | length > 0 - (host_i3_dotfiles | default([])) | length > 0
- name: Copy host-specific sway dotfiles - name: Copy host-specific Sway dotfiles
tags: [dotfiles, dotfiles:desktop, dotfiles:host, sway] tags: [dotfiles, dotfiles:desktop, dotfiles:host, sway]
ansible.builtin.copy: ansible.builtin.copy:
src: "{{ playbook_dir }}/../dotfiles/{{ hostname }}/{{ item.src }}" src: "{{ playbook_dir }}/../dotfiles/{{ hostname }}/{{ item.src }}"
@@ -33,4 +33,3 @@
when: when:
- "'sway' in (desktop_sessions_enabled | default([]))" - "'sway' in (desktop_sessions_enabled | default([]))"
- (host_sway_dotfiles | default([])) | length > 0 - (host_sway_dotfiles | default([])) | length > 0

View File

@@ -1,38 +1,16 @@
--- ---
- name: Check if GRUB_CMDLINE_LINUX line exists in /etc/default/grub - name: Configure GRUB kernel parameters for NVIDIA hybrid graphics
tags: [packages, nvidia]
ansible.builtin.command:
cmd: grep -E '^GRUB_CMDLINE_LINUX=' /etc/default/grub
register: nymph_grub_cmdline_check
changed_when: false
failed_when: false
- name: Initialize empty GRUB_CMDLINE_LINUX line if missing
tags: [packages, nvidia] tags: [packages, nvidia]
ansible.builtin.lineinfile: ansible.builtin.lineinfile:
path: /etc/default/grub path: /etc/default/grub
line: 'GRUB_CMDLINE_LINUX=""' regexp: '^GRUB_CMDLINE_LINUX='
insertafter: '^GRUB_CMDLINE_LINUX_DEFAULT=' line: 'GRUB_CMDLINE_LINUX="rd.luks.uuid=1e15d159-5d05-4a1f-9639-ac200dff9f9c rootflags=subvol=@ apparmor=1 security=apparmor nouveau.modeset=0 nvidia-drm.modeset=1"'
state: present state: present
when: nymph_grub_cmdline_check.rc != 0
register: nymph_grub_cmdline_init
- name: Append NVIDIA kernel parameters to GRUB_CMDLINE_LINUX if missing
tags: [packages, nvidia]
ansible.builtin.replace:
path: /etc/default/grub
regexp: '^(GRUB_CMDLINE_LINUX="(?:(?!{{ item | regex_escape }})[^"])*?)"$'
replace: '\1 {{ item }}"'
loop:
- nouveau.modeset=0
- nvidia-drm.modeset=1
register: nymph_grub_cmdline_append
- name: Regenerate GRUB configuration - name: Regenerate GRUB configuration
tags: [packages, nvidia] tags: [packages, nvidia]
ansible.builtin.command: grub-mkconfig -o /boot/grub/grub.cfg ansible.builtin.command: grub-mkconfig -o /boot/grub/grub.cfg
changed_when: true changed_when: true
when: nymph_grub_cmdline_init is changed or nymph_grub_cmdline_append is changed
- name: Configure NVIDIA power management for hybrid graphics - name: Configure NVIDIA power management for hybrid graphics
tags: [packages, nvidia] tags: [packages, nvidia]
@@ -61,3 +39,13 @@
regexp: '^bindsym \$mod\+Return exec --no-startup-id /usr/bin/alacritty' 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' line: 'bindsym $mod+Return exec --no-startup-id ~/.local/bin/prime-run /usr/bin/alacritty'
when: "'i3' in (desktop_sessions_enabled | default([]))" when: "'i3' in (desktop_sessions_enabled | default([]))"
- name: Deploy WirePlumber camera priority config
tags: [dotfiles, dotfiles:host]
ansible.builtin.copy:
src: "{{ playbook_dir }}/../dotfiles/nymph/.config/wireplumber/wireplumber.conf.d/60-camera-priority.conf"
dest: "{{ user_home }}/.config/wireplumber/wireplumber.conf.d/60-camera-priority.conf"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"
force: true

View File

@@ -8,13 +8,8 @@
group: "{{ user_group }}" group: "{{ user_group }}"
mode: "0755" mode: "0755"
loop: loop:
- "{{ user_home }}/.config/alacritty"
- "{{ user_home }}/.config/dunst"
- "{{ user_home }}/.config/i3" - "{{ user_home }}/.config/i3"
- "{{ user_home }}/.config/i3blocks" - "{{ user_home }}/.config/i3blocks"
- "{{ user_home }}/.config/picom"
- "{{ user_home }}/.config/polybar"
- "{{ user_home }}/.config/rofi"
when: "'i3' in (desktop_sessions_enabled | default([]))" when: "'i3' in (desktop_sessions_enabled | default([]))"
- name: Install allowed emptty X11 sessions - name: Install allowed emptty X11 sessions

View File

@@ -1,4 +0,0 @@
[preferred]
default=gtk
org.freedesktop.impl.portal.Screenshot=wlr
org.freedesktop.impl.portal.ScreenCast=wlr

View File

@@ -1,5 +0,0 @@
[Desktop Entry]
Name=Sway
Comment=SwayFX (Wayland)
Exec=/usr/local/bin/start-sway
Type=Application

View File

@@ -1,5 +1,5 @@
--- ---
- name: Ensure sway config directories exist - name: Ensure Sway config directories exist
tags: [dotfiles, dotfiles:desktop, sway] tags: [dotfiles, dotfiles:desktop, sway]
ansible.builtin.file: ansible.builtin.file:
path: "{{ item }}" path: "{{ item }}"
@@ -8,56 +8,39 @@
group: "{{ user_group }}" group: "{{ user_group }}"
mode: "0755" mode: "0755"
loop: loop:
- "{{ user_home }}/.config/alacritty"
- "{{ user_home }}/.config/dunst"
- "{{ user_home }}/.config/rofi"
- "{{ user_home }}/.config/sway" - "{{ user_home }}/.config/sway"
- "{{ user_home }}/.config/sway/scripts" - "{{ user_home }}/.config/kanshi"
- "{{ user_home }}/.config/sway/wallpapers" - "{{ user_home }}/.config/qt5ct"
- "{{ user_home }}/.config/waybar" - "{{ user_home }}/.config/qt5ct/colors"
- "{{ user_home }}/.config/qt6ct"
- "{{ user_home }}/.config/qt6ct/colors"
when: "'sway' in (desktop_sessions_enabled | default([]))" when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Install allowed emptty Wayland sessions - name: Ensure Noctalia config directories exist
tags: [packages, services, emptty, sway] tags: [dotfiles, dotfiles:desktop, sway, noctalia]
ansible.builtin.copy:
src: sway.desktop
dest: /etc/emptty/wayland-sessions/sway.desktop
owner: root
group: root
mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Install Sway session launcher in /usr/local/bin
tags: [packages, services, sway]
ansible.builtin.copy:
src: "{{ playbook_dir }}/../dotfiles/desktop/.local/bin/start-sway"
dest: /usr/local/bin/start-sway
owner: root
group: root
mode: "0755"
when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Ensure /etc/xdg/xdg-desktop-portal exists
tags: [packages, services, sway, portal]
ansible.builtin.file: ansible.builtin.file:
path: /etc/xdg/xdg-desktop-portal path: "{{ item }}"
state: directory state: directory
owner: root owner: "{{ username }}"
group: root group: "{{ user_group }}"
mode: "0755" mode: "0755"
loop:
- "{{ user_home }}/.config/noctalia"
- "{{ user_home }}/.config/noctalia/plugins"
- "{{ user_home }}/.local/share/noctalia-plugins"
when: "'sway' in (desktop_sessions_enabled | default([]))" when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Configure xdg-desktop-portal backend preferences for sway - name: Install Sway emptty session entry
tags: [packages, services, sway, portal] tags: [packages, services, emptty, sway]
ansible.builtin.copy: ansible.builtin.template:
src: sway-portals.conf src: Sway.desktop.j2
dest: /etc/xdg/xdg-desktop-portal/sway-portals.conf dest: /etc/emptty/wayland-sessions/Sway.desktop
owner: root owner: root
group: root group: root
mode: "0644" mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))" when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Copy sway desktop dotfiles - name: Copy Sway desktop dotfiles
tags: [dotfiles, dotfiles:desktop, sway] tags: [dotfiles, dotfiles:desktop, sway]
ansible.builtin.copy: ansible.builtin.copy:
src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}" src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}"
@@ -69,3 +52,92 @@
loop_control: loop_control:
label: "{{ item.dest }}" label: "{{ item.dest }}"
when: "'sway' in (desktop_sessions_enabled | default([]))" when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Render Sway shell config
tags: [dotfiles, dotfiles:desktop, sway]
ansible.builtin.template:
src: shell.conf.j2
dest: "{{ user_home }}/.config/sway/shell.conf"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Render Noctalia settings template
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
ansible.builtin.template:
src: noctalia-settings.json.j2
dest: "{{ user_home }}/.config/noctalia/settings.json"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Render qt5ct config
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
ansible.builtin.template:
src: qt5ct.conf.j2
dest: "{{ user_home }}/.config/qt5ct/qt5ct.conf"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Render qt6ct config
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
ansible.builtin.template:
src: qt6ct.conf.j2
dest: "{{ user_home }}/.config/qt6ct/qt6ct.conf"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Manage Noctalia shell plugins
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
ansible.builtin.include_tasks: noctalia.yml
when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Copy shared Clipper settings
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
ansible.builtin.copy:
src: "{{ playbook_dir }}/../dotfiles/desktop/.config/noctalia/plugins/clipper/settings.json"
dest: "{{ user_home }}/.config/noctalia/plugins/clipper/settings.json"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"
when: "'sway' in (desktop_sessions_enabled | default([]))"
- name: Allow Flatpak apps to read shared theme configs
tags: [packages, dotfiles, dotfiles:desktop, sway, noctalia]
ansible.builtin.command:
argv:
- flatpak
- override
- --user
- "--filesystem={{ item }}"
become_user: "{{ username }}"
environment:
HOME: "{{ user_home }}"
changed_when: false
loop: "{{ desktop_flatpak_global_filesystems | default([]) }}"
when:
- "'sway' in (desktop_sessions_enabled | default([]))"
- (desktop_flatpak_packages | default([])) | length > 0
- name: Export global Flatpak environment for theme integration
tags: [packages, dotfiles, dotfiles:desktop, sway, noctalia]
ansible.builtin.command:
argv:
- flatpak
- override
- --user
- "--env={{ item }}"
become_user: "{{ username }}"
environment:
HOME: "{{ user_home }}"
changed_when: false
loop: "{{ desktop_flatpak_global_env | default([]) }}"
when:
- "'sway' in (desktop_sessions_enabled | default([]))"
- (desktop_flatpak_packages | default([])) | length > 0

View File

@@ -0,0 +1,158 @@
---
- name: Check whether official Clipper plugin directory exists
ansible.builtin.stat:
path: "{{ user_home }}/.local/share/noctalia-plugins/official/clipper"
follow: false
register: official_clipper_path_state
- name: Repair official Clipper plugin permissions before git update
ansible.builtin.file:
path: "{{ user_home }}/.local/share/noctalia-plugins/official/clipper"
state: directory
recurse: true
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "u=rwX,go=rX"
when:
- official_clipper_path_state.stat.exists
- official_clipper_path_state.stat.isdir
- name: Remove untracked files from official Clipper subtree before git update
ansible.builtin.command:
cmd: git clean -fd -- clipper
chdir: "{{ user_home }}/.local/share/noctalia-plugins/official"
become_user: "{{ username }}"
environment:
HOME: "{{ user_home }}"
register: official_clipper_clean
changed_when: >-
(official_clipper_clean.stdout | default('') | trim) != '' or
(official_clipper_clean.stderr | default('') | trim) != ''
when:
- official_clipper_path_state.stat.exists
- official_clipper_path_state.stat.isdir
- name: Bootstrap official Noctalia plugins checkout
ansible.builtin.git:
repo: https://github.com/noctalia-dev/noctalia-plugins.git
dest: "{{ user_home }}/.local/share/noctalia-plugins/official"
version: main
update: true
force: true
become_user: "{{ username }}"
environment:
HOME: "{{ user_home }}"
- name: Check if Clipper is a real directory (needs migration to symlink)
ansible.builtin.stat:
path: "{{ user_home }}/.config/noctalia/plugins/clipper"
follow: false
register: clipper_path_state
- name: Check whether Clipper pinned data exists
ansible.builtin.stat:
path: "{{ user_home }}/.config/noctalia/plugins/clipper/pinned.json"
register: clipper_pinned_state
when:
- clipper_path_state.stat.exists
- clipper_path_state.stat.isdir
- not (clipper_path_state.stat.islnk | default(false))
- name: Preserve Clipper pinned data before migration
ansible.builtin.copy:
src: "{{ user_home }}/.config/noctalia/plugins/clipper/pinned.json"
dest: "{{ user_home }}/.local/share/noctalia-plugins/official/clipper/pinned.json"
remote_src: true
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"
become_user: "{{ username }}"
environment:
HOME: "{{ user_home }}"
when:
- clipper_pinned_state is defined and clipper_pinned_state.stat is defined and clipper_pinned_state.stat.exists
- name: Check whether Clipper notecards directory exists
ansible.builtin.stat:
path: "{{ user_home }}/.config/noctalia/plugins/clipper/notecards"
register: clipper_notecards_state
when:
- clipper_path_state.stat.exists
- clipper_path_state.stat.isdir
- not (clipper_path_state.stat.islnk | default(false))
- name: Preserve Clipper notecards before migration
ansible.builtin.copy:
src: "{{ user_home }}/.config/noctalia/plugins/clipper/notecards/"
dest: "{{ user_home }}/.local/share/noctalia-plugins/official/clipper/notecards/"
remote_src: true
owner: "{{ username }}"
group: "{{ user_group }}"
mode: preserve
become_user: "{{ username }}"
environment:
HOME: "{{ user_home }}"
when:
- clipper_notecards_state is defined and clipper_notecards_state.stat is defined and clipper_notecards_state.stat.exists and clipper_notecards_state.stat.isdir
- name: Remove old Clipper directory (migration to symlink)
ansible.builtin.file:
path: "{{ user_home }}/.config/noctalia/plugins/clipper"
state: absent
when:
- clipper_path_state.stat.exists
- clipper_path_state.stat.isdir
- not (clipper_path_state.stat.islnk | default(false))
- name: Create Clipper symlink to official plugin
ansible.builtin.file:
src: "{{ user_home }}/.local/share/noctalia-plugins/official/clipper"
dest: "{{ user_home }}/.config/noctalia/plugins/clipper"
state: link
force: true
owner: "{{ username }}"
group: "{{ user_group }}"
- name: Check if usb-drive-manager is a real directory (needs migration to symlink)
ansible.builtin.stat:
path: "{{ user_home }}/.config/noctalia/plugins/usb-drive-manager"
follow: false
register: usb_drive_manager_path_state
- name: Remove old usb-drive-manager directory (migration to symlink)
ansible.builtin.file:
path: "{{ user_home }}/.config/noctalia/plugins/usb-drive-manager"
state: absent
when:
- usb_drive_manager_path_state.stat.exists
- usb_drive_manager_path_state.stat.isdir
- not (usb_drive_manager_path_state.stat.islnk | default(false))
- name: Link official Noctalia plugins
ansible.builtin.file:
src: "{{ user_home }}/.local/share/noctalia-plugins/official/{{ item }}"
dest: "{{ user_home }}/.config/noctalia/plugins/{{ item }}"
state: link
force: true
owner: "{{ username }}"
group: "{{ user_group }}"
loop:
- clipboard
- polkit-agent
- usb-drive-manager
- name: Ensure Noctalia cache directory exists
ansible.builtin.file:
path: "{{ user_home }}/.cache/noctalia"
state: directory
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0755"
- name: Deploy Noctalia wallpapers cache
ansible.builtin.template:
src: wallpapers.json.j2
dest: "{{ user_home }}/.cache/noctalia/wallpapers.json"
owner: "{{ username }}"
group: "{{ user_group }}"
mode: "0644"

View File

@@ -0,0 +1,8 @@
[Desktop Entry]
Name=Sway
Comment=Sway Wayland compositor
Exec={{ user_home }}/.local/bin/start-sway-session
TryExec=sway
Type=Application
DesktopNames=sway;wlroots
Keywords=wayland;wm;windowmanager;window;manager;tiling;compositor;

View File

@@ -0,0 +1,636 @@
{
"appLauncher": {
"autoPasteClipboard": false,
"clipboardWatchImageCommand": "wl-paste --type image --watch cliphist store",
"clipboardWatchTextCommand": "wl-paste --type text --watch cliphist store",
"clipboardWrapText": true,
"customLaunchPrefix": "",
"customLaunchPrefixEnabled": false,
"density": "default",
"enableClipPreview": true,
"enableClipboardChips": true,
"enableClipboardHistory": false,
"enableClipboardSmartIcons": true,
"enableSessionSearch": true,
"enableSettingsSearch": true,
"enableWindowsSearch": true,
"iconMode": "tabler",
"ignoreMouseInput": false,
"overviewLayer": false,
"pinnedApps": [],
"position": "center",
"screenshotAnnotationTool": "",
"showCategories": true,
"showIconBackground": false,
"sortByMostUsed": true,
"terminalCommand": "alacritty -e",
"viewMode": "list"
},
"audio": {
"mprisBlacklist": [],
"preferredPlayer": "",
"spectrumFrameRate": 30,
"spectrumMirrored": true,
"visualizerType": "linear",
"volumeFeedback": false,
"volumeFeedbackSoundFile": "",
"volumeOverdrive": false,
"volumeStep": 5
},
"bar": {
"autoHideDelay": 500,
"autoShowDelay": 150,
"backgroundOpacity": 0.93,
"barType": "simple",
"capsuleColorKey": "none",
"capsuleOpacity": 1,
"contentPadding": 2,
"density": "default",
"displayMode": "always_visible",
"enableExclusionZoneInset": true,
"fontScale": 1,
"frameRadius": 12,
"frameThickness": 8,
"hideOnOverview": false,
"marginHorizontal": 4,
"marginVertical": 4,
"middleClickAction": "none",
"middleClickCommand": "",
"middleClickFollowMouse": false,
"monitors": [
{% for monitor in noctalia_bar_monitors | default(['DP-1']) %}
"{{ monitor }}"{% if not loop.last %},{% endif %}
{% endfor %}
],
"mouseWheelAction": "none",
"mouseWheelWrap": true,
"outerCorners": true,
"position": "top",
"reverseScroll": false,
"rightClickAction": "controlCenter",
"rightClickCommand": "",
"rightClickFollowMouse": true,
"screenOverrides": [
{% for override in noctalia_screen_overrides | default([]) %}
{
"enabled": {{ override.enabled | lower }},
"name": "{{ override.name }}"
}{% if not loop.last %},{% endif %}
{% endfor %}
],
"showCapsule": true,
"showOnWorkspaceSwitch": true,
"showOutline": false,
"useSeparateOpacity": false,
"widgetSpacing": 6,
"widgets": {
"center": [
{
"clockColor": "none",
"customFont": "",
"formatHorizontal": "HH:mm ddd, MMM dd",
"formatVertical": "HH mm - dd MM",
"id": "Clock",
"tooltipFormat": "HH:mm ddd, MMM dd",
"useCustomFont": false
},
{
"compactMode": false,
"hideMode": "hidden",
"hideWhenIdle": false,
"id": "MediaMini",
"maxWidth": 145,
"panelShowAlbumArt": true,
"scrollingMode": "hover",
"showAlbumArt": true,
"showArtistFirst": true,
"showProgressRing": true,
"showVisualizer": false,
"textColor": "none",
"useFixedWidth": false,
"visualizerType": "linear"
}
],
"left": [
{
"characterCount": 2,
"colorizeIcons": false,
"emptyColor": "secondary",
"enableScrollWheel": true,
"focusedColor": "primary",
"followFocusedScreen": false,
"fontWeight": "bold",
"groupedBorderOpacity": 1,
"hideUnoccupied": false,
"iconScale": 0.8,
"id": "Workspace",
"labelMode": "index",
"occupiedColor": "secondary",
"pillSize": 0.6,
"showApplications": false,
"showApplicationsHover": false,
"showBadge": true,
"showLabelsOnlyWhenOccupied": true,
"unfocusedIconsOpacity": 1
}
],
"right": [
{
"blacklist": [],
"chevronColor": "none",
"colorizeIcons": false,
"drawerEnabled": true,
"hidePassive": false,
"id": "Tray",
"pinned": []
},
{
"compactMode": true,
"diskPath": "/",
"iconColor": "none",
"id": "SystemMonitor",
"showCpuCores": false,
"showCpuFreq": false,
"showCpuTemp": true,
"showCpuUsage": true,
"showDiskAvailable": false,
"showDiskUsage": false,
"showDiskUsageAsPercent": false,
"showGpuTemp": false,
"showLoadAverage": false,
"showMemoryAsPercent": false,
"showMemoryUsage": true,
"showNetworkStats": false,
"showSwapUsage": false,
"textColor": "none",
"useMonospaceFont": true,
"usePadding": false
},
{
"defaultSettings": {
"autoMount": false,
"fileBrowser": "yazi",
"hideWhenEmpty": false,
"iconColor": "none",
"showBadge": false,
"showNotifications": true,
"terminalCommand": "kitty"
},
"id": "plugin:usb-drive-manager"
},
{
"defaultSettings": {
"autoPaste": false,
"autoPasteDelay": 300,
"autoPasteOnRightClick": false,
"cardColors": {},
"customColors": {},
"enableTodoIntegration": false,
"fullscreenMode": false,
"hidePanelBackground": false,
"notecardsEnabled": true,
"panelHeight": 0,
"panelWidth": 1450,
"pincardsEnabled": true,
"showCloseButton": true
},
"id": "plugin:clipper"
},
{
"displayMode": "onhover",
"iconColor": "none",
"id": "Volume",
"middleClickCommand": "pwvucontrol || pavucontrol",
"textColor": "none"
},
{
"displayMode": "onhover",
"iconColor": "none",
"id": "Network",
"textColor": "none"
},
{
"displayMode": "onhover",
"iconColor": "none",
"id": "Bluetooth",
"textColor": "none"
},
{
"applyToAllMonitors": false,
"displayMode": "onhover",
"iconColor": "none",
"id": "Brightness",
"textColor": "none"
},
{
"deviceNativePath": "__default__",
"displayMode": "graphic-clean",
"hideIfIdle": false,
"hideIfNotDetected": true,
"id": "Battery",
"showNoctaliaPerformance": false,
"showPowerProfiles": false
},
{
"colorizeDistroLogo": false,
"colorizeSystemIcon": "secondary",
"colorizeSystemText": "none",
"customIconPath": "",
"enableColorization": true,
"icon": "settings",
"id": "ControlCenter",
"useDistroLogo": false
},
{
"hideWhenZero": false,
"hideWhenZeroUnread": false,
"iconColor": "none",
"id": "NotificationHistory",
"showUnreadBadge": true,
"unreadBadgeColor": "tertiary"
}
]
}
},
"brightness": {
"backlightDeviceMappings": [],
"brightnessStep": 5,
"enableDdcSupport": false,
"enforceMinimum": true
},
"calendar": {
"cards": [
{
"enabled": true,
"id": "calendar-header-card"
},
{
"enabled": true,
"id": "calendar-month-card"
},
{
"enabled": true,
"id": "weather-card"
}
]
},
"colorSchemes": {
"darkMode": true,
"generationMethod": "tonal-spot",
"manualSunrise": "06:30",
"manualSunset": "18:30",
"monitorForColors": "",
"predefinedScheme": "Ayu",
"schedulingMode": "off",
"syncGsettings": true,
"useWallpaperColors": false
},
"controlCenter": {
"cards": [
{
"enabled": true,
"id": "profile-card"
},
{
"enabled": true,
"id": "shortcuts-card"
},
{
"enabled": true,
"id": "audio-card"
},
{
"enabled": true,
"id": "brightness-card"
},
{
"enabled": true,
"id": "weather-card"
},
{
"enabled": true,
"id": "media-sysmon-card"
}
],
"diskPath": "/",
"position": "close_to_bar_button",
"shortcuts": {
"left": [
{"id": "Network"},
{"id": "Bluetooth"},
{"id": "WallpaperSelector"},
{"id": "NoctaliaPerformance"}
],
"right": [
{"id": "Notifications"},
{"id": "PowerProfile"},
{"id": "KeepAwake"},
{"id": "NightLight"}
]
}
},
"desktopWidgets": {
"enabled": false,
"gridSnap": false,
"gridSnapScale": false,
"monitorWidgets": [],
"overviewEnabled": true
},
"dock": {
"animationSpeed": 1,
"backgroundOpacity": 1,
"colorizeIcons": false,
"deadOpacity": 0.6,
"displayMode": "auto_hide",
"dockType": "floating",
"enabled": false,
"floatingRatio": 1,
"groupApps": false,
"groupClickAction": "cycle",
"groupContextMenuMode": "extended",
"groupIndicatorStyle": "dots",
"inactiveIndicators": false,
"indicatorColor": "primary",
"indicatorOpacity": 0.6,
"indicatorThickness": 3,
"launcherIcon": "",
"launcherIconColor": "none",
"launcherPosition": "end",
"launcherUseDistroLogo": false,
"monitors": [],
"onlySameOutput": true,
"pinnedApps": [],
"pinnedStatic": false,
"position": "bottom",
"showDockIndicator": false,
"showLauncherIcon": false,
"sitOnFrame": false,
"size": 1
},
"general": {
"allowPanelsOnScreenWithoutBar": true,
"allowPasswordWithFprintd": false,
"animationDisabled": false,
"animationSpeed": 1,
"autoStartAuth": false,
"avatarImage": "{{ user_home }}/.face",
"boxRadiusRatio": 1,
"clockFormat": "hh\\nmm",
"clockStyle": "custom",
"compactLockScreen": false,
"dimmerOpacity": 0.2,
"enableBlurBehind": true,
"enableLockScreenCountdown": true,
"enableLockScreenMediaControls": false,
"enableShadows": true,
"forceBlackScreenCorners": false,
"iRadiusRatio": 1,
"keybinds": {
"keyDown": ["Down"],
"keyEnter": ["Return", "Enter"],
"keyEscape": ["Esc"],
"keyLeft": ["Left"],
"keyRemove": ["Del"],
"keyRight": ["Right"],
"keyUp": ["Up"]
},
"language": "",
"lockOnSuspend": true,
"lockScreenAnimations": false,
"lockScreenBlur": 0,
"lockScreenCountdownDuration": 10000,
"lockScreenMonitors": [],
"lockScreenTint": 0,
"passwordChars": false,
"radiusRatio": 1,
"reverseScroll": false,
"scaleRatio": 1,
"screenRadiusRatio": 1,
"shadowDirection": "bottom_right",
"shadowOffsetX": 2,
"shadowOffsetY": 3,
"showChangelogOnStartup": true,
"showHibernateOnLockScreen": false,
"showScreenCorners": false,
"showSessionButtonsOnLockScreen": true,
"smoothScrollEnabled": true,
"telemetryEnabled": false
},
"hooks": {
"colorGeneration": "",
"darkModeChange": "",
"enabled": false,
"performanceModeDisabled": "",
"performanceModeEnabled": "",
"screenLock": "",
"screenUnlock": "",
"session": "",
"startup": "",
"wallpaperChange": ""
},
"idle": {
"customCommands": "[]",
"enabled": true,
"fadeDuration": 5,
"lockCommand": "",
"lockTimeout": 660,
"resumeLockCommand": "",
"resumeScreenOffCommand": "",
"resumeSuspendCommand": "",
"screenOffCommand": "",
"screenOffTimeout": 600,
"suspendCommand": "",
"suspendTimeout": 1800
},
"location": {
"analogClockInCalendar": false,
"autoLocate": false,
"firstDayOfWeek": -1,
"hideWeatherCityName": false,
"hideWeatherTimezone": false,
"name": "",
"showCalendarEvents": true,
"showCalendarWeather": true,
"showWeekNumberInCalendar": false,
"use12hourFormat": false,
"useFahrenheit": false,
"weatherEnabled": true,
"weatherShowEffects": true,
"weatherTaliaMascotAlways": false
},
"network": {
"bluetoothAutoConnect": true,
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"bluetoothRssiPollIntervalMs": 60000,
"bluetoothRssiPollingEnabled": false,
"disableDiscoverability": false,
"networkPanelView": "wifi",
"wifiDetailsViewMode": "grid"
},
"nightLight": {
"autoSchedule": true,
"dayTemp": "6500",
"enabled": false,
"forced": false,
"manualSunrise": "06:30",
"manualSunset": "18:30",
"nightTemp": "4000"
},
"noctaliaPerformance": {
"disableDesktopWidgets": true,
"disableWallpaper": true
},
"notifications": {
"backgroundOpacity": 1,
"clearDismissed": true,
"criticalUrgencyDuration": 15,
"density": "default",
"enableBatteryToast": true,
"enableKeyboardLayoutToast": true,
"enableMarkdown": false,
"enableMediaToast": false,
"enabled": true,
"location": "top_right",
"lowUrgencyDuration": 3,
"monitors": [],
"normalUrgencyDuration": 8,
"overlayLayer": true,
"respectExpireTimeout": false,
"saveToHistory": {
"critical": true,
"low": true,
"normal": true
},
"sounds": {
"criticalSoundFile": "",
"enabled": false,
"excludedApps": "discord,firefox,chrome,chromium,edge",
"lowSoundFile": "",
"normalSoundFile": "",
"separateSounds": false,
"volume": 0.5
}
},
"osd": {
"autoHideMs": 2000,
"backgroundOpacity": 1,
"enabled": true,
"enabledTypes": [0, 1, 2],
"location": "top_right",
"monitors": [],
"overlayLayer": true
},
"plugins": {
"autoUpdate": false,
"notifyUpdates": true
},
"sessionMenu": {
"countdownDuration": 10000,
"enableCountdown": true,
"largeButtonsLayout": "single-row",
"largeButtonsStyle": true,
"position": "center",
"powerOptions": [
{"action": "lock", "command": "", "countdownEnabled": true, "enabled": true, "keybind": "1"},
{"action": "suspend", "command": "", "countdownEnabled": true, "enabled": true, "keybind": "2"},
{"action": "hibernate", "command": "", "countdownEnabled": true, "enabled": true, "keybind": "3"},
{"action": "reboot", "command": "", "countdownEnabled": true, "enabled": true, "keybind": "4"},
{"action": "logout", "command": "", "countdownEnabled": true, "enabled": true, "keybind": "5"},
{"action": "shutdown", "command": "", "countdownEnabled": true, "enabled": true, "keybind": "6"},
{"action": "rebootToUefi", "command": "", "countdownEnabled": true, "enabled": true, "keybind": "7"},
{"action": "userspaceReboot", "command": "", "countdownEnabled": true, "enabled": false, "keybind": ""}
],
"showHeader": true,
"showKeybinds": true
},
"settingsVersion": 59,
"systemMonitor": {
"batteryCriticalThreshold": 5,
"batteryWarningThreshold": 20,
"cpuCriticalThreshold": 90,
"cpuWarningThreshold": 80,
"criticalColor": "",
"diskAvailCriticalThreshold": 10,
"diskAvailWarningThreshold": 20,
"diskCriticalThreshold": 90,
"diskWarningThreshold": 80,
"enableDgpuMonitoring": true,
"externalMonitor": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor",
"gpuCriticalThreshold": 90,
"gpuWarningThreshold": 80,
"memCriticalThreshold": 90,
"memWarningThreshold": 80,
"swapCriticalThreshold": 90,
"swapWarningThreshold": 80,
"tempCriticalThreshold": 90,
"tempWarningThreshold": 80,
"useCustomColors": false,
"warningColor": ""
},
"templates": {
"activeTemplates": [
{"enabled": true, "id": "alacritty"},
{"enabled": true, "id": "gtk"},
{"enabled": true, "id": "emacs"},
{"enabled": true, "id": "telegram"},
{"enabled": true, "id": "qt"},
{"enabled": true, "id": "sway"}
],
"enableUserTheming": false
},
"ui": {
"boxBorderEnabled": false,
"fontDefault": "{{ desktop_ui_font_family | default('Noto Sans') }}",
"fontDefaultScale": 1,
"fontFixed": "{{ desktop_fixed_font_family | default('Hack Nerd Font') }}",
"fontFixedScale": 1,
"panelBackgroundOpacity": 0.93,
"panelsAttachedToBar": true,
"scrollbarAlwaysVisible": true,
"settingsPanelMode": "centered",
"settingsPanelSideBarCardStyle": false,
"tooltipsEnabled": true,
"translucentWidgets": false
},
"wallpaper": {
"automationEnabled": false,
"directory": "{{ user_home }}/Pictures/Wallpapers",
"enableMultiMonitorDirectories": false,
"enabled": true,
"favorites": [],
"fillColor": "#000000",
"fillMode": "crop",
"hideWallpaperFilenames": false,
"linkLightAndDarkWallpapers": true,
"monitorDirectories": [],
"overviewBlur": 0.4,
"overviewEnabled": false,
"overviewTint": 0.6,
"panelPosition": "follow_bar",
"randomIntervalSec": 300,
"setWallpaperOnAllMonitors": true,
"showHiddenFiles": false,
"skipStartupTransition": false,
"solidColor": "#1a1a2e",
"sortOrder": "name",
"transitionDuration": 1500,
"transitionEdgeSmoothness": 0.05,
"transitionType": ["fade", "disc", "stripes", "wipe", "pixelate", "honeycomb"],
"useOriginalImages": false,
"useSolidColor": false,
"useWallhaven": false,
"viewMode": "single",
"wallhavenApiKey": "",
"wallhavenCategories": "111",
"wallhavenOrder": "desc",
"wallhavenPurity": "100",
"wallhavenQuery": "",
"wallhavenRatios": "",
"wallhavenResolutionHeight": "",
"wallhavenResolutionMode": "atleast",
"wallhavenResolutionWidth": "",
"wallhavenSorting": "relevance",
"wallpaperChangeMode": "random"
}
}

View File

@@ -0,0 +1,6 @@
[Appearance]
color_scheme_path={{ user_home }}/.config/qt5ct/colors/noctalia.conf
custom_palette=true
icon_theme={{ desktop_icon_theme | default('Yaru-orange-dark') }}
standard_dialogs=default
style=Fusion

View File

@@ -0,0 +1,6 @@
[Appearance]
color_scheme_path={{ user_home }}/.config/qt6ct/colors/noctalia.conf
custom_palette=true
icon_theme={{ desktop_icon_theme | default('Yaru-orange-dark') }}
standard_dialogs=default
style=Fusion

View File

@@ -0,0 +1,32 @@
set $menu qs -c noctalia-shell ipc call launcher toggle
set $audio_panel qs -c noctalia-shell ipc call volume openPanel
set $locker qs -c noctalia-shell ipc call lockScreen lock
set $powermenu qs -c noctalia-shell ipc call sessionMenu toggle
set $screenshot_full sh -c 'QT_QPA_PLATFORM=wayland flameshot full --clipboard'
set $screenshot_region sh -c 'QT_QPA_PLATFORM=wayland flameshot gui'
set $screenshot_window sh -c 'QT_QPA_PLATFORM=wayland flameshot gui'
set $audio_raise qs -c noctalia-shell ipc call volume increase
set $audio_lower qs -c noctalia-shell ipc call volume decrease
set $audio_mute qs -c noctalia-shell ipc call volume muteOutput
set $audio_mic_mute qs -c noctalia-shell ipc call volume muteInput
set $brightness_up qs -c noctalia-shell ipc call brightness increase
set $brightness_down qs -c noctalia-shell ipc call brightness decrease
exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP XDG_SESSION_TYPE XCURSOR_THEME XCURSOR_SIZE
exec systemctl --user import-environment WAYLAND_DISPLAY DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP XDG_SESSION_TYPE XCURSOR_THEME XCURSOR_SIZE
exec ~/.local/bin/update-turnstile-env
exec dex --autostart --environment sway
exec gnome-keyring-daemon --start --components=secrets
exec ~/.local/bin/setup-gtk-theme
exec pipewire
exec pipewire-pulse
exec wireplumber
exec kanshi
exec flameshot
exec udiskie --no-tray
exec wl-paste --watch cliphist store
exec qs -c noctalia-shell
bindsym $mod+c exec qs -c noctalia-shell ipc call launcher clipboard
bindsym $mod+Ctrl+v exec qs -c noctalia-shell ipc call plugin:clipboard toggle
bindsym $mod+Ctrl+Shift+v exec qs -c noctalia-shell ipc call plugin:clipboard wipe

View File

@@ -0,0 +1,18 @@
{
"defaultWallpaper": "/etc/xdg/quickshell/noctalia-shell/Assets/Wallpaper/noctalia.png",
"usedRandomWallpapers": {},
"wallpapers": {
"": {
"dark": "{{ noctalia_wallpaper }}",
"light": "{{ noctalia_wallpaper }}"
},
"DP-1": {
"dark": "{{ noctalia_wallpaper }}",
"light": "{{ noctalia_wallpaper }}"
},
"eDP-1": {
"dark": "{{ noctalia_wallpaper }}",
"light": "{{ noctalia_wallpaper }}"
}
}
}

View File

@@ -36,7 +36,7 @@
label: "{{ item.dest }}" label: "{{ item.dest }}"
- name: Install workstation npm packages - name: Install workstation npm packages
tags: [packages, npm] tags: [packages]
community.general.npm: community.general.npm:
name: "{{ item.name }}" name: "{{ item.name }}"
global: true global: true

View File

@@ -74,20 +74,6 @@
changed_when: true changed_when: true
when: item.stdout | trim != item.item.value when: item.stdout | trim != item.item.value
- name: Apply workstation GNOME extension dconf settings
tags: [gnome]
ansible.builtin.command:
argv:
- dconf
- write
- "{{ item.path }}{{ item.key }}"
- "{{ item.value }}"
become_user: "{{ username }}"
loop: "{{ workstation_gnome_extension_dconf_settings | default([]) }}"
loop_control:
label: "{{ item.path }}{{ item.key }}"
changed_when: true
- name: Check whether VS Code CLI is available on workstation host - name: Check whether VS Code CLI is available on workstation host
tags: [packages, vscode] tags: [packages, vscode]
ansible.builtin.command: ansible.builtin.command:

View File

@@ -18,4 +18,3 @@
loop: "{{ host_enabled_services | default([]) }}" loop: "{{ host_enabled_services | default([]) }}"
loop_control: loop_control:
label: "{{ item }}" label: "{{ item }}"

View File

@@ -36,25 +36,6 @@ services:
- web - web
- gitea - gitea
# Disabled: prometheus does not have enough resources to run Nextcloud AIO.
# nextcloud-aio-mastercontainer:
# image: ghcr.io/nextcloud-releases/all-in-one:latest
# container_name: nextcloud-aio-mastercontainer
# init: true
# restart: always
# ports:
# - "127.0.0.1:8080:8080"
# environment:
# APACHE_PORT: "11000"
# APACHE_IP_BINDING: "0.0.0.0"
# APACHE_ADDITIONAL_NETWORK: "server_web"
# NEXTCLOUD_DATADIR: "/srv/nextcloud/data"
# volumes:
# - "nextcloud_aio_mastercontainer:/mnt/docker-aio-config"
# - "/var/run/docker.sock:/var/run/docker.sock:ro"
# networks:
# - web
navidromedb: navidromedb:
image: postgres:13 image: postgres:13
container_name: navidromedb container_name: navidromedb
@@ -106,11 +87,6 @@ services:
networks: networks:
web: web:
name: server_web
external: false external: false
gitea: gitea:
external: false external: false
# volumes:
# nextcloud_aio_mastercontainer:
# name: nextcloud_aio_mastercontainer

View File

@@ -1,5 +0,0 @@
# Claude Code Global Context
Import the shared coding agent bootstrap context:
@~/.config/ai/bootstrap.md

View File

@@ -1,16 +0,0 @@
model = "gpt-5.5"
model_reasoning_effort = "medium"
model_instructions_file = "{{ effective_user_home }}/.config/ai/bootstrap.md"
[projects."/home/fscotto/AnsiblePlaybook"]
trust_level = "trusted"
[tui]
theme = "coldark-dark"
[tui.model_availability_nux]
"gpt-5.5" = 3
[features]
memories = true

View File

@@ -1,7 +0,0 @@
{
"$schema": "https://opencode.ai/config.json",
"instructions": [
"~/.config/ai/bootstrap.md",
"~/.config/ai/rules/safety.md"
]
}

View File

@@ -1,14 +0,0 @@
{
"security": {
"auth": {
"selectedType": "oauth-personal"
}
},
"context": {
"fileName": [
"~/.config/ai/bootstrap.md",
"~/.config/ai/rules/safety.md",
"~/.config/ai/AGENTS.md"
]
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -1,39 +0,0 @@
# Validate DBUS_SESSION_BUS_ADDRESS: a stale value (e.g. inherited from a
# dead X session) makes secret-tool, mbsync, msmtp fail with
# "Could not connect: No such file or directory".
# Fall back to ~/.dbus-session-bus-address (written by .xinitrc) or
# /run/user/$UID/bus, mirroring scripts/bootstrap_mail.sh.
_dbus_addr_socket_path() {
printf '%s' "${1#unix:path=}" | sed 's/,.*//'
}
_dbus_addr_is_live() {
case "$1" in
unix:path=*)
[ -S "$(_dbus_addr_socket_path "$1")" ]
;;
unix:abstract=*)
return 0
;;
*)
return 1
;;
esac
}
if ! _dbus_addr_is_live "${DBUS_SESSION_BUS_ADDRESS:-}"; then
unset DBUS_SESSION_BUS_ADDRESS
if [ -f "$HOME/.dbus-session-bus-address" ]; then
_saved=$(tr -d '\n' <"$HOME/.dbus-session-bus-address" 2>/dev/null)
if [ -n "$_saved" ] && _dbus_addr_is_live "$_saved"; then
export DBUS_SESSION_BUS_ADDRESS="$_saved"
fi
unset _saved
fi
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ] && [ -S "/run/user/$(id -u)/bus" ]; then
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
fi
fi
unset -f _dbus_addr_socket_path _dbus_addr_is_live

View File

@@ -1 +1,2 @@
export SVDIR="$HOME/.config/service" export SVDIR="$HOME/.config/service"
export SSH_AUTH_SOCK="$HOME/.local/state/ssh-agent/socket"

View File

@@ -1 +0,0 @@
export SSH_AUTH_SOCK="$HOME/.local/state/ssh-agent/socket"

View File

@@ -1,14 +1,14 @@
if command -v emacsclient >/dev/null 2>&1; then if command -v emacsclient >/dev/null 2>&1; then
ec() { ec() {
emacsclient -c -n "$@" || { emacsclient -c -n "$@" || {
printf '%s\n' "Emacs server is not available. Log into a graphical session and ensure the user 'emacs' service is running." >&2 printf '%s\n' "Emacs server is not available. Log into a graphical session and ensure the turnstile-managed 'emacs' service is running." >&2
return 1 return 1
} }
} }
et() { et() {
emacsclient -t "$@" || { emacsclient -t "$@" || {
printf '%s\n' "Emacs server is not available. Ensure the user 'emacs' service is running in your graphical session." >&2 printf '%s\n' "Emacs server is not available. Ensure the turnstile-managed 'emacs' service is running in your graphical session." >&2
return 1 return 1
} }
} }

View File

@@ -12,7 +12,7 @@ ap() {
cmd+=(--tag "$1") cmd+=(--tag "$1")
fi fi
printf '\033[0;36m+ %s\033[0m\n' "${cmd[*]}" printf '+ %s\n' "${cmd[*]}"
"${cmd[@]}" "${cmd[@]}"
) )
} }

View File

@@ -1,6 +1,9 @@
[general]
import = ["~/.config/alacritty/themes/noctalia.toml"]
[window] [window]
padding = { x = 8, y = 8 } padding = { x = 8, y = 8 }
opacity = 0.90 opacity = 1.0
[font] [font]
normal = { family = "Hack Nerd Font", style = "Regular" } normal = { family = "Hack Nerd Font", style = "Regular" }
@@ -13,33 +16,8 @@ multiplier = 3
[cursor] [cursor]
style = { shape = "Beam", blinking = "Off" } style = { shape = "Beam", blinking = "Off" }
[colors.primary]
background = "#000000"
foreground = "#c8c8c8"
[colors.normal]
black = "#1f1f28"
red = "#c7162b"
green = "#4caf50"
yellow = "#e95420"
blue = "#4a90d9"
magenta = "#7e57c2"
cyan = "#6daeea"
white = "#eeeeee"
[colors.bright]
black = "#3a3a46"
red = "#ff5c5c"
green = "#7ad97a"
yellow = "#ff8f40"
blue = "#6daeea"
magenta = "#9575cd"
cyan = "#8bd6ff"
white = "#ffffff"
[keyboard] [keyboard]
bindings = [ bindings = [
{ key = "V", mods = "Control|Shift", action = "Paste" }, { key = "V", mods = "Control|Shift", action = "Paste" },
{ key = "C", mods = "Control|Shift", action = "Copy" }, { key = "C", mods = "Control|Shift", action = "Copy" }
{ key = "Return", mods = "Shift", chars = "\u001B\r" }
] ]

View File

@@ -4,11 +4,11 @@ follow = mouse
gap_size = 10 gap_size = 10
width = 360 width = 360
height = (0, 120) height = 120
origin = top-right origin = top-right
offset = (20, 40) offset = 20x40
font = LiterationMono Nerd Font 10 font = Liberation Sans 10
line_height = 2 line_height = 2
padding = 12 padding = 12
@@ -19,7 +19,7 @@ separator_height = 2
frame_width = 2 frame_width = 2
corner_radius = 8 corner_radius = 8
transparency = 15 transparency = 0
background = "#1f1f28" background = "#1f1f28"
foreground = "#eeeeee" foreground = "#eeeeee"

View File

@@ -3,13 +3,13 @@
set $mod Mod4 set $mod Mod4
set $refresh_i3status killall -SIGUSR1 i3status set $refresh_i3status killall -SIGUSR1 i3status
font pango:LiterationMono Nerd Font 10 font pango:Liberation Mono 10
# Start XDG autostart entries (.desktop), useful on Void for pipewire/wireplumber/etc. # Start XDG autostart entries (.desktop), useful on Void for pipewire/wireplumber/etc.
exec --no-startup-id dex --autostart --environment i3 exec --no-startup-id dex --autostart --environment i3
exec --no-startup-id gnome-keyring-daemon --start --components=secrets 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 setxkbmap -layout us -variant intl
exec_always --no-startup-id feh --bg-center ~/.config/i3/wallpapers/wallpaper-161664.jpg exec_always --no-startup-id feh --bg-fill ~/.config/i3/wallpapers/void-minimalist2.png
exec_always --no-startup-id ~/.config/i3/scripts/setup-gtk-theme.sh exec_always --no-startup-id ~/.config/i3/scripts/setup-gtk-theme.sh
exec --no-startup-id /usr/libexec/xdg-desktop-portal exec --no-startup-id /usr/libexec/xdg-desktop-portal
@@ -18,12 +18,6 @@ exec --no-startup-id pipewire
exec --no-startup-id pipewire-pulse exec --no-startup-id pipewire-pulse
exec --no-startup-id wireplumber 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 # Monitor configuration
exec --no-startup-id autorandr --persistent --change exec --no-startup-id autorandr --persistent --change
@@ -52,12 +46,6 @@ new_window pixel 2
new_float pixel 2 new_float pixel 2
hide_edge_borders none hide_edge_borders none
# Gaps (i3 >= 4.22)
gaps inner 10
gaps outer 4
smart_gaps on
smart_borders on
# vim-like directions # vim-like directions
set $left h set $left h
set $down j set $down j
@@ -162,17 +150,6 @@ set $ws8 "8"
set $ws9 "9" set $ws9 "9"
set $ws10 "10" 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+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2 bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3 bindsym $mod+3 workspace number $ws3
@@ -222,24 +199,24 @@ mode "resize" {
bindsym $mod+r mode "resize" bindsym $mod+r mode "resize"
# i3bar + i3status (disabilitato: ora gestito da polybar) # i3bar + i3status
# bar { bar {
# status_command i3blocks status_command i3blocks
# position bottom position bottom
# tray_output primary tray_output primary
# font pango:Liberation Mono 10 font pango:Liberation Mono 10
#
# colors { colors {
# background #1f1f28 background #1f1f28
# statusline #d0d0d0 statusline #d0d0d0
# separator #3a3a46 separator #3a3a46
#
# focused_workspace #4a90d9 #4a90d9 #ffffff focused_workspace #4a90d9 #4a90d9 #ffffff
# active_workspace #3a3a46 #2b2b36 #d0d0d0 active_workspace #3a3a46 #2b2b36 #d0d0d0
# inactive_workspace #1f1f28 #1f1f28 #9a9a9a inactive_workspace #1f1f28 #1f1f28 #9a9a9a
# urgent_workspace #c7162b #c7162b #ffffff urgent_workspace #c7162b #c7162b #ffffff
# } }
# } }
client.focused #4a90d9 #4a90d9 #ffffff #4a90d9 #4a90d9 client.focused #4a90d9 #4a90d9 #ffffff #4a90d9 #4a90d9
client.focused_inactive #3a3a46 #2b2b36 #eeeeee #3a3a46 #3a3a46 client.focused_inactive #3a3a46 #2b2b36 #eeeeee #3a3a46 #3a3a46

View File

@@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
wallpaper="$HOME/.config/i3/wallpapers/maxresdefault.jpg" wallpaper="$HOME/.config/i3/wallpapers/void-minimalist.png"
cached="$HOME/.cache/i3lock/wallpaper.png" cached="$HOME/.cache/i3lock/wallpaper.png"
dims_cache="$HOME/.cache/i3lock/dims.txt" dims_cache="$HOME/.cache/i3lock/dims.txt"
dims=$(xdotool getdisplaygeometry | tr ' ' 'x') dims=$(xdotool getdisplaygeometry | tr ' ' 'x')

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

View File

@@ -1,7 +1,7 @@
[Default Applications] [Default Applications]
text/html=userapp-Firefox-91DVN3.desktop text/html=firefox.desktop
x-scheme-handler/http=userapp-Firefox-91DVN3.desktop x-scheme-handler/http=firefox.desktop
x-scheme-handler/https=userapp-Firefox-91DVN3.desktop x-scheme-handler/https=firefox.desktop
x-scheme-handler/about=firefox.desktop x-scheme-handler/about=firefox.desktop
x-scheme-handler/unknown=firefox.desktop x-scheme-handler/unknown=firefox.desktop
application/pdf=com.github.xournalpp.xournalpp.desktop application/pdf=com.github.xournalpp.xournalpp.desktop
@@ -164,13 +164,6 @@ text/x-readme=emacs.desktop
text/x-rst=emacs.desktop text/x-rst=emacs.desktop
text/x-tex=emacs.desktop text/x-tex=emacs.desktop
text/x-texinfo=emacs.desktop text/x-texinfo=emacs.desktop
x-scheme-handler/chrome=userapp-Firefox-91DVN3.desktop
application/x-extension-htm=userapp-Firefox-91DVN3.desktop
application/x-extension-html=userapp-Firefox-91DVN3.desktop
application/x-extension-shtml=userapp-Firefox-91DVN3.desktop
application/xhtml+xml=userapp-Firefox-91DVN3.desktop
application/x-extension-xhtml=userapp-Firefox-91DVN3.desktop
application/x-extension-xht=userapp-Firefox-91DVN3.desktop
[Added Associations] [Added Associations]
application/json=emacs.desktop; application/json=emacs.desktop;
@@ -333,6 +326,3 @@ text/x-readme=emacs.desktop;
text/x-rst=emacs.desktop; text/x-rst=emacs.desktop;
text/x-tex=emacs.desktop; text/x-tex=emacs.desktop;
text/x-texinfo=emacs.desktop; text/x-texinfo=emacs.desktop;
x-scheme-handler/http=userapp-Firefox-91DVN3.desktop;
x-scheme-handler/https=userapp-Firefox-91DVN3.desktop;
x-scheme-handler/chrome=userapp-Firefox-91DVN3.desktop;

View File

@@ -0,0 +1,18 @@
{
"mError": "#d95757",
"mHover": "#39bae6",
"mOnError": "#0b0e14",
"mOnHover": "#0b0e14",
"mOnPrimary": "#0b0e14",
"mOnSecondary": "#0b0e14",
"mOnSurface": "#d1d1c7",
"mOnSurfaceVariant": "#8e959e",
"mOnTertiary": "#0b0e14",
"mOutline": "#565b66",
"mPrimary": "#e6b450",
"mSecondary": "#aad94c",
"mShadow": "#000000",
"mSurface": "#0b0e14",
"mSurfaceVariant": "#1e222a",
"mTertiary": "#39bae6"
}

View File

@@ -0,0 +1,90 @@
{
"dark": {
"mPrimary": "#b58fff",
"mOnPrimary": "#000000",
"mSecondary": "#c79aff",
"mOnSecondary": "#000000",
"mTertiary": "#d8b4ff",
"mOnTertiary": "#000000",
"mError": "#ff6f9b",
"mOnError": "#000000",
"mSurface": "#000000",
"mOnSurface": "#e8d8ff",
"mSurfaceVariant": "#110d1a",
"mOnSurfaceVariant": "#b58fff",
"mOutline": "#4c3a70",
"mShadow": "#000000",
"terminal": {
"foreground": "#e8d8ff",
"background": "#000000",
"selectionFg": "#e8d8ff",
"selectionBg": "#4c3a70",
"cursorText": "#000000",
"cursor": "#e8d8ff",
"normal": {
"black": "#000000",
"red": "#ff6f9b",
"green": "#a8e6cf",
"yellow": "#d8b4ff",
"blue": "#b58fff",
"magenta": "#c79aff",
"cyan": "#e0c1ff",
"white": "#e8d8ff"
},
"bright": {
"black": "#4c3a70",
"red": "#ff8cb3",
"green": "#b8f0d8",
"yellow": "#e6d1ff",
"blue": "#c9a8ff",
"magenta": "#d4b8ff",
"cyan": "#f0e0ff",
"white": "#f5f0ff"
}
}
},
"light": {
"mPrimary": "#8a56d4",
"mOnPrimary": "#ffffff",
"mSecondary": "#a074ff",
"mOnSecondary": "#ffffff",
"mTertiary": "#c79aff",
"mOnTertiary": "#ffffff",
"mError": "#ff6f9b",
"mOnError": "#ffffff",
"mSurface": "#fbf8ff",
"mOnSurface": "#1a1428",
"mSurfaceVariant": "#e8e0f8",
"mOnSurfaceVariant": "#8a56d4",
"mOutline": "#9b85c2",
"mShadow": "#e2d8f5",
"terminal": {
"foreground": "#1a1428",
"background": "#fbf8ff",
"selectionFg": "#1a1428",
"selectionBg": "#e8e0f8",
"cursorText": "#fbf8ff",
"cursor": "#1a1428",
"normal": {
"black": "#6b5b95",
"red": "#ff6f9b",
"green": "#6fb58f",
"yellow": "#c79aff",
"blue": "#8a56d4",
"magenta": "#a074ff",
"cyan": "#b89fff",
"white": "#1a1428"
},
"bright": {
"black": "#9b85c2",
"red": "#ff8cb3",
"green": "#85d7a8",
"yellow": "#e0c1ff",
"blue": "#b58fff",
"magenta": "#c79aff",
"cyan": "#d8b4ff",
"white": "#120f1f"
}
}
}
}

View File

@@ -0,0 +1,90 @@
{
"dark": {
"mPrimary": "#ff8cb3",
"mOnPrimary": "#000000",
"mSecondary": "#ffb3cc",
"mOnSecondary": "#000000",
"mTertiary": "#ffcce0",
"mOnTertiary": "#000000",
"mError": "#ff99b8",
"mOnError": "#000000",
"mSurface": "#000000",
"mOnSurface": "#ffe0eb",
"mSurfaceVariant": "#1a0f16",
"mOnSurfaceVariant": "#ff8cb3",
"mOutline": "#5a3f4d",
"mShadow": "#000000",
"terminal": {
"foreground": "#ffe0eb",
"background": "#000000",
"selectionFg": "#ffe0eb",
"selectionBg": "#5a3f4d",
"cursorText": "#000000",
"cursor": "#ffe0eb",
"normal": {
"black": "#000000",
"red": "#ff99b8",
"green": "#ffccdd",
"yellow": "#ffcce0",
"blue": "#ff8cb3",
"magenta": "#ffb3cc",
"cyan": "#ffd6e8",
"white": "#ffe0eb"
},
"bright": {
"black": "#5a3f4d",
"red": "#ffb8cc",
"green": "#ffd6e8",
"yellow": "#ffe0f0",
"blue": "#ffa8c2",
"magenta": "#ffccdd",
"cyan": "#ffe8f2",
"white": "#fff0f5"
}
}
},
"light": {
"mPrimary": "#e57399",
"mOnPrimary": "#ffffff",
"mSecondary": "#ff99b8",
"mOnSecondary": "#ffffff",
"mTertiary": "#ffb3cc",
"mOnTertiary": "#ffffff",
"mError": "#ff99b8",
"mOnError": "#ffffff",
"mSurface": "#fff5fa",
"mOnSurface": "#2c1822",
"mSurfaceVariant": "#f5d6e3",
"mOnSurfaceVariant": "#e57399",
"mOutline": "#b38099",
"mShadow": "#f0d0e0",
"terminal": {
"foreground": "#2c1822",
"background": "#fff5fa",
"selectionFg": "#2c1822",
"selectionBg": "#f5d6e3",
"cursorText": "#fff5fa",
"cursor": "#2c1822",
"normal": {
"black": "#8c6075",
"red": "#ff99b8",
"green": "#e599b3",
"yellow": "#ffb3cc",
"blue": "#e57399",
"magenta": "#ff99b8",
"cyan": "#ffb8d1",
"white": "#2c1822"
},
"bright": {
"black": "#b38099",
"red": "#ffb8cc",
"green": "#ffccdd",
"yellow": "#ffcce0",
"blue": "#ff8cb3",
"magenta": "#ffb3cc",
"cyan": "#ffd6e8",
"white": "#1a1015"
}
}
}
}

View File

@@ -0,0 +1,94 @@
{
"dark": {
"mPrimary": "#FFC799",
"mOnPrimary": "#000000",
"mSecondary": "#99FFE4",
"mOnSecondary": "#000000",
"mTertiary": "#FBADFF",
"mOnTertiary": "#000000",
"mError": "#FF8080",
"mOnError": "#000000",
"mSurface": "#0C0C0C",
"mOnSurface": "#FFFFFF",
"mSurfaceVariant": "#1C1C1C",
"mOnSurfaceVariant": "#A0A0A0",
"mOutline": "#505050",
"mShadow": "#000000",
"mHover": "#282828",
"mOnHover": "#FFFFFF",
"terminal": {
"foreground": "#FFFFFF",
"background": "#0C0C0C",
"normal": {
"black": "#0C0C0C",
"red": "#FF8080",
"green": "#99FFE4",
"yellow": "#FFC799",
"blue": "#80B3FF",
"magenta": "#FBADFF",
"cyan": "#99FFE4",
"white": "#A0A0A0"
},
"bright": {
"black": "#505050",
"red": "#FF8080",
"green": "#99FFE4",
"yellow": "#FFC799",
"blue": "#80B3FF",
"magenta": "#FBADFF",
"cyan": "#99FFE4",
"white": "#FFFFFF"
},
"cursor": "#FFFFFF",
"cursorText": "#000000",
"selectionFg": "#000000",
"selectionBg": "#FFC799"
}
},
"light": {
"mPrimary": "#FFB170",
"mOnPrimary": "#0C0C0C",
"mSecondary": "#00CC99",
"mOnSecondary": "#0C0C0C",
"mTertiary": "#FBADFF",
"mOnTertiary": "#0C0C0C",
"mError": "#FF8080",
"mOnError": "#0C0C0C",
"mSurface": "#F2F2F2",
"mOnSurface": "#0C0C0C",
"mSurfaceVariant": "#E5E5E5",
"mOnSurfaceVariant": "#282828",
"mOutline": "#505050",
"mShadow": "#D9D9D9",
"mHover": "#E0E0E0",
"mOnHover": "#0C0C0C",
"terminal": {
"foreground": "#0C0C0C",
"background": "#F2F2F2",
"normal": {
"black": "#F2F2F2",
"red": "#FF8080",
"green": "#00CC99",
"yellow": "#FFC799",
"blue": "#004A77",
"magenta": "#FBADFF",
"cyan": "#006B57",
"white": "#505050"
},
"bright": {
"black": "#A0A0A0",
"red": "#FF8080",
"green": "#00CC99",
"yellow": "#FFC799",
"blue": "#80B3FF",
"magenta": "#FBADFF",
"cyan": "#99FFE4",
"white": "#0C0C0C"
},
"cursor": "#0C0C0C",
"cursorText": "#F2F2F2",
"selectionFg": "#F2F2F2",
"selectionBg": "#FFC799"
}
}
}

View File

@@ -0,0 +1,28 @@
{
"sources": [
{
"enabled": true,
"name": "Noctalia Plugins",
"url": "https://github.com/noctalia-dev/noctalia-plugins"
}
],
"states": {
"clipboard": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"clipper": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"polkit-agent": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"usb-drive-manager": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
}
},
"version": 2
}

View File

@@ -0,0 +1,48 @@
{
"message": "Clipboard Panel",
"backgroundColor": "#fabd2f",
"cardColors": {
"Text": {
"bg": "mOutline",
"separator": "mSurface",
"fg": "mOnSurface"
},
"Image": {
"bg": "mTertiary",
"separator": "mSurface",
"fg": "mOnTertiary"
},
"Link": {
"bg": "mPrimary",
"separator": "mSurface",
"fg": "mOnPrimary"
},
"Code": {
"bg": "mSecondary",
"separator": "mSurface",
"fg": "mOnSecondary"
},
"Color": {
"bg": "mSecondary",
"separator": "mSurface",
"fg": "mOnSecondary"
},
"Emoji": {
"bg": "mHover",
"separator": "mSurface",
"fg": "mOnHover"
},
"File": {
"bg": "mError",
"separator": "mSurface",
"fg": "mOnError"
}
},
"customColors": {},
"enableTodoIntegration": true,
"autoOpenPinnedPanel": false,
"pincardsEnabled": true,
"notecardsEnabled": true,
"showCloseButton": true,
"closeOnBackgroundClick": true
}

View File

@@ -0,0 +1,7 @@
{
"$schema": "https://opencode.ai/config.json",
"instructions": [
"~/.config/opencode/bootstrap.md",
"~/.config/opencode/rules/safety.md"
]
}

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

@@ -2,7 +2,7 @@ configuration {
modi: "drun,run,window"; modi: "drun,run,window";
show-icons: true; show-icons: true;
icon-theme: "Yaru"; icon-theme: "Yaru";
font: "LiterationMono Nerd Font 11"; font: "Liberation Sans 11";
} }
* { * {

View File

@@ -1,156 +1,64 @@
# Sway / SwayFX config
set $mod Mod4 set $mod Mod4
font pango:LiterationMono Nerd Font 10
# vim-like directions
set $left h
set $down j
set $up k
set $right l
# Default terminal (hosts can override via host.conf — e.g. nymph wraps it in prime-run)
set $terminal alacritty set $terminal alacritty
set $fallback_terminal st
# Workspaces (waybar formatta i numeri in romani via format-icons) # Host-specific overrides
set $ws1 "1" include ~/.config/sway/host.conf
set $ws2 "2" include ~/.config/sway/shell.conf
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"
# Input devices font pango:Hack Nerd Font 10
input * {
# Input and output defaults
seat seat0 xcursor_theme Yaru 24
input type:keyboard {
xkb_layout us xkb_layout us
xkb_variant intl xkb_variant intl
} }
# Cursor
seat * xcursor_theme Yaru 24
# Outputs
output * bg ~/.config/sway/wallpapers/wallpaper-161664.jpg center
# SwayFX effects
corner_radius 8
blur enable
blur_passes 2
blur_radius 5
shadows enable
default_dim_inactive 0.1
# Allow X11 applications
xwayland enable
# General behavior
focus_follows_mouse no focus_follows_mouse no
mouse_warping none mouse_warping none
floating_modifier $mod floating_modifier $mod normal
tiling_drag enable
# Borders # Borders
default_border pixel 2 default_border pixel 2
default_floating_border pixel 2 default_floating_border pixel 2
hide_edge_borders none hide_edge_borders none
# Gaps # Floating rules
gaps inner 10 for_window [app_id="Rofi"] floating enable
gaps outer 4 for_window [app_id="org.pulseaudio.pavucontrol"] floating enable
smart_gaps on for_window [class="Pavucontrol"] floating enable
smart_borders on for_window [app_id="nm-connection-editor"] floating enable
for_window [class="Nm-connection-editor"] floating enable
for_window [app_id="blueman-manager"] floating enable
for_window [class="Blueman-manager"] floating enable
# Per-host overrides (terminal wrapper, gaps tweaks, workspace→output bindings, …) set $left h
include ~/.config/sway/host.conf set $down j
set $up k
set $right l
# Window rules # App launchers and window actions
for_window [app_id="(?i)polkit"] floating enable
for_window [class="(?i)polkit"] floating enable
for_window [title="^Authentication Required"] floating enable
# Autostart — XDG and session services
exec dex --autostart --environment sway
exec gnome-keyring-daemon --start --components=secrets
exec_always ~/.config/sway/scripts/setup-gtk-theme.sh
exec /usr/libexec/xdg-desktop-portal
# Audio
exec pipewire
exec pipewire-pulse
exec wireplumber
# Status bar
exec waybar
# OSD daemon (volume/brightness/caps-lock)
exec swayosd-server
# Tray services
exec dunst
exec /usr/libexec/xfce-polkit
exec nm-applet
exec blueman-applet
exec udiskie
exec flameshot
# Clipboard manager (Wayland-native)
exec wl-paste --type text --watch cliphist store
exec wl-paste --type image --watch cliphist store
# Idle / lock policy
# 5 min idle → lock
# 10 min idle → screen off (DPMS)
# resume → screen on
# before sleep → lock
exec swayidle -w \
timeout 300 '~/.config/sway/scripts/lockscreen' \
timeout 600 'swaymsg "output * dpms off"' \
resume 'swaymsg "output * dpms on"' \
before-sleep '~/.config/sway/scripts/lockscreen'
# Terminal
bindsym $mod+Return exec $terminal bindsym $mod+Return exec $terminal
bindsym $mod+Shift+Return exec $fallback_terminal
# Emacs client
bindsym $mod+Shift+e exec emacsclient -c -n bindsym $mod+Shift+e exec emacsclient -c -n
bindsym $mod+d exec $menu
# Launcher bindsym $mod+Shift+v exec $audio_panel
bindsym $mod+d exec "rofi -show drun -theme ~/.config/rofi/config.rasi"
# Clipboard history picker
bindsym $mod+c exec "cliphist list | rofi -dmenu -theme ~/.config/rofi/config.rasi | cliphist decode | wl-copy"
# Audio panel control
bindsym $mod+Shift+v exec pavucontrol
# File manager
bindsym $mod+Shift+f exec thunar bindsym $mod+Shift+f exec thunar
bindsym $mod+Shift+x exec $locker
# Manual lock screen
bindsym $mod+Shift+x exec ~/.config/sway/scripts/lockscreen
# Kill focused window
bindsym $mod+Shift+q kill bindsym $mod+Shift+q kill
# Screenshot # Screenshots
# Print → flameshot GUI (annotations, save + clipboard via portal) bindsym Print exec $screenshot_full
# Shift+Print → grim+slurp region → clipboard bindsym Shift+Print exec $screenshot_region
# Alt+Print → grim focused output → clipboard bindsym Alt+Print exec $screenshot_window
bindsym Print exec flameshot gui --path "$HOME/Pictures/Screenshots" --clipboard
bindsym Shift+Print exec ~/.config/sway/scripts/screenshot region
bindsym Alt+Print exec ~/.config/sway/scripts/screenshot output
# Focus # Focus
bindsym $mod+$left focus left bindsym $mod+$left focus left
bindsym $mod+$down focus down bindsym $mod+$down focus down
bindsym $mod+$up focus up bindsym $mod+$up focus up
bindsym $mod+$right focus right bindsym $mod+$right focus right
bindsym $mod+Left focus left bindsym $mod+Left focus left
bindsym $mod+Down focus down bindsym $mod+Down focus down
bindsym $mod+Up focus up bindsym $mod+Up focus up
@@ -161,23 +69,20 @@ bindsym $mod+Shift+$left move left
bindsym $mod+Shift+$down move down bindsym $mod+Shift+$down move down
bindsym $mod+Shift+$up move up bindsym $mod+Shift+$up move up
bindsym $mod+Shift+$right move right bindsym $mod+Shift+$right move right
bindsym $mod+Shift+Left move left bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right bindsym $mod+Shift+Right move right
# Split # Split and layouts
bindsym $mod+b split h bindsym $mod+b split h
bindsym $mod+v split v bindsym $mod+v split v
# Layouts
bindsym $mod+f fullscreen toggle bindsym $mod+f fullscreen toggle
bindsym $mod+s layout stacking bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split bindsym $mod+e layout toggle split
# Floating / focus mode
bindsym $mod+Shift+space floating toggle bindsym $mod+Shift+space floating toggle
bindsym $mod+space focus mode_toggle bindsym $mod+space focus mode_toggle
bindsym $mod+a focus parent bindsym $mod+a focus parent
@@ -186,22 +91,32 @@ bindsym $mod+a focus parent
bindsym $mod+Shift+minus move scratchpad bindsym $mod+Shift+minus move scratchpad
bindsym $mod+minus scratchpad show bindsym $mod+minus scratchpad show
# Volume (via swayosd: aggiorna pactl + mostra OSD) # Volume and brightness OSD
bindsym XF86AudioRaiseVolume exec swayosd-client --output-volume raise bindsym XF86AudioRaiseVolume exec $audio_raise
bindsym XF86AudioLowerVolume exec swayosd-client --output-volume lower bindsym XF86AudioLowerVolume exec $audio_lower
bindsym XF86AudioMute exec swayosd-client --output-volume mute-toggle bindsym XF86AudioMute exec $audio_mute
bindsym XF86AudioMicMute exec swayosd-client --input-volume mute-toggle bindsym XF86AudioMicMute exec $audio_mic_mute
# Brightness (via swayosd: aggiorna brightnessctl + mostra OSD) bindsym XF86MonBrightnessUp exec $brightness_up
bindsym XF86MonBrightnessUp exec swayosd-client --brightness raise bindsym XF86MonBrightnessDown exec $brightness_down
bindsym XF86MonBrightnessDown exec swayosd-client --brightness lower
# Media keys # Media keys
bindsym XF86AudioPlay exec playerctl play-pause bindsym XF86AudioPlay exec playerctl play-pause
bindsym XF86AudioNext exec playerctl next bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous bindsym XF86AudioPrev exec playerctl previous
# Workspace switch # 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
bindsym $mod+1 workspace number $ws1 bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2 bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3 bindsym $mod+3 workspace number $ws3
@@ -226,11 +141,11 @@ bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9 bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10 bindsym $mod+Shift+0 move container to workspace number $ws10
# Reload / exit # Reload and power menu
bindsym $mod+Shift+c reload bindsym $mod+Shift+c reload
bindsym $mod+Shift+r reload bindsym $mod+Shift+r reload
bindsym $mod+Shift+BackSpace exec swaymsg exit bindsym $mod+Shift+BackSpace exit
bindsym $mod+Shift+Escape exec ~/.config/sway/scripts/powermenu.sh bindsym $mod+Shift+Escape exec $powermenu
# Resize mode # Resize mode
mode "resize" { mode "resize" {
@@ -248,12 +163,7 @@ mode "resize" {
bindsym Escape mode "default" bindsym Escape mode "default"
bindsym $mod+r mode "default" bindsym $mod+r mode "default"
} }
bindsym $mod+r mode "resize" bindsym $mod+r mode "resize"
# Client colors (border, background, text, indicator, child_border) include ~/.config/sway/noctalia
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,3 +1 @@
# Per-host sway overrides. Empty by default; hosts that need tuning # Host-specific Sway overrides live here.
# ship their own version via host_sway_dotfiles, which overwrites this
# placeholder during deploy.

View File

@@ -1,17 +0,0 @@
#!/bin/sh
exec swaylock \
--image "$HOME/.config/sway/wallpapers/maxresdefault.jpg" \
--scaling fill \
--indicator-idle-visible \
--ring-color 2f4058 \
--inside-color 1f1f28 \
--line-color 00000000 \
--separator-color 3a3a46 \
--key-hl-color 6daeea \
--bs-hl-color c7162b \
--ring-ver-color 4a90d9 \
--inside-ver-color 1f1f28 \
--ring-wrong-color c7162b \
--inside-wrong-color 1f1f28 \
--text-color d0d0d0

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/sway/scripts/lockscreen
;;
*Logout)
swaymsg exit
;;
*Suspend)
~/.config/sway/scripts/lockscreen
loginctl suspend
;;
*Reboot)
loginctl reboot
;;
*Shutdown)
loginctl poweroff
;;
esac

View File

@@ -1,40 +0,0 @@
#!/bin/sh
# Quick screenshot helpers for sway. Captures via grim, saves to disk and
# also copies to the Wayland clipboard. Use the flameshot binding for
# annotations / fancy capture.
#
# Usage: screenshot {full|region|output|window}
set -eu
mode="${1:-full}"
dir="$HOME/Pictures/Screenshots"
mkdir -p "$dir"
file="$dir/$(date +%Y%m%d_%H%M%S).png"
case "$mode" in
full)
grim "$file"
;;
region)
grim -g "$(slurp)" "$file"
;;
output)
out=$(swaymsg -t get_outputs --raw \
| jq -r '.[] | select(.focused) | .name')
grim -o "$out" "$file"
;;
window)
geom=$(swaymsg -t get_tree \
| jq -r '.. | select(.focused? == true)
| "\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)"')
grim -g "$geom" "$file"
;;
*)
printf 'Usage: %s {full|region|output|window}\n' "$0" >&2
exit 1
;;
esac
wl-copy < "$file"
notify-send "Screenshot saved" "$file" -i image-x-generic >/dev/null 2>&1 || true

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: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

View File

@@ -1,101 +0,0 @@
{
"layer": "top",
"position": "top",
"height": 26,
"spacing": 4,
"modules-left": ["sway/workspaces"],
"modules-center": [],
"modules-right": ["cpu", "memory", "disk", "temperature", "backlight", "network", "pulseaudio", "battery", "tray", "clock"],
"sway/workspaces": {
"disable-scroll": true,
"all-outputs": false,
"format": "{icon}",
"format-icons": {
"1": "I",
"2": "II",
"3": "III",
"4": "IV",
"5": "V",
"6": "VI",
"7": "VII",
"8": "VIII",
"9": "IX",
"10": "X"
},
"persistent-workspaces": {
"*": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}
},
"clock": {
"interval": 60,
"format": "{:%Y-%m-%d %H:%M}",
"tooltip-format": "<tt>{calendar}</tt>"
},
"cpu": {
"interval": 5,
"format": " {usage}%"
},
"memory": {
"interval": 10,
"format": " {used:0.1f}G / {total:0.1f}G"
},
"disk": {
"interval": 60,
"path": "/",
"format": " {used} / {total}"
},
"temperature": {
"interval": 10,
"critical-threshold": 80,
"format": " {temperatureC}°C",
"format-critical": " {temperatureC}°C"
},
"backlight": {
"format": " {percent}%",
"on-scroll-up": "brightnessctl set +5%",
"on-scroll-down": "brightnessctl set 5%-"
},
"network": {
"interval": 5,
"format-wifi": " {essid} {signalStrength}%",
"format-ethernet": " {ifname}",
"format-disconnected": " offline",
"tooltip-format": "{ifname} {ipaddr}"
},
"pulseaudio": {
"format": "{icon} {volume}%",
"format-muted": " muted",
"format-bluetooth": "{icon} {volume}% ",
"format-icons": { "default": ["", "", ""] },
"on-click": "swayosd-client --output-volume mute-toggle",
"on-click-right": "pavucontrol"
},
"battery": {
"bat": "BAT0",
"interval": 30,
"states": {
"warning": 30,
"critical": 15
},
"format": "{icon} {capacity}%",
"format-charging": " {capacity}%",
"format-full": " full",
"format-icons": ["", "", "", "", ""]
},
"tray": {
"icon-size": 16,
"spacing": 6
}
}

View File

@@ -1,67 +0,0 @@
* {
font-family: "LiterationMono Nerd Font", "Symbols Nerd Font Mono", monospace;
font-size: 10pt;
min-height: 0;
}
window#waybar {
background-color: #1f1f28;
color: #d0d0d0;
border: none;
}
#workspaces button {
padding: 0 8px;
margin: 0;
color: #9a9a9a;
background-color: transparent;
border: none;
border-radius: 0;
}
#workspaces button.visible {
color: #d0d0d0;
background-color: #2b2b36;
}
#workspaces button.focused {
color: #ffffff;
background-color: #4a90d9;
}
#workspaces button.urgent {
color: #ffffff;
background-color: #c7162b;
}
#clock,
#cpu,
#memory,
#disk,
#temperature,
#backlight,
#network,
#pulseaudio,
#battery,
#tray {
padding: 0 8px;
}
#clock { color: #d0d0d0; }
#cpu { color: #bb9af7; }
#memory { color: #7dcfff; }
#disk { color: #9ec07c; }
#temperature { color: #e0af68; }
#temperature.critical { color: #c7162b; }
#backlight { color: #d0d0d0; }
#network { color: #4a90d9; }
#network.disconnected { color: #3a3a46; }
#pulseaudio { color: #7dcfff; }
#pulseaudio.muted { color: #8e8e9a; }
#battery { color: #d0d0d0; }
#battery.charging { color: #9ec07c; }
#battery.warning { color: #e0af68; }
#battery.critical { color: #c7162b; }
#battery.full { color: #9ec07c; }
#tray { padding: 0 6px; }

View File

@@ -45,8 +45,8 @@
'misc/rss 'misc/rss
'misc/terminal 'misc/terminal
'misc/vcs 'misc/vcs
'misc/documents 'misc/pdf
'misc/i3-config 'misc/epub
'misc/xclip) 'misc/i3-config)
(message "...user configuration loaded") (message "...user configuration loaded")

View File

@@ -105,8 +105,8 @@
(define-key projectile-command-map (kbd "v") #'fscotto/project-multi-vterm) (define-key projectile-command-map (kbd "v") #'fscotto/project-multi-vterm)
(define-key projectile-command-map (kbd "V") nil) (define-key projectile-command-map (kbd "V") nil)
(define-key projectile-command-map (kbd "x") #'fscotto/project-external-terminal) (define-key projectile-command-map (kbd "x") #'fscotto/project-external-terminal)
(define-key projectile-command-map (kbd "a") #'fscotto/project-agent-dwim) (define-key projectile-command-map (kbd "a") #'fscotto/project-opencode-dwim)
(define-key projectile-command-map (kbd "A") #'fscotto/project-agent-session) (define-key projectile-command-map (kbd "A") #'fscotto/project-opencode-session)
(define-key projectile-command-map (kbd "g") #'fscotto/project-magit-status)) (define-key projectile-command-map (kbd "g") #'fscotto/project-magit-status))
;;;; LSP ;;;; LSP

View File

@@ -1,16 +1,14 @@
;;; core-ui.el -*- lexical-binding: t; -*- ;;; core-ui.el -*- lexical-binding: t; -*-
;; Load default theme ;; Load generated Noctalia theme.
(use-package nordic-night-theme (add-to-list 'custom-theme-load-path (expand-file-name "themes" user-emacs-directory))
:ensure t (load-theme 'noctalia t)
:config
(load-theme 'nordic-night t))
;; Setting default font ;; Setting default font
(set-frame-font "LiterationMono Nerd Font 14" nil t) (set-frame-font "Hack Nerd Font 14" nil t)
(add-to-list 'default-frame-alist (add-to-list 'default-frame-alist
'(font . "FantasqueSansM Nerd Font-14")) '(font . "Hack Nerd Font-14"))
;; Remove toolbar ;; Remove toolbar
(tool-bar-mode -1) (tool-bar-mode -1)

View File

@@ -1,23 +1,6 @@
;;; json.el -*- lexical-binding: t -*- ;;; json.el -*- lexical-binding: t -*-
(defun fscotto/json-maybe-start-lsp ()
"Start LSP for JSON buffers when lsp-mode is available."
(when (fboundp 'lsp-deferred)
(lsp-deferred)))
(use-package json-mode (use-package json-mode
:ensure t :ensure t)
:mode
(("\\.json\\'" . json-mode)
("\\.jsonc\\'" . json-mode))
:hook
(json-mode . fscotto/json-maybe-start-lsp))
(with-eval-after-load 'json-ts-mode
(add-hook 'json-ts-mode-hook #'fscotto/json-maybe-start-lsp))
(with-eval-after-load 'jsonc-mode
(add-hook 'jsonc-mode-hook #'fscotto/json-maybe-start-lsp))
(provide 'json) (provide 'json)

View File

@@ -1,5 +1,4 @@
(require 'seq) ;;functions to support syncing .elfeed between machines
(require 'subr-x)
;;makes sure elfeed reads index from disk before launching ;;makes sure elfeed reads index from disk before launching
(defvar fscotto/elfeed-initial-update-done nil (defvar fscotto/elfeed-initial-update-done nil
"Non-nil once Elfeed has triggered its first automatic update this session.") "Non-nil once Elfeed has triggered its first automatic update this session.")
@@ -129,24 +128,16 @@ Each entry is a cons cell of display string and session id."
"Return the latest saved OpenCode session id for the current project." "Return the latest saved OpenCode session id for the current project."
(cdr (car (fscotto/opencode-session-candidates (fscotto/project-root))))) (cdr (car (fscotto/opencode-session-candidates (fscotto/project-root)))))
(defun fscotto/project-agent-dwim () (defun fscotto/project-opencode-dwim ()
"Choose an agent for the current project and launch it externally." "Open the most useful OpenCode session for the current project.
Resume the latest saved session when available, otherwise create a new one."
(interactive) (interactive)
(let ((agent (completing-read "Agent: " '("Claude" "Codex" "Gemini" "OpenCode") nil t)))
(pcase agent
("Claude"
(fscotto/launch-external-terminal '("claude" "--continue")))
("OpenCode"
(let ((session-id (fscotto/project-opencode-latest-session-id))) (let ((session-id (fscotto/project-opencode-latest-session-id)))
(if session-id (if session-id
(fscotto/launch-external-terminal (list "opencode" "--session" session-id) (fscotto/launch-external-terminal (list "opencode" "--session" session-id)
(fscotto/project-root)) (fscotto/project-root))
(fscotto/project-opencode)))) (fscotto/project-opencode))))
("Codex"
(fscotto/launch-external-terminal '("codex" "resume" "--last")))
("Gemini"
(fscotto/launch-external-terminal '("gemini" "--resume" "latest")
(fscotto/project-root))))))
(defun fscotto/project-opencode-session () (defun fscotto/project-opencode-session ()
"Resume a saved OpenCode session for the current project." "Resume a saved OpenCode session for the current project."
@@ -160,78 +151,6 @@ Each entry is a cons cell of display string and session id."
(fscotto/launch-external-terminal (list "opencode" "--session" session-id) (fscotto/launch-external-terminal (list "opencode" "--session" session-id)
project-directory)))) project-directory))))
(defun fscotto/gemini-session-candidates (directory)
"Return Gemini session candidates for DIRECTORY.
Each entry is a cons cell of display string and session index.
Tries JSON output first, falls back to text parsing if unavailable."
(let* ((default-directory (file-name-as-directory directory))
(json-output (shell-command-to-string
"gemini --list-sessions --output-format json 2>/dev/null")))
(cond
((string-match "^{" json-output)
(ignore-errors
(require 'json)
(let* ((parsed (json-parse-string json-output))
(sessions (gethash "sessions" parsed)))
(when (vectorp sessions)
(seq-map-indexed
(lambda (s idx)
(let* ((idx-str (number-to-string (1+ idx)))
(msg (if (hash-table-p s)
(or (gethash "firstUserMessage" s) "Session")
"Session"))
(ts (and (hash-table-p s)
(ignore-errors (gethash "lastUpdated" s))
(when (stringp it) (string-trim it))))
(label (if ts (format "%s [%s]" msg ts) msg)))
(cons label idx-str)))
sessions)))))
(t
(let* ((output (shell-command-to-string "gemini --list-sessions"))
(lines (seq-filter (lambda (s) (string-match "\\S-" s))
(split-string output "\n" t)))
(data-lines (seq-drop lines 1))
(candidates nil))
(dolist (line data-lines)
(let ((trimmed (string-trim line)))
(when (string-match
(rx (group (one-or-more digit))
(one-or-more whitespace)
(group (one-or-more nonl)))
trimmed)
(push (cons (match-string 2 trimmed)
(match-string 1 trimmed))
candidates))))
(nreverse candidates))))))
(defun fscotto/project-gemini-session ()
"Choose and resume a Gemini session for the current project."
(interactive)
(let* ((project-directory (fscotto/project-root))
(candidates (fscotto/gemini-session-candidates project-directory)))
(unless candidates
(user-error "No Gemini sessions found for %s" project-directory))
(let* ((selection (completing-read "Gemini session: " candidates nil t))
(session-idx (cdr (assoc selection candidates))))
(fscotto/launch-external-terminal
(list "gemini" "--resume" session-idx)
project-directory))))
(defun fscotto/project-agent-session ()
"Choose an agent and resume a saved session for the current project."
(interactive)
(let ((agent (completing-read "Agent session: " '("Claude" "Codex" "Gemini" "OpenCode") nil t)))
(pcase agent
("Claude"
(fscotto/launch-external-terminal '("claude" "--resume")))
("OpenCode"
(fscotto/project-opencode-session))
("Codex"
(fscotto/launch-external-terminal '("codex" "resume")))
("Gemini"
(fscotto/project-gemini-session)))))
(defun fscotto/project-external-terminal () (defun fscotto/project-external-terminal ()
"Open the external terminal in project root." "Open the external terminal in project root."
(interactive) (interactive)

View File

@@ -1,39 +0,0 @@
;;; documents.el -*- lexical-binding: t; -*-
(use-package pdf-tools
:ensure t
:config
(pdf-tools-install))
(use-package pdf-view
:config
(setq-default pdf-view-display-size 'fit-width)
(setq pdf-cache-org-imgparams t
pdf-view-use-smooth-scrolling t)
(setq pdf-annot-default-visible-properties t))
(with-eval-after-load 'pdf-view
(define-key pdf-view-mode-map (kbd "n") 'pdf-view-next-page)
(define-key pdf-view-mode-map (kbd "p") 'pdf-view-previous-page)
(define-key pdf-view-mode-map (kbd "q") 'pdf-view-close))
(use-package nov
:ensure t
:mode ("\\.epub\\'" . nov-mode))
(use-package calibre
:ensure t
:commands calibre-library
:config
(setq calibre-calibredb-executable
(or (executable-find "calibredb")
(let ((flatpak-wrapper (expand-file-name "~/.local/bin/calibredb")))
(when (file-executable-p flatpak-wrapper)
flatpak-wrapper))
"calibredb")
calibre-libraries
`(("Library" . ,(expand-file-name "~/Documents/Library")))))
(provide 'misc/documents)
;;; documents.el ends here

Some files were not shown because too many files have changed in this diff Show More