diff --git a/.chezmoi.toml.tmpl b/.chezmoi.toml.tmpl
new file mode 100644
index 0000000..de91be3
--- /dev/null
+++ b/.chezmoi.toml.tmpl
@@ -0,0 +1,15 @@
+encryption = "age"
+
+[age]
+identity = "~/.config/chezmoi/key"
+recipient = "age1pq1q8zvperhkgayvaeyppanuwml6l54a2ehp8au3z96qzsympcjxhsvzdk9exks48fufdr3xaq8n65tque5xmfe5q6gjelsv55y6wa38fxxnurujk8dzup9zl9j3343mvdndnl0y20uejscwe3lfzn382ftspcespwdkpy063nz2ne4jalf5amuk9uuhyq7gezyg0ryhps2vwrsesckqe3md9nt50szym5zwmc9n3mq4faxahrlvystfcs4wq9ccjv9552v5x34vjs5zn83qy4skktkgvppdga95kt9jjx2fc3jvtqrusrf8rr3qlpckz0nqxndcqkstxlte3n8tjmuahnj8ph4prfhn899ze9wnxyznregyu6nnj365rry86rdagj53fwg0x6n9zhx62e2x7jshzyydahzp264efhakf9llacfvlwx6efe2sppk5zfsp0m8vgeyv3fvrxqrv3y4zj6cgj29kdlc6mvtpeqrcxkkd0xcka44p2287nphx6shwk426jl3v8qedtg5n6rcq68r454dfhxffr356gj6x3sc7a6890pkn55qa63s74nju4ytakmzescsrxamd6psgx8vjrcyvxfqlapywd74z5456dr2h3s49yud9ekzly7gcl04jss9kg8zelgfnqatslz6qtv6tzrgcqzm2rqc3asjylh2vhe9ze3qvtnucnqkddzygqtkr99apg67r23ur6ey2dznw5j546qq3uxnf4vydj8wv9cxd0xzs8xvn9cxu93xt5kxnr8j3ry2al7rszczu5faf24wqqh835uevdwn2r5szjvjdrtg7fw4zgkcpft2fgqm35fafavvulezhj44d5jy6yly4zmckeh4xpfh82zkwkegav373t65upepvykqfgcnwvtsatewmska82ud76ak37gw0x94xycwszq8sm29q4gpq9f8f2eyk6dj8aqhmdurr7hh87scqf4sjt669w95fsyrkr7eynltw8u3fcaur2yq44yk6sgr38wlnrxlcxzmv4st5d5c0zwjprds3kn26j5d6arx7gxw8nrgs57cetjnx586h25ltv2hh5c27xvdj20l2cpd7434mkscfe0jp395mphsyrl0hfh69vvxvh3yyq7a2eeqvc03fcnkfju5lksvexg3nr43qtgk5wqcw36h4z4jy772qdusu6x8wsnh23c9v48cfvm5q3r6x79ptr63sdrejd9gpun9wwckp5r0qusp7g9qysyt8yz9235e0reungjlaz2pnvaqksuaxjy2fpyn8f4uvg82rtlhq8f3373np259sq3fl39d32whyk62a5dukf7se6qkaykwwxgcprp0patv5prfukyjdtpx3ym40nnye9a8m9snk4g2xyenwh6wcldt230c6zvanp3vyfmtvc6tsdgmsvu62n5jkw2cfc9yzxyv9st72ampfns3e96ymack4fvz49p6c7vq0xf84380axzs9ajx9ssdwwra4auczj3f4uutpwh4rypmdxs3y2qvutzh0am08yq5w6wjwgv6yad2aex3s2s2gmzwllw2tpnlzv2vejnm3t24zrlkyfhcuqu0a5ppfex3r2ekrwsy4lz9w045wen4tms7pg638zu3wwg7fjrf6ctjtsjh8yuxf58gcwpy50ym8xg30n2gr09kmp9dyaeqsespdfvz9m4085pk25jdtdhprr8dh9m44wyndc8zhsz4gwx26kkyscq7kctd3lxpl8jwszkjyk9tmqrxyvjxe29c7w8g0qcqulnc326xwpt9nrgqssww0wnya3w42392dwpukthq79zvzlw60qruh6vnnxe6w849ajxe3lss8e0rthnq6gpfm0f0q754nvn9f05xvz3ptj5kch6d5hpzgwdkrjuw7rrwxhs7gdn3gkk6puvs62yge6zrg7jalyx"
+
+[data]
+{{ $system := promptStringOnce . "system" "Which system class is this machine?" "desktop" }}
+system = {{ $system | quote }}
+
+{{ $email := promptStringOnce . "email" "What is your email address (git)" }}
+email = {{ $email | quote }}
+
+{{ $name := promptStringOnce . "name" "What is your name (git)" }}
+name = {{ $name | quote }}
diff --git a/.chezmoiignore b/.chezmoiignore
new file mode 100644
index 0000000..67ba6a0
--- /dev/null
+++ b/.chezmoiignore
@@ -0,0 +1,2 @@
+assets/
+README.md
diff --git a/.gitignore b/.gitignore
index 7f473d9..d3c8379 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
-roles/z
-roles/test
error.log
-callback_plugins/__pycache__
+.callback_plugins/__pycache__
+# chezmoi local state — never committed
+.chezmoi/
+*.chezmoi.state
\ No newline at end of file
diff --git a/README.md b/README.md
index e380350..6649b95 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,64 @@
-# Installation
-Clone the repo and execute the `install.sh` script.
-Or use this command:
+# Dotfiles (chezmoi)
+
+Dotfiles managed by [chezmoi](https://www.chezmoi.io/). The repo works on
+Arch and Ubuntu (not complete) and has three machine classes: **server**, **desktop**, and **laptop**.
+
+
+## First-time install on a new machine
+
+### 1. Install prerequisites
+
```bash
-bash -c "$(curl -fsSL https://gitea.keuledrive.de/Keule2/Dotfiles/raw/branch/main/install.sh)"
-```
-Or this command to use arguments:
-```bash
-curl -fsSL "https://gitea.keuledrive.de/Keule2/Dotfiles/raw/branch/main/install.sh" | bash -s -- -e "system=server"
+# Arch
+sudo pacman -S git curl age jq chezmoi
+
+# Ubuntu
+sudo apt-get install -y git curl age jq
+# chezmoi: see https://www.chezmoi.io/install/
```
-# Update
-Just execute the `install.sh` script again.
+### 2. Provision the age key
-# Usage
-All additional parameters are passed to the ansible playbook. This means that you can skip tags or only execute desired tags.
-Example: Skip alacritty
+The age key needs to be placed at `~/.config/chezmoi/key`
+With following permissions
```bash
-./install.sh --skip-tags alacritty
-```
-Example: Only execute alacritty and fish
-```bash
-./install.sh -t alacritty,fish
+chmod 600 ~/.config/chezmoi/key
```
-# Settings
-There are two ways to set settings/values.
-1. Create/Edit: `$HOME/.config/dotfiles/values.yml`
-2. Edit: `$HOME/.dotfiles/group_vars/all`
+### 3. Bootstrap
-## Ansible Vault
-Vault password file: `$HOME/.config/dotfiles/vault-password.txt`
+```bash
+chezmoi init --apply git@gitea.keuledrive.de:Keule2/Dotfiles.git
+```
-## Settings
-### System
-|Value |Desc |Default|
-|------------|-------------------------------------------------------|-------|
-|server |Minimal installation (CMD tools) | |
-|desktop |Install WM and desktop applications |x |
-|desktop_full|Install additional packages for the desktop (e.g. wine)| |
-
+Will ask:
-# TODO
-- AGS: Bar, AppLauncher, PowerMenu, Notifications, Calculator, Emoji-Picker, ...
-- Ubuntu/Debian Support
-- ...
+- **Which system class is this machine?** — pick `server`, `desktop`, or `laptop`.
+- **EMAIL** — for git config.
+
+## Usage
+
+| Command | Effect |
+|---|---|
+| `chezmoi apply` | apply any local changes to dotfiles and run-once scripts |
+| `chezmoi update` | `git pull` + `apply` |
+| `chezmoi edit ` | open a tracked file in `$EDITOR` |
+| `chezmoi cd` | shell into the source dir |
+| `chezmoi diff` | show pending changes against your home |
+| `chezmoi managed` | list files chezmoi manages |
+
+## Changing the system class
+
+Two ways:
+
+```bash
+# Option A: re-prompt
+chezmoi init --apply --force --prompt
+
+# Option B: edit the cached value
+$EDITOR ~/.config/chezmoi/chezmoi.toml # change [data].system
+chezmoi apply
+```
+
+## TODO
+- Check packages e.g. gaming Steam/Lutris
diff --git a/ansible.cfg b/ansible.cfg
deleted file mode 100644
index 808ad9c..0000000
--- a/ansible.cfg
+++ /dev/null
@@ -1,4 +0,0 @@
-[defaults]
-stdout_callback = beautiful_output
-# Use the stdout_callback when running ad-hoc commands.
-bin_ansible_callbacks = True
diff --git a/roles/minegrub/files/minegrub/LICENSE b/assets/minegrub/LICENSE
similarity index 100%
rename from roles/minegrub/files/minegrub/LICENSE
rename to assets/minegrub/LICENSE
diff --git a/roles/minegrub/files/minegrub/Minecraft24.pf2 b/assets/minegrub/Minecraft24.pf2
similarity index 100%
rename from roles/minegrub/files/minegrub/Minecraft24.pf2
rename to assets/minegrub/Minecraft24.pf2
diff --git a/roles/minegrub/files/minegrub/Minecraft30.pf2 b/assets/minegrub/Minecraft30.pf2
similarity index 100%
rename from roles/minegrub/files/minegrub/Minecraft30.pf2
rename to assets/minegrub/Minecraft30.pf2
diff --git a/roles/minegrub/files/minegrub/Monocraft22.pf2 b/assets/minegrub/Monocraft22.pf2
similarity index 100%
rename from roles/minegrub/files/minegrub/Monocraft22.pf2
rename to assets/minegrub/Monocraft22.pf2
diff --git a/roles/minegrub/files/minegrub/assets/MinecraftRegular-Bmg3.otf b/assets/minegrub/assets/MinecraftRegular-Bmg3.otf
similarity index 100%
rename from roles/minegrub/files/minegrub/assets/MinecraftRegular-Bmg3.otf
rename to assets/minegrub/assets/MinecraftRegular-Bmg3.otf
diff --git a/roles/minegrub/files/minegrub/assets/Monocraft.otf b/assets/minegrub/assets/Monocraft.otf
similarity index 100%
rename from roles/minegrub/files/minegrub/assets/Monocraft.otf
rename to assets/minegrub/assets/Monocraft.otf
diff --git a/roles/minegrub/files/minegrub/assets/logo_clear.png b/assets/minegrub/assets/logo_clear.png
similarity index 100%
rename from roles/minegrub/files/minegrub/assets/logo_clear.png
rename to assets/minegrub/assets/logo_clear.png
diff --git a/roles/minegrub/files/minegrub/assets/splashes.txt b/assets/minegrub/assets/splashes.txt
similarity index 100%
rename from roles/minegrub/files/minegrub/assets/splashes.txt
rename to assets/minegrub/assets/splashes.txt
diff --git a/roles/minegrub/files/minegrub/background.png b/assets/minegrub/background.png
similarity index 100%
rename from roles/minegrub/files/minegrub/background.png
rename to assets/minegrub/background.png
diff --git a/roles/minegrub/files/minegrub/dirt.png b/assets/minegrub/dirt.png
similarity index 100%
rename from roles/minegrub/files/minegrub/dirt.png
rename to assets/minegrub/dirt.png
diff --git a/roles/minegrub/files/minegrub/item_c.png b/assets/minegrub/item_c.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_c.png
rename to assets/minegrub/item_c.png
diff --git a/roles/minegrub/files/minegrub/item_e.png b/assets/minegrub/item_e.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_e.png
rename to assets/minegrub/item_e.png
diff --git a/roles/minegrub/files/minegrub/item_n.png b/assets/minegrub/item_n.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_n.png
rename to assets/minegrub/item_n.png
diff --git a/roles/minegrub/files/minegrub/item_ne.png b/assets/minegrub/item_ne.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_ne.png
rename to assets/minegrub/item_ne.png
diff --git a/roles/minegrub/files/minegrub/item_nw.png b/assets/minegrub/item_nw.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_nw.png
rename to assets/minegrub/item_nw.png
diff --git a/roles/minegrub/files/minegrub/item_s.png b/assets/minegrub/item_s.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_s.png
rename to assets/minegrub/item_s.png
diff --git a/roles/minegrub/files/minegrub/item_se.png b/assets/minegrub/item_se.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_se.png
rename to assets/minegrub/item_se.png
diff --git a/roles/minegrub/files/minegrub/item_sw.png b/assets/minegrub/item_sw.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_sw.png
rename to assets/minegrub/item_sw.png
diff --git a/roles/minegrub/files/minegrub/item_w.png b/assets/minegrub/item_w.png
similarity index 100%
rename from roles/minegrub/files/minegrub/item_w.png
rename to assets/minegrub/item_w.png
diff --git a/roles/minegrub/files/minegrub/logo.png b/assets/minegrub/logo.png
similarity index 100%
rename from roles/minegrub/files/minegrub/logo.png
rename to assets/minegrub/logo.png
diff --git a/roles/minegrub/files/minegrub/selected_item_c.png b/assets/minegrub/selected_item_c.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_c.png
rename to assets/minegrub/selected_item_c.png
diff --git a/roles/minegrub/files/minegrub/selected_item_e.png b/assets/minegrub/selected_item_e.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_e.png
rename to assets/minegrub/selected_item_e.png
diff --git a/roles/minegrub/files/minegrub/selected_item_n.png b/assets/minegrub/selected_item_n.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_n.png
rename to assets/minegrub/selected_item_n.png
diff --git a/roles/minegrub/files/minegrub/selected_item_ne.png b/assets/minegrub/selected_item_ne.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_ne.png
rename to assets/minegrub/selected_item_ne.png
diff --git a/roles/minegrub/files/minegrub/selected_item_nw.png b/assets/minegrub/selected_item_nw.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_nw.png
rename to assets/minegrub/selected_item_nw.png
diff --git a/roles/minegrub/files/minegrub/selected_item_s.png b/assets/minegrub/selected_item_s.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_s.png
rename to assets/minegrub/selected_item_s.png
diff --git a/roles/minegrub/files/minegrub/selected_item_se.png b/assets/minegrub/selected_item_se.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_se.png
rename to assets/minegrub/selected_item_se.png
diff --git a/roles/minegrub/files/minegrub/selected_item_sw.png b/assets/minegrub/selected_item_sw.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_sw.png
rename to assets/minegrub/selected_item_sw.png
diff --git a/roles/minegrub/files/minegrub/selected_item_w.png b/assets/minegrub/selected_item_w.png
similarity index 100%
rename from roles/minegrub/files/minegrub/selected_item_w.png
rename to assets/minegrub/selected_item_w.png
diff --git a/roles/minegrub/files/minegrub/static_bar.png b/assets/minegrub/static_bar.png
similarity index 100%
rename from roles/minegrub/files/minegrub/static_bar.png
rename to assets/minegrub/static_bar.png
diff --git a/roles/minegrub/files/minegrub/term_e.png b/assets/minegrub/term_e.png
similarity index 100%
rename from roles/minegrub/files/minegrub/term_e.png
rename to assets/minegrub/term_e.png
diff --git a/roles/minegrub/files/minegrub/term_n.png b/assets/minegrub/term_n.png
similarity index 100%
rename from roles/minegrub/files/minegrub/term_n.png
rename to assets/minegrub/term_n.png
diff --git a/roles/minegrub/files/minegrub/term_ne.png b/assets/minegrub/term_ne.png
similarity index 100%
rename from roles/minegrub/files/minegrub/term_ne.png
rename to assets/minegrub/term_ne.png
diff --git a/roles/minegrub/files/minegrub/term_nw.png b/assets/minegrub/term_nw.png
similarity index 100%
rename from roles/minegrub/files/minegrub/term_nw.png
rename to assets/minegrub/term_nw.png
diff --git a/roles/minegrub/files/minegrub/term_s.png b/assets/minegrub/term_s.png
similarity index 100%
rename from roles/minegrub/files/minegrub/term_s.png
rename to assets/minegrub/term_s.png
diff --git a/roles/minegrub/files/minegrub/term_se.png b/assets/minegrub/term_se.png
similarity index 100%
rename from roles/minegrub/files/minegrub/term_se.png
rename to assets/minegrub/term_se.png
diff --git a/roles/minegrub/files/minegrub/term_sw.png b/assets/minegrub/term_sw.png
similarity index 100%
rename from roles/minegrub/files/minegrub/term_sw.png
rename to assets/minegrub/term_sw.png
diff --git a/roles/minegrub/files/minegrub/term_w.png b/assets/minegrub/term_w.png
similarity index 100%
rename from roles/minegrub/files/minegrub/term_w.png
rename to assets/minegrub/term_w.png
diff --git a/roles/minegrub/files/minegrub/theme.txt b/assets/minegrub/theme.txt
similarity index 100%
rename from roles/minegrub/files/minegrub/theme.txt
rename to assets/minegrub/theme.txt
diff --git a/roles/system/files/pacman.conf b/assets/pacman.conf
similarity index 100%
rename from roles/system/files/pacman.conf
rename to assets/pacman.conf
diff --git a/callback_plugins/beautiful_output.py b/callback_plugins/beautiful_output.py
deleted file mode 100644
index a2493cd..0000000
--- a/callback_plugins/beautiful_output.py
+++ /dev/null
@@ -1,1466 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# MIT License
-#
-# Copyright (c) 2019 Thiago Alves
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-"""A clean and opinionated output callback plugin.
-
-The goal of this plugin is to consolidated Ansible's output in the style of
-LINUX/UNIX startup logs, and use unicode symbols to display task status.
-
-This Callback plugin is intended to be used on playbooks that you have
-to execute *"in-person"*, since it does always output to the screen.
-
-In order to use this Callback plugin, you should add this Role as a dependency
-in your project, and set the ``stdout_callback`` option on the
-:file:`ansible.cfg file::
-
- stdout_callback = beautiful_output
-
-"""
-
-# Make coding more python3-ish
-from __future__ import absolute_import, division, print_function
-
-__metaclass__ = type
-
-DOCUMENTATION = """---
- callback: beautiful_output
- type: stdout
- author: Thiago Alves
- short_description: a clean, condensed, and beautiful Ansible output
- version_added: 2.8
- description:
- - >-
- Consolidated Ansible output in the style of LINUX/UNIX startup
- logs, and use unicode symbols to organize tasks.
- extends_documentation_fragment:
- - default_callback
- requirements:
- - set as stdout in configuration
-"""
-
-import json
-import locale
-import os
-import re
-import textwrap
-import yaml
-
-from ansible import constants as C
-from ansible import context
-from ansible.executor.task_result import TaskResult
-from ansible.module_utils._text import to_text, to_bytes
-from ansible.module_utils.common._collections_compat import Mapping
-from ansible.parsing.utils.yaml import from_yaml
-from ansible.plugins.callback import CallbackBase
-from ansible.template import Templar
-from ansible.utils.color import colorize, hostcolor, stringc
-from ansible.vars.clean import strip_internal_keys, module_response_deepcopy
-from ansible.vars.hostvars import HostVarsVars
-from collections import OrderedDict
-try:
- from collections.abc import Sequence
-except:
- from collections import Sequence
-from numbers import Number
-from os.path import basename, isdir
-from watchdog.observers import Observer
-from watchdog.events import FileSystemEventHandler, EVENT_TYPE_CREATED
-
-_symbol = {
- "success": to_text("✔"),
- "warning": to_text("⚠"),
- "failure": to_text("✘"),
- "dead": to_text("✝"),
- "yaml": to_text("🅨"),
- "retry": to_text("️↻"),
- "loop": to_text("∑"),
- "arrow_right": to_text("➞"),
- "skip": to_text("⤼"),
- "flag": to_text("⚑"),
-} # type: Dict[str,str]
-""":obj:`dict` of :obj:`str` to :obj:`str`: A dictionary of symbols to be used
-when the Callback needs to display a symbol on the screen.
-"""
-
-_session_title = {
- "msg": "Message",
- "stdout": "Output",
- "stderr": "Error output",
- "module_stdout": "Module output",
- "module_stderr": "Module error output",
- "rc": "Return code",
- "changed": "Environment changed",
- "_ansible_no_log": "Omit logs",
- "use_stderr": "Use STDERR to output",
-} # type: Dict[str,str]
-""":obj:`dict` of :obj:`str` to :obj:`str`: A dictionary of terms used as
-section title when displayin the output of a command.
-"""
-
-_session_order = OrderedDict(
- [
- ("_ansible_no_log", 3),
- ("use_stderr", 4),
- ("msg", 1),
- ("stdout", 1),
- ("module_stdout", 1),
- ("stderr", 1),
- ("module_stderr", 1),
- ("rc", 3),
- ("changed", 3),
- ]
-)
-""":obj:`dict` of :obj:`str` to :obj:`str`: A dictionary representing the
-display an order in wich sections should be displayed to user.
-"""
-
-ansi_escape = re.compile(
- r"""
- \x1B # ESC
- [@-_] # 7-bit C1 Fe
- [0-?]* # Parameter bytes
- [ -/]* # Intermediate bytes
- [@-~] # Final byte
-""",
- re.VERBOSE,
-)
-""":regexp:`Pattern`: A regular expression that can match any ANSI escape
-sequence in a string.
-"""
-
-
-def symbol(key, color=None): # type: (str, str) -> str
- """Helper function that returns an Unicode character based on the given
- ``key``. This function also colorize the returned string using the
- :func:`~ansible.utils.color.stringc` function, depending on the value
- passed to `color`.
-
- Args:
- key (:obj:`str`): One of the keys used to define the dictionary
- :const:`~beautiful_output._symbol`.
- color (:obj:`str`, optional): a string representing the color that
- should be used to diplay the given symbol
-
- Returns:
- :obj:`str`: A unicode character representing a symbol for the given
- ``key``.
- """
- output = _symbol.get(key, to_text(":{0}:").format(key))
- if not color:
- return output
- return stringc(output, color)
-
-
-def iscollection(obj):
- """Helper method to check if a given object is not only a Squence, but also
- **not** any kind of string.
-
- Args:
- obj (object): The object used on the validation.
-
- Returns:
- bool: True if the object is a collection and False otherwise.
- """
- return isinstance(obj, Sequence) and not isinstance(obj, basestring)
-
-
-def stringtruncate(
- value,
- color="normal",
- width=0,
- justfn=None,
- fillchar=" ",
- truncate_placeholder="[...]",
-):
- """Truncates a giving string using the configuration passed as arguments to
- this function.
-
- Args:
- value (:obj:`str` or int): A value to be truncated if it has more
- characters than is allowed.
- color (:obj:`str`, optional): A string representing a color for Ansible.
- If this color is ``None``, no color will be used. Defaults to None.
- width (int, optional): The limits of characters allowed for the giving
- ``value``. If 0 is given, no truncation happens. Defaults to 0.
- justfn (:func:`Callable`, optional): A function to do the justification
- of the text. Defaults to :func:`str.rjust` if the type of ``value``
- is integer and :func:`str.ljust` otherwise.
- fillchar (:obj:`str`, optional): The character used to fill the space up
- to ``width`` after (or before) the ``value`` content. Defaults to
- " ".
- truncate_placeholder (:obj:`str`, optional): The text used to represents
- the truncation. Defaults to "[...]".
-
- Returns:
- The original string truncated to ``width`` and aligned according to
- ``justfn``.
- """
- if not value:
- return fillchar * width
-
- if not justfn:
- justfn = str.rjust if isinstance(value, int) else str.ljust
-
- if isinstance(value, int):
- value = to_text("{:n}").format(value)
-
- truncsize = len(truncate_placeholder)
- do_not_trucate = len(value) <= width or width == 0
- truncated_width = width - truncsize
-
- return stringc(
- to_text(justfn(str(value), width))
- if do_not_trucate
- else to_text("{0}{1}".format(
- value[:truncated_width] if justfn == str.ljust else truncate_placeholder,
- truncate_placeholder if justfn == str.ljust else value[truncated_width:],
- )),
- color,
- )
-
-
-def dictsum(totals, values):
- """Given two dictionaries of ``int`` values, this method will sum the
- value in ``totals`` with values in ``values``.
-
- If a key in ``values`` does not exist in ``totals``, that key will be
- added to it, and its initial value will be the same as in ``values``.
-
- Note:
- The type of the keys in the dictionaries are irrelevant, and this
- method will re-use anything that is used there.
-
- Args:
- totals (:obj:`dict` of :obj:`object` to int): The total cached
- from previous calls of this functions.
- values (:obj:`dict` of :obj:`object` to int): The dictionary of
- values used to sum up the totals.
-
- Exemple:
- >>> dict1 = {"key1": 10, "key2": 20, "key3": 30}
- >>> dict2 = {"key1": 5, "key2": 10, "key3": 15}
- >>> dict3 = {"key1": 1, "key2": 2, "key3": 3}
- >>> totals = {}
- >>> dictsum(totals, dict1)
- >>> totals
- {"key1": 10, "key2": 20, "key3": 30}
- >>> dictsum(totals, dict2)
- >>> totals
- {"key1": 15, "key2": 30, "key3": 45}
- >>> dictsum(totals, dict3)
- >>> totals
- {"key1": 16, "key2": 32, "key3": 48}
- """
- for key, value in values.items():
- if key not in totals:
- totals[key] = value
- else:
- totals[key] += value
-
-
-class CallbackModule(CallbackBase, FileSystemEventHandler):
- """The Callback plugin class to produce clean outputs.
-
- This class handles all Ansible callbacks that generate text on the output.
- It follows the new user configuration variables like
- :data:`~ansible.constants.DISPLAY_ARGS_TO_STDOUT` and
- :data:`~ansible.constants.DISPLAY_SKIPPED_HOSTS`, and it wraps lines at
- column ``80`` to make it possible to read the output on any monitor.
-
- In addition to that, the ``beautiful_output`` plugin implements a crud
- version of a Bus to allow other plugins to flush the output when necessary.
-
- Normally, in order to hide task not executed, the ``beautiful_output``
- plugin will delay printing the task's title until it knows there is anything
- to print. On certain conditions, an action plugin can output an information
- to the user, and without the Bus mechanism, the action plugin output would
- show up before the task title is printed, which would feel like the action
- plugin output belongs to the previous task.
-
- In order to flush the output on these scenarios, a plugin needs to write a
- file to a location where the ``beautiful_output`` plugin is observing. At
- this point, the Callback plugin will flush any outstanding text, and the
- other plugin can proceed with its own task.
-
- Args:
- display (:obj:`ansible.utils.display.Display`, optional): Holds the
- display to be used to print outputs with this callback.
-
- Attributes:
- CALLBACK_VERSION (:obj:`decimal`): A class attribute that holds the
- last version of Ansible Callback API that can use this plugin.
- CALLBACK_TYPE (:obj:`str`): The type of callback this plugin is
- implementing.
- CALLBACK_NAME (:obj:`str`): The name of this plugin.
- BUS_DIR (:obj:`str`): The path where the ``beautiful_stdout`` plugin
- will observe for files to trigger a flush.
- delegated_vars (:obj:`dict` of :obj:`str` to :obj:`str`): This
- dictionaire is used to store the variables used by a task when it
- delegated to a different host. Mostly, we only need to know the
- host name where our task was delegated to. Defaults to ``None``.
- _item_processed (:obj:`bool`): A flag indicating if an item from a task
- was already processed and printed. This is to allow us to print a
- header before start printin all the items from a task. Defaults to
- ``False``.
- _current_play (:obj:`~ansible.playbook.play.Play`): This attribute holds
- the current play being executed on this playbook. Defaults to
- ``None``.
- _current_host (:obj:`str`): The host where a task is being executed at
- the moment we access this attribute. If this attribute is ``None``,
- this means that at this moment there is no task being executed on
- any host. Defaults to ``None``.
- _task_name_buffer (:obj:`str`): This attribute holds the text that
- should be printed when a task is being executed. Defaults to
- ``None``.
-
- See Also:
- - :class:`ansible.plugins.callback.CallbackBase`
- - :class:`watchdog.events.FileSystemEventHandler`
- - `Ansible Callback documentation`_
-
- References:
- - `Ansible developping plugins documentation`_
- - `Ansible Callback plugins from Ansible Core`_
-
-
- .. _Ansible Callback documentation:
- https://docs.ansible.com/ansible/latest/plugins/callback.html
- .. _Ansible developping plugins documentation:
- https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html#callback-plugins
- .. _Ansible Callback plugins from Ansible Core:
- https://github.com/ansible/ansible/tree/devel/lib/ansible/plugins/callback
- """
-
- CALLBACK_VERSION = 2.0
- CALLBACK_TYPE = "stdout"
- CALLBACK_NAME = "beautiful_output"
- BUS_DIR = "%s/beautiful-output-bus" % C.DEFAULT_LOCAL_TMP
-
- def __init__(self, display=None):
- CallbackBase.__init__(self, display)
- self.delegated_vars = None
- self._item_processed = False
- self._current_play = None
- self._current_host = None
- self._task_name_buffer = None
-
- def display(self, msg, color=None, stderr=False):
- """Helper method to display text on the screen.
-
- This method is a thin wrapper aroung the real
- :meth:`~ansible.utils.display.Display.display` method from the Ansible
- :class:`~ansible.utils.display.Display` class.
-
- Any ``msg`` that is displayed with this method, will be displayed
- without any changes on the screen, and will have all the ANSI escape
- sequences stripped before displaying it on the logs.
-
- Args:
- msg (:obj:`str`): The message to be displayed.
- color (:obj:`str`, optional): A string representing a color on the
- Ansible Display system. Defaults to None.
- stderr (bool, optional): Flag indicating that the ``msg``should be
- displayed on the :data:`stderr` stream. Defaults to False.
- """
- self._display.display(msg=msg, color=color, stderr=stderr, screen_only=True)
- self._display.display(
- msg=ansi_escape.sub("", msg), stderr=stderr, log_only=True
- )
-
- def v2_playbook_on_start(self, playbook):
- """Displays the Playbook report Header when Ansible starst running it.
-
- The content displayed will depend on the options used to run the
- playbook, as well as the options configured in the :file:`ansible.cfg`
- file.
-
- It will always show which playbook it is running and if it is running
- in check mode.
-
- It will display all arguments used to run the given ``playbook` if it
- is running in verbose mode (`-vvv`), the ``display_args_to_stdout``
- option in the :file:`ansible.cfg` file, or if the
- ``ANSIBLE_DISPLAY_ARGS_TO_STDOUT`` environment variable is set
-
- It will display a tag line, only if the CLI arguments are **not**
- displayed, since the tags used to filters which tasks to run are passed
- in the command line as arguments
-
- Args:
- playbook (:obj:`~ansible.playbook.Playbook`): The running playbook.
-
- See Also:
- - :meth:`_display_cli_arguments`
- - :meth:`_display_tag_strip`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_playbook_on_start`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- playbook_name = to_text("{0} {1}").format(
- symbol(to_text("yaml"), C.COLOR_HIGHLIGHT),
- stringc(basename(playbook._file_name), C.COLOR_HIGHLIGHT),
- )
- if (
- "check" in context.CLIARGS
- and bool(context.CLIARGS["check"])
- and not self._is_run_verbose(verbosity=3)
- and not C.DISPLAY_ARGS_TO_STDOUT
- ):
- playbook_name = to_text("{0} (check mode)").format(playbook_name)
-
- self.display(to_text("\nExecuting playbook {0}").format(playbook_name))
-
- # show CLI arguments
- if self._is_run_verbose(verbosity=3) or C.DISPLAY_ARGS_TO_STDOUT:
- self._display_cli_arguments()
- else:
- self._display_tag_strip(playbook)
- self.display(to_text("\n"))
-
- def v2_playbook_on_no_hosts_matched(self):
- """Display a warning when there is no hosts available.
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_playbook_on_no_hosts_matched`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self.display(
- " %s No hosts found!" % symbol("warning", "bright yellow"),
- color=C.COLOR_DEBUG,
- )
-
- def v2_playbook_on_no_hosts_remaining(self):
- """Display an error when one or more hosts that were alive when the
- playbook start running are not reachable anymore.
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_playbook_on_no_hosts_remaining`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self.display(
- " %s Ran out of hosts!" % symbol("warning", "bright red"),
- color=C.COLOR_ERROR,
- )
-
- def v2_playbook_on_play_start(self, play):
- """Displays a banner with the play name and the hosts used in this
- play.
-
- This method might be called multimple times during the execution of a
- playbook, and it will not always have the play changed. Due to this
- fact, we short-circuit the method to not do anything if the play used
- to display the banner is the same as the one used on the last time the
- method was called.
-
- Args:
- play (:obj:`~ansible.playbook.play.Play`): the current play being
- executed on this playbook.
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_playbook_on_play_start`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- if self._current_play:
- self._current_play = play
- return
- self._current_play = play
- name = play.get_name().strip()
- if name:
- self.display(
- to_text("[PLAY: {0}]").format(stringc(name, C.COLOR_HIGHLIGHT)).center(91, "-")
- )
- else:
- self.display("[PLAY]".center(80, "-"))
-
- if play.hosts:
- self.display("Hosts:")
- for host in play.hosts:
- self.display(to_text(" - {0}").format(stringc(host, C.COLOR_HIGHLIGHT)))
- self.display(to_text("-") * 80)
-
- def v2_playbook_on_task_start(self, task, is_conditional):
- """Displays a title for the giving ``task`.
-
- Args:
- task (:obj:`~ansible.playbook.task.Task`): The task to have its
- title printed in the console.
- is_conditional: This attribute is ignored in this callback.
-
- See Also:
- :meth:`_display_task_name`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_playbook_on_task_start`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self._display_task_name(task)
-
- def v2_playbook_on_handler_task_start(self, task):
- """Displays a title for the giving ``task`, marking it as a handler
- task.
-
- Args:
- task (:obj:`~ansible.playbook.task.Task`): The task to have its
- title printed in the console.
-
- See Also:
- :meth:`_display_task_name`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_playbook_on_handler_task_start`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self._display_task_name(task, is_handler=True)
-
- def v2_runner_retry(self, result):
- """Displays the retrying steps Ansible is doing to make the task run
- on the host.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the previous attempt to run the task.
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_retry`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- msg = " ️%s Retrying... (%d of %d)" % (
- symbol("retry"),
- result._result["attempts"],
- result._result["retries"],
- )
- if self._is_run_verbose(result, 2):
- # All result keys stating with _ansible_ are internal, so remove them from the result before we output anything.
- abridged_result = strip_internal_keys(
- module_response_deepcopy(result._result)
- )
- abridged_result.pop("exception", None)
-
- if not self._is_run_verbose(verbosity=3):
- abridged_result.pop("invocation", None)
- abridged_result.pop("diff", None)
-
- msg += "Result was: %s" % CallbackModule.dump_value(abridged_result)
- self.display(msg, color=C.COLOR_DEBUG)
-
- def v2_runner_on_start(self, host, task):
- """Caches the giving ``host`` object to be easily accessible during the
- evaluation of a task display.
-
- Args:
- host (:obj:`~ansible.inventory.host.Host`): The host that will run
- the giving ``task``.
- task (:obj:`~ansible.playbook.task.Task`): The task that will be
- ran on the giving ``host``.
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_on_start`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self._current_host = host
-
- def v2_runner_on_ok(self, result):
- """Displays the result of a task run.
-
- This method will also be called every time an **item**, on a loop task,
- is processed.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
-
- See Also:
- - :meth:`_preprocess_result`
- - :meth:`changed_artifacts`
- - :meth:`_process_result_output`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_on_ok`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- if self._item_processed:
- return
-
- self._preprocess_result(result)
- msg, display_color = CallbackModule.changed_artifacts(result, "ok", C.COLOR_OK)
- task_result = self._process_result_output(result, msg, symbol("success"))
- self.display(task_result, display_color)
-
- def v2_runner_on_skipped(self, result):
- """If the you configured Ansible to display skipped hosts, this method
- will display the task and information that it was skipped.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
-
- See Also:
- - :meth:`_preprocess_result`
- - :meth:`_process_result_output`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_on_skipped`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- if C.DISPLAY_SKIPPED_HOSTS:
- self._preprocess_result(result)
- task_result = self._process_result_output(result, "skipped", symbol("skip"))
- self.display(task_result, C.COLOR_SKIP)
- pass
- else:
- self.outlines = []
-
- def v2_runner_on_failed(self, result, ignore_errors=False):
- """When a task fails, this method is called to display information
- about the error.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
-
- See Also:
- - :meth:`_preprocess_result`
- - :meth:`_process_result_output`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_on_failed`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- if self._item_processed:
- return
-
- self._preprocess_result(result)
- status = "ignored" if ignore_errors else "failed"
- color = C.COLOR_SKIP if ignore_errors else C.COLOR_ERROR
- task_result = self._process_result_output(result, status, symbol("failure"))
- self.display(task_result, color)
-
- def v2_runner_on_unreachable(self, result):
- """When a host becames *unreachable* before the execution of its task,
- this method will display information about the unreachability.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
-
- See Also:
- - :meth:`_preprocess_result`
- - :meth:`_process_result_output`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_on_unreachable`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self._flush_display_buffer()
- task_result = self._process_result_output(result, "unreachable", symbol("dead"))
- self.display(task_result, C.COLOR_UNREACHABLE)
-
- def v2_runner_item_on_ok(self, result):
- """Displays the result of an item task run.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
-
- See Also:
- - :meth:`_preprocess_result`
- - :meth:`changed_artifacts`
- - :meth:`_process_item_result_output`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_on_ok`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self._preprocess_result(result)
- status, display_color = CallbackModule.changed_artifacts(
- result, "ok", C.COLOR_OK
- )
- task_result = self._process_item_result_output(
- result, status, symbol("success")
- )
- self.display(task_result, display_color)
-
- def v2_runner_item_on_skipped(self, result):
- """If the you configured Ansible to display skipped hosts, this method
- will display a task item and information that it was skipped.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
-
- See Also:
- - :meth:`_preprocess_result`
- - :meth:`_process_item_result_output`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_on_skipped`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- if C.DISPLAY_SKIPPED_HOSTS:
- self._preprocess_result(result)
- task_result = self._process_item_result_output(
- result, "skipped", symbol("skip")
- )
- self.display(task_result, C.COLOR_SKIP)
- else:
- self.outlines = []
-
- def v2_runner_item_on_failed(self, result):
- """When an intem on a task fails, this method is called to display
- information about the failure.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
-
- See Also:
- - :meth:`_preprocess_result`
- - :meth:`_process_item_result_output`
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_runner_item_on_failed`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self._flush_display_buffer()
- task_result = self._process_item_result_output(
- result, "failed", symbol("failure")
- )
- self.display(task_result, C.COLOR_ERROR)
-
- def v2_playbook_on_stats(self, stats):
- """When the execution of a playbook finishes, this method is called to
- display an execution summary.
-
- It also displays an aggregate total for all executions.
-
- Note:
- Overrides the
- :meth:`~ansible.plugins.callback.CallbackBase.v2_playbook_on_stats`
- method from the :class:`~ansible.plugins.callback.CallbackBase`
- class.
- """
- self.display(to_text("{0}\n\n").format("-" * 80))
- totals = {
- "ok": 0,
- "changed": 0,
- "unreachable": 0,
- "failures": 0,
- "rescued": 0,
- "ignored": 0,
- }
-
- self._display_summary_table_row(
- ("Hosts", C.COLOR_VERBOSE, 30),
- ("Success", C.COLOR_VERBOSE, 7),
- ("Changed", C.COLOR_VERBOSE, 7),
- ("Dark", C.COLOR_VERBOSE, 7),
- ("Failed", C.COLOR_VERBOSE, 7),
- ("Rescued", C.COLOR_VERBOSE, 7),
- ("Ignored", C.COLOR_VERBOSE, 7),
- )
- self._display_summary_table_separator("=")
-
- hosts = sorted(stats.processed.keys())
- for host_name in hosts:
- host_summary = stats.summarize(host_name)
- dictsum(totals, host_summary)
- self._display_summary_table_row(
- (host_name, C.COLOR_HIGHLIGHT, 30),
- (host_summary["ok"], C.COLOR_OK, 7),
- (host_summary["changed"], C.COLOR_CHANGED, 7),
- (host_summary["unreachable"], C.COLOR_UNREACHABLE, 7),
- (host_summary["failures"], C.COLOR_ERROR, 7),
- (host_summary["rescued"], C.COLOR_OK, 7),
- (host_summary["ignored"], C.COLOR_WARN, 7),
- )
-
- self._display_summary_table_separator("-")
- self._display_summary_table_row(
- ("Totals", C.COLOR_VERBOSE, 30),
- (totals["ok"], C.COLOR_OK, 7),
- (totals["changed"], C.COLOR_CHANGED, 7),
- (totals["unreachable"], C.COLOR_UNREACHABLE, 7),
- (totals["failures"], C.COLOR_ERROR, 7),
- (totals["rescued"], C.COLOR_OK, 7),
- (totals["ignored"], C.COLOR_WARN, 7),
- )
-
- def _handle_exception(self, result, use_stderr=False):
- """When an exception happen during the execution of a playbook, this
- method is called to display information about the crash.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
- use_stderr (bool, optional): Flag indicating if this exception
- should be printed using the ``stderr`` stream. Defaults to
- ``False``.
- """
- if "exception" in result:
- result["use_stderr"] = use_stderr
- msg = "An exception occurred during task execution. "
- if not self._is_run_verbose(verbosity=3):
- # extract just the actual error message from the exception text
-
- error = result["exception"].strip().split("\n")[-1]
- msg += "To see the full traceback, use -vvv. The error was: %s" % error
- elif "module_stderr" in result:
- if result["exception"] != result["module_stderr"]:
- msg = "The full traceback is:\n" + result["exception"]
- del result["exception"]
- result["stderr"] = msg
-
- def _is_run_verbose(self, result=None, verbosity=0):
- """Verify if the current run is verbose (should display information)
- respecting the given ``verbosity``.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult, optional):
- The task result to be considered when checking verbosity.
- Defaults to None.
- verbosity (int, optional): The verbosity level that this method
- will check against. Defaults to 0.
-
- Returns:
- bool: True if the display verbosity cresses the treshold defined by
- the argument ``verbosity``, False otherwise.
- """
- result = {} if not result else result._result
- return (
- self._display.verbosity >= verbosity or "_ansible_verbose_always" in result
- ) and "_ansible_verbose_override" not in result
-
- def _display_cli_arguments(self, indent=2):
- """Display all arguments passed to Ansible in the command line.
-
- Args:
- indent (int, optional): Number of spaces to indent the whole
- arguments block. Defaults to 2.
- """
- if context.CLIARGS.get("args"):
- self.display(
- to_text("{0}Positional arguments: {1}").format(
- " " * indent, ", ".join(context.CLIARGS["args"])
- ),
- color=C.COLOR_VERBOSE,
- )
-
- for arg, val in {
- key: value
- for key, value in context.CLIARGS.items()
- if key != "args" and value
- }.items():
- if iscollection(val):
- self.display(to_text("{0}{1}:").format(" " * indent, arg), color=C.COLOR_VERBOSE)
- for v in val:
- self.display(
- to_text("{0}- {1}").format(" " * (indent + 2), v), color=C.COLOR_VERBOSE
- )
- else:
- self.display(
- to_text("{0}{1}: {2}").format(" " * indent, arg, val), color=C.COLOR_VERBOSE
- )
-
- def _get_tags(self, playbook):
- """Returns a collection of tags that will be associated with all tasks
- runnin during this session.
-
- This means that it will collect all the tags available in the giving
- ``playbook``, and filter against the tags passed to Ansible in the
- command line.
-
- Args:
- playbook (:obj:`~ansible.playbook.Playbook`): The playbook where to
- look for tags.
-
- Returns:
- :obj:`list` of :obj:`str`: A sorted list of all tags used in this
- run.
- """
- tags = set()
- for play in playbook.get_plays():
- for block in play.compile():
- blocks = block.filter_tagged_tasks({})
- if blocks.has_tasks():
- for task in blocks.block:
- tags.update(task.tags)
- if "tags" in context.CLIARGS:
- requested_tags = set(context.CLIARGS["tags"])
- else:
- requested_tags = {"all"}
- if len(requested_tags) > 1 or next(iter(requested_tags)) != "all":
- tags = tags.intersection(requested_tags)
- return sorted(tags)
-
- def _display_tag_strip(self, playbook, width=80):
- """Displays a line of tags present in the given ``playbook``
- intersected with the tags given to Ansible in the command line.
-
- If the line is bigger than ``width`` characters, it will wrap the tag
- line before it cross the treshold.
-
- To make the tag line be more aesthetic pleasant, it will be displayed
- with a blank line before and after each line used.
-
- Args:
- playbook (:obj:`~ansible.playbook.Playbook`): The playbook where to
- look for tags.
- width (int): How many characters can be used in a single line.
- Defaults to 80.
- """
- tags = self._get_tags(playbook)
- tag_strings = ""
- total_len = 0
- first_item = True
- for tag in sorted(tags):
- if not first_item:
- if total_len + len(tag) + 5 > width:
- tag_strings += to_text("\n\n {0} {1} {2} {3}").format(
- "\x1b[6;30;47m", symbol("flag"), tag, "\x1b[0m"
- )
- total_len = len(tag) + 6
- first_item = True
- else:
- tag_strings += to_text(" {0} {1} {2} {3}").format(
- "\x1b[6;30;47m", symbol("flag"), tag, "\x1b[0m"
- )
- total_len += len(tag) + 5
- else:
- first_item = False
- tag_strings += to_text(" {0} {1} {2} {3}").format(
- "\x1b[6;30;47m", symbol("flag"), tag, "\x1b[0m"
- )
- total_len = len(tag) + 6
- self.display("\n")
- self.display(tag_strings)
-
- def _get_task_display_name(self, task):
- """Caches the giving ``task`` name if it is not an include task.
-
- Args:
- task (:obj:`~ansible.playbook.task.Task`): The task object that
- will be analyzed.
- """
- self.task_display_name = None
- display_name = task.get_name().strip().split(" : ")
-
- task_display_name = display_name[-1]
- if task_display_name.startswith("include"):
- return
- else:
- self.task_display_name = task_display_name
-
- def _preprocess_result(self, result):
- """Check the result object for errors or warning. It also make sure
- that the task title buffer is flushed and displayed to the user.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
-
- See Also:
- - :meth:`_flush_display_buffer`
- - :meth:`_handle_exception`
- - :meth:`_handle_warnings`
- """
- self.delegated_vars = result._result.get("_ansible_delegated_vars", None)
- self._flush_display_buffer()
- self._handle_exception(result._result)
- self._handle_warnings(result._result)
-
- def _get_host_string(self, result, prefix=""):
- """Retrieve the host from the giving ``result``.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
- prefix (:obj:`str`, optional): A prefix added to the host name.
- Defaults to "".
-
- Returns:
- A formatted version of the host that generated the ``result``.
- """
- task_host = to_text("{0}{1}").format(prefix, result._host.get_name())
- if self.delegated_vars:
- task_host += to_text(" {0} {1}{2}").format(
- symbol("arrow_right"), prefix, self.delegated_vars["ansible_host"]
- )
- return task_host
-
- def _process_result_output(self, result, status, symbol_char="", indent=2):
- """Returns the result converted to string.
-
- Each key in the ``result._result`` is considered a session for the
- purpose of this method. All sessions have their content indented related
- to the session title.
-
- If a session verbosity (found on the :const:`_session_order` dictionary)
- doesnot cross the treshold for this playbook, it will not be shown.
-
- This method also converts all session titles that are present in the
- :const:`` dictionary, to their string representation. The rest of the
- titles are simply capitalized for aestetics purpose.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
- status (:obj:`str`): The status representing this ourput (e.g. "ok",
- "changed", "failed").
- symbol_char (:obj:`str`, optional): An UTF-8 character to be used as
- a symbol_char in the beginning of the output. Defaults to "".
- indent (int, optional): How many character the text generated from
- the ``result`` should be indended to. Defaults to 2.
-
- Returns:
- :obj:`str`: A formated version of the giving ``result``.
- """
- task_host = self._get_host_string(result)
-
- task_result = to_text("{0}{1}{2} [{3}]").format(
- " " * indent,
- symbol_char + " " if symbol_char else "",
- task_host,
- status.upper(),
- )
-
- for key, verbosity in _session_order.items():
- if (
- key in result._result
- and result._result[key]
- and self._is_run_verbose(result, verbosity)
- ):
- task_result += self.reindent_session(
- _session_title.get(key, key), result._result[key], indent + 2
- )
-
- for title, text in result._result.items():
- if title not in _session_title and text and self._is_run_verbose(result, 2):
- task_result += self.reindent_session(
- title.replace("_", " ").replace(".", " ").capitalize(),
- text,
- indent + 2,
- )
-
- return task_result
-
- def _process_item_result_output(self, result, status, symbol_char="", indent=2):
- """Displays the given ``result`` of an item task.
-
- This method is a simplified version of the
- :meth:`_process_result_output` method where no sessions are printed.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
- status (:obj:`str`): The status representing this ourput (e.g. "ok",
- "changed", "failed").
- symbol_char (:obj:`str`, optional): An UTF-8 character to be used as
- a symbol_char in the beginning of the output. Defaults to "".
- indent (int, optional): How many character the text generated from
- the ``result`` should be indended to. Defaults to 2.
-
- Returns:
- :obj:`str`: A formated version of the giving ``result``.
- """
- if not self._item_processed:
- self._item_processed = True
- self.display(to_text("{0}{1} Items:").format(" " * indent, symbol("loop")))
-
- item_name = self._get_item_label(result._result)
- if isinstance(item_name, dict):
- if "name" in item_name:
- item_name = item_name.get("name")
- elif "path" in item_name:
- item_name = item_name.get("path")
- else:
- item_name = u'JSON: "{0}"'.format(
- stringtruncate(
- json.dumps(item_name, separators=(",", ":")), width=36
- )
- )
- task_host = self._get_host_string(result, "@")
- task_result = to_text("{0}{1} {2} ({3}) [{4}]").format(
- " " * (indent + 2), symbol_char, item_name, task_host, status.upper()
- )
- return task_result
-
- def _display_summary_table_separator(self, symbol_char):
- """Displays a line separating header or footer from content on the
- summary table.
-
- Args:
- symbol_char (:obj:`str`): The character to be used as the separator.
- """
- self.display(
- to_text(" {0} {1} {2} {3} {4} {5} {6}").format(
- symbol_char * 30,
- symbol_char * 7,
- symbol_char * 7,
- symbol_char * 7,
- symbol_char * 7,
- symbol_char * 7,
- symbol_char * 7,
- )
- )
-
- def _display_summary_table_row(
- self, host, success, changed, dark, failed, rescued, ignored
- ):
- """Displays a single line in the summary table, respecting the color and
- size given in the arguments.
-
- Each argument in this method is a tuple of three values:
-
- - The text;
- - The color;
- - The width;
-
- Args:
- host (:obj:`tuple` of :obj:`str`, :obj:`str`, int): Which host this
- row is representing.
- success (:obj:`tuple` of :obj:`str`, :obj:`str`, int): How many
- tasks were run successfully.
- changed (:obj:`tuple` of :obj:`str`, :obj:`str`, int): How many
- values were changed due to the execution of the task.
- dark (:obj:`tuple` of :obj:`str`, :obj:`str`, int): How many hosts
- were not reachable during the execution of this playbook.
- failed (:obj:`tuple` of :obj:`str`, :obj:`str`, int): How many tasks
- failed during their execution.
- rescued (:obj:`tuple` of :obj:`str`, :obj:`str`, int): How manu
- tasks where recover from a failure and were able to complete
- successfully.
- ignored (:obj:`tuple` of :obj:`str`, :obj:`str`, int): How many
- tasks were ignored.
- """
- self.display(
- to_text(" {0} {1} {2} {3} {4} {5} {6}").format(
- stringtruncate(host[0], host[1], host[2]),
- stringtruncate(success[0], success[1], success[2]),
- stringtruncate(changed[0], changed[1], changed[2]),
- stringtruncate(dark[0], dark[1], dark[2]),
- stringtruncate(failed[0], failed[1], failed[2]),
- stringtruncate(rescued[0], rescued[1], rescued[2]),
- stringtruncate(ignored[0], ignored[1], ignored[2]),
- )
- )
-
- def _display_task_decision_score(self, task):
- """Calculate the probability for the giving ``task`` to be displayed
- based on configurations and the task ``when`` clause.
-
- Args:
- task (:obj:`~ansible.playbook.task.Task`): The task object that
- will be analyzed.
-
- Returns:
- :obj:`Number`: A number between 0 and 1 representing the
- probability to show the giving ``task``. Currently this method
- only return 3 possible values:
-
- :0.0:
- When we are sure that the task should **not** be displayed.
- This means that we were able to process the ``when`` clause and
- it returned ``False``, or this ``task`` is a debug task and its
- verbosity does **not** cross the trashold for our playbook.
- :1.0:
- When we are sure the ``task`` should be displayed. This means
- that we were able to process the ``when`` clause and it returned
- ``True``, or this ``task`` is a debug task and its verbosity
- does cross the trashold for our playbook.
- :0.5:
- When we don't know if this task should be displayed or not. By
- default, we associate any ``task`` with this score, and change
- it if one of the conditions for the other scores are met.
- """
- score = 0.5
- var_manager = task.get_variable_manager()
- task_args = task.args
- if task.when and var_manager:
- all_hosts = CallbackModule.get_chainned_value(
- var_manager.get_vars(), "hostvars"
- )
- play_task_vars = var_manager.get_vars(
- play=self._current_play, host=self._current_host, task=task
- )
- templar = Templar(task._loader, variables=play_task_vars)
- exception = False
- for hostname in all_hosts.keys():
- host_vars = CallbackModule.get_chainned_value(all_hosts, hostname)
- host_vars.update(play_task_vars)
- try:
- if not task.evaluate_conditional(templar, host_vars):
- score = 0.0
- break
- except Exception as e:
- exception = True
- else:
- if not exception:
- score = 1.0
- elif task.action == "debug" and task_args and "verbosity" in task_args:
- score = (
- 1.0
- if self._is_run_verbose(verbosity=int(task_args["verbosity"]))
- else 0.0
- )
- return score
-
- def _display_task_name(self, task, is_handler=False):
- """Displays the giving ``task`` title.
-
- In reality, this method may or may not display the title based on some
- factors:
-
- If the :file:`ansible.cfg` has the ``display_skipped_hosts`` option set
- to ``True``, or if either of the environment variables
- (``ANSIBLE_DISPLAY_SKIPPED_HOSTS``, and ``DISPLAY_SKIPPED_HOSTS``) are
- set, the ``task`` title is displayed as soon as this method is called.
-
- Otherwise, this method will *cache* the ``task`` title until the
- :meth:`_flush_display_buffer` is called.
-
- Args:
- task (:obj:`~ansible.playbook.task.Task`): The task object that
- will be displayed in the console.
- is_handler (bool, optional): Flag indicating if this task is being
- handled by a different host. Defaults to False.
-
- See Also:
- - :meth:`_get_task_display_name`
- - :meth:`_display_task_decision_score`
- - :meth:`_flush_display_buffer`
- """
- self._item_processed = False
- self._get_task_display_name(task)
-
- if self.task_display_name:
- self._task_name_buffer = (
- self.task_display_name
- if not is_handler
- else "%s (via handler)..." % self.task_display_name
- )
-
- display_score = self._display_task_decision_score(task)
- if display_score >= 1.0 or C.DISPLAY_SKIPPED_HOSTS:
- self._flush_display_buffer()
- elif display_score < 0.1:
- self._task_name_buffer = None
-
- def _flush_display_buffer(self):
- """Display a task title if there is one to display.
- """
- if self._task_name_buffer:
- self.display(self._task_name_buffer)
- self._task_name_buffer = None
-
- @staticmethod
- def try_parse_string(text):
- """This method will try to parse the giving ``text`` using a JSON and
- a YAML parser in order to return a dictionary representing this parsed
- structure.
-
- Args:
- text (:obj:`str`): A text that may or may not be a JSON or YAML
- content.
-
- Returns:
- Returns the parser object from ``text``. If the giving ``text`` was
- not a JSON or YAML content, ``None`` will be returned.
- """
- textobj = None
-
- try:
- textobj = json.loads(text)
- except Exception as e:
- try:
- textobj = yaml.load(text, Loader=yaml.SafeLoader)
- except Exception:
- pass
-
- return textobj
-
- @staticmethod
- def dump_value(value):
- """Given a string, this method will parse the giving string and return
- the parsed object converted to a YAML representation.
-
- Args:
- value (:obj:`str`): A string to be parsed.
-
- Returns:
- :obj:`str`: The YAML representation of the object parsed from the
- giving ``value``.
- """
- text = None
- obj = CallbackModule.try_parse_string(value)
- if obj:
- text = yaml.dump(obj, Dumper=yaml.SafeDumper, default_flow_style=False)
- return text
-
- @staticmethod
- def reindent_session(title, text, indent=2, width=80):
- """This method returns a text formatted with the giving ``indent`` and
- wrapped at the giving ``width``.
-
- Args:
- title (:obj:`str`): The left most indented text.
- text (:obj:`str`): The rest of the text that will be indented two
- characters to the left of the ``title`` indentation.
- indent (int): Number of spaces used to indent the whole block.
- Defaults to 2.
- width (int, optional): How many characters are allowed to be used
- on a single line for this text block. Defaults to 80.
-
- Returns:
- :obj:`str`: The formatted text.
- """
- titleindent = " " * indent
- textindent = " " * (indent + 2)
- textwidth = width - (indent + len(title) + 2)
- textstr = str(text).strip()
- dumped = False
- if textstr.startswith("---") or textstr.startswith("{"):
- dumped = CallbackModule.dump_value(textstr)
- textstr = dumped if dumped else textstr
- output = to_text("\n{0}{1}:").format(titleindent, title)
- lines = textstr.splitlines()
-
- if (len(lines) == 1) and (len(textstr) <= textwidth) and (not dumped):
- output += " %s" % textstr
- else:
- for line in lines:
- output += "\n%s" % textwrap.fill(
- text=line,
- width=width,
- initial_indent=textindent,
- subsequent_indent=textindent,
- )
- return output
-
- @staticmethod
- def changed_artifacts(result, status, display_color):
- """Detect if the given ``result`` did change anything during its
- execution and return the proper status and display color for it.
-
- Args:
- result (:obj:`~ansible.executor.task_result.TaskResult`): The result
- object representing the execution of a task.
- status (:obj:`str`): A string representing the current status of
- the giving ``result``.
- display_color (:obj:`str`): A string representing the current status
- color of the giving ``result``.
-
- Returns:
- :obj:`tuple` of :obj:`str`, :obj:`str`: The return value depends on
- the giving ``result`` object. If this method detects the ``changed``
- flag in the ``result`` object, it returns::
-
- ("changed", "yellow")
-
- Otherwise, the values passed in the ``status`` and ``display_color``
- arguments will be used::
-
- (status, display_color)
- """
- result_was_changed = "changed" in result._result and result._result["changed"]
- if result_was_changed:
- return "changed", C.COLOR_CHANGED
- return status, display_color
-
- @staticmethod
- def get_chainned_value(mapping, *args):
- """Returns a value from a dictionary.
-
- It can return chainned values based on a list of keys giving by the
- ``args`` argument.
-
- Example:
- >>> crazy_dict = {
- ... "a_key": "a_value",
- ... "dict_key": {
- ... "other_key": "other_value",
- ... "other_dict_key": {
- ... "target_value": "Found It!"
- ... }
- ... }
- ... }
- >>> CallbackModule.get_chainned_value(crazy_dict, "dict_key", "other_dict_key", "target_value")
- 'Found It!'
-
- Args:
- mapping (:obj:`dict`): The dictionary used to fetch a value using
- chainned calls.
- *args: A list of keys to use to retrieve the deep value in the
- giving dictionary.
-
- Returns:
- Returns any value that matches the chain of keys passed in the
- ``args`` argument. If this value is a dictionary of some sort, the
- values of this dictionary will be shallowed copied to the returned
- dictionary.
- """
- if args:
- key = args[0]
- others = args[1:]
-
- if key in mapping:
- value = mapping[key]
- if others:
- return CallbackModule.get_chainned_value(value, *others)
- if isinstance(value, Mapping):
- dict_value = {}
- dict_value.update(value)
- return dict_value
- return value
- return None
diff --git a/roles/bash/files/.bashrc b/dot_bashrc
similarity index 64%
rename from roles/bash/files/.bashrc
rename to dot_bashrc
index 6a11c23..e857dee 100644
--- a/roles/bash/files/.bashrc
+++ b/dot_bashrc
@@ -23,20 +23,22 @@ function ya() {
## Aliases
# Replace ls with eza
-alias ls='eza -al --color=always --group-directories-first' # preferred listing
-alias la='eza -a --color=always --group-directories-first' # all files and dirs
-alias ll='eza -l --color=always --group-directories-first' # long format
-alias lt='eza -aT --color=always --group-directories-first' # tree listing
-alias l.='eza -ald --color=always --group-directories-first .*' # show only dotfiles
+if [ -f /usr/bin/eza ]; then
+ alias ls='eza -al --color=always --group-directories-first --icons=auto' # preferred listing
+ alias la='eza -a --color=always --group-directories-first --icons=auto' # all files and dirs
+ alias ll='eza -l --color=always --group-directories-first --icons=auto' # long format
+ alias lt='eza -aT --color=always --group-directories-first --icons=auto' # tree listing
+ alias l.='eza -ald --color=always --group-directories-first --icons=auto .*' # show only dotfiles
+fi
# Replace cat with bat
if [ -f /usr/bin/bat ]; then
alias cat='bat --style header --style snip --style changes --style header'
fi
-# Replace yay with paru
-if [ -f /usr/bin/paru ]; then
- alias yay='paru'
+# Replace paru with yay
+if [ -f /usr/bin/yay ]; then
+ alias paru='yay'
fi
# Aliases
@@ -56,12 +58,14 @@ alias rmpkg="sudo pacman -Rdd"
alias tarnow='tar -acf '
alias untar='tar -zxvf '
alias wget='wget -c '
-
# Cleanup orphaned packages
alias cleanup='sudo pacman -Rns `pacman -Qtdq`'
-
# Get the error messages from journalctl
alias jctl="journalctl -p 3 -xb"
-
# Recent installed packages
-alias rip="expac --timefmt='%Y-%m-%d %T' '%l\t%n %v' | sort | tail -200 | nl"
+alias ripp="expac --timefmt='%Y-%m-%d %T' '%l\t%n %v' | sort | tail -200 | nl"
+
+
+if [ -f /usr/bin/fastfetch ]; then
+ fastfetch
+fi
diff --git a/roles/fish/files/config.fish b/dot_config/fish/config.fish
similarity index 94%
rename from roles/fish/files/config.fish
rename to dot_config/fish/config.fish
index 94930c9..709bfbf 100644
--- a/roles/fish/files/config.fish
+++ b/dot_config/fish/config.fish
@@ -21,7 +21,7 @@ if test -d ~/.local/bin
end
end
-# Add ~/go/bin to PATH
+# Add ~/go to PATH
if test -d ~/go/bin
if not contains -- ~/go/bin $PATH
set -p PATH ~/go/bin
@@ -29,10 +29,6 @@ if test -d ~/go/bin
end
## Plugin configuration
-# Set settings for https://github.com/franciscolourenco/done
-set -U __done_min_cmd_duration 10000
-set -U __done_notification_urgency_level low
-
# Starship prompt
if type -q starship && status --is-interactive
starship init fish | source
@@ -141,11 +137,11 @@ end
## Aliases
# Replace ls with eza
if type -q eza
- alias ls='eza -al --color=always --group-directories-first --icons' # preferred listing
- alias la='eza -a --color=always --group-directories-first --icons' # all files and dirs
- alias ll='eza -l --color=always --group-directories-first --icons' # long format
- alias lt='eza -aT --color=always --group-directories-first --icons' # tree listing
- alias l.='eza -ald --color=always --group-directories-first --icons .*' # show only dotfiles
+ alias ls='eza -al --color=always --group-directories-first --icons=auto' # preferred listing
+ alias la='eza -a --color=always --group-directories-first --icons=auto' # all files and dirs
+ alias ll='eza -l --color=always --group-directories-first --icons=auto' # long format
+ alias lt='eza -aT --color=always --group-directories-first --icons=auto' # tree listing
+ alias l.='eza -ald --color=always --group-directories-first --icons=auto .*' # show only dotfiles
end
# Replace cat with bat
diff --git a/dot_config/hypr/dms/binds-user.lua b/dot_config/hypr/dms/binds-user.lua
new file mode 100644
index 0000000..cbad4c9
--- /dev/null
+++ b/dot_config/hypr/dms/binds-user.lua
@@ -0,0 +1,38 @@
+-- DMS user keybind overrides (edit via Control Center or dms; do not remove this header)
+
+hl.unbind("CTRL + SHIFT + Escape")
+hl.bind("CTRL + SHIFT + Escape", hl.dsp.exec_cmd("dms ipc call processlist focusOrToggle"), { description = "dms ipc call processlist focusOrToggle" })
+hl.unbind("SUPER + CTRL + S")
+hl.bind("SUPER + CTRL + S", hl.dsp.exec_cmd("dms ipc call quickCapture screenshot window edit"), { description = "screenshot window" })
+hl.unbind("SUPER + I")
+hl.bind("SUPER + I", hl.dsp.exec_cmd("dms ipc notifications toggle"), { description = "notification toggle" })
+hl.unbind("SUPER + N")
+hl.bind("SUPER + N", hl.dsp.exec_cmd("dms ipc call notepad toggle"), { description = "dms ipc call notepad toggle" })
+hl.unbind("SUPER + O")
+hl.bind("SUPER + O", hl.dsp.exec_cmd("dms ipc call lock lock"), { description = "dms ipc call lock lock" })
+hl.unbind("SUPER + SHIFT + B")
+hl.bind("SUPER + SHIFT + B", hl.dsp.exec_cmd("dms ipc call mpris previous"), { locked = true, description = "dms ipc call mpris previous" })
+hl.unbind("SUPER + SHIFT + N")
+hl.bind("SUPER + SHIFT + N", hl.dsp.exec_cmd("dms ipc call mpris next"), { locked = true, description = "dms ipc call mpris next" })
+hl.unbind("SUPER + SHIFT + P")
+hl.bind("SUPER + SHIFT + P", hl.dsp.exec_cmd("dms ipc call mpris playPause"), { locked = true, description = "dms ipc call mpris playPause" })
+hl.unbind("SUPER + SHIFT + S")
+hl.bind("SUPER + SHIFT + S", hl.dsp.exec_cmd("dms ipc call quickCapture screenshot region edit"), { description = "screenshot region" })
+hl.unbind("SUPER + SHIFT + T")
+hl.bind("SUPER + SHIFT + T", hl.dsp.exec_cmd("dms ipc call timer toggle"), { description = "timer toggle" })
+hl.unbind("SUPER + B")
+hl.bind("SUPER + B", hl.dsp.exec_cmd("brave"))
+hl.unbind("SUPER + E")
+hl.bind("SUPER + E", hl.dsp.exec_cmd("thunar"))
+hl.unbind("SUPER + SHIFT + O")
+hl.bind("SUPER + SHIFT + O", hl.dsp.dpms({ action = "toggle" }), { description = "dpms toggle" })
+hl.unbind("CTRL + ALT + Delete")
+hl.unbind("CTRL + SHIFT + T")
+hl.unbind("SUPER + C")
+hl.bind("SUPER + C", hl.dsp.window.close(), { description = "Close window" })
+hl.unbind("SUPER + CTRL + F")
+hl.unbind("SUPER + F")
+hl.bind("SUPER + F", hl.dsp.window.float({ action = "toggle" }), { description = "Float/unfloat window" })
+hl.unbind("SUPER + M")
+hl.bind("SUPER + M", hl.dsp.window.fullscreen({ mode = "maximized", action = "toggle" }), { description = "Toggle maximization" })
+hl.unbind("SUPER + Q")
diff --git a/dot_config/hypr/dms/binds.lua b/dot_config/hypr/dms/binds.lua
new file mode 100644
index 0000000..958d882
--- /dev/null
+++ b/dot_config/hypr/dms/binds.lua
@@ -0,0 +1,171 @@
+-- DMS default keybinds (Hyprland 0.55+ Lua)
+
+-- === Application Launchers ===
+hl.bind("SUPER + T", hl.dsp.exec_cmd("ghostty"))
+hl.bind("SUPER + space", hl.dsp.exec_cmd("dms ipc call spotlight toggle"))
+hl.bind("ALT + space", hl.dsp.exec_cmd("dms ipc call spotlight-bar toggle"))
+hl.bind("SUPER + V", hl.dsp.exec_cmd("dms ipc call clipboard toggle"))
+hl.bind("SUPER + M", hl.dsp.exec_cmd("dms ipc call processlist focusOrToggle"))
+hl.bind("SUPER + comma", hl.dsp.exec_cmd("dms ipc call settings focusOrToggle"))
+hl.bind("SUPER + N", hl.dsp.exec_cmd("dms ipc call notifications toggle"))
+hl.bind("SUPER + SHIFT + N", hl.dsp.exec_cmd("dms ipc call notepad toggle"))
+hl.bind("SUPER + Y", hl.dsp.exec_cmd("dms ipc call dash toggle wallpaper"))
+hl.bind("SUPER + TAB", hl.dsp.exec_cmd("dms ipc call hypr toggleOverview"))
+hl.bind("SUPER + O", hl.dsp.exec_cmd("dms ipc call hypr toggleOverview"))
+hl.bind("SUPER + X", hl.dsp.exec_cmd("dms ipc call powermenu toggle"))
+
+-- === Cheat sheet
+hl.bind("SUPER + SHIFT + Slash", hl.dsp.exec_cmd("dms ipc call keybinds toggle hyprland"))
+
+-- === Security ===
+hl.bind("SUPER + ALT + L", hl.dsp.exec_cmd("dms ipc call lock lock"))
+hl.bind("SUPER + SHIFT + E", hl.dsp.exit())
+hl.bind("CTRL + ALT + Delete", hl.dsp.exec_cmd("dms ipc call processlist focusOrToggle"))
+
+-- === Audio Controls ===
+hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("dms ipc call audio increment 3"), { locked = true, repeating = true })
+hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("dms ipc call audio decrement 3"), { locked = true, repeating = true })
+hl.bind("XF86AudioMute", hl.dsp.exec_cmd("dms ipc call audio mute"), { locked = true })
+hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("dms ipc call audio micmute"), { locked = true })
+hl.bind("XF86AudioPause", hl.dsp.exec_cmd("dms ipc call mpris playPause"), { locked = true })
+hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("dms ipc call mpris playPause"), { locked = true })
+hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("dms ipc call mpris previous"), { locked = true })
+hl.bind("XF86AudioNext", hl.dsp.exec_cmd("dms ipc call mpris next"), { locked = true })
+hl.bind("CTRL + XF86AudioRaiseVolume", hl.dsp.exec_cmd("dms ipc call mpris increment 3"), { locked = true, repeating = true })
+hl.bind("CTRL + XF86AudioLowerVolume", hl.dsp.exec_cmd("dms ipc call mpris decrement 3"), { locked = true, repeating = true })
+
+-- === Brightness Controls ===
+hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd([[dms ipc call brightness increment 5 ""]]), { locked = true, repeating = true })
+hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd([[dms ipc call brightness decrement 5 ""]]), { locked = true, repeating = true })
+
+-- === Window Management ===
+hl.bind("SUPER + Q", hl.dsp.window.close())
+hl.bind("SUPER + F", hl.dsp.window.fullscreen({ mode = "maximized", action = "toggle" }))
+hl.bind("SUPER + SHIFT + F", hl.dsp.window.fullscreen({ mode = "fullscreen", action = "toggle" }))
+hl.bind("SUPER + SHIFT + T", hl.dsp.window.float({ action = "toggle" }))
+hl.bind("SUPER + W", hl.dsp.group.toggle())
+hl.bind("SUPER + SHIFT + W", hl.dsp.exec_cmd("dms ipc call window-rules toggle"))
+
+-- === Focus Navigation ===
+hl.bind("SUPER + left", hl.dsp.focus({ direction = "l" }))
+hl.bind("SUPER + down", hl.dsp.focus({ direction = "d" }))
+hl.bind("SUPER + up", hl.dsp.focus({ direction = "u" }))
+hl.bind("SUPER + right", hl.dsp.focus({ direction = "r" }))
+hl.bind("SUPER + H", hl.dsp.focus({ direction = "l" }))
+hl.bind("SUPER + J", hl.dsp.focus({ direction = "d" }))
+hl.bind("SUPER + K", hl.dsp.focus({ direction = "u" }))
+hl.bind("SUPER + L", hl.dsp.focus({ direction = "r" }))
+
+-- === Window Movement ===
+hl.bind("SUPER + SHIFT + left", hl.dsp.window.move({ direction = "l" }))
+hl.bind("SUPER + SHIFT + down", hl.dsp.window.move({ direction = "d" }))
+hl.bind("SUPER + SHIFT + up", hl.dsp.window.move({ direction = "u" }))
+hl.bind("SUPER + SHIFT + right", hl.dsp.window.move({ direction = "r" }))
+hl.bind("SUPER + SHIFT + H", hl.dsp.window.move({ direction = "l" }))
+hl.bind("SUPER + SHIFT + J", hl.dsp.window.move({ direction = "d" }))
+hl.bind("SUPER + SHIFT + K", hl.dsp.window.move({ direction = "u" }))
+hl.bind("SUPER + SHIFT + L", hl.dsp.window.move({ direction = "r" }))
+
+-- === Column Navigation ===
+hl.bind("SUPER + Home", hl.dsp.focus({ window = "first" }))
+hl.bind("SUPER + End", hl.dsp.focus({ window = "last" }))
+
+-- === Monitor Navigation ===
+hl.bind("SUPER + CTRL + left", hl.dsp.focus({ monitor = "l" }))
+hl.bind("SUPER + CTRL + right", hl.dsp.focus({ monitor = "r" }))
+hl.bind("SUPER + CTRL + H", hl.dsp.focus({ monitor = "l" }))
+hl.bind("SUPER + CTRL + J", hl.dsp.focus({ monitor = "d" }))
+hl.bind("SUPER + CTRL + K", hl.dsp.focus({ monitor = "u" }))
+hl.bind("SUPER + CTRL + L", hl.dsp.focus({ monitor = "r" }))
+
+-- === Move to Monitor ===
+hl.bind("SUPER + SHIFT + CTRL + left", hl.dsp.window.move({ monitor = "l" }))
+hl.bind("SUPER + SHIFT + CTRL + down", hl.dsp.window.move({ monitor = "d" }))
+hl.bind("SUPER + SHIFT + CTRL + up", hl.dsp.window.move({ monitor = "u" }))
+hl.bind("SUPER + SHIFT + CTRL + right", hl.dsp.window.move({ monitor = "r" }))
+hl.bind("SUPER + SHIFT + CTRL + H", hl.dsp.window.move({ monitor = "l" }))
+hl.bind("SUPER + SHIFT + CTRL + J", hl.dsp.window.move({ monitor = "d" }))
+hl.bind("SUPER + SHIFT + CTRL + K", hl.dsp.window.move({ monitor = "u" }))
+hl.bind("SUPER + SHIFT + CTRL + L", hl.dsp.window.move({ monitor = "r" }))
+
+-- === Workspace Navigation ===
+hl.bind("SUPER + Page_Down", hl.dsp.focus({ workspace = "e+1" }))
+hl.bind("SUPER + Page_Up", hl.dsp.focus({ workspace = "e-1" }))
+hl.bind("SUPER + U", hl.dsp.focus({ workspace = "e+1" }))
+hl.bind("SUPER + I", hl.dsp.focus({ workspace = "e-1" }))
+hl.bind("SUPER + CTRL + down", hl.dsp.window.move({ workspace = "e+1" }))
+hl.bind("SUPER + CTRL + up", hl.dsp.window.move({ workspace = "e-1" }))
+hl.bind("SUPER + CTRL + U", hl.dsp.window.move({ workspace = "e+1" }))
+hl.bind("SUPER + CTRL + I", hl.dsp.window.move({ workspace = "e-1" }))
+
+-- === Workspace Management ===
+hl.bind("CTRL + SHIFT + R", hl.dsp.exec_cmd("dms ipc call workspace-rename open"))
+
+-- === Move Workspaces ===
+hl.bind("SUPER + SHIFT + Page_Down", hl.dsp.window.move({ workspace = "e+1" }))
+hl.bind("SUPER + SHIFT + Page_Up", hl.dsp.window.move({ workspace = "e-1" }))
+hl.bind("SUPER + SHIFT + U", hl.dsp.window.move({ workspace = "e+1" }))
+hl.bind("SUPER + SHIFT + I", hl.dsp.window.move({ workspace = "e-1" }))
+
+-- === Mouse Wheel Navigation ===
+hl.bind("SUPER + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
+hl.bind("SUPER + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
+hl.bind("SUPER + CTRL + mouse_down", hl.dsp.window.move({ workspace = "e+1" }))
+hl.bind("SUPER + CTRL + mouse_up", hl.dsp.window.move({ workspace = "e-1" }))
+
+-- === Touchpad Gestures ===
+hl.gesture({ fingers = 3, direction = "horizontal", action = "workspace" })
+
+-- === Numbered Workspaces ===
+hl.bind("SUPER + 1", hl.dsp.focus({ workspace = "1" }))
+hl.bind("SUPER + 2", hl.dsp.focus({ workspace = "2" }))
+hl.bind("SUPER + 3", hl.dsp.focus({ workspace = "3" }))
+hl.bind("SUPER + 4", hl.dsp.focus({ workspace = "4" }))
+hl.bind("SUPER + 5", hl.dsp.focus({ workspace = "5" }))
+hl.bind("SUPER + 6", hl.dsp.focus({ workspace = "6" }))
+hl.bind("SUPER + 7", hl.dsp.focus({ workspace = "7" }))
+hl.bind("SUPER + 8", hl.dsp.focus({ workspace = "8" }))
+hl.bind("SUPER + 9", hl.dsp.focus({ workspace = "9" }))
+
+-- === Move to Numbered Workspaces ===
+hl.bind("SUPER + SHIFT + 1", hl.dsp.window.move({ workspace = "1" }))
+hl.bind("SUPER + SHIFT + 2", hl.dsp.window.move({ workspace = "2" }))
+hl.bind("SUPER + SHIFT + 3", hl.dsp.window.move({ workspace = "3" }))
+hl.bind("SUPER + SHIFT + 4", hl.dsp.window.move({ workspace = "4" }))
+hl.bind("SUPER + SHIFT + 5", hl.dsp.window.move({ workspace = "5" }))
+hl.bind("SUPER + SHIFT + 6", hl.dsp.window.move({ workspace = "6" }))
+hl.bind("SUPER + SHIFT + 7", hl.dsp.window.move({ workspace = "7" }))
+hl.bind("SUPER + SHIFT + 8", hl.dsp.window.move({ workspace = "8" }))
+hl.bind("SUPER + SHIFT + 9", hl.dsp.window.move({ workspace = "9" }))
+
+-- === Column Management ===
+hl.bind("SUPER + bracketleft", hl.dsp.layout("preselect l"))
+hl.bind("SUPER + bracketright", hl.dsp.layout("preselect r"))
+
+-- === Sizing & Layout ===
+hl.bind("SUPER + R", hl.dsp.layout("togglesplit"))
+hl.bind("SUPER + CTRL + F", hl.dsp.window.fullscreen({ mode = "maximized", action = "set" }))
+
+-- === Move/resize windows with mainMod + LMB/RMB and dragging ===
+hl.bind("SUPER + mouse:272", hl.dsp.window.drag(), { mouse = true, description = "Move window" })
+hl.bind("SUPER + mouse:273", hl.dsp.window.resize(), { mouse = true, description = "Resize window" })
+
+hl.bind("SUPER + code:20", hl.dsp.window.resize({ x = -100, y = 0, relative = true }), { description = "Expand window left" })
+hl.bind("SUPER + code:21", hl.dsp.window.resize({ x = 100, y = 0, relative = true }), { description = "Shrink window left" })
+
+-- === Manual Sizing ===
+hl.bind("SUPER + minus", hl.dsp.window.resize({ x = -100, y = 0, relative = true }), { repeating = true })
+hl.bind("SUPER + equal", hl.dsp.window.resize({ x = 100, y = 0, relative = true }), { repeating = true })
+hl.bind("SUPER + SHIFT + minus", hl.dsp.window.resize({ x = 0, y = -100, relative = true }), { repeating = true })
+hl.bind("SUPER + SHIFT + equal", hl.dsp.window.resize({ x = 0, y = 100, relative = true }), { repeating = true })
+
+-- === Screenshots ===
+hl.bind("Print", hl.dsp.exec_cmd("dms screenshot"))
+hl.bind("CTRL + Print", hl.dsp.exec_cmd("dms screenshot full"))
+hl.bind("ALT + Print", hl.dsp.exec_cmd("dms screenshot window"))
+
+-- === Display Profiles ===
+hl.bind("SUPER + P", hl.dsp.exec_cmd("dms ipc outputs cycleProfile"))
+
+-- === System Controls ===
+hl.bind("SUPER + SHIFT + P", hl.dsp.dpms({ action = "toggle" }))
diff --git a/dot_config/hypr/dms/colors.lua b/dot_config/hypr/dms/colors.lua
new file mode 100644
index 0000000..e4b20b7
--- /dev/null
+++ b/dot_config/hypr/dms/colors.lua
@@ -0,0 +1,27 @@
+-- Auto-generated by DMS Matugen hook — do not edit manually.
+-- Remove require("dms.colors") from hyprland.lua to override.
+
+hl.config({
+ general = {
+ col = {
+ active_border = "rgb(9fd49b)",
+ inactive_border = "rgb(8c9388)",
+ },
+ },
+ group = {
+ col = {
+ border_active = "rgb(9fd49b)",
+ border_inactive = "rgb(8c9388)",
+ border_locked_active = "rgb(ffb4ab)",
+ border_locked_inactive = "rgb(8c9388)",
+ },
+ groupbar = {
+ col = {
+ active = "rgb(9fd49b)",
+ inactive = "rgb(8c9388)",
+ locked_active = "rgb(ffb4ab)",
+ locked_inactive = "rgb(8c9388)",
+ },
+ },
+ },
+})
diff --git a/dot_config/hypr/dms/cursor.lua b/dot_config/hypr/dms/cursor.lua
new file mode 100644
index 0000000..08a930b
--- /dev/null
+++ b/dot_config/hypr/dms/cursor.lua
@@ -0,0 +1,6 @@
+-- Auto-generated by DMS — do not edit manually
+
+hl.env("HYPRCURSOR_THEME", "breeze_cursors")
+hl.env("XCURSOR_THEME", "breeze_cursors")
+hl.env("HYPRCURSOR_SIZE", "24")
+hl.env("XCURSOR_SIZE", "24")
diff --git a/dot_config/hypr/dms/layout.lua b/dot_config/hypr/dms/layout.lua
new file mode 100644
index 0000000..a8c289d
--- /dev/null
+++ b/dot_config/hypr/dms/layout.lua
@@ -0,0 +1,18 @@
+-- Auto-generated by DMS — do not edit manually
+
+hl.config({
+ general = {
+ gaps_in = 4,
+ gaps_out = 4,
+ border_size = 1,
+ resize_on_border = false,
+ },
+ decoration = {
+ rounding = 12,
+ },
+})
+
+hl.layer_rule({
+ match = { namespace = "^dms:bar$" },
+ xray = true,
+})
diff --git a/dot_config/hypr/dms/outputs.lua.tmpl b/dot_config/hypr/dms/outputs.lua.tmpl
new file mode 100644
index 0000000..c6890b3
--- /dev/null
+++ b/dot_config/hypr/dms/outputs.lua.tmpl
@@ -0,0 +1,14 @@
+-- Auto-generated by DMS — do not edit manually
+-- Templated by chezmoi: per-system monitor configuration.
+
+{{ if eq .system "desktop" }}
+hl.monitor({ output = "", mode = "preferred", position = "0x0", scale = 1 })
+hl.monitor({ output = "HDMI-A-2", mode = "1920x1080@60.000", position = "6400x1080", scale = 1, vrr = 0 })
+hl.monitor({ output = "DP-2", mode = "3840x2160@120.000", position = "2560x0", scale = 1, vrr = 0 })
+hl.monitor({ output = "HDMI-A-1", mode = "2560x1440@119.998", position = "0x0", scale = 1, vrr = 0 })
+{{ else if eq .system "laptop" }}
+hl.monitor({ output = "", mode = "preferred", position = "0x0", scale = 1 })
+hl.monitor({ output = "eDP-1", mode = "preferred", position = "0x0", scale = 1 })
+{{ else }}
+-- server has no GUI; no monitors defined
+{{ end }}
\ No newline at end of file
diff --git a/dot_config/hypr/dms/windowrules.lua b/dot_config/hypr/dms/windowrules.lua
new file mode 100644
index 0000000..7627ea4
--- /dev/null
+++ b/dot_config/hypr/dms/windowrules.lua
@@ -0,0 +1,8 @@
+-- DMS Window Rules — managed by DankMaterialShell
+-- Do not edit manually; changes may be overwritten
+
+-- DMS-RULE: id=wr_1785350111586245435, name=feishin
+hl.window_rule({ match = { class = "^feishin$" }, workspace = "2" })
+
+-- DMS-RULE: id=wr_1785350520619777540, name=vesktop
+hl.window_rule({ match = { class = "^vesktop$" }, workspace = "6" })
diff --git a/dot_config/hypr/hyprland.lua.tmpl b/dot_config/hypr/hyprland.lua.tmpl
new file mode 100644
index 0000000..3f2a47b
--- /dev/null
+++ b/dot_config/hypr/hyprland.lua.tmpl
@@ -0,0 +1,112 @@
+-- Hyprland configuration (Lua) — https://wiki.hypr.land/Configuring/Start/
+-- Templated by chezmoi: per-system autostart, touchpad, and workspace rules.
+hl.config({ autogenerated = false })
+
+hl.on("hyprland.start", function()
+ -- DMS_STARTUP_BEGIN
+ hl.exec_cmd("dbus-update-activation-environment --systemd --all")
+ hl.exec_cmd("systemctl --user start hyprland-session.target")
+ -- DMS_STARTUP_END
+
+ -- Auto Start Applications
+{{ if eq .system "desktop" }}
+ hl.exec_cmd("kdeconnectd")
+ hl.exec_cmd("feishin")
+ hl.exec_cmd("vesktop")
+{{ else if eq .system "laptop" }}
+ hl.exec_cmd("kdeconnectd")
+{{ else }}
+ -- server has no GUI; nothing to autostart
+{{ end }}
+end)
+
+hl.config({
+ input = {
+ kb_layout = "us",
+ numlock_by_default = true,
+ follow_mouse = 1,
+ repeat_delay = 300,
+ touchpad = {
+ tap_to_click = true,
+ natural_scroll = true,
+{{ if eq .system "laptop" }}
+ disable_while_typing = true,
+{{ end }}
+ },
+ },
+ general = {
+ gaps_in = 4,
+ gaps_out = 4,
+ border_size = 1,
+ layout = "dwindle",
+ },
+ decoration = {
+ rounding = 12,
+ active_opacity = 1.0,
+ inactive_opacity = 0.97,
+ dim_inactive = true,
+ dim_strength = 0.1,
+ shadow = {
+ enabled = true,
+ range = 30,
+ render_power = 5,
+ offset = "0 5",
+ color = "rgba(00000070)",
+ },
+ blur = {
+ enabled = true,
+ size = 8,
+ },
+ },
+ dwindle = {
+ preserve_split = true,
+ },
+ master = {
+ mfact = 0.5,
+ },
+})
+
+hl.animation({ leaf = "windowsIn", enabled = true, speed = 3, bezier = "default" })
+hl.animation({ leaf = "windowsOut", enabled = true, speed = 3, bezier = "default" })
+hl.animation({ leaf = "workspaces", enabled = true, speed = 5, bezier = "default" })
+hl.animation({ leaf = "windowsMove", enabled = true, speed = 4, bezier = "default" })
+hl.animation({ leaf = "fade", enabled = true, speed = 3, bezier = "default" })
+hl.animation({ leaf = "border", enabled = true, speed = 3, bezier = "default" })
+hl.layer_rule({ match = { namespace = "^(quickshell)$" }, no_anim = true })
+hl.layer_rule({ match = { namespace = "^dms:.*" }, no_anim = true })
+
+-- Workspaces rules
+{{ if eq .system "desktop" }}
+hl.workspace_rule({ workspace = "1", monitor = "HDMI-A-1" })
+hl.workspace_rule({ workspace = "2", monitor = "HDMI-A-1" })
+
+hl.workspace_rule({ workspace = "3", monitor = "DP-2" })
+hl.workspace_rule({ workspace = "4", monitor = "DP-2" })
+hl.workspace_rule({ workspace = "5", monitor = "DP-2" })
+
+hl.workspace_rule({ workspace = "6", monitor = "HDMI-A-2" })
+hl.workspace_rule({ workspace = "7", monitor = "HDMI-A-2" })
+{{ else if eq .system "laptop" }}
+hl.workspace_rule({ workspace = "1", monitor = "eDP-1" })
+hl.workspace_rule({ workspace = "2", monitor = "eDP-1" })
+hl.workspace_rule({ workspace = "3", monitor = "eDP-1" })
+hl.workspace_rule({ workspace = "4", monitor = "eDP-1" })
+hl.workspace_rule({ workspace = "5", monitor = "eDP-1" })
+{{ else }}
+-- server has no GUI; no workspace rules
+{{ end }}
+
+-- Env vars
+hl.env("XDG_MENU_PREFIX", "plasma-")
+hl.env("QT_QPA_PLATFORM", "wayland")
+hl.env("QT_QPA_PLATFORMTHEME", "gtk3")
+hl.env("ELECTRON_OZONE_PLATFORM_HINT", "auto")
+
+-- Dank Material Shell
+require("dms.colors")
+require("dms.outputs")
+require("dms.layout")
+require("dms.cursor")
+require("dms.binds")
+require("dms.binds-user")
+require("dms.windowrules")
\ No newline at end of file
diff --git a/dot_config/hypr/hyprland/colors.conf b/dot_config/hypr/hyprland/colors.conf
new file mode 100644
index 0000000..928bee2
--- /dev/null
+++ b/dot_config/hypr/hyprland/colors.conf
@@ -0,0 +1,32 @@
+general {
+ col.active_border = rgba(8c938877)
+ col.inactive_border = rgba(42494055)
+}
+
+misc {
+ background_color = rgba(10140fFF)
+}
+
+plugin {
+ hyprbars {
+ # Honestly idk if it works like css, but well, why not
+ bar_text_font = Google Sans Flex Medium, Rubik, Geist, AR One Sans, Reddit Sans, Inter, Roboto, Ubuntu, Noto Sans, sans-serif
+ bar_height = 30
+ bar_padding = 10
+ bar_button_padding = 5
+ bar_precedence_over_border = true
+ bar_part_of_window = true
+
+ bar_color = rgba(10140fFF)
+ col.text = rgba(e0e4dbFF)
+
+
+ # example buttons (R -> L)
+ # hyprbars-button = color, size, on-click
+ hyprbars-button = rgb(e0e4db), 13, , hyprctl dispatch killactive
+ hyprbars-button = rgb(e0e4db), 13, , hyprctl dispatch fullscreen 1
+ hyprbars-button = rgb(e0e4db), 13, , hyprctl dispatch movetoworkspacesilent special
+ }
+}
+
+windowrule = border_color rgba(9fd49bAA) rgba(9fd49b77), match:pin 1
diff --git a/dot_config/hypr/hyprlock/colors.conf b/dot_config/hypr/hyprlock/colors.conf
new file mode 100644
index 0000000..8f99fb3
--- /dev/null
+++ b/dot_config/hypr/hyprlock/colors.conf
@@ -0,0 +1,12 @@
+# This configuration is generated by matugen
+# Changing these variables with matugen still enabled will overwrite them.
+
+$text_color = rgba(bbf0b6FF)
+$entry_background_color = rgba(00210511)
+$entry_border_color = rgba(8c938855)
+$entry_color = rgba(bbf0b6FF)
+$font_family = Google Sans Flex Medium
+$font_family_clock = Google Sans Flex Medium
+$font_material_symbols = Material Symbols Rounded
+
+$background_image = /home/keule/Pictures/wallpapers/background.jpg
\ No newline at end of file
diff --git a/roles/nvim/files/README.md b/dot_config/nvim/README.md
similarity index 100%
rename from roles/nvim/files/README.md
rename to dot_config/nvim/README.md
diff --git a/roles/nvim/files/init.lua b/dot_config/nvim/init.lua
similarity index 100%
rename from roles/nvim/files/init.lua
rename to dot_config/nvim/init.lua
diff --git a/roles/nvim/files/lua/community.lua b/dot_config/nvim/lua/community.lua
similarity index 100%
rename from roles/nvim/files/lua/community.lua
rename to dot_config/nvim/lua/community.lua
diff --git a/roles/nvim/files/lua/lazy_setup.lua b/dot_config/nvim/lua/lazy_setup.lua
similarity index 100%
rename from roles/nvim/files/lua/lazy_setup.lua
rename to dot_config/nvim/lua/lazy_setup.lua
diff --git a/roles/nvim/files/lua/plugins/astrocore.lua b/dot_config/nvim/lua/plugins/astrocore.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/astrocore.lua
rename to dot_config/nvim/lua/plugins/astrocore.lua
diff --git a/roles/nvim/files/lua/plugins/astrolsp.lua b/dot_config/nvim/lua/plugins/astrolsp.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/astrolsp.lua
rename to dot_config/nvim/lua/plugins/astrolsp.lua
diff --git a/roles/nvim/files/lua/plugins/astroui.lua b/dot_config/nvim/lua/plugins/astroui.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/astroui.lua
rename to dot_config/nvim/lua/plugins/astroui.lua
diff --git a/roles/nvim/files/lua/plugins/mappings.lua b/dot_config/nvim/lua/plugins/mappings.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/mappings.lua
rename to dot_config/nvim/lua/plugins/mappings.lua
diff --git a/roles/nvim/files/lua/plugins/mason.lua b/dot_config/nvim/lua/plugins/mason.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/mason.lua
rename to dot_config/nvim/lua/plugins/mason.lua
diff --git a/roles/nvim/files/lua/plugins/neo-tree.lua b/dot_config/nvim/lua/plugins/neo-tree.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/neo-tree.lua
rename to dot_config/nvim/lua/plugins/neo-tree.lua
diff --git a/roles/nvim/files/lua/plugins/none-ls.lua b/dot_config/nvim/lua/plugins/none-ls.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/none-ls.lua
rename to dot_config/nvim/lua/plugins/none-ls.lua
diff --git a/roles/nvim/files/lua/plugins/treesitter.lua b/dot_config/nvim/lua/plugins/treesitter.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/treesitter.lua
rename to dot_config/nvim/lua/plugins/treesitter.lua
diff --git a/roles/nvim/files/lua/plugins/user.lua b/dot_config/nvim/lua/plugins/user.lua
similarity index 100%
rename from roles/nvim/files/lua/plugins/user.lua
rename to dot_config/nvim/lua/plugins/user.lua
diff --git a/roles/nvim/files/lua/polish.lua b/dot_config/nvim/lua/polish.lua
similarity index 100%
rename from roles/nvim/files/lua/polish.lua
rename to dot_config/nvim/lua/polish.lua
diff --git a/roles/nvim/files/neovim.yml b/dot_config/nvim/neovim.yml
similarity index 100%
rename from roles/nvim/files/neovim.yml
rename to dot_config/nvim/neovim.yml
diff --git a/roles/nvim/files/selene.toml b/dot_config/nvim/selene.toml
similarity index 100%
rename from roles/nvim/files/selene.toml
rename to dot_config/nvim/selene.toml
diff --git a/roles/starship/files/starship.toml b/dot_config/starship/starship.toml.tmpl
similarity index 96%
rename from roles/starship/files/starship.toml
rename to dot_config/starship/starship.toml.tmpl
index 25dabb5..10d815d 100644
--- a/roles/starship/files/starship.toml
+++ b/dot_config/starship/starship.toml.tmpl
@@ -44,7 +44,9 @@ min_time = 1
# Somethere at the beginning
[battery]
charging_symbol = ""
-disabled = true
+{{ if eq .system "laptop" }}disabled = false
+{{ else }}disabled = true
+{{ end }}
discharging_symbol = ""
full_symbol = ""
diff --git a/roles/yazi/files/keymap.toml b/dot_config/yazi/keymap.toml
similarity index 100%
rename from roles/yazi/files/keymap.toml
rename to dot_config/yazi/keymap.toml
diff --git a/roles/yazi/files/package.toml b/dot_config/yazi/package.toml
similarity index 100%
rename from roles/yazi/files/package.toml
rename to dot_config/yazi/package.toml
diff --git a/roles/yazi/files/plugins/bookmarks.yazi/LICENSE b/dot_config/yazi/plugins/bookmarks.yazi/LICENSE
similarity index 100%
rename from roles/yazi/files/plugins/bookmarks.yazi/LICENSE
rename to dot_config/yazi/plugins/bookmarks.yazi/LICENSE
diff --git a/roles/yazi/files/plugins/bookmarks.yazi/README.md b/dot_config/yazi/plugins/bookmarks.yazi/README.md
similarity index 100%
rename from roles/yazi/files/plugins/bookmarks.yazi/README.md
rename to dot_config/yazi/plugins/bookmarks.yazi/README.md
diff --git a/roles/yazi/files/plugins/bookmarks.yazi/main.lua b/dot_config/yazi/plugins/bookmarks.yazi/main.lua
similarity index 100%
rename from roles/yazi/files/plugins/bookmarks.yazi/main.lua
rename to dot_config/yazi/plugins/bookmarks.yazi/main.lua
diff --git a/roles/yazi/files/yazi.toml b/dot_config/yazi/yazi.toml
similarity index 100%
rename from roles/yazi/files/yazi.toml
rename to dot_config/yazi/yazi.toml
diff --git a/dot_gitconfig.tmpl b/dot_gitconfig.tmpl
new file mode 100644
index 0000000..b6517f7
--- /dev/null
+++ b/dot_gitconfig.tmpl
@@ -0,0 +1,10 @@
+[user]
+ email = {{ .email }}
+ name = {{ .name }}
+ signingkey = 3EBCBD305D1C69450CEBF4A8B57235A0D139F9FD
+[init]
+ defaultBranch = main
+[core]
+ autocrlf = input
+[commit]
+ gpgsign = true
diff --git a/encrypted_dot_wakatime.cfg.age b/encrypted_dot_wakatime.cfg.age
new file mode 100644
index 0000000..863f166
--- /dev/null
+++ b/encrypted_dot_wakatime.cfg.age
@@ -0,0 +1,42 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IE9PTEZEc21o
+Tm9QRWFCblZ0eURVZURmQTRLMU9jN1Iza29rV21SUndiS29CYmtlenlKV3pUMEpE
+Y0hKU3phTjJnbjMzNnYzUkdYa3g3MitNSzB1ZVVSYkNOMzJTbVNUU3ZuRlAxRXNL
+SzN3SmhIUGhxd1RXZHI0RmNqaUNmSTJpaVlpVFA4QmF2ZVFEWTJlK01UZFB3dDd0
+NXMxWXhtMmFrVURxUW52aWZhMUovc0tNUjZYWXFOMU1YVGllT1pxemtrUU9ldlZU
+bHVOYlhVS2tYUm1kUElvd2hBK1RBNXZpWGwrR2R3R0hSNUVyc1RrQUR4MFZXRmgz
+eStwZUxMSVFhV0t2UThtL09VR1FnL2NMa3c3a2o3OEtMTkVHblpyd2phajhSTkZC
+N2NoUnZpZnpHRTdFTGtERGg5US9USWlDbnBRWTAyb2NzK0dZOGplWWxsWXhiVkoy
+b0pmOW5mdHE2TnlhNEx2bUVoeVZqUTdKN3YzYTJQQ2Z5VzA1WGFxSjZhUWgwbndv
+UUtBclJtOUdlWVQ1RW54cDJ6b1BWc3VhTnpRZEc0WXlMQmRUVjB0ZlYrTnVNV2Zu
+ZGtTaitqRkdGVWorQTBNcnpReHY5bnBWeTAxRHI3YVg0WUdyVHd5NlBkNER6NzYz
+c2RWTFB3cVBaUFpZMzUzU3NYRmZHV1gvMnZLUFd6WldLOWVyLytCWHhBOStDOFBm
+Z05KUms0OVh0QzFlNEdqdEU3c3NZelNkMGxtdXhBeWd0L0Zha1JFNVhZc1pnbHNW
+WDRNeTdRajFodEhFRmRmdlkxNEYyTzFpWmk1eWJQdnJIN1VseUtlTTFtRTJibGlj
+QjRkdThpdDhZU1hJT2s5SUx4MGZGbVRYY3psdVgxSm9hbmV1aUpTQzdxbm9xYkVr
+dkx4a2d5TStBcytVTjgydUlLU2hwcWJ6TFRlZjZIRVRaSWNObXFGU2NDMWxQMUFQ
+akM4UkxhY3VUZUdHKzAyb0wzNTM1L2xIQmJpaUVLSFlNZWIvbE1HVnVnVElWRzlP
+RnRRUzRKazJmamtlYXhDazd6ZG12dUZ2a3JQR0FUOERCUDN2TVUvN0pXNHNRRnBr
+RWlIRDltenRtR3F1TkR0aXRERHVGeVZJTGF1b3pYbFpVREc1TUhDTlhCQjJlN3hl
+MzBCZVRyM0kxRSt1MFU5TDA4ZTF1VUtCSEFZQkl5Zit2TnNCaUU0cUhFNlhFcG9W
+TjR6eTZJbEJiS2gyVE1PWWUycDlYQ3dvZlFUc2plMDBMZXFqUkpUMFJpWGhnSWtj
+N0JQSzBuM0pFY1B1bXEzclowbFFhaElXa1RPSFJ6ZHRtZHRDdXRFZStVcGw0dGpx
+Q21wK0VBc0xpak9rMUNHMVBISFQ2bndqYnNSblUrVmM2bTVCZ3NIQU16RGkxOUJU
+Mk9haE5RRTAxVGlOY3NCbFQ3V2xrc0YxeS83QVEyamJrN2crWnhNY2FEb3RMKy9P
+Z1BoOWYwMlRLVWZqL2FxYkp5TE9seWFjMUVXcE12S1ZEZjA0bW5FUmh1N2FLY0Va
+dnVJNHhNSlFONnk1L2xEcHFpWlRuMXJadHp6NFc3WjBqZTdGWWc5TjhPbmNFaDdZ
+cGpjcHhqUXV2NTZ5Ny9seE5RMlZxb01TSG9KbVdheHNtQTRYWTNVak40VzZpY2ZU
+OC8xekVwa0s4elBVUC9MMzBCSmRkckhjajc5SVM3VjhvZFFyRDRjRHRzcWZISWJB
+blZnLzMwVW1aTjRBSVpDNERzR24rRDU1cCtzL3Uwb2RIUjRtUWZnZFJONGJha3or
+aFhaME54dEwzMGJvQ0ZHbVhPZXdWUCtIN05UdmlwbkhjaFV3aCtGMnFHU2pTK21z
+NTlPNEtwR0NRZmJWWStwWFJtY2N4djV5WmpnSmJtYkQvVXRKbWlZL0YrMnRKSzY1
+MlBXQ2dUMzluQ2ZNQ3dJSFFrYUxVS0FRY3BNK0dLck9QcG1EVVJLbVJYdnRZQQpE
+OTluZjV2ZWN1RG9tSnpEQ1htVzZRMlFJcDJFSW9hc1BsVWoyaHc2ek1BCi0tLSAx
+bVFZODh0eTRyemtKcEtabU5iOFltR1RPYndvV0h4ME5CZ0V6a0k2dkgwCjMcrv1i
+X/Q7cSztMHyJ2h7X/Pua0a8+Uw21d8rJwvbiCTTIrje4HLT7+CtHl+wRand/yPpj
+13od2ldCW020adzS8h2EL9erX0SCGtD6Kk4Au9rX9TKEEZCFkffimYgMnTt+MUAZ
+HAY2QbGOQsqOynDdeWBTwemKQep8kSgLoGONKO7Tz2l2/MqUCS2W7YQRFb783i03
+kicX6irr+EaVq9BdX2KOO/c7K7DshJ6AXYMFhcGBY0wn5TnXoO/3ANBTg0zj7CgO
+WU3oMKfc1tgHCzXfp5t8UdTnmiMxPussFxil/rVIiUmhtg6R/ADfaENALYreOxKT
+Y6zMgQ==
+-----END AGE ENCRYPTED FILE-----
diff --git a/group_vars/all b/group_vars/all
deleted file mode 100644
index 4644da2..0000000
--- a/group_vars/all
+++ /dev/null
@@ -1,29 +0,0 @@
-default_roles:
- - bash
- - btop
- - fish
- - nvim
- - starship
- - yazi
-
-desktop_roles:
- - alacritty
- - discord
- - hypr
- - kvantum
- - minegrub
- - nwg-look
- - qt5ct
- - sddm
- - wakatime
-
-system: desktop
-
-wakapi_key: !vault |
- $ANSIBLE_VAULT;1.1;AES256
- 39346164353734613634356635383464636463373437333463616530346162303666343962383364
- 3862316162646639353665336530613965663437316263310a646464663038346539393039666537
- 32636139616239643934353135656662376262356433616635343830646164363435353739343966
- 6233303036393538370a656564643033383334323631663631336137346161326464373364346230
- 64323564663534393766356166393363376237633565316363363138373033353030373139366365
- 6435323438633233363166626330633164346534363335666433
diff --git a/install.sh b/install.sh
deleted file mode 100755
index 90b6017..0000000
--- a/install.sh
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/bin/bash
-
-# Vars
-DOTFILES_DIR="$HOME/.dotfiles"
-CONFIG_DIR="$HOME/.config/dotfiles"
-REPO="https://gitea.keuledrive.de/Keule2/Dotfiles.git"
-DIST=$(source /etc/os-release && echo $ID)
-
-# Colors
-COLOR_RESET='\033[0m'
-RED='\033[0;31m'
-LGREEN='\033[01;32m'
-
-# Helper Functions
-print_header() {
- echo -e "${LGREEN}$1${COLOR_RESET}"
-}
-
-cmd() {
- local DOTFILES_LOG="./error.log"
-
- if eval "$1" 1> /dev/null 2> $DOTFILES_LOG; then
- rm "$DOTFILES_LOG"
- return 0
- fi
-
- echo -e "${RED}"
- cat $DOTFILES_LOG
- echo -e "${COLOR_RESET}"
- rm "$DOTFILES_LOG"
- exit 1
-}
-
-paru_install() {
- if [ -x "$(command -v paru)" ]; then
- return
- fi
-
- # Install Base-Devel
- if [ -z "$(pacman -Q | grep base-devel)" ]; then
- print_header "Installing base-devel"
- cmd "sudo pacman -S base-devel --noconfirm"
- fi
- # Install RustUp
- if ! [ -x "$(command -v rustup)" ]; then
- print_header "Installing rustup"
- cmd "sudo pacman -S rustup --noconfirm"
- cmd "rustup default stable"
- fi
- # Instal Paru
- FOLDER=$(mktemp -d)
- print_header "Installing paru"
- cmd "git clone https://aur.archlinux.org/paru.git $FOLDER"
- cd $FOLDER
- cmd "makepkg -si --noconfirm"
-}
-
-arch_install() {
- # Install Ansible
- if ! [ -x "$(command -v ansible)" ]; then
- print_header "Installing ansible"
- cmd "sudo pacman -S ansible --noconfirm"
- fi
- # Install Git
- if ! [ -x "$(command -v git)" ]; then
- print_header "Installing git"
- cmd "sudo pacman -S git --noconfirm"
- fi
- # Installl Paru
- paru_install
- # Install PIP
- if ! [ -x "$(command -v pip)" ]; then
- print_header "Installing pip"
- cmd "sudo pacman -S python-pip --noconfirm"
- fi
- # Install Watchdog
- if [ -z "$(pip list | grep watchdog)" ]; then
- print_header "Installing watchdog"
- cmd "pip install --break-system-packages watchdog"
- fi
-}
-
-ubuntu_install() {
- # Install Ansible
- if ! dpkg -s ansible >/dev/null 2>&1; then
- print_header "Installing ansible"
- cmd "sudo apt-get update"
- cmd "sudo apt-get install -y software-properties-common"
- cmd "sudo apt-add-repository -y ppa:ansible/ansible"
- cmd "sudo apt-get update"
- cmd "sudo apt-get install -y ansible"
- cmd "sudo apt-get install python3-argcomplete"
- cmd "sudo activate-global-python-argcomplete3"
- fi
- # Install Git
- if ! dpkg -s git >/dev/null 2>&1; then
- print_header "Installing git"
- cmd "sudo apt-get install -y git"
- fi
- # TODO pip, watchdog
-}
-
-update_galaxy() {
- local OS=$1
-
- print_header "Installing/Updating ansible-galaxy"
- cmd "ansible-galaxy install -r $DOTFILES_DIR/requirements/default.yml"
- if [ -f "$DOTFILES_DIR/requirements/$OS.yml" ]; then
- cmd "ansible-galaxy install -r $DOTFILES_DIR/requirements/$OS.yml"
- fi
-}
-
-# Banner
-cat << "EOF"
-________ __ .___ __ .__ .__
-\______ \ _____/ |_ ______ | | ____ _______/ |______ | | | | ___________
- | | \ / _ \ __\/ ___/ | |/ \ / ___/\ __\__ \ | | | | _/ __ \_ __ \
- | ` ( <_> ) | \___ \ | | | \\___ \ | | / __ \| |_| |_\ ___/| | \/
-/_______ /\____/|__| /____ > |___|___| /____ > |__| (____ /____/____/\___ >__|
- \/ \/ \/ \/ \/ \/
-EOF
-
-# Setup
-case $DIST in
- arch)
- arch_install
- ;;
- ubuntu)
- ubuntu_install
- ;;
- *)
- echo "Unsupported OS"
- exit 1
- ;;
-esac
-
-# Clone repository
-if ! [[ -d "$DOTFILES_DIR" ]]; then
- print_header "Cloning repo"
- cmd "git clone $REPO $DOTFILES_DIR"
-else
- print_header "Updating repo"
- cmd "git -C $DOTFILES_DIR pull"
-fi
-
-# Change Working Dir
-cd "$DOTFILES_DIR"
-
-# Update Galaxy
-update_galaxy $DIST
-
-# Run playbook
-if [[ -f "$CONFIG_DIR/vault-password.txt" ]]; then
- if [[ -f "$CONFIG_DIR/values.yml" ]]; then
- ansible-playbook --diff -v --ask-become-pass --extra-vars "@$CONFIG_DIR/values.yml" --vault-password-file "$CONFIG_DIR/vault-password.txt" "$DOTFILES_DIR/main.yml" "$@"
- else
- ansible-playbook --diff -v --ask-become-pass --vault-password-file "$CONFIG_DIR/vault-password.txt" "$DOTFILES_DIR/main.yml" "$@"
- fi
-elif [[ -f "$CONFIG_DIR/values.yml" ]]; then
- ansible-playbook --diff -v --ask-become-pass --extra-vars "@$CONFIG_DIR/values.yml" "$DOTFILES_DIR/main.yml" "$@"
-else
- ansible-playbook --diff -v --ask-become-pass "$DOTFILES_DIR/main.yml" "$@"
-fi
diff --git a/main.yml b/main.yml
deleted file mode 100644
index 493f752..0000000
--- a/main.yml
+++ /dev/null
@@ -1,52 +0,0 @@
----
-- name: Dotfiles
- hosts: localhost
- connection: local
- tasks:
- - name: Get username
- command: whoami
- register: whoami
- tags:
- - always
-
- - name: Set username
- set_fact:
- username: "{{ whoami.stdout }}"
- tags:
- - always
-
- - name: Set default roles
- set_fact:
- roles: "{{ ansible_run_tags != ['all'] and ansible_run_tags or default_roles | difference(ansible_skip_tags | default([])) }}"
- tags:
- - always
-
- - name: Set desktop roles
- set_fact:
- roles: "{{ (desktop_roles + roles) | difference(ansible_skip_tags | default([])) }}"
- tags:
- - always
- when: system != 'server' and desktop_roles is defined and ansible_run_tags == ['all']
-
- - name: Prepend system role
- set_fact:
- roles: "{{ ['system'] | difference(roles) + roles }}"
- tags:
- - always
-
- - name: Display roles
- debug: "var=roles"
- tags:
- - always
-
- - name: Run roles
- include_role:
- apply:
- tags:
- - "{{ roles_item }}"
- name: "{{ roles_item }}"
- loop_control:
- loop_var: roles_item
- with_items: "{{ roles }}"
- tags:
- - always
diff --git a/requirements/arch.yml b/requirements/arch.yml
deleted file mode 100644
index 052506b..0000000
--- a/requirements/arch.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-collections:
- - name: kewlfft.aur
diff --git a/requirements/default.yml b/requirements/default.yml
deleted file mode 100644
index 72fe72d..0000000
--- a/requirements/default.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-collections:
- - name: community.general
diff --git a/roles/alacritty/files/alacritty.toml b/roles/alacritty/files/alacritty.toml
deleted file mode 100644
index 05542c8..0000000
--- a/roles/alacritty/files/alacritty.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-import = [
- # Theme
- "~/.config/alacritty/catppuccin-macchiato.toml"
-]
-
-[env]
-TERM = "xterm-256color"
-
-[window]
-opacity = 0.7
-decorations = "None"
-padding = { x = 0, y = 0 }
-
-[font]
-normal = {family = "CaskaydiaCove Nerd Font", style = "Mono"}
-
-[cursor]
-style = {shape = "Beam", blinking = "On"}
-vi_mode_style = {shape = "Block", blinking = "On"}
diff --git a/roles/alacritty/files/catppuccin-macchiato.toml b/roles/alacritty/files/catppuccin-macchiato.toml
deleted file mode 100644
index f7e1658..0000000
--- a/roles/alacritty/files/catppuccin-macchiato.toml
+++ /dev/null
@@ -1,97 +0,0 @@
-# MIT License
-#
-# Copyright (c) 2021 Catppuccin
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-[colors.primary]
-background = "#24273A"
-foreground = "#CAD3F5"
-dim_foreground = "#CAD3F5"
-bright_foreground = "#CAD3F5"
-
-[colors.cursor]
-text = "#24273A"
-cursor = "#F4DBD6"
-
-[colors.vi_mode_cursor]
-text = "#24273A"
-cursor = "#B7BDF8"
-
-[colors.search.matches]
-foreground = "#24273A"
-background = "#A5ADCB"
-
-[colors.search.focused_match]
-foreground = "#24273A"
-background = "#A6DA95"
-
-[colors.footer_bar]
-foreground = "#24273A"
-background = "#A5ADCB"
-
-[colors.hints.start]
-foreground = "#24273A"
-background = "#EED49F"
-
-[colors.hints.end]
-foreground = "#24273A"
-background = "#A5ADCB"
-
-[colors.selection]
-text = "#24273A"
-background = "#F4DBD6"
-
-[colors.normal]
-black = "#494D64"
-red = "#ED8796"
-green = "#A6DA95"
-yellow = "#EED49F"
-blue = "#8AADF4"
-magenta = "#F5BDE6"
-cyan = "#8BD5CA"
-white = "#B8C0E0"
-
-[colors.bright]
-black = "#5B6078"
-red = "#ED8796"
-green = "#A6DA95"
-yellow = "#EED49F"
-blue = "#8AADF4"
-magenta = "#F5BDE6"
-cyan = "#8BD5CA"
-white = "#A5ADCB"
-
-[colors.dim]
-black = "#494D64"
-red = "#ED8796"
-green = "#A6DA95"
-yellow = "#EED49F"
-blue = "#8AADF4"
-magenta = "#F5BDE6"
-cyan = "#8BD5CA"
-white = "#B8C0E0"
-
-[[colors.indexed_colors]]
-index = 16
-color = "#F5A97F"
-
-[[colors.indexed_colors]]
-index = 17
-color = "#F4DBD6"
diff --git a/roles/alacritty/tasks/main.yml b/roles/alacritty/tasks/main.yml
deleted file mode 100644
index 5df6586..0000000
--- a/roles/alacritty/tasks/main.yml
+++ /dev/null
@@ -1,22 +0,0 @@
----
-- name: "[Alacritty] Install"
- kewlfft.aur.aur:
- name:
- - alacritty
- - ueberzugpp
- state: present
-
-- name: "[Alacritty] Create config folder"
- ansible.builtin.file:
- mode: "0755"
- path: "{{ ansible_user_dir }}/.config/alacritty"
- state: directory
-
-- name: "[Alacritty] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/alacritty"
-
-- name: "[Alacritty] Set default"
- shell: gsettings set org.cinnamon.desktop.default-applications.terminal exec alacritty && gsettings set org.gnome.desktop.default-applications.terminal exec alacritty
- ignore_errors: true
diff --git a/roles/bash/tasks/main.yml b/roles/bash/tasks/main.yml
deleted file mode 100644
index 98b810f..0000000
--- a/roles/bash/tasks/main.yml
+++ /dev/null
@@ -1,12 +0,0 @@
----
-- name: "[Bash] Install"
- ansible.builtin.package:
- name:
- - bash
- state: latest
- become: yes
-
-- name: "[Bash] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/"
diff --git a/roles/btop/files/btop.conf b/roles/btop/files/btop.conf
deleted file mode 100644
index 6125a66..0000000
--- a/roles/btop/files/btop.conf
+++ /dev/null
@@ -1,248 +0,0 @@
-#? Config file for btop v. 1.3.2
-
-#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
-#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
-color_theme = "Default"
-
-#* If the theme set background should be shown, set to False if you want terminal background transparency.
-theme_background = True
-
-#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
-truecolor = True
-
-#* Set to true to force tty mode regardless if a real tty has been detected or not.
-#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
-force_tty = False
-
-#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
-#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
-#* Use whitespace " " as separator between different presets.
-#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty"
-presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty"
-
-#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
-#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
-vim_keys = True
-
-#* Rounded corners on boxes, is ignored if TTY mode is ON.
-rounded_corners = True
-
-#* Default symbols to use for graph creation, "braille", "block" or "tty".
-#* "braille" offers the highest resolution but might not be included in all fonts.
-#* "block" has half the resolution of braille but uses more common characters.
-#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY.
-#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view.
-graph_symbol = "braille"
-
-# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
-graph_symbol_cpu = "default"
-
-# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty".
-graph_symbol_gpu = "default"
-
-# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
-graph_symbol_mem = "default"
-
-# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
-graph_symbol_net = "default"
-
-# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
-graph_symbol_proc = "default"
-
-#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace.
-shown_boxes = "cpu mem net proc"
-
-#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
-update_ms = 2000
-
-#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
-#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
-proc_sorting = "memory"
-
-#* Reverse sorting order, True or False.
-proc_reversed = False
-
-#* Show processes as a tree.
-proc_tree = False
-
-#* Use the cpu graph colors in the process list.
-proc_colors = True
-
-#* Use a darkening gradient in the process list.
-proc_gradient = True
-
-#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
-proc_per_core = True
-
-#* Show process memory as bytes instead of percent.
-proc_mem_bytes = True
-
-#* Show cpu graph for each process.
-proc_cpu_graphs = True
-
-#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
-proc_info_smaps = False
-
-#* Show proc box on left side of screen instead of right.
-proc_left = False
-
-#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
-proc_filter_kernel = False
-
-#* In tree-view, always accumulate child process resources in the parent process.
-proc_aggregate = False
-
-#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
-#* Select from a list of detected attributes from the options menu.
-cpu_graph_upper = "total"
-
-#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available.
-#* Select from a list of detected attributes from the options menu.
-cpu_graph_lower = "total"
-
-#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off".
-show_gpu_info = "Auto"
-
-#* Toggles if the lower CPU graph should be inverted.
-cpu_invert_lower = True
-
-#* Set to True to completely disable the lower CPU graph.
-cpu_single_graph = False
-
-#* Show cpu box at bottom of screen instead of top.
-cpu_bottom = False
-
-#* Shows the system uptime in the CPU box.
-show_uptime = True
-
-#* Show cpu temperature.
-check_temp = True
-
-#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
-cpu_sensor = "Auto"
-
-#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
-show_coretemp = True
-
-#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
-#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
-#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.
-#* Example: "4:0 5:1 6:3"
-cpu_core_map = ""
-
-#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine".
-temp_scale = "celsius"
-
-#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
-base_10_sizes = False
-
-#* Show CPU frequency.
-show_cpu_freq = True
-
-#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
-#* Special formatting: /host = hostname | /user = username | /uptime = system uptime
-clock_format = "%X"
-
-#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
-background_update = True
-
-#* Custom cpu model name, empty string to disable.
-custom_cpu_name = ""
-
-#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
-#* Begin line with "exclude=" to change to exclude filter, otherwise defaults to "most include" filter. Example: disks_filter="exclude=/boot /home/user".
-disks_filter = ""
-
-#* Show graphs instead of meters for memory values.
-mem_graphs = True
-
-#* Show mem box below net box instead of above.
-mem_below_net = False
-
-#* Count ZFS ARC in cached and available memory.
-zfs_arc_cached = True
-
-#* If swap memory should be shown in memory box.
-show_swap = True
-
-#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
-swap_disk = True
-
-#* If mem box should be split to also show disks info.
-show_disks = True
-
-#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
-only_physical = True
-
-#* Read disks list from /etc/fstab. This also disables only_physical.
-use_fstab = True
-
-#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
-zfs_hide_datasets = False
-
-#* Set to true to show available disk space for privileged users.
-disk_free_priv = False
-
-#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
-show_io_stat = True
-
-#* Toggles io mode for disks, showing big graphs for disk read/write speeds.
-io_mode = False
-
-#* Set to True to show combined read/write io graphs in io mode.
-io_graph_combined = False
-
-#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
-#* Example: "/mnt/media:100 /:20 /boot:1".
-io_graph_speeds = ""
-
-#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
-net_download = 100
-
-net_upload = 100
-
-#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
-net_auto = True
-
-#* Sync the auto scaling for download and upload to whichever currently has the highest scale.
-net_sync = True
-
-#* Starts with the Network Interface specified here.
-net_iface = ""
-
-#* Show battery stats in top right if battery is present.
-show_battery = True
-
-#* Which battery to use if multiple are present. "Auto" for auto detection.
-selected_battery = "Auto"
-
-#* Show power stats of battery next to charge indicator.
-show_battery_watts = True
-
-#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
-#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
-log_level = "WARNING"
-
-#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
-nvml_measure_pcie_speeds = True
-
-#* Horizontally mirror the GPU graph.
-gpu_mirror_graph = True
-
-#* Custom gpu0 model name, empty string to disable.
-custom_gpu_name0 = ""
-
-#* Custom gpu1 model name, empty string to disable.
-custom_gpu_name1 = ""
-
-#* Custom gpu2 model name, empty string to disable.
-custom_gpu_name2 = ""
-
-#* Custom gpu3 model name, empty string to disable.
-custom_gpu_name3 = ""
-
-#* Custom gpu4 model name, empty string to disable.
-custom_gpu_name4 = ""
-
-#* Custom gpu5 model name, empty string to disable.
-custom_gpu_name5 = ""
diff --git a/roles/btop/tasks/main.yml b/roles/btop/tasks/main.yml
deleted file mode 100644
index 7b20963..0000000
--- a/roles/btop/tasks/main.yml
+++ /dev/null
@@ -1,18 +0,0 @@
----
-- name: "[Btop] Install"
- ansible.builtin.package:
- name:
- - btop
- state: latest
- become: true
-
-- name: "[Btop] Create config folder"
- ansible.builtin.file:
- mode: "0755"
- path: "{{ ansible_user_dir }}/.config/btop"
- state: directory
-
-- name: "[Btop] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/btop"
diff --git a/roles/discord/files/Preferences b/roles/discord/files/Preferences
deleted file mode 100644
index 364bb10..0000000
--- a/roles/discord/files/Preferences
+++ /dev/null
@@ -1 +0,0 @@
-{"spellcheck":{"dictionaries":["en-GB", "de-DE"],"dictionary":""}}
diff --git a/roles/discord/files/storage/lang.json b/roles/discord/files/storage/lang.json
deleted file mode 100644
index 8b4cb6e..0000000
--- a/roles/discord/files/storage/lang.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "lang": "en-US"
-}
diff --git a/roles/discord/files/storage/settings.json b/roles/discord/files/storage/settings.json
deleted file mode 100644
index 573b6c7..0000000
--- a/roles/discord/files/storage/settings.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "windowStyle": "native",
- "channel": "stable",
- "armcordCSP": true,
- "minimizeToTray": false,
- "keybinds": [],
- "alternativePaste": false,
- "multiInstance": false,
- "mods": [
- "none"
- ],
- "spellcheck": true,
- "performanceMode": "none",
- "skipSplash": false,
- "inviteWebsocket": true,
- "startMinimized": false,
- "dynamicIcon": false,
- "tray": "dynamic",
- "customJsBundle": "https://armcord.app/placeholder.js",
- "customCssBundle": "https://armcord.app/placeholder.css",
- "disableAutogain": false,
- "useLegacyCapturer": false,
- "mobileMode": false,
- "trayIcon": "dynamic",
- "doneSetup": true,
- "clientName": "ArmCord",
- "customIcon": "/usr/lib/armcord/app.asar/assets/desktop.png",
- "modCache": {
- "shelter": "1b35b8802a85809742af99f454bb941f56f759a3"
- },
- "hardwareAcceleration": true,
- "audio": {
- "workaround": false,
- "deviceSelect": true,
- "granularSelect": true,
- "ignoreVirtual": false,
- "ignoreDevices": false,
- "ignoreInputMedia": false,
- "onlySpeakers": false,
- "onlyDefaultSpeakers": true,
- "loopbackType": "loopback"
- },
- "transparency": "none",
- "legcordCSP": true,
- "bounceOnPing": false,
- "disableHttpCache": false,
- "autoHideMenuBar": true,
- "blockPowerSavingInVoiceChat": false,
- "useMacSystemPicker": true,
- "popoutPiP": false,
- "spellcheckLanguage": [
- "en-US",
- "de-DE"
- ],
- "sleepInBackground": false,
- "noBundleUpdates": false,
- "additionalArguments": "",
- "smoothScroll": true,
- "autoScroll": false,
- "useSystemCssEditor": false,
- "overlayButtonColor": "#121214"
-}
diff --git a/roles/discord/files/themes/Catppuccin-Macchiato-BD/LICENSE b/roles/discord/files/themes/Catppuccin-Macchiato-BD/LICENSE
deleted file mode 100644
index 5602ca7..0000000
--- a/roles/discord/files/themes/Catppuccin-Macchiato-BD/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 Catppuccin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/roles/discord/files/themes/Catppuccin-Macchiato-BD/manifest.json b/roles/discord/files/themes/Catppuccin-Macchiato-BD/manifest.json
deleted file mode 100644
index 761e9a1..0000000
--- a/roles/discord/files/themes/Catppuccin-Macchiato-BD/manifest.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "theme": "src.css",
- "name": "Catppuccin Macchiato",
- "author": "winston#0001",
- "authorId": "505490445468696576",
- "version": "0.2.0",
- "description": "🎮 Soothing pastel theme for Discord",
- "website": "https://github.com/catppuccin/discord",
- "invite": "r6Mdz5dpFc",
- "updateSrc": "https://raw.githubusercontent.com/catppuccin/discord/main/themes/macchiato.theme.css",
- "supportsArmCordTitlebar": false,
- "enabled": true
-}
diff --git a/roles/discord/files/themes/Catppuccin-Macchiato-BD/src.css b/roles/discord/files/themes/Catppuccin-Macchiato-BD/src.css
deleted file mode 100644
index 3127eba..0000000
--- a/roles/discord/files/themes/Catppuccin-Macchiato-BD/src.css
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * @name Catppuccin Macchiato
- * @author winston#0001
- * @authorId 505490445468696576
- * @version 0.2.0
- * @description 🎮 Soothing pastel theme for Discord
- * @website https://github.com/catppuccin/discord
- * @invite r6Mdz5dpFc
- * **/
-
-@import url("https://catppuccin.github.io/discord/dist/catppuccin-macchiato.theme.css");
diff --git a/roles/discord/tasks/main.yml b/roles/discord/tasks/main.yml
deleted file mode 100644
index 1d26ca4..0000000
--- a/roles/discord/tasks/main.yml
+++ /dev/null
@@ -1,18 +0,0 @@
----
-- name: "[Discord] Install"
- kewlfft.aur.aur:
- name:
- - legcord
- state: present
-
-- name: "[Discord] Create config folder"
- ansible.builtin.file:
- mode: "0755"
- path: "{{ ansible_user_dir }}/.config/legcord"
- state: directory
- force: false
-
-- name: "[Discord] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/legcord"
diff --git a/roles/fish/tasks/main.yml b/roles/fish/tasks/main.yml
deleted file mode 100644
index 42241f7..0000000
--- a/roles/fish/tasks/main.yml
+++ /dev/null
@@ -1,26 +0,0 @@
----
-- name: "[Fish] Install"
- kewlfft.aur.aur:
- name:
- - fish
- - fish-done
- - fastfetch
- - zoxide
- state: present
-
-- name: "[Fish] Create config folder"
- ansible.builtin.file:
- mode: "0755"
- path: "{{ ansible_user_dir }}/.config/fish"
- state: directory
-
-- name: "[Fish] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/fish"
-
-- name: "[Fish] Set shell"
- ansible.builtin.shell:
- cmd: "sudo usermod -s $(which fish) {{ username }}"
- become: true
- ignore_errors: true
diff --git a/roles/hypr/files/devices.conf b/roles/hypr/files/devices.conf
deleted file mode 100755
index 1ca5cd4..0000000
--- a/roles/hypr/files/devices.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-# Devices
-device {
- name = roccat-roccat-kone-emp-mouse
- sensitivity = -0.5
-}
diff --git a/roles/hypr/files/env.conf b/roles/hypr/files/env.conf
deleted file mode 100755
index 437d06e..0000000
--- a/roles/hypr/files/env.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-# Environment
-env = XCURSOR_SIZE,24
-env = XCURSOR_THEME,Breeze
-env = HYPRCURSOR_SIZE,24
-env = HYPRCURSOR_THEME,rose-pine-hyprcursor
-env = XDG_SESSION_TYPE,wayland
-env = WLR_NO_HARDWARE_CURSORS,1
-env = QT_QPA_PLATFORMTHEME,gtk3
-env = QT_STYLE_OVERRIDE,qt5ct
diff --git a/roles/hypr/files/hyprland.conf b/roles/hypr/files/hyprland.conf
deleted file mode 100755
index 82f3e95..0000000
--- a/roles/hypr/files/hyprland.conf
+++ /dev/null
@@ -1,83 +0,0 @@
-# Env
-source = ~/.config/hypr/env.conf
-
-# Nvidia
-# source = ~/.config/hypr/nvidia.conf
-
-# Keybinds
-source = ~/.config/hypr/keybinds.conf
-
-# Monitors/Workspaces
-source = ~/.config/hypr/windowrule.conf
-
-# Startup
-source = ~/.config/hypr/startup.conf
-
-# Devices
-source = ~/.config/hypr/devices.conf
-
-# Input
-input {
- kb_layout = us
- numlock_by_default = 1
-
- follow_mouse = 1
-
- touchpad {
- natural_scroll = yes
- }
-}
-
-# General
-general {
- gaps_in = 2
- gaps_out = 2
- border_size = 2
- col.active_border = rgba(7dc4e4ee) rgba(7dc4e4ee) 45deg
- col.inactive_border = rgba(595959aa)
-
- layout = dwindle
-}
-
-# Decoration
-decoration {
- rounding = 0
-
- blur {
- enabled = true
- size = 2
- passes = 3
- #noise = 0
- new_optimizations = on
- special = false
-
- blurls = rofi
- blurls = gtk-layer-shell
- }
-}
-
-# Animations
-animations {
- enabled = yes
-
- bezier = myBezier, 0.05, 0.9, 0.1, 1.05
-
- animation = windows, 1, 7, myBezier
- animation = windowsOut, 1, 7, default, popin 80%
- animation = border, 1, 10, default
- animation = borderangle, 1, 8, default
- animation = fade, 1, 7, default
- animation = workspaces, 1, 6, default
-}
-
-# Dwindle
-dwindle {
- pseudotile = yes
- preserve_split = yes
-}
-
-# Misc
-misc {
- #mouse_move_enables_dpms = true
- key_press_enables_dpms = true
-}
diff --git a/roles/hypr/files/keybinds.conf b/roles/hypr/files/keybinds.conf
deleted file mode 100755
index 967375f..0000000
--- a/roles/hypr/files/keybinds.conf
+++ /dev/null
@@ -1,102 +0,0 @@
-# Keybindings
-$mainMod = SUPER
-
-# General
-bind = $mainMod, P, pseudo,
-bind = $mainMod, DELETE, exit,
-bind = $mainMod, C, killactive,
-bind = $mainMod, M, fullscreen,
-bind = $mainMod, S, togglesplit,
-bind = $mainMod, F, togglefloating,
-bind = $mainMod, O, global, caelestia:lock
-bind = $mainMod, G, global, caelestia:dashboard
-bind = $mainMod, F4, exec, ags -t powermenu
-bind = $mainMod, SPACE, global, caelestia:launcher
-bind = $mainMod, TAB, exec, ags -t overview
-bind = $mainMod, V, exec, caelestia clipboard
-bind = $mainMod, COMMA, exec, caelestia emoji -p
-bind = $mainMod SHIFT, S, exec, grimblast --freeze copy area
-bind = $mainMod CTRL, S, exec, grimblast --freeze copysave area ~/Pictures/Screenshots/"$(date --rfc-3339=seconds)".png
-
-# Media keys
-bind = , XF86AudioNext, exec, playerctl next
-bind = , XF86AudioPrev, exec, playerctl previous
-bind = , XF86AudioPlay, exec, playerctl play
-bind = , XF86AudioPause, exec, playerctl pause
-bind = , XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle
-bind = , XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle
-binde = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_SINK@ 5%+
-binde = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_SINK@ 5%-
-binde = , XF86MonBrightnessDown, exec, brightnessctl set 5%-
-binde = , XF86MonBrightnessUp, exec, brightnessctl set 5%+
-#bind = , XF86PowerOff, exec, systemctl shutdown
-
-# Applications
-bind = $mainMod, T, exec, alacritty
-bind = $mainMod, E, exec, nemo
-bind = $mainMod, G, exec, ags -t calc
-bind = CTRL SHIFT, ESCAPE, exec, alacritty -e btop
-
-# Move focus
-bind = $mainMod, left, movefocus, l
-bind = $mainMod, H, movefocus, l
-bind = $mainMod, right, movefocus, r
-bind = $mainMod, L, movefocus, r
-bind = $mainMod, up, movefocus, u
-bind = $mainMod, K, movefocus, u
-bind = $mainMod, down, movefocus, d
-bind = $mainMod, J, movefocus, d
-
-# Scrachtpad
-bind = $mainMod CTRL, 2, togglespecialworkspace,
-bind = $mainMod CTRL, 1, movetoworkspace, special
-
-# Move window
-bind = $mainMod SHIFT, left, movewindow, l
-bind = $mainMod SHIFT, H, movewindow, l
-bind = $mainMod SHIFT, right, movewindow, r
-bind = $mainMod SHIFT, L, movewindow, r
-bind = $mainMod SHIFT, up, movewindow, u
-bind = $mainMod SHIFT, K, movewindow, u
-bind = $mainMod SHIFT, down, movewindow, d
-bind = $mainMod SHIFT, J, movewindow, d
-bindm = $mainMod, mouse:272, movewindow
-
-# Resize windows
-binde = $mainMod CTRL, left, resizeactive, -20 0
-binde = $mainMod CTRL, h, resizeactive, -20 0
-binde = $mainMod CTRL, right, resizeactive, 20 0
-binde = $mainMod CTRL, l, resizeactive, 20 0
-binde = $mainMod CTRL, up, resizeactive, 0 -20
-binde = $mainMod CTRL, k, resizeactive, 0 -20
-binde = $mainMod CTRL, down, resizeactive, 0 20
-binde = $mainMod CTRL, j, resizeactive, 0 20
-bindm = $mainMod, mouse:273, resizewindow
-
-# Move active window to a workspace
-bind = $mainMod SHIFT, 1, movetoworkspace, 1
-bind = $mainMod SHIFT, 2, movetoworkspace, 2
-bind = $mainMod SHIFT, 3, movetoworkspace, 3
-bind = $mainMod SHIFT, 4, movetoworkspace, 4
-bind = $mainMod SHIFT, 5, movetoworkspace, 5
-bind = $mainMod SHIFT, 6, movetoworkspace, 6
-bind = $mainMod SHIFT, 7, movetoworkspace, 7
-bind = $mainMod SHIFT, 8, movetoworkspace, 8
-bind = $mainMod SHIFT, 9, movetoworkspace, 9
-bind = $mainMod SHIFT, 0, movetoworkspace, 10
-
-# Switch workspaces
-bind = $mainMod, 1, workspace, 1
-bind = $mainMod, 2, workspace, 2
-bind = $mainMod, 3, workspace, 3
-bind = $mainMod, 4, workspace, 4
-bind = $mainMod, 5, workspace, 5
-bind = $mainMod, 6, workspace, 6
-bind = $mainMod, 7, workspace, 7
-bind = $mainMod, 8, workspace, 8
-bind = $mainMod, 9, workspace, 9
-bind = $mainMod, 0, workspace, 10
-
-# Scroll through existing workspaces
-bind = $mainMod, mouse_down, workspace, e+1
-bind = $mainMod, mouse_up, workspace, e-1
diff --git a/roles/hypr/files/nvidia.conf b/roles/hypr/files/nvidia.conf
deleted file mode 100755
index b431303..0000000
--- a/roles/hypr/files/nvidia.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-# Nvidia env
-env = GBM_BACKEND,nvidia-drm
-env = LIBVA_DRIVER_NAME,nvidia
-env = __GLX_VENDOR_LIBRARY_NAME,nvidia
-env = __GL_VRR_ALLOWED,1
-env = WLR_NO_HARDWARE_CURSORS,1
-env = WLR_DRM_NO_ATOMIC,1
diff --git a/roles/hypr/tasks/main.yml b/roles/hypr/tasks/main.yml
deleted file mode 100644
index 2a4ccaf..0000000
--- a/roles/hypr/tasks/main.yml
+++ /dev/null
@@ -1,34 +0,0 @@
----
-- name: "[Hyprland] Install"
- kewlfft.aur.aur:
- name:
- - hyprland
- state: present
-
-- name: "[Hyprland] Create config folder"
- ansible.builtin.file:
- mode: 0755
- path: "{{ ansible_user_dir }}/.config/hypr"
- state: directory
-
-- name: "[Hyprland] Create screenshot folder"
- ansible.builtin.file:
- mode: 0755
- path: "{{ ansible_user_dir }}/Pictures/Screenshots"
- state: directory
-
-- name: "[Hyprland] Configure"
- ansible.builtin.copy:
- mode: 0755
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/hypr"
-
-- name: "[Hyprland] Configure startup"
- ansible.builtin.template:
- src: startup.conf
- dest: "{{ ansible_user_dir }}/.config/hypr"
-
-- name: "[Hyprland] Configure windowrules"
- ansible.builtin.template:
- src: windowrule.conf
- dest: "{{ ansible_user_dir }}/.config/hypr"
diff --git a/roles/hypr/templates/startup.conf b/roles/hypr/templates/startup.conf
deleted file mode 100755
index 5606e64..0000000
--- a/roles/hypr/templates/startup.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-# Shell
-exec-once = caelestia shell -d
-
-# Programms
-{% if system == "desktop_full" %}
-exec-once = legcord
-exec-once = feishin
-exec-once = nextcloud
-{% endif %}
-exec-once = nm-applet
-exec-once = blueman-applet
-exec-once = playerctld daemon
-
-# Clipboard
-exec-once = wl-paste --type text --watch cliphist store #Stores only text data
-exec-once = wl-paste --type image --watch cliphist store #Stores only image data
-
-# Misc
-exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
diff --git a/roles/hypr/templates/windowrule.conf b/roles/hypr/templates/windowrule.conf
deleted file mode 100755
index bd5d497..0000000
--- a/roles/hypr/templates/windowrule.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-# Monitors
-{% if system == "desktop_full" %}
-$monitorOne = HDMI-A-1
-$monitorTwo = DP-2
-$monitorThree = HDMI-A-2
-
-monitor = $monitorOne,1920x1080@144.001007,0x0,1
-monitor = $monitorTwo,2560x1440@143.912003,1920x0,1
-monitor = $monitorThree,1920x1080@60.000000,4480x0,1
-{% endif %}
-monitor = ,preferred,auto,1
-
-
-# Window Rules - (hyprctl -j clients | grep class)
-windowrule = workspace 2, class:feishin
-windowrule = workspace 5, class:discord
-windowrule = workspace 5, class:legcord
-
-# windowrule = float,class:lutris
-# windowrule = size 965 545, class:lutris
-# windowrule = float,title:^.*culator.*$
-
-# Workspace
-{% if system == "desktop_full" %}
-workspace = 1, monitor:$monitorOne, default:true
-workspace = 2, monitor:$monitorOne
-
-workspace = 3, monitor:$monitorTwo, default:true
-workspace = 4, monitor:$monitorTwo
-
-workspace = 5, monitor:$monitorThree, default:true
-workspace = 6, monitor:$monitorThree
-{% endif %}
diff --git a/roles/kvantum/files/Catppuccin-Frappe-Rosewater/Catppuccin-Frappe-Rosewater.kvconfig b/roles/kvantum/files/Catppuccin-Frappe-Rosewater/Catppuccin-Frappe-Rosewater.kvconfig
deleted file mode 100644
index 91ab873..0000000
--- a/roles/kvantum/files/Catppuccin-Frappe-Rosewater/Catppuccin-Frappe-Rosewater.kvconfig
+++ /dev/null
@@ -1,464 +0,0 @@
-[%General]
-author=elkrien based on Arc Dark style
-comment=Catppuccin-Frappe-Rosewater
-spread_menuitems=true
-left_tabs=true
-mirror_doc_tabs=true
-scroll_width=8
-attach_active_tab=true
-composite=true
-menu_shadow_depth=7
-tooltip_shadow_depth=0
-splitter_width=7
-check_size=16
-slider_width=4
-slider_handle_width=18
-slider_handle_length=18
-textless_progressbar=false
-menubar_mouse_tracking=true
-slim_toolbars=false
-toolbutton_style=1
-x11drag=menubar_and_primary_toolbar
-double_click=false
-translucent_windows=false
-blurring=false
-popup_blurring=true
-opaque=kaffeine,kmplayer,subtitlecomposer,kdenlive,vlc,smplayer,smplayer2,avidemux,avidemux2_qt4,avidemux3_qt4,avidemux3_qt5,kamoso,QtCreator,VirtualBox,trojita,dragon,digikam,qmplay2
-group_toolbar_buttons=false
-vertical_spin_indicators=false
-fill_rubberband=false
-spread_progressbar=true
-merge_menubar_with_toolbar=true
-small_icon_size=16
-large_icon_size=32
-button_icon_size=16
-scroll_arrows=false
-iconless_pushbutton=true
-toolbar_icon_size=16
-combo_as_lineedit=true
-button_contents_shift=false
-groupbox_top_label=true
-inline_spin_indicators=true
-joined_inactive_tabs=false
-layout_spacing=2
-submenu_overlap=0
-tooltip_delay=-1
-animate_states=false
-transient_scrollbar=true
-alt_mnemonic=true
-combo_menu=true
-layout_margin=4
-no_window_pattern=false
-respect_DE=true
-scroll_min_extent=36
-scrollable_menu=false
-scrollbar_in_view=false
-spin_button_width=16
-submenu_delay=250
-tree_branch_line=true
-progressbar_thickness=8
-click_behavior=0
-contrast=1.00
-dialog_button_layout=0
-drag_from_buttons=false
-hide_combo_checkboxes=false
-intensity=1.00
-no_inactiveness=false
-reduce_menu_opacity=0
-reduce_window_opacity=10
-saturation=1.00
-shadowless_popup=false
-transient_groove=false
-
-[GeneralColors]
-window.color=#303446
-base.color=#292C3C
-alt.base.color=#292C3C
-button.color=#414559
-light.color=#51576D
-mid.light.color=#51576D
-dark.color=#292C3C
-mid.color=#292C3C
-highlight.color=#F2D5CF
-inactive.highlight.color=#F2D5CF
-text.color=#C6D0F5
-window.text.color=#C6D0F5
-button.text.color=#C6D0F5
-disabled.text.color=#626880
-tooltip.text.color=#C6D0F5
-highlight.text.color=#292C3C
-link.color=#F2D5CF
-link.visited.color=#8CAAEE
-
-[ItemView]
-inherits=PanelButtonCommand
-frame.element=itemview
-interior.element=itemview
-frame=true
-interior=true
-text.iconspacing=3
-text.toggle.color=#292C3C
-
-[RadioButton]
-inherits=PanelButtonCommand
-frame=false
-interior.element=radio
-
-[CheckBox]
-inherits=PanelButtonCommand
-frame=false
-interior.element=checkbox
-
-[TreeExpander]
-indicator.element=tree
-indicator.size=8
-
-[ToolTip]
-frame.top=4
-frame.right=4
-frame.bottom=4
-frame.left=4
-frame=true
-
-[PanelButtonCommand]
-inherits=PanelButtonCommand
-interior.element=button
-frame.element=button
-text.normal.color=#C6D0F5
-text.focus.color=#C6D0F5
-text.press.color=#292C3C
-text.toggle.color=#292C3C
-
-[PanelButtonTool]
-inherits=PanelButtonCommand
-
-[DockTitle]
-inherits=PanelButtonCommand
-interior=false
-frame=false
-text.margin.top=5
-text.margin.bottom=5
-text.margin.left=5
-text.margin.right=5
-indicator.size=0
-
-[Dock]
-interior.element=toolbar
-frame.element=toolbar
-frame=true
-interior=true
-
-[GroupBox]
-inherits=PanelButtonCommand
-interior.element=tabframe
-interior=true
-frame=false
-
-[Focus]
-inherits=PanelButtonCommand
-frame=true
-frame.element=focus
-frame.top=1
-frame.bottom=1
-frame.left=1
-frame.right=1
-frame.patternsize=20
-
-[GenericFrame]
-inherits=PanelButtonCommand
-frame.element=common
-frame.top=1
-frame.bottom=1
-frame.left=1
-frame.right=1
-
-[Slider]
-inherits=PanelButtonCommand
-interior=true
-frame.element=slider
-interior.element=slider
-frame.top=3
-frame.bottom=3
-frame.left=3
-frame.right=3
-focusFrame=true
-
-[SliderCursor]
-inherits=PanelButtonCommand
-interior=true
-interior.element=slidercursor
-frame=false
-
-[LineEdit]
-inherits=PanelButtonCommand
-frame.element=lineedit
-interior.element=lineedit
-
-[IndicatorSpinBox]
-inherits=LineEdit
-frame.element=lineedit
-interior.element=lineedit
-frame.top=0
-frame.bottom=2
-frame.left=2
-frame.right=2
-indicator.size=8
-
-[DropDownButton]
-inherits=PanelButtonCommand
-frame.top=2
-frame.bottom=2
-frame.left=0
-frame.right=1
-indicator.size=8
-
-[ToolboxTab]
-inherits=PanelButtonCommand
-frame.element=tabframe
-frame.top=1
-frame.bottom=1
-frame.left=1
-frame.right=1
-
-[Tab]
-inherits=PanelButtonCommand
-interior.element=tab
-frame.element=tab
-frame.top=2
-frame.bottom=3
-frame.left=3
-frame.right=3
-indicator.size=10
-text.normal.color=#626880
-text.focus.color=#C6D0F5
-text.press.color=#C6D0F5
-text.toggle.color=#C6D0F5
-focusFrame=true
-
-[TabBarFrame]
-inherits=GenericFrame
-frame=true
-frame.element=tabBarFrame
-interior=false
-frame.top=4
-frame.bottom=4
-frame.left=4
-frame.right=4
-
-[TabFrame]
-inherits=PanelButtonCommand
-frame.element=tabframe
-interior.element=tabframe
-
-[Dialog]
-inherits=TabBarFrame
-frame.element=tabframe
-interior=false
-frame=false
-frame.top=1
-frame.bottom=1
-frame.left=1
-frame.right=1
-
-[HeaderSection]
-inherits=PanelButtonCommand
-interior.element=header
-frame.element=header
-frame.top=0
-frame.bottom=1
-frame.left=1
-frame.right=1
-frame.expansion=0
-text.normal.color=#C6D0F5
-text.focus.color=#F2D5CF
-text.press.color=#C6D0F5
-text.toggle.color=#C6D0F5
-indicator.element=harrow
-
-[SizeGrip]
-inherits=PanelButtonCommand
-frame=false
-interior=false
-indicator.element=resize-grip
-indicator.size=0
-
-[Toolbar]
-inherits=PanelButtonCommand
-interior.element=menubar
-frame.element=menubar
-frame=true
-frame.bottom=4
-frame.left=4
-frame.right=4
-text.normal.color=#C6D0F5
-text.focus.color=#C6D0F5
-text.press.color=#F2D5CF
-text.toggle.color=#F2D5CF
-text.bold=false
-
-[MenuBar]
-inherits=PanelButtonCommand
-frame.element=menubar
-interior.element=menubar
-frame.bottom=0
-text.normal.color=#C6D0F5
-frame.expansion=0
-text.bold=false
-
-[ToolbarButton]
-frame.element=tbutton
-interior.element=tbutton
-indicator.element=arrow
-text.normal.color=#C6D0F5
-text.focus.color=#C6D0F5
-text.press.color=#292C3C
-text.toggle.color=#292C3C
-text.bold=false
-
-[Scrollbar]
-inherits=PanelButtonCommand
-indicator.size=0
-interior=false
-frame=false
-
-[ScrollbarGroove]
-inherits=PanelButtonCommand
-interior=false
-frame=false
-
-[ScrollbarSlider]
-inherits=PanelButtonCommand
-interior=false
-frame.element=scrollbarslider
-frame.top=4
-frame.bottom=4
-frame.left=4
-frame.right=4
-
-[ProgressbarContents]
-inherits=PanelButtonCommand
-frame=true
-frame.element=progress-pattern
-interior.element=progress-pattern
-frame.top=2
-frame.bottom=2
-frame.left=2
-frame.right=2
-
-[Progressbar]
-inherits=PanelButtonCommand
-frame.element=progress
-interior.element=progress
-frame.top=2
-frame.bottom=2
-frame.left=2
-frame.right=2
-text.margin=0
-text.normal.color=#C6D0F5
-text.focus.color=#C6D0F5
-text.press.color=#292C3C
-text.toggle.color=#292C3C
-text.bold=false
-frame.expansion=18
-
-[RadioButton]
-inherits=PanelButtonCommand
-
-[Menu]
-frame.element=menu
-interior.element=menu
-inherits=PanelButtonCommand
-text.press.color=#292C3C
-text.toggle.color=#292C3C
-text.bold=false
-frame.top=3
-frame.bottom=3
-frame.left=3
-frame.right=3
-
-[MenuItem]
-inherits=PanelButtonCommand
-interior.element=menuitem
-indicator.size=8
-text.focus.color=#C6D0F5
-text.press.color=#C6D0F5
-
-[MenuBarItem]
-inherits=PanelButtonCommand
-interior.element=menubaritem
-frame=false
-text.margin.top=3
-text.margin.bottom=3
-text.margin.left=5
-text.margin.right=5
-
-[StatusBar]
-inherits=Toolbar
-frame.element=toolbar
-font.bold=true
-text.normal.color=#C6D0F5
-frame=true
-frame.top=0
-frame.bottom=0
-
-[TitleBar]
-inherits=PanelButtonCommand
-frame=false
-interior=false
-text.margin.top=2
-text.margin.bottom=2
-text.margin.left=3
-text.margin.right=3
-
-[ComboBox]
-inherits=PanelButtonCommand
-indicator.size=8
-frame.top=3
-frame.bottom=3
-frame.left=3
-frame.right=3
-text.margin.top=1
-text.margin.bottom=1
-text.margin.left=3
-text.margin.right=3
-text.toggle.color=#C6D0F5
-
-[ToolboxTab]
-inherits=PanelButtonCommand
-text.normal.color=#C6D0F5
-text.press.color=#C6D0F5
-text.focus.color=#C6D0F5
-
-[Hacks]
-transparent_dolphin_view=false
-blur_konsole=true
-transparent_ktitle_label=true
-transparent_menutitle=true
-respect_darkness=true
-kcapacitybar_as_progressbar=true
-force_size_grip=false
-iconless_pushbutton=true
-iconless_menu=false
-disabled_icon_opacity=100
-lxqtmainmenu_iconsize=0
-normal_default_pushbutton=true
-single_top_toolbar=false
-tint_on_mouseover=0
-transparent_pcmanfm_sidepane=true
-transparent_pcmanfm_view=false
-blur_translucent=true
-centered_forms=false
-kinetic_scrolling=false
-middle_click_scroll=false
-no_selection_tint=false
-noninteger_translucency=false
-style_vertical_toolbars=false
-blur_only_active_window=false
-
-[Window]
-interior=true
-interior.element=window
-frame.top=0
-frame.bottom=0
-frame.left=0
-frame.right=0
diff --git a/roles/kvantum/files/Catppuccin-Frappe-Rosewater/Catppuccin-Frappe-Rosewater.svg b/roles/kvantum/files/Catppuccin-Frappe-Rosewater/Catppuccin-Frappe-Rosewater.svg
deleted file mode 100644
index a029b1c..0000000
--- a/roles/kvantum/files/Catppuccin-Frappe-Rosewater/Catppuccin-Frappe-Rosewater.svg
+++ /dev/null
@@ -1,1958 +0,0 @@
-
diff --git a/roles/kvantum/files/Catppuccin-Frappe-Rosewater/LICENSE b/roles/kvantum/files/Catppuccin-Frappe-Rosewater/LICENSE
deleted file mode 100644
index 006383b..0000000
--- a/roles/kvantum/files/Catppuccin-Frappe-Rosewater/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2021 Catppuccin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/roles/kvantum/files/kvantum.kvconfig b/roles/kvantum/files/kvantum.kvconfig
deleted file mode 100644
index 14acad4..0000000
--- a/roles/kvantum/files/kvantum.kvconfig
+++ /dev/null
@@ -1,2 +0,0 @@
-[General]
-theme=Catppuccin-Macchiato-Rosewater
diff --git a/roles/kvantum/tasks/main.yml b/roles/kvantum/tasks/main.yml
deleted file mode 100644
index 540808c..0000000
--- a/roles/kvantum/tasks/main.yml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-- name: "[Kvantum] Install"
- kewlfft.aur.aur:
- name:
- - kvantum-qt5-git
- state: present
-
-- name: "[Kvantum] Create config folder"
- ansible.builtin.file:
- mode: "0755"
- path: "{{ ansible_user_dir }}/.config/Kvantum"
- state: directory
-
-- name: "[Kvantum] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/Kvantum"
diff --git a/roles/minegrub/tasks/main.yml b/roles/minegrub/tasks/main.yml
deleted file mode 100644
index 59efed9..0000000
--- a/roles/minegrub/tasks/main.yml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-- name: "[Minegrub] Install"
- ansible.builtin.copy:
- src: "./"
- dest: "/boot/grub/themes/"
- force: false
- become: true
-
-- name: "[Minegrub] Configure"
- shell: sed -i '/^\(#\)\?GRUB_THEME/ s~.*~GRUB_THEME=/boot/grub/themes/minegrub/theme.txt~' /etc/default/grub
- ignore_errors: true
- become: true
-
-- name: "[Minegrub] Updating grub"
- shell: grub-mkconfig -o /boot/grub/grub.cfg
- ignore_errors: true
- become: true
diff --git a/roles/nvim/files/.luarc.json b/roles/nvim/files/.luarc.json
deleted file mode 100644
index 8415579..0000000
--- a/roles/nvim/files/.luarc.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "format.enable": false
-}
diff --git a/roles/nvim/files/.neoconf.json b/roles/nvim/files/.neoconf.json
deleted file mode 100644
index 2d7a81f..0000000
--- a/roles/nvim/files/.neoconf.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "neodev": {
- "library": {
- "enabled": true,
- "plugins": true
- }
- },
- "neoconf": {
- "plugins": {
- "lua_ls": {
- "enabled": true
- }
- }
- },
- "lspconfig": {
- "lua_ls": {
- "Lua.format.enable": false
- }
- }
-}
diff --git a/roles/nvim/files/.stylua.toml b/roles/nvim/files/.stylua.toml
deleted file mode 100644
index bfcffff..0000000
--- a/roles/nvim/files/.stylua.toml
+++ /dev/null
@@ -1,7 +0,0 @@
-column_width = 120
-line_endings = "Unix"
-indent_type = "Spaces"
-indent_width = 2
-quote_style = "AutoPreferDouble"
-call_parentheses = "None"
-collapse_simple_statement = "Always"
diff --git a/roles/nvim/tasks/main.yml b/roles/nvim/tasks/main.yml
deleted file mode 100644
index 2c9c828..0000000
--- a/roles/nvim/tasks/main.yml
+++ /dev/null
@@ -1,18 +0,0 @@
----
-- name: "[Nvim] Install"
- ansible.builtin.package:
- name:
- - neovim
- state: latest
- become: true
-
-- name: "[Nvim] Create config folder"
- ansible.builtin.file:
- mode: "0755"
- path: "{{ ansible_user_dir }}/.config/nvim"
- state: directory
-
-- name: "[Nvim] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/nvim"
diff --git a/roles/nwg-look/files/.config/gtk-3.0/settings.ini b/roles/nwg-look/files/.config/gtk-3.0/settings.ini
deleted file mode 100644
index 4529af6..0000000
--- a/roles/nwg-look/files/.config/gtk-3.0/settings.ini
+++ /dev/null
@@ -1,17 +0,0 @@
-[Settings]
-gtk-theme-name=Catppuccin-Macchiato-Standard-Sapphire-Dark
-gtk-icon-theme-name=Papirus
-gtk-font-name=CaskaydiaCove Nerd Font 12
-gtk-cursor-theme-name=Breeze
-gtk-cursor-theme-size=24
-gtk-toolbar-style=GTK_TOOLBAR_ICONS
-gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
-gtk-button-images=0
-gtk-menu-images=0
-gtk-enable-event-sounds=1
-gtk-enable-input-feedback-sounds=0
-gtk-xft-antialias=1
-gtk-xft-hinting=1
-gtk-xft-hintstyle=hintslight
-gtk-xft-rgba=rgb
-gtk-application-prefer-dark-theme=0
diff --git a/roles/nwg-look/files/.config/xsettingsd/xsettingsd.conf b/roles/nwg-look/files/.config/xsettingsd/xsettingsd.conf
deleted file mode 100644
index 2daf23c..0000000
--- a/roles/nwg-look/files/.config/xsettingsd/xsettingsd.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-Net/ThemeName "Catppuccin-Macchiato-Standard-Sapphire-Dark"
-Net/IconThemeName "Papirus"
-Gtk/CursorThemeName "Breeze"
-Net/EnableEventSounds 1
-EnableInputFeedbackSounds 0
-Xft/Antialias 1
-Xft/Hinting 1
-Xft/HintStyle "hintslight"
-Xft/RGBA "rgb"
diff --git a/roles/nwg-look/files/.gtkrc-2.0 b/roles/nwg-look/files/.gtkrc-2.0
deleted file mode 100644
index a77960c..0000000
--- a/roles/nwg-look/files/.gtkrc-2.0
+++ /dev/null
@@ -1,19 +0,0 @@
-# DO NOT EDIT! This file will be overwritten by nwg-look.
-# Any customization should be done in ~/.gtkrc-2.0.mine instead.
-
-include "/home/keule/.gtkrc-2.0.mine"
-gtk-theme-name="Catppuccin-Macchiato-Standard-Sapphire-Dark"
-gtk-icon-theme-name="Papirus"
-gtk-font-name="CaskaydiaCove Nerd Font 12"
-gtk-cursor-theme-name="Breeze"
-gtk-cursor-theme-size=24
-gtk-toolbar-style=GTK_TOOLBAR_ICONS
-gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
-gtk-button-images=0
-gtk-menu-images=0
-gtk-enable-event-sounds=1
-gtk-enable-input-feedback-sounds=0
-gtk-xft-antialias=1
-gtk-xft-hinting=1
-gtk-xft-hintstyle="hintslight"
-gtk-xft-rgba="rgb"
diff --git a/roles/nwg-look/tasks/main.yml b/roles/nwg-look/tasks/main.yml
deleted file mode 100644
index e8da518..0000000
--- a/roles/nwg-look/tasks/main.yml
+++ /dev/null
@@ -1,11 +0,0 @@
----
-- name: "[NWG-look] Install"
- kewlfft.aur.aur:
- name:
- - nwg-look
- state: present
-
-- name: "[NWG-look] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/"
diff --git a/roles/qt5ct/files/qt5ct.conf b/roles/qt5ct/files/qt5ct.conf
deleted file mode 100644
index d59646b..0000000
--- a/roles/qt5ct/files/qt5ct.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-[Appearance]
-color_scheme_path=/usr/share/qt5ct/colors/darker.conf
-custom_palette=false
-icon_theme=Papirus
-standard_dialogs=default
-style=kvantum-dark
-
-[Fonts]
-fixed="CaskaydiaCove Nerd Font Mono,12,-1,5,50,0,0,0,0,0,Regular"
-general="CaskaydiaCove Nerd Font,12,-1,5,50,0,0,0,0,0,Regular"
-
-[Interface]
-activate_item_on_single_click=1
-buttonbox_layout=0
-cursor_flash_time=1000
-dialog_buttons_have_icons=1
-double_click_interval=400
-gui_effects=@Invalid()
-keyboard_scheme=2
-menus_have_icons=true
-show_shortcuts_in_context_menus=true
-stylesheets=@Invalid()
-toolbutton_style=4
-underline_shortcut=1
-wheel_scroll_lines=3
-
-[SettingsWindow]
-geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\a\x80\0\0\0\0\0\0\fw\0\0\x2\xb7\0\0\0\0\0\0\0\0\0\0\x4\xff\0\0\x2\xbe\0\0\0\0\x2\0\0\0\n\0\0\0\a\x80\0\0\0\0\0\0\fw\0\0\x2\xb7)
-
-[Troubleshooting]
-force_raster_widgets=1
-ignored_applications=@Invalid()
diff --git a/roles/qt5ct/tasks/main.yml b/roles/qt5ct/tasks/main.yml
deleted file mode 100644
index 428476f..0000000
--- a/roles/qt5ct/tasks/main.yml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-- name: "[QT5CT] Install"
- kewlfft.aur.aur:
- name:
- - qt5ct
- state: present
-
-- name: "[QT5CT] Create config folder"
- ansible.builtin.file:
- mode: "0755"
- path: "{{ ansible_user_dir }}/.config/qt5ct"
- state: directory
-
-- name: "[QT5CT] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/qt5ct"
diff --git a/roles/sddm/files/sddm.conf.d/default.conf b/roles/sddm/files/sddm.conf.d/default.conf
deleted file mode 100755
index ba64598..0000000
--- a/roles/sddm/files/sddm.conf.d/default.conf
+++ /dev/null
@@ -1,139 +0,0 @@
-[Autologin]
-# Whether sddm should automatically log back into sessions when they exit
-Relogin=false
-
-# Name of session file for autologin session (if empty try last logged in)
-Session=
-
-# Username for autologin session
-User=
-
-
-[General]
-# Which display server should be used.
-# Valid values are: x11, x11-user, wayland. Wayland support is experimental
-DisplayServer=x11
-
-# Comma-separated list of environment variables to be set
-GreeterEnvironment=
-
-# Halt command
-HaltCommand=/usr/bin/systemctl poweroff
-
-# Input method module
-InputMethod=
-
-# Comma-separated list of Linux namespaces for user session to enter
-Namespaces=
-
-# Initial NumLock state. Can be on, off or none.
-# If property is set to none, numlock won't be changed
-# NOTE: Currently ignored if autologin is enabled.
-Numlock=on
-
-# Reboot command
-RebootCommand=/usr/bin/systemctl reboot
-
-
-[Theme]
-# Current theme name
-Current=catppuccin-macchiato
-
-# Cursor size used in the greeter
-CursorSize=24
-
-# Cursor theme used in the greeter
-CursorTheme=Breeze
-
-# Number of users to use as threshold
-# above which avatars are disabled
-# unless explicitly enabled with EnableAvatars
-DisableAvatarsThreshold=7
-
-# Enable display of custom user avatars
-EnableAvatars=true
-
-# Global directory for user avatars
-# The files should be named .face.icon
-FacesDir=/usr/share/sddm/faces
-
-# Font used in the greeter
-Font=CaskaydiaCove Nerd Font 12
-
-# Theme directory path
-ThemeDir=/usr/share/sddm/themes
-
-
-[Users]
-# Default $PATH for logged in users
-DefaultPath=/usr/local/sbin:/usr/local/bin:/usr/bin
-
-# Comma-separated list of shells.
-# Users with these shells as their default won't be listed
-HideShells=
-
-# Comma-separated list of users that should not be listed
-HideUsers=
-
-# Maximum user id for displayed users
-MaximumUid=60513
-
-# Minimum user id for displayed users
-MinimumUid=1000
-
-# Remember the session of the last successfully logged in user
-RememberLastSession=true
-
-# Remember the last successfully logged in user
-RememberLastUser=true
-
-# When logging in as the same user twice, restore the original session, rather than create a new one
-ReuseSession=true
-
-
-[Wayland]
-# Path of the Wayland compositor to execute when starting the greeter
-CompositorCommand=weston --shell=fullscreen-shell.so
-
-# Enable Qt's automatic high-DPI scaling
-EnableHiDPI=true
-
-# Path to a script to execute when starting the desktop session
-SessionCommand=/usr/share/sddm/scripts/wayland-session
-
-# Comma-separated list of directories containing available Wayland sessions
-SessionDir=/usr/local/share/wayland-sessions,/usr/share/wayland-sessions
-
-# Path to the user session log file
-SessionLogFile=.local/share/sddm/wayland-session.log
-
-
-[X11]
-# Path to a script to execute when starting the display server
-DisplayCommand=/usr/share/sddm/scripts/Xsetup
-
-# Path to a script to execute when stopping the display server
-DisplayStopCommand=/usr/share/sddm/scripts/Xstop
-
-# Enable Qt's automatic high-DPI scaling
-EnableHiDPI=true
-
-# Arguments passed to the X server invocation
-ServerArguments=-nolisten tcp
-
-# Path to X server binary
-ServerPath=/usr/bin/X
-
-# Path to a script to execute when starting the desktop session
-SessionCommand=/usr/share/sddm/scripts/Xsession
-
-# Comma-separated list of directories containing available X sessions
-SessionDir=/usr/local/share/xsessions,/usr/share/xsessions
-
-# Path to the user session log file
-SessionLogFile=.local/share/sddm/xorg-session.log
-
-# Path to Xephyr binary
-XephyrPath=/usr/bin/Xephyr
-
-
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Components/Clock.qml b/roles/sddm/files/themes/catppuccin-macchiato/Components/Clock.qml
deleted file mode 100644
index f076d28..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Components/Clock.qml
+++ /dev/null
@@ -1,14 +0,0 @@
-import QtQuick 2.15
-import SddmComponents 2.0
-
-Clock {
- id: time
- color: config.text
- timeFont.family: config.Font
- dateFont.family: config.Font
- anchors {
- margins: 10
- top: parent.top
- right: parent.right
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Components/LoginPanel.qml b/roles/sddm/files/themes/catppuccin-macchiato/Components/LoginPanel.qml
deleted file mode 100644
index e0dec79..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Components/LoginPanel.qml
+++ /dev/null
@@ -1,147 +0,0 @@
-import QtQuick 2.15
-import QtQuick.Window 2.15
-import QtQuick.Controls 2.15
-
-Item {
- property var user: userField.text
- property var password: passwordField.text
- property var session: sessionPanel.session
- property var inputHeight: Screen.height * 0.032
- property var inputWidth: Screen.width * 0.16
- Rectangle {
- id: loginBackground
- anchors {
- verticalCenter: parent.verticalCenter
- horizontalCenter: parent.horizontalCenter
- }
- height: inputHeight * 5.3
- width: inputWidth * 1.2
- radius: 5
- visible: config.LoginBackground == "true" ? true : false
- color: config.mantle
- }
- Column {
- spacing: 8
- anchors {
- bottom: parent.bottom
- left: parent.left
- }
- PowerButton {
- id: powerButton
- }
- RebootButton {
- id: rebootButton
- }
- SleepButton {
- id: sleepButton
- }
- z: 5
- }
- Column {
- spacing: 8
- anchors {
- bottom: parent.bottom
- right: parent.right
- }
- SessionPanel {
- id: sessionPanel
- }
- z: 5
- }
- Column {
- spacing: 8
- z: 5
- width: inputWidth
- anchors {
- verticalCenter: parent.verticalCenter
- horizontalCenter: parent.horizontalCenter
- }
- UserField {
- id: userField
- height: inputHeight
- width: parent.width
- }
- PasswordField {
- id: passwordField
- height: inputHeight
- width: parent.width
- onAccepted: loginButton.clicked()
- }
- Button {
- id: loginButton
- height: inputHeight
- width: parent.width
- enabled: user != "" && password != "" ? true : false
- hoverEnabled: true
- contentItem: Text {
- id: buttonText
- renderType: Text.NativeRendering
- font {
- family: config.Font
- pointSize: config.FontSize
- bold: true
- }
- horizontalAlignment: Text.AlignHCenter
- verticalAlignment: Text.AlignVCenter
- color: config.crust
- text: "Login"
- }
- background: Rectangle {
- id: buttonBackground
- color: config.sapphire
- radius: 3
- }
- states: [
- State {
- name: "pressed"
- when: loginButton.down
- PropertyChanges {
- target: buttonBackground
- color: config.teal
- }
- PropertyChanges {
- target: buttonText
- }
- },
- State {
- name: "hovered"
- when: loginButton.hovered
- PropertyChanges {
- target: buttonBackground
- color: config.teal
- }
- PropertyChanges {
- target: buttonText
- }
- },
- State {
- name: "enabled"
- when: loginButton.enabled
- PropertyChanges {
- target: buttonBackground
- }
- PropertyChanges {
- target: buttonText
- }
- }
- ]
- transitions: Transition {
- PropertyAnimation {
- properties: "color"
- duration: 300
- }
- }
- onClicked: {
- sddm.login(user, password, session)
- }
- }
- }
- Connections {
- target: sddm
-
- function onLoginFailed() {
- passwordField.text = ""
- passwordField.focus = true
- }
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Components/PasswordField.qml b/roles/sddm/files/themes/catppuccin-macchiato/Components/PasswordField.qml
deleted file mode 100644
index dd0f384..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Components/PasswordField.qml
+++ /dev/null
@@ -1,48 +0,0 @@
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-
-TextField {
- id: passwordField
- focus: true
- selectByMouse: true
- placeholderText: "Password"
- echoMode: TextInput.Password
- passwordCharacter: "•"
- passwordMaskDelay: config.PasswordShowLastLetter
- selectionColor: config.overlay0
- renderType: Text.NativeRendering
- font.family: config.Font
- font.pointSize: config.FontSize
- font.bold: true
- color: config.text
- horizontalAlignment: TextInput.AlignHCenter
- background: Rectangle {
- id: passFieldBackground
- radius: 3
- color: config.surface0
- }
- states: [
- State {
- name: "focused"
- when: passwordField.activeFocus
- PropertyChanges {
- target: passFieldBackground
- color: config.surface1
- }
- },
- State {
- name: "hovered"
- when: passwordField.hovered
- PropertyChanges {
- target: passFieldBackground
- color: config.surface1
- }
- }
- ]
- transitions: Transition {
- PropertyAnimation {
- properties: "color"
- duration: 300
- }
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Components/PowerButton.qml b/roles/sddm/files/themes/catppuccin-macchiato/Components/PowerButton.qml
deleted file mode 100644
index dc74269..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Components/PowerButton.qml
+++ /dev/null
@@ -1,41 +0,0 @@
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-
-Item {
- implicitHeight: powerButton.height
- implicitWidth: powerButton.width
- Button {
- id: powerButton
- height: inputHeight
- width: inputHeight
- hoverEnabled: true
- icon {
- source: Qt.resolvedUrl("../icons/power.svg")
- height: height
- width: width
- color: config.crust
- }
- background: Rectangle {
- id: powerButtonBackground
- radius: 3
- color: config.red
- }
- states: [
- State {
- name: "hovered"
- when: powerButton.hovered
- PropertyChanges {
- target: powerButtonBackground
- color: config.rosewater
- }
- }
- ]
- transitions: Transition {
- PropertyAnimation {
- properties: "color"
- duration: 300
- }
- }
- onClicked: sddm.powerOff()
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Components/RebootButton.qml b/roles/sddm/files/themes/catppuccin-macchiato/Components/RebootButton.qml
deleted file mode 100644
index a2c9b9f..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Components/RebootButton.qml
+++ /dev/null
@@ -1,41 +0,0 @@
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-
-Item {
- implicitHeight: rebootButton.height
- implicitWidth: rebootButton.width
- Button {
- id: rebootButton
- height: inputHeight
- width: inputHeight
- hoverEnabled: true
- icon {
- source: Qt.resolvedUrl("../icons/reboot.svg")
- height: height
- width: width
- color: config.crust
- }
- background: Rectangle {
- id: rebootButtonBackground
- radius: 3
- color: config.red
- }
- states: [
- State {
- name: "hovered"
- when: rebootButton.hovered
- PropertyChanges {
- target: rebootButtonBackground
- color: config.rosewater
- }
- }
- ]
- transitions: Transition {
- PropertyAnimation {
- properties: "color"
- duration: 300
- }
- }
- onClicked: sddm.reboot()
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Components/SessionPanel.qml b/roles/sddm/files/themes/catppuccin-macchiato/Components/SessionPanel.qml
deleted file mode 100644
index 0edfcb3..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Components/SessionPanel.qml
+++ /dev/null
@@ -1,156 +0,0 @@
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-import QtQml.Models 2.15
-
-Item {
- property var session: sessionList.currentIndex
- implicitHeight: sessionButton.height
- implicitWidth: sessionButton.width
- DelegateModel {
- id: sessionWrapper
- model: sessionModel
- delegate: ItemDelegate {
- id: sessionEntry
- height: inputHeight
- width: parent.width
- highlighted: sessionList.currentIndex == index
- contentItem: Text {
- renderType: Text.NativeRendering
- font.family: config.Font
- font.pointSize: config.FontSize
- font.bold: true
- horizontalAlignment: Text.AlignHCenter
- verticalAlignment: Text.AlignVCenter
- color: config.text
- text: name
- }
- background: Rectangle {
- id: sessionEntryBackground
- color: config.surface1
- radius: 3
- }
- states: [
- State {
- name: "hovered"
- when: sessionEntry.hovered
- PropertyChanges {
- target: sessionEntryBackground
- color: config.surface2
- }
- }
- ]
- transitions: Transition {
- PropertyAnimation {
- property: "color"
- duration: 300
- }
- }
- MouseArea {
- anchors.fill: parent
- onClicked: {
- sessionList.currentIndex = index
- sessionPopup.close()
- }
- }
- }
- }
- Button {
- id: sessionButton
- height: inputHeight
- width: inputHeight
- hoverEnabled: true
- icon {
- source: Qt.resolvedUrl("../icons/settings.svg")
- height: height
- width: width
- color: config.text
- }
- background: Rectangle {
- id: sessionButtonBackground
- color: config.surface0
- radius: 3
- }
- states: [
- State {
- name: "pressed"
- when: sessionButton.down
- PropertyChanges {
- target: sessionButtonBackground
- color: config.surface1
- }
- },
- State {
- name: "hovered"
- when: sessionButton.hovered
- PropertyChanges {
- target: sessionButtonBackground
- color: config.surface2
- }
- },
- State {
- name: "selection"
- when: sessionPopup.visible
- PropertyChanges {
- target: sessionButtonBackground
- color: config.surface2
- }
- }
- ]
- transitions: Transition {
- PropertyAnimation {
- properties: "color"
- duration: 150
- }
- }
- onClicked: {
- sessionPopup.visible ? sessionPopup.close() : sessionPopup.open()
- sessionButton.state = "pressed"
- }
- }
- Popup {
- id: sessionPopup
- width: inputWidth + padding * 2
- x: (sessionButton.width + sessionList.spacing) * -7.6
- y: -(contentHeight + padding * 2) + sessionButton.height
- padding: inputHeight / 10
- background: Rectangle {
- radius: 5.4
- color: config.surface0
- }
- contentItem: ListView {
- id: sessionList
- implicitHeight: contentHeight
- spacing: 8
- model: sessionWrapper
- currentIndex: sessionModel.lastIndex
- clip: true
- }
- enter: Transition {
- ParallelAnimation {
- NumberAnimation {
- property: "opacity"
- from: 0
- to: 1
- duration: 400
- easing.type: Easing.OutExpo
- }
- NumberAnimation {
- property: "x"
- from: sessionPopup.x + (inputWidth * 0.1)
- to: sessionPopup.x
- duration: 500
- easing.type: Easing.OutExpo
- }
- }
- }
- exit: Transition {
- NumberAnimation {
- property: "opacity"
- from: 1
- to: 0
- duration: 300
- easing.type: Easing.OutExpo
- }
- }
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Components/SleepButton.qml b/roles/sddm/files/themes/catppuccin-macchiato/Components/SleepButton.qml
deleted file mode 100644
index f4a4b7a..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Components/SleepButton.qml
+++ /dev/null
@@ -1,41 +0,0 @@
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-
-Item {
- implicitHeight: sleepButton.height
- implicitWidth: sleepButton.width
- Button {
- id: sleepButton
- height: inputHeight
- width: inputHeight
- hoverEnabled: true
- icon {
- source: Qt.resolvedUrl("../icons/sleep.svg")
- height: height
- width: width
- color: config.crust
- }
- background: Rectangle {
- id: sleepButtonBg
- color: config.red
- radius: 3
- }
- states: [
- State {
- name: "hovered"
- when: sleepButton.hovered
- PropertyChanges {
- target: sleepButtonBg
- color: config.rosewater
- }
- }
- ]
- transitions: Transition {
- PropertyAnimation {
- properties: "color"
- duration: 300
- }
- }
- onClicked: sddm.suspend()
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Components/UserField.qml b/roles/sddm/files/themes/catppuccin-macchiato/Components/UserField.qml
deleted file mode 100644
index 9f8ca61..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Components/UserField.qml
+++ /dev/null
@@ -1,50 +0,0 @@
-import QtQuick 2.15
-import QtQuick.Controls 2.15
-
-TextField {
- id: userField
- height: inputHeight
- width: inputWidth
- selectByMouse: true
- echoMode: TextInput.Normal
- selectionColor: config.overlay0
- renderType: Text.NativeRendering
- font {
- family: config.Font
- pointSize: config.FontSize
- bold: true
- }
- color: config.text
- horizontalAlignment: Text.AlignHCenter
- placeholderText: "Username"
- text: userModel.lastUser
- background: Rectangle {
- id: userFieldBackground
- color: config.surface0
- radius: 3
- }
- states: [
- State {
- name: "focused"
- when: userField.activeFocus
- PropertyChanges {
- target: userFieldBackground
- color: config.surface1
- }
- },
- State {
- name: "hovered"
- when: userField.hovered
- PropertyChanges {
- target: userFieldBackground
- color: config.surface1
- }
- }
- ]
- transitions: Transition {
- PropertyAnimation {
- properties: "color"
- duration: 300
- }
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/LICENSE b/roles/sddm/files/themes/catppuccin-macchiato/LICENSE
deleted file mode 100644
index 006383b..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2021 Catppuccin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/Main.qml b/roles/sddm/files/themes/catppuccin-macchiato/Main.qml
deleted file mode 100644
index 422054b..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/Main.qml
+++ /dev/null
@@ -1,48 +0,0 @@
-import QtQuick 2.15
-import QtQuick.Window 2.15
-import QtQuick.Controls 2.15
-import "Components"
-
-Item {
- id: root
- height: Screen.height
- width: Screen.width
- Rectangle {
- id: background
- anchors.fill: parent
- height: parent.height
- width: parent.width
- z: 0
- color: config.base
- }
- Image {
- id: backgroundImage
- anchors.fill: parent
- height: parent.height
- width: parent.width
- fillMode: Image.PreserveAspectCrop
- visible: config.CustomBackground == "true" ? true : false
- z: 1
- source: config.Background
- asynchronous: false
- cache: true
- mipmap: true
- clip: true
- }
- Item {
- id: mainPanel
- z: 3
- anchors {
- fill: parent
- margins: 50
- }
- Clock {
- id: time
- visible: config.ClockEnabled == "true" ? true : false
- }
- LoginPanel {
- id: loginPanel
- anchors.fill: parent
- }
- }
-}
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/assets/angle-down.png b/roles/sddm/files/themes/catppuccin-macchiato/assets/angle-down.png
deleted file mode 100644
index f621bfc..0000000
Binary files a/roles/sddm/files/themes/catppuccin-macchiato/assets/angle-down.png and /dev/null differ
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/backgrounds/.gitkeep b/roles/sddm/files/themes/catppuccin-macchiato/backgrounds/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/icons/power.svg b/roles/sddm/files/themes/catppuccin-macchiato/icons/power.svg
deleted file mode 100644
index 70495dd..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/icons/power.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
\ No newline at end of file
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/icons/reboot.svg b/roles/sddm/files/themes/catppuccin-macchiato/icons/reboot.svg
deleted file mode 100644
index 5506bbb..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/icons/reboot.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
\ No newline at end of file
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/icons/settings.svg b/roles/sddm/files/themes/catppuccin-macchiato/icons/settings.svg
deleted file mode 100644
index 9a64fbd..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/icons/settings.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/icons/sleep.svg b/roles/sddm/files/themes/catppuccin-macchiato/icons/sleep.svg
deleted file mode 100644
index 4102f2d..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/icons/sleep.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
\ No newline at end of file
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/metadata.desktop b/roles/sddm/files/themes/catppuccin-macchiato/metadata.desktop
deleted file mode 100644
index d6693d5..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/metadata.desktop
+++ /dev/null
@@ -1,14 +0,0 @@
-[SddmGreeterTheme]
-Name=Catppuccin macchiato
-Description=Soothing pastel theme for SDDM
-Type=sddm-theme
-Version=2.1
-Website=https://github.com/catppuccin/sddm
-Screenshot=preview.png
-MainScript=Main.qml
-ConfigFile=theme.conf
-TranslationsDirectory=translations
-Theme-Id=Catppuccin
-Theme-API=2.0
-License=MIT
-QtVersion=6
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/preview.png b/roles/sddm/files/themes/catppuccin-macchiato/preview.png
deleted file mode 100644
index bc262d2..0000000
Binary files a/roles/sddm/files/themes/catppuccin-macchiato/preview.png and /dev/null differ
diff --git a/roles/sddm/files/themes/catppuccin-macchiato/theme.conf b/roles/sddm/files/themes/catppuccin-macchiato/theme.conf
deleted file mode 100644
index ce839a7..0000000
--- a/roles/sddm/files/themes/catppuccin-macchiato/theme.conf
+++ /dev/null
@@ -1,39 +0,0 @@
-[General]
-Font="CaskaydiaCove Nerd Font"
-FontSize=12
-ClockEnabled="true"
-CustomBackground="false"
-LoginBackground="false"
-Background="backgrounds/wall.jpg"
-
-# Uncomment this option to show the last letter of the password
-# for the number of milliseconds specified
-# PasswordShowLastLetter=1000
-
-# DON'T CHANGE THESE
-rosewater = "#f4dbd6"
-flamingo = "#f0c6c6"
-pink = "#f5bde6"
-mauve = "#c6a0f6"
-red = "#ed8796"
-maroon = "#ee99a0"
-peach = "#f5a97f"
-yellow = "#eed49f"
-green = "#a6da95"
-teal = "#8bd5ca"
-sky = "#91d7e3"
-sapphire = "#7dc4e4"
-blue = "#8aadf4"
-lavender = "#b7bdf8"
-text = "#cad3f5"
-subtext1 = "#b8c0e0"
-subtext0 = "#a5adcb"
-overlay2 = "#939ab7"
-overlay1 = "#8087a2"
-overlay0 = "#6e738d"
-surface2 = "#5b6078"
-surface1 = "#494d64"
-surface0 = "#363a4f"
-base = "#24273a"
-mantle = "#1e2030"
-crust = "#181926"
diff --git a/roles/sddm/tasks/main.yml b/roles/sddm/tasks/main.yml
deleted file mode 100644
index cc4aedd..0000000
--- a/roles/sddm/tasks/main.yml
+++ /dev/null
@@ -1,28 +0,0 @@
----
-- name: "[SDDM] Install"
- ansible.builtin.package:
- name:
- - sddm
- state: latest
- become: true
-
-- name: "[SDDM] Create config folder"
- ansible.builtin.file:
- mode: 0755
- path: "/etc/sddm.conf.d/"
- state: directory
- become: true
-
-- name: "[SDDM] Configure"
- ansible.builtin.copy:
- mode: 0755
- src: "./sddm.conf.d/"
- dest: "/etc/sddm.conf.d/"
- become: true
-
-- name: "[SDDM] Configure theme"
- ansible.builtin.copy:
- mode: 0755
- src: "./themes/"
- dest: "/usr/share/sddm/themes/"
- become: true
diff --git a/roles/starship/tasks/main.yml b/roles/starship/tasks/main.yml
deleted file mode 100644
index d1bb099..0000000
--- a/roles/starship/tasks/main.yml
+++ /dev/null
@@ -1,12 +0,0 @@
----
-- name: "[Starship] Install"
- ansible.builtin.package:
- name:
- - starship
- state: latest
- become: true
-
-- name: "[Starship] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config"
diff --git a/roles/system/tasks/Archlinux.yml b/roles/system/tasks/Archlinux.yml
deleted file mode 100644
index 3d984d1..0000000
--- a/roles/system/tasks/Archlinux.yml
+++ /dev/null
@@ -1,284 +0,0 @@
----
-- name: "[Arch] Configure pacman"
- ansible.builtin.copy:
- mode: 0644
- src: "pacman.conf"
- dest: "/etc/"
- become: true
- tags:
- - pacman
-
-- name: "[Arch] Update packages"
- community.general.pacman:
- update_cache: true
- upgrade: true
- state: latest
- become: true
- tags:
- - pacman
-
-- name: "[Arch] Install default packages"
- kewlfft.aur.aur:
- name:
- - networkmanager
- - networkmanager-openvpn
- - wireguard-tools
- - inotify-tools
- - libqalculate
- - cifs-utils
- - reflector
- - os-prober
- - ntfs-3g
- - openssh
- - upower
- - expac
- - unzip
- - less
- - curl
- - wget
- - awk
- - zip
- - tar
- - eza
- - bat
- - fzf
- - fd
- - jq
- state: present
- tags:
- - default_pkgs
-
-- name: "[Arch] Install programming packages"
- kewlfft.aur.aur:
- name:
- - jdk-openjdk
- - maven
- - rustup
- - npm
- - go
- state: present
- tags:
- - programming_pkgs
- when: system != 'server'
-
-- name: "[Arch] Configure rustup"
- command: rustup default stable
- tags:
- - programming_pkgs
- when: system != 'server'
-
-- name: "[Arch] Install desktop packages"
- kewlfft.aur.aur:
- name:
- # Fonts
- - noto-fonts
- - noto-fonts-cjk
- - noto-fonts-emoji
- - ttf-font-awesome
- - nerd-fonts
- # Pipewire
- - pipewire
- - wireplumber
- - pipewire-alsa
- - pipewire-audio
- - pipewire-jack
- - pipewire-pulse
- - gst-plugin-pipewire
- # Network
- - network-manager-applet
- # Bluetooth
- - bluez
- - bluez-utils
- - blueman
- - gnome-bluetooth-3.0
- # Printing
- - cups
- - cups-pdf
- # Theming
- - qt5ct
- # Icon Themes
- - papirus-icon-theme
- # Cursor Themes
- - xcursor-breeze
- # Themes
- - catppuccin-gtk-theme-frappe
- - catppuccin-gtk-theme-latte
- - catppuccin-gtk-theme-macchiato
- - catppuccin-gtk-theme-mocha
- # Misc
- - brightnessctl
- #- wlr-randr
- - playerctl
- - libnotify
- - mediainfo
- - hyprpicker
- - swww
- - sddm
- - swayidle
- - grimblast-git
- - cliphist
- - wl-clipboard
- - polkit-kde-agent
- - xdg-desktop-portal-hyprland
- - gnome-keyring
- state: present
- tags:
- - desktop_pkgs
- when: system != 'server'
-
-- name: "[Arch] Install desktop applications"
- kewlfft.aur.aur:
- name:
- - libreoffice-fresh
- - nextcloud-client
- - appimagelauncher
- - feishin-appimage
- - element-desktop
- - youtube-music
- - vscodium-bin
- - pavucontrol
- - thunderbird
- - hyprpicker
- - brave-bin
- - obsidian
- - yt-dlp
- - nvtop
- - nemo
- - nemo-fileroller
- - gvfs-smb
- - gvfs-mtp
- - mpv
- # Device configuration
- #- openrazer-daemon
- #- openrgb
- #- piper
- # AMD Stats
- #- amdgpu_top
- # Character map
- #- gucharmap
- # Calculator
- #- galculator
- state: present
- tags:
- - desktop_apps
- when: system != 'server'
-
-- name: "[Arch] Install additional desktop packages"
- kewlfft.aur.aur:
- name:
- - steam
- - lutris
- # Wine
- - wine-staging
- - giflib
- - lib32-giflib
- - libpng
- - lib32-libpng
- - libldap
- - lib32-libldap
- - gnutls
- - lib32-gnutls
- - mpg123
- - lib32-mpg123
- - openal
- - lib32-openal
- - v4l-utils
- - lib32-v4l-utils
- - libpulse
- - lib32-libpulse
- - libgpg-error
- - lib32-libgpg-error
- - alsa-plugins
- - lib32-alsa-plugins
- - alsa-lib
- - lib32-alsa-lib
- - libjpeg-turbo
- - lib32-libjpeg-turbo
- - sqlite
- - lib32-sqlite
- - libxcomposite
- - lib32-libxcomposite
- - libxinerama
- - lib32-libgcrypt
- - libgcrypt
- - lib32-libxinerama
- - ncurses
- - lib32-ncurses
- - ocl-icd
- - lib32-ocl-icd
- - libxslt
- - lib32-libxslt
- - libva
- - lib32-libva
- - gtk3
- - lib32-gtk3
- - gst-plugins-base-libs
- - lib32-gst-plugins-base-libs
- - vulkan-icd-loader
- - lib32-vulkan-icd-loader
- state: present
- tags:
- - desktop_pkgs
- when: system == 'desktop_full'
-
-- name: Gather GPU info
- shell: "lspci | grep -i vga"
- register: gpu_info
- tags:
- - desktop_pkgs
- when: system == 'desktop_full'
-
-- name: "[Arch] Install AMD packages"
- kewlfft.aur.aur:
- name:
- - lib32-mesa
- - vulkan-radeon
- - lib32-vulkan-radeon
- state: present
- when: "system == 'desktop_full' and 'Advanced Micro Devices' in gpu_info.stdout"
-
-- name: "[Arch] Install Intel packages"
- kewlfft.aur.aur:
- name:
- - lib32-mesa
- - vulkan-intel
- - lib32-vulkan-intel
- state: present
- tags:
- - desktop_pkgs
- when: "system == 'desktop_full' and 'Intel Corporation' in gpu_info.stdout"
-
-- name: "[Arch] Install Nvidia packages"
- kewlfft.aur.aur:
- name:
- - nvidia-dkms
- - nvidia-utils
- - lib32-nvidia-utils
- - nvidia-settings
- state: present
- tags:
- - desktop_pkgs
- when: "system == 'desktop_full' and 'NVIDIA' in gpu_info.stdout"
-
-- name: "[Arch] Enable services"
- ansible.builtin.service:
- name: "{{ item }}"
- enabled: true
- with_items:
- - bluetooth
- - cups
- - sddm
- tags:
- - desktop_services
- when: "system == 'desktop'"
- become: true
-
-- name: "Set makepkg threads"
- ansible.builtin.lineinfile:
- path: /etc/makepkg.conf
- regexp: '^#MAKEFLAGS='
- line: 'MAKEFLAGS="-j10"'
- state: present
- tags:
- - makepkg
- become: true
diff --git a/roles/system/tasks/main.yml b/roles/system/tasks/main.yml
deleted file mode 100644
index 968dd62..0000000
--- a/roles/system/tasks/main.yml
+++ /dev/null
@@ -1,11 +0,0 @@
----
-- name: "[System] Checking for Distribution Config: {{ ansible_distribution }}"
- ansible.builtin.stat:
- path: "{{ role_path }}/tasks/{{ ansible_distribution }}.yml"
- register: system_distribution_config
- tags:
- - system
-
-- name: "[System] Run Tasks: {{ ansible_distribution }}"
- ansible.builtin.include_tasks: "{{ ansible_distribution }}.yml"
- when: system_distribution_config.stat.exists
diff --git a/roles/wakatime/tasks/main.yml b/roles/wakatime/tasks/main.yml
deleted file mode 100644
index e2010a9..0000000
--- a/roles/wakatime/tasks/main.yml
+++ /dev/null
@@ -1,7 +0,0 @@
----
-- name: "[Wakatime]"
- ansible.builtin.template:
- mode: 0644
- src: wakatime.cfg
- dest: "{{ ansible_user_dir }}/.wakatime.cfg"
- ignore_errors: true
diff --git a/roles/wakatime/templates/wakatime.cfg b/roles/wakatime/templates/wakatime.cfg
deleted file mode 100644
index 51537c8..0000000
--- a/roles/wakatime/templates/wakatime.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-[settings]
-api_url = https://wakapi.keulelab.de/api
-api_key = {{ wakapi_key }}
diff --git a/roles/yazi/tasks/main.yml b/roles/yazi/tasks/main.yml
deleted file mode 100644
index f241de1..0000000
--- a/roles/yazi/tasks/main.yml
+++ /dev/null
@@ -1,18 +0,0 @@
----
-- name: "[Yazi] Install"
- ansible.builtin.package:
- name:
- - yazi
- state: latest
- become: true
-
-- name: "[Yazi] Create config folder"
- ansible.builtin.file:
- mode: "0755"
- path: "{{ ansible_user_dir }}/.config/yazi"
- state: directory
-
-- name: "[Yazi] Configure"
- ansible.builtin.copy:
- src: "./"
- dest: "{{ ansible_user_dir }}/.config/yazi"
diff --git a/run_once_00-prereqs.sh b/run_once_00-prereqs.sh
new file mode 100755
index 0000000..ac295d2
--- /dev/null
+++ b/run_once_00-prereqs.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+# run_once_00-prereqs.sh
+# Verifies that the tools required by later run_once scripts are installed.
+
+set -euo pipefail
+
+missing=()
+
+need_cmd() {
+ command -v "$1" >/dev/null 2>&1 || missing+=("$1")
+}
+
+need_cmd sudo
+need_cmd git
+need_cmd curl
+need_cmd age
+need_cmd jq
+need_cmd pacman || need_cmd apt-get
+need_cmd chezmoi
+
+if (( ${#missing[@]} > 0 )); then
+ cat <>> Missing prerequisites: ${missing[*]}
+
+Install them for your distro, then re-run \`chezmoi apply\`:
+
+ Arch: sudo pacman -S --needed git curl sudo age jq
+ Ubuntu: sudo apt-get install -y git curl sudo age jq
+
+\`age\` is also available at https://github.com/FiloSottile/age as a static
+binary if your distro does not package it.
+EOF
+ exit 1
+fi
+
+echo ">>> prereqs OK"
diff --git a/run_once_10-install-base.sh b/run_once_10-install-base.sh
new file mode 100755
index 0000000..8e35c9c
--- /dev/null
+++ b/run_once_10-install-base.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+# run_once_10-install-base.sh
+# Installs base and some programming packages
+
+set -euo pipefail
+
+SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
+DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
+
+case "$DISTRO_ID" in
+ arch)
+ echo ">>> [base] arch, system=$SYS"
+
+ sudo pacman -Syu --noconfirm
+
+ sudo pacman -S --noconfirm --needed \
+ networkmanager networkmanager-openvpn wireguard-tools fastfetch \
+ inotify-tools libqalculate cifs-utils reflector os-prober ntfs-3g \
+ openssh upower expac unzip less curl wget gawk zip tar \
+ eza bat fzf fd jq go
+
+ if [ "$SYS" != "server" ]; then
+ sudo pacman -S --noconfirm --needed \
+ jdk-openjdk maven rustup npm
+ rustup default stable >/dev/null 2>&1 || true
+ fi
+
+ # AUR helper
+ if ! command -v yay >/dev/null 2>&1; then
+ sudo pacman -S --noconfirm --needed base-devel
+ tmp=$(mktemp -d)
+ git clone https://aur.archlinux.org/yay.git "$tmp"
+ ( cd "$tmp" && makepkg -si --noconfirm )
+ rm -rf "$tmp"
+ fi
+ ;;
+
+ ubuntu)
+ echo ">>> [base] ubuntu, system=$SYS"
+
+ sudo apt-get update
+ sudo apt-get upgrade -y
+
+ sudo apt-get install -y \
+ network-manager openvpn wireguard-tools inotify-tools libqalculate \
+ cifs-utils os-prober ntfs-3g openssh upower unzip less curl wget \
+ gawk zip tar fzf fd-find jq
+
+ # fdfind → fd compatibility symlink
+ # if command -v fdfind >/dev/null 2>&1 && ! command -v fd >/dev/null 2>&1; then
+ # sudo ln -sf "$(command -v fdfind)" /usr/local/bin/fd
+ # fi
+
+ if [ "$SYS" != "server" ]; then
+ sudo apt-get install -y \
+ openjdk-17-jdk maven rustup npm golang-go
+ rustup default stable >/dev/null 2>&1 || true
+ fi
+ ;;
+
+ *)
+ echo ">>> [base] unsupported distro: ${DISTRO_ID:-unknown}, skipping"
+ exit 0
+ ;;
+esac
+
+echo ">>> [base] done"
diff --git a/run_once_20-install-gui.sh b/run_once_20-install-gui.sh
new file mode 100755
index 0000000..f0a727d
--- /dev/null
+++ b/run_once_20-install-gui.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+# run_once_20-install-gui.sh
+# Hyprland and all other GUI/desktop environment packages
+
+set -euo pipefail
+
+SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
+DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
+
+if [ "$SYS" = "server" ]; then
+ echo ">>> [gui] system=server, skipping"
+ exit 0
+fi
+
+case "$DISTRO_ID" in
+ arch)
+ echo ">>> [gui] arch, system=$SYS"
+
+ sudo pacman -S --noconfirm --needed \
+ noto-fonts noto-fonts-cjk noto-fonts-emoji ttf-font-awesome nerd-fonts \
+ pipewire wireplumber pipewire-alsa pipewire-audio pipewire-jack \
+ pipewire-pulse gst-plugin-pipewire qt6-multimedia \
+ network-manager-applet \
+ bluez bluez-utils blueman gnome-bluetooth-3.0 \
+ cups cups-pdf cups-pk-helper \
+ qt5ct qt6ct \
+ papirus-icon-theme breeze-cursors adw-gtk-theme \
+ brightnessctl playerctl libnotify mediainfo btop \
+ fprintd kimageformats \
+ cliphist wl-clipboard \
+ polkit-kde-agent xdg-desktop-portal-hyprland gnome-keyring \
+ hyprland greetd ghostty
+
+ yay -S --noconfirm greetd-dms-greeter-git dankcalendar-git vesktop-git
+
+
+ sudo -v && curl -fsSL https://install.danklinux.com | sh -s -- -c hyprland -t ghostty --include-deps dms-greeter -y
+
+ fi
+ ;;
+
+ ubuntu)
+ echo ">>> [gui] ubuntu, system=$SYS"
+ echo ">>> [gui] ubuntu, no GUI packages"
+ ;;
+
+ *)
+ echo ">>> [gui] unsupported distro: ${DISTRO_ID:-unknown}, skipping"
+ exit 0
+ ;;
+esac
+
+echo ">>> [gui] done"
diff --git a/run_once_30-install-power-mgmt.sh b/run_once_30-install-power-mgmt.sh
new file mode 100755
index 0000000..5c25304
--- /dev/null
+++ b/run_once_30-install-power-mgmt.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# run_once_30-install-power-mgmt.sh
+# Laptop-only: power management stack. Skipped on desktop/server.
+
+set -euo pipefail
+
+SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
+DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
+
+if [ "$SYS" != "laptop" ]; then
+ echo ">>> [power-mgmt] system=$SYS, skipping (not a laptop)"
+ exit 0
+fi
+
+case "$DISTRO_ID" in
+ arch)
+ echo ">>> [power-mgmt] arch"
+
+ sudo pacman -S --noconfirm --needed tlp auto-cpufreq power-profiles-daemon
+ sudo systemctl enable tlp
+ sudo systemctl enable auto-cpufreq
+ sudo systemctl enable power-profiles-daemon
+ ;;
+
+ ubuntu)
+ echo ">>> [power-mgmt] ubuntu"
+
+ sudo apt-get install -y tlp tlp-rdw power-profiles-daemon
+ sudo systemctl enable tlp
+ # tlp and power-profiles-daemon conflict on most hardware — mask the latter
+ sudo systemctl mask power-profiles-daemon || true
+ ;;
+
+ *)
+ echo ">>> [power-mgmt] unsupported distro: ${DISTRO_ID:-unknown}, skipping"
+ exit 0
+ ;;
+esac
+
+echo ">>> [power-mgmt] done"
diff --git a/run_once_40-install-apps.sh b/run_once_40-install-apps.sh
new file mode 100755
index 0000000..c733deb
--- /dev/null
+++ b/run_once_40-install-apps.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+# run_once_40-install-apps.sh
+# Desktop applications. Skipped on server.
+
+set -euo pipefail
+
+SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
+DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
+
+if [ "$SYS" = "server" ]; then
+ echo ">>> [apps] system=server, skipping"
+ exit 0
+fi
+
+case "$DISTRO_ID" in
+ arch)
+ echo ">>> [apps] arch, system=$SYS"
+
+ # Repo packages
+ sudo pacman -S --noconfirm --needed \
+ libreoffice-fresh nextcloud-client \
+ gvfs gvfs-mtp gvfs-smb thunar tumbler \
+ mpv nvtop pavucontrol thunderbird firefox yt-dlp
+
+ # AUR packages
+ yay -S --noconfirm --needed \
+ appimagelauncher feishin-appimage \
+ vscodium-bin obsidian brave-bin
+ ;;
+
+ ubuntu)
+ echo ">>> [apps] ubuntu, system=$SYS"
+
+ sudo apt-get install -y \
+ libreoffice nextcloud-desktop \
+ mpv nvtop pavucontrol thunderbird firefox yt-dlp
+
+ echo ">>> [apps] TODO: install via Flatpak/Snap — feishin, ..."
+ ;;
+
+ *)
+ echo ">>> [apps] unsupported distro: ${DISTRO_ID:-unknown}, skipping"
+ exit 0
+ ;;
+esac
+
+echo ">>> [apps] done"
diff --git a/run_once_50-configure-system.sh b/run_once_50-configure-system.sh
new file mode 100755
index 0000000..2e8eb90
--- /dev/null
+++ b/run_once_50-configure-system.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+# run_once_50-configure-system.sh
+# System-level config, enable services and set some settings
+
+set -euo pipefail
+
+SYS="$(chezmoi data --format=json 2>/dev/null | jq -r '.system // "desktop"')"
+DISTRO_ID="$(chezmoi data --format=json 2>/dev/null | jq -r '.chezmoi.osRelease.id // empty')"
+SRC="$(chezmoi source-path)"
+echo ">>> [configure] distro=$DISTRO_ID, system=$SYS, source=$SRC"
+
+case "$DISTRO_ID" in
+ arch)
+ # pacman.conf — everyone on arch
+ sudo install -m644 "$SRC/assets/pacman.conf" /etc/pacman.conf
+
+ # MAKEFLAGS — everyone on arch
+ sudo sed -i 's/^#MAKEFLAGS=/MAKEFLAGS="-j'"$(nproc)"'"/' /etc/makepkg.conf
+
+ if [ "$SYS" != "server" ]; then
+ sudo systemctl enable bluetooth cups greetd
+
+ # minegrub GRUB theme (best-effort)
+ if [ -d /boot/grub/themes ]; then
+ sudo mkdir -p /boot/grub/themes/minegrub
+ sudo cp -r "$SRC/assets/minegrub/." /boot/grub/themes/minegrub/
+ if ! grep -q '^GRUB_THEME=' /etc/default/grub 2>/dev/null; then
+ echo 'GRUB_THEME="/boot/grub/themes/minegrub/theme.txt"' \
+ | sudo tee -a /etc/default/grub >/dev/null
+ sudo grub-mkconfig -o /boot/grub/grub.cfg
+ fi
+ else
+ echo ">>> [configure] /boot/grub/themes missing — skipping minegrub install"
+ fi
+ fi
+ ;;
+
+ ubuntu)
+ echo ">>> [ubuntu] no configure system"
+ ;;
+
+ *)
+ echo ">>> [configure] unsupported distro: ${DISTRO_ID:-unknown}, skipping"
+ exit 0
+ ;;
+esac
+
+echo ">>> [configure] done"
diff --git a/run_once_99-set-shell.sh b/run_once_99-set-shell.sh
new file mode 100755
index 0000000..a3f5148
--- /dev/null
+++ b/run_once_99-set-shell.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# run_once_99-set-shell.sh
+# Sets the user's default login shell to fish.
+
+set -euo pipefail
+
+if ! command -v fish >/dev/null 2>&1; then
+ echo ">>> [set-shell] fish not installed; skipping"
+ exit 0
+fi
+
+USER_NAME="${USER:-$(id -un)}"
+current_shell="$(getent passwd "$USER_NAME" | cut -d: -f7)"
+
+if [ "$current_shell" = "$(command -v fish)" ]; then
+ echo ">>> [set-shell] shell already set to fish"
+ exit 0
+fi
+
+echo ">>> [set-shell] changing shell for $USER_NAME to $(command -v fish)"
+sudo chsh -s "$(command -v fish)" "$USER_NAME" || true