diff --git a/app/configuration/configure-gnome.sh b/app/configuration/configure-gnome.sh
index cb94eb0..df83dc8 100644
--- a/app/configuration/configure-gnome.sh
+++ b/app/configuration/configure-gnome.sh
@@ -1,3 +1,8 @@
+if [[ ! $(get_window_manager) == "gnome" ]] ; then
+ status "GNOME is not the current window manager. Skipping..."
+ return
+fi
+
setup_gnome=$(gum confirm "Do you want to configure GNOME and extensions?" --affirmative "Yes" --negative "No" --default=false && echo "true" || echo "false")
if [[ $setup_gnome == "true" ]]; then
diff --git a/app/configuration/select-window-manager b/app/configuration/select-window-manager
new file mode 100644
index 0000000..d6ab965
--- /dev/null
+++ b/app/configuration/select-window-manager
@@ -0,0 +1,45 @@
+#!/bin/bash
+set -e
+
+current_window_manager=$(get_window_manager)
+
+status "Current window manager: $current_window_manager"
+
+SELECTED_WINDOW_MANAGER=$(gum choose "gnome" "hyprland" --header "Select your window manager" --selected "$current_window_manager" --limit 1 --height 20)
+
+if [ -z "$SELECTED_WINDOW_MANAGER" ]; then
+ status "No window manager selected. Skipping..."
+ return
+fi
+
+if [ "$SELECTED_WINDOW_MANAGER" == "$current_window_manager" ]; then
+ status "Window manager is already set to: $SELECTED_WINDOW_MANAGER. No further action required."
+ return
+fi
+
+if [[ "$SELECTED_WINDOW_MANAGER" == "hyprland" ]]; then
+ if ! is_installed "hyprland"; then
+ status "Hyprland is not installed. Hyprland needs to be installed before enabling it. Do you want to install Hyprland now? (This will install Hyprland and all related packages)"
+ if ! gum confirm "Do you want to install Hyprland?"; then
+ status "Hyprland installation cancelled."
+ return
+ fi
+ source $MANJIKAZE_DIR/app/installations/hyprland/hyprland.sh
+ return
+ fi
+fi
+
+if gum confirm "Do you want to change the window manager to $SELECTED_WINDOW_MANAGER?"; then
+ set_window_manager "$SELECTED_WINDOW_MANAGER"
+ status "Window manager changed to: $SELECTED_WINDOW_MANAGER"
+
+ USER_FILE="/var/lib/AccountsService/users/$USER"
+ if [[ -f "$USER_FILE" ]]; then
+ status "Setting auto-login session to: $SELECTED_WINDOW_MANAGER"
+ sudo sed -i -E "s/^Session=.*/Session=$SELECTED_WINDOW_MANAGER/" "$USER_FILE"
+ else
+ status "Warning: AccountsService entry $USER_FILE not found – unable to adjust auto-login session automatically."
+ fi
+else
+ status "Window manager not changed."
+fi
\ No newline at end of file
diff --git a/app/installations/optional/hyprland.sh b/app/installations/optional/hyprland.sh
new file mode 100644
index 0000000..de64a32
--- /dev/null
+++ b/app/installations/optional/hyprland.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+install_package "hyprland" "repo"
+install_package "hyprpaper" "repo"
+install_package "hypridle" "repo"
+install_package "hyprlock" "repo"
+install_package "hyprpolkitagent" "repo"
+install_package "hyprpicker" "repo"
+install_package "slurp" "repo"
+install_package "waybar" "repo"
+install_package "rofi-wayland" "repo"
+
+
+if [ ! -d ~/.config/hypr ]; then
+ rsync -a --ignore-existing configs/hypr/ ~/.config/hypr/
+ rsync -a --ignore-existing assets/background.jpg ~/.config/hypr/background.jpg
+fi
+
+if [ ! -d ~/.config/rofi ]; then
+ rsync -a --ignore-existing configs/rofi/ ~/.config/rofi/
+fi
+
+if [ ! -d ~/.config/waybar ]; then
+ rsync -a --ignore-existing configs/waybar/ ~/.config/waybar/
+fi
\ No newline at end of file
diff --git a/app/installations/recommended/alacritty.sh b/app/installations/recommended/alacritty.sh
index 3ddde37..3ca286f 100644
--- a/app/installations/recommended/alacritty.sh
+++ b/app/installations/recommended/alacritty.sh
@@ -11,7 +11,7 @@ if [ ! -d ~/.config/alacritty ]; then
fi
# Pin Alacritty to dock and remove default terminal if using GNOME
-if [[ "$XDG_CURRENT_DESKTOP" == *"GNOME"* ]]; then
+if [[ $(get_window_manager) == "gnome" ]]; then
status "Pinning Alacritty to dock and removing default terminal..."
# Get current favorites
diff --git a/configs/hypr/base.conf b/configs/hypr/base.conf
new file mode 100644
index 0000000..835149e
--- /dev/null
+++ b/configs/hypr/base.conf
@@ -0,0 +1,111 @@
+#############################
+### ENVIRONMENT VARIABLES ###
+#############################
+
+env = XCURSOR_SIZE,24
+env = HYPRCURSOR_SIZE,24
+
+#####################
+### LOOK AND FEEL ###
+#####################
+
+general {
+ gaps_in = 4
+ gaps_out = 8
+ border_size = 2
+ col.active_border = $gb_light0
+ col.inactive_border = $gb_dark1
+ resize_on_border = true
+ allow_tearing = false
+ layout = dwindle
+ no_focus_fallback = true
+ extend_border_grab_area = 15
+ hover_icon_on_border = true
+}
+
+decoration {
+ rounding = 8
+
+ shadow {
+ enabled = true
+ render_power = 2
+ ignore_window = true
+ color = $gb_dark0_hard
+ }
+
+ blur {
+ enabled = true
+ size = 6
+ passes = 2
+ new_optimizations = true
+ ignore_opacity = true
+ noise = 0.0117
+ contrast = 0.8916
+ brightness = 0.8916
+ vibrancy = 0.1696
+ special = false
+ }
+
+ active_opacity = 1.0
+ inactive_opacity = 0.93
+ fullscreen_opacity = 1.0
+}
+
+animations {
+ enabled = true
+
+ bezier = easeOutQuint,0.23,1,0.32,1
+ bezier = easeInOutCubic,0.65,0.05,0.36,1
+ bezier = linear,0,0,1,1
+ bezier = almostLinear,0.5,0.5,0.75,1.0
+ bezier = quick,0.15,0,0.1,1
+
+ animation = global, 1, 10, default
+ animation = border, 1, 5.39, easeOutQuint
+ animation = windows, 1, 4.79, easeOutQuint
+ animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
+ animation = windowsOut, 1, 1.49, linear, popin 87%
+ animation = fadeIn, 1, 1.73, almostLinear
+ animation = fadeOut, 1, 1.46, almostLinear
+ animation = fade, 1, 3.03, quick
+ animation = layers, 1, 3.81, easeOutQuint
+ animation = layersIn, 1, 4, easeOutQuint, fade
+ animation = layersOut, 1, 1.5, linear, fade
+ animation = fadeLayersIn, 1, 1.79, almostLinear
+ animation = fadeLayersOut, 1, 1.39, almostLinear
+ animation = workspaces, 1, 1.94, almostLinear, fade
+ animation = workspacesIn, 1, 1.21, almostLinear, fade
+ animation = workspacesOut, 1, 1.94, almostLinear, fade
+}
+
+dwindle {
+ pseudotile = true
+ preserve_split = true
+ permanent_direction_override = true
+ split_width_multiplier = 1.4
+}
+
+misc {
+ force_default_wallpaper = 0
+ disable_hyprland_logo = false
+ disable_splash_rendering = true
+ animate_manual_resizes = true
+ animate_mouse_windowdragging = true
+ enable_swallow = false
+ swallow_regex = ^(kitty)$
+ focus_on_activate = true
+ mouse_move_enables_dpms = true
+ key_press_enables_dpms = true
+ initial_workspace_tracking = 2
+}
+
+#############
+### INPUT ###
+#############
+
+input {
+ kb_layout = us
+ follow_mouse = 1
+ sensitivity = 0
+ numlock_by_default = true
+}
diff --git a/configs/hypr/custom.conf b/configs/hypr/custom.conf
new file mode 100644
index 0000000..e69de29
diff --git a/configs/hypr/hypridle.conf b/configs/hypr/hypridle.conf
new file mode 100644
index 0000000..23e364e
--- /dev/null
+++ b/configs/hypr/hypridle.conf
@@ -0,0 +1,7 @@
+general {
+ lock_cmd = pidof hyprlock || hyprlock
+ unlock_cmd = pkill -USR1 hyprlock
+
+ before_sleep_cmd = loginctl lock-session
+ after_sleep_cmd = hyprctl dispatch dpms on
+}
diff --git a/configs/hypr/hyprland.conf b/configs/hypr/hyprland.conf
new file mode 100644
index 0000000..61173b0
--- /dev/null
+++ b/configs/hypr/hyprland.conf
@@ -0,0 +1,25 @@
+# Hyprland Configuration
+# This is the main configuration file that imports all other configs.
+# Refer to the wiki for more information: https://wiki.hyprland.org/Configuring/
+
+monitor=DP-3, 1920x1200, 0x0, 1
+monitor=DP-2, 1920x1200, 1920x0, 1
+monitor=DP-1, 1920x1200, 3840x0, 1
+
+# Basic programs
+$terminal = kitty
+$fileManager = dolphin
+$browser = firefox
+$menu = rofi -show run
+
+# Source shared configuration files
+source = ~/.config/hypr/theme.conf
+source = ~/.config/hypr/base.conf
+source = ~/.config/hypr/keybindings.conf
+source = ~/.config/hypr/rules.conf
+source = ~/.config/hypr/custom.conf
+
+## Start On Launch ##
+exec-once = waybar
+exec = hyprpaper &
+exec-once = hypridle
\ No newline at end of file
diff --git a/configs/hypr/hyprlock.conf b/configs/hypr/hyprlock.conf
new file mode 100644
index 0000000..ea65049
--- /dev/null
+++ b/configs/hypr/hyprlock.conf
@@ -0,0 +1,45 @@
+background {
+ monitor =
+ path = screenshot
+ blur_size = 4
+ blur_passes = 1
+ noise = 0.0117
+ contrast = 0.8916
+ brightness = 0.8172
+ vibrancy = 0.1696
+ vibrancy_darkness = 0.0
+}
+
+input-field {
+ monitor =
+ size = 265, 50
+ outline_thickness = 3
+ dots_size = 0.33
+ dots_spacing = 0.15
+ dots_center = false
+ outer_color = rgb(151515)
+ inner_color = rgb(200, 200, 200)
+ font_color = rgb(10, 10, 10)
+ fade_on_empty = true
+ placeholder_text = Input Password...
+ hide_input = false
+ position = 0, -20
+ halign = center
+ valign = center
+}
+
+label {
+ monitor =
+ text = cmd[update:1000] date "+%H:%M:%S"
+ color = rgba(200, 200, 200, 1.0)
+ font_size = 25
+ font_family = JetBrains Mono Nerd Font
+ position = 0, 80
+ halign = center
+ valign = center
+}
+
+auth {
+ pam:enabled = true
+ pam:module = login
+}
\ No newline at end of file
diff --git a/configs/hypr/hyprpaper.conf b/configs/hypr/hyprpaper.conf
new file mode 100644
index 0000000..aa460f4
--- /dev/null
+++ b/configs/hypr/hyprpaper.conf
@@ -0,0 +1,2 @@
+preload = ~/.config/hypr/background.jpg
+wallpaper = , ~/.config/hypr/background.jpg
\ No newline at end of file
diff --git a/configs/hypr/keybindings.conf b/configs/hypr/keybindings.conf
new file mode 100644
index 0000000..a4abe4a
--- /dev/null
+++ b/configs/hypr/keybindings.conf
@@ -0,0 +1,82 @@
+###################
+### KEYBINDINGS ###
+###################
+
+$mainMod = SUPER
+
+bind = $mainMod, Return, exec, $terminal # Open terminal
+bind = $mainMod SHIFT, Return, exec, $browser # Open browser
+bind = $mainMod, Space, exec, $menu # Open Application Menu
+
+# System control
+bind = $mainMod, Escape, exec, hyprctl reload
+bind = $mainMod SHIFT, Escape, exec, hyprctl reload
+bind = $mainMod ALT, Escape, exit
+
+# Window management
+bind = $mainMod, R, killactive
+bind = $mainMod SHIFT, R, killactive
+bind = $mainMod, Z, exec, hyprlock
+
+# Workspace management
+bind = $mainMod, E, workspace, emptym
+bind = $mainMod SHIFT, E, movetoworkspace, emptym
+
+bind = $mainMod, Q, workspace, m-1
+bind = $mainMod, W, workspace, m+1
+bind = $mainMod SHIFT, Q, movetoworkspace, m-1
+bind = $mainMod SHIFT, W, movetoworkspace, m+1
+
+# Monitor focus
+bind = $mainMod, A, focusmonitor, +1
+bind = $mainMod, S, focusmonitor, -1
+bind = $mainMod SHIFT, A, movewindow, mon:+1
+bind = $mainMod SHIFT, S, movewindow, mon:-1
+
+# Window states
+bind = $mainMod, T, togglefloating,
+bind = $mainMod SHIFT, T, pseudo,
+bind = $mainMod ALT, T, fullscreen,
+
+# Focus/move windows
+bind = $mainMod, H, movefocus, l
+bind = $mainMod, J, movefocus, d
+bind = $mainMod, K, movefocus, u
+bind = $mainMod, L, movefocus, r
+bind = $mainMod SHIFT, H, movewindow, l
+bind = $mainMod SHIFT, J, movewindow, d
+bind = $mainMod SHIFT, K, movewindow, u
+bind = $mainMod SHIFT, L, movewindow, r
+
+# Move floating windows
+bind = $mainMod, left, moveactive, -20 0
+bind = $mainMod, down, moveactive, 0 20
+bind = $mainMod, up, moveactive, 0 -20
+bind = $mainMod, right, moveactive, 20 0
+
+# Resize windows
+bind = $mainMod ALT, H, resizeactive, -20 0
+bind = $mainMod ALT, J, resizeactive, 0 20
+bind = $mainMod ALT, K, resizeactive, 0 -20
+bind = $mainMod ALT, L, resizeactive, 20 0
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+# Multimedia keys
+bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
+bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
+bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
+bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
+bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+
+bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%-
+
+# Media controls
+bindl = , XF86AudioNext, exec, playerctl next
+bindl = , XF86AudioPause, exec, playerctl play-pause
+bindl = , XF86AudioPlay, exec, playerctl play-pause
+bindl = , XF86AudioPrev, exec, playerctl previous
+
+# Screenshot binding
+bind = , Print, exec, mkdir -p ~/Pictures/Screenshots/$(date +%Y-%m)/$(date +%d)/ && grim -g "$(slurp -d)" - | tee ~/Pictures/Screenshots/$(date +%Y-%m)/$(date +%d)/$(date +%H-%M-%S).png | wl-copy
diff --git a/configs/hypr/rules.conf b/configs/hypr/rules.conf
new file mode 100644
index 0000000..9b3ea66
--- /dev/null
+++ b/configs/hypr/rules.conf
@@ -0,0 +1,16 @@
+##############################
+### WINDOWS AND WORKSPACES ###
+##############################
+
+# Layer rules for rofi (shared launcher)
+layerrule = blur,rofi
+layerrule = dimaround,rofi
+layerrule = animation slide,rofi
+
+# Common window rules
+windowrulev2 = noblur 1, floating:1
+
+# Utility window rules
+windowrulev2 = opacity 0.9 0.1, tag:invisible
+windowrulev2 = noborder, tag:invisible
+windowrulev2 = decorate, tag:invisible
diff --git a/configs/hypr/theme.conf b/configs/hypr/theme.conf
new file mode 100644
index 0000000..bb6e9e2
--- /dev/null
+++ b/configs/hypr/theme.conf
@@ -0,0 +1,15 @@
+###################
+### COLORSCHEME ###
+###################
+
+# Gruvbox Dark Colors
+$gb_dark0_hard = 0xff1d2021
+$gb_dark0 = 0xff282828
+$gb_dark1 = 0xff3c3836
+$gb_light0 = 0xfffbf1c7
+$gb_light1 = 0xffebdbb2
+
+$gb_neutral_red = 0xffcc241d
+$gb_bright_red = 0xfffb4934
+$gb_neutral_green = 0xff98971a
+$gb_neutral_yellow = 0xffd79921
\ No newline at end of file
diff --git a/configs/rofi/config.rasi b/configs/rofi/config.rasi
new file mode 100644
index 0000000..c15d8e4
--- /dev/null
+++ b/configs/rofi/config.rasi
@@ -0,0 +1,28 @@
+configuration {
+ modes: "run";
+ modi: "run,Projects:$HOME/.config/rofi/run_code.sh";
+ font: "JetBrainsMono Nerd Font 12";
+ location: 6;
+ drun-display-format: "{name}";
+ disable-history: false;
+ sidebar-mode: true;
+ display-run: "Applications";
+ kb-move-char-back: "Control+b";
+ kb-move-char-forward: "Control+f";
+ kb-mode-next: "Right,Control+Tab";
+ kb-mode-previous: "Left,Control+ISO_Left_Tab";
+ timeout {
+ action: "kb-cancel";
+ delay: 0;
+ }
+ filebrowser {
+ directories-first: true;
+ sorting-method: "name";
+ }
+ animation {
+ enabled: true;
+ window-enter: "slide-down";
+ window-exit: "slide-up";
+ }
+}
+@theme "$HOME/.config/rofi/theme.rasi"
diff --git a/configs/rofi/run_code.sh b/configs/rofi/run_code.sh
new file mode 100755
index 0000000..53a567d
--- /dev/null
+++ b/configs/rofi/run_code.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/bash
+
+# This script requires a certain structure in the Projects directory.
+# This works for me, but you might need to adjust it to your own structure.
+
+if [ $# -eq 0 ]
+then
+ for i in $(ls -dft $HOME/Projects/*/*); do
+ echo "$i" | sed -e 's/^\/home\/$USER\/Projects\///g';
+ done
+else
+ coproc ( cursor $HOME/Projects/$1 > /dev/null 2>&1 )
+ exec 1>&-
+ exit
+fi
diff --git a/configs/rofi/theme.rasi b/configs/rofi/theme.rasi
new file mode 100644
index 0000000..e0b34a9
--- /dev/null
+++ b/configs/rofi/theme.rasi
@@ -0,0 +1,84 @@
+/**
+ * Modern Gruvbox theme for Rofi
+ * Inspired by Waybar styling
+ */
+* {
+ /* Core colors */
+ background: rgba(40, 40, 40, 0.5);
+ foreground: #ebdbb2;
+ selected-bg: #504945;
+ selected-fg: #ebdbb2;
+ border: rgba(168, 153, 132, 0.5);
+
+ /* Theme colors */
+ background-color: transparent;
+ text-color: var(foreground);
+ border-color: var(border);
+}
+
+window {
+ background-color: var(background);
+ // border: 2px 0px 0px;
+ // border-color: var(border);
+ border-radius: 10px 10px 0px 0px;
+ padding: 0px 8px 0px 8px;
+ width: 40%;
+ transparency: "real";
+ margin: 0px;
+}
+
+mainbox {
+ padding: 0;
+}
+
+listview {
+ border: 0px;
+ scrollbar: false;
+ padding: 8px 4px;
+}
+
+element {
+ padding: 8px 8px;
+ border-radius: 8px 8px 8px 8px;
+}
+
+element selected {
+ border: 2px;
+ background-color: var(selected-bg);
+ text-color: var(selected-fg);
+}
+
+inputbar {
+ border: 2px;
+ border-radius: 0px 0px 8px 8px;
+ background-color: var(selected-bg);
+ text-color: var(selected-fg);
+ spacing: 0;
+ padding: 8px 12px;
+ margin: 0 0 8px 0;
+ children: [ prompt, textbox-prompt-sep, entry ];
+}
+
+prompt,
+entry {
+ text-color: var(foreground);
+}
+
+textbox-prompt-sep {
+ expand: false;
+ str: ":";
+ text-color: var(foreground);
+ margin: 0 0.3em 0 0;
+}
+
+button {
+ border: 2px 2px 0px 2px;
+ border-color: var(border);
+ border-radius: 8px 8px 0px 0px;
+ margin: 0px 56px;
+}
+
+button selected {
+ background-color: var(selected-bg);
+ text-color: var(selected-fg);
+}
\ No newline at end of file
diff --git a/configs/waybar/bar_DP-1.jsonc b/configs/waybar/bar_DP-1.jsonc
new file mode 100644
index 0000000..3a2ffdd
--- /dev/null
+++ b/configs/waybar/bar_DP-1.jsonc
@@ -0,0 +1,8 @@
+{
+ "height": 30,
+ "spacing": 8,
+ "modules-center": [
+ "hyprland/workspaces"
+ ],
+ "include": "~/.config/waybar/modules.jsonc"
+}
\ No newline at end of file
diff --git a/configs/waybar/bar_DP-2.jsonc b/configs/waybar/bar_DP-2.jsonc
new file mode 100644
index 0000000..f8c7115
--- /dev/null
+++ b/configs/waybar/bar_DP-2.jsonc
@@ -0,0 +1,16 @@
+{
+ "output": "DP-2",
+ "height": 30,
+ "spacing": 8,
+ "modules-center": [
+ "hyprland/workspaces"
+ ],
+ "modules-right": [
+ "custom/colorpicker",
+ "clock"
+ ],
+ "include": [
+ "~/.config/waybar/modules.jsonc",
+ "~/.config/waybar/modules/waymisu.jsonc"
+ ]
+}
\ No newline at end of file
diff --git a/configs/waybar/bar_DP-3.jsonc b/configs/waybar/bar_DP-3.jsonc
new file mode 100644
index 0000000..3a2ffdd
--- /dev/null
+++ b/configs/waybar/bar_DP-3.jsonc
@@ -0,0 +1,8 @@
+{
+ "height": 30,
+ "spacing": 8,
+ "modules-center": [
+ "hyprland/workspaces"
+ ],
+ "include": "~/.config/waybar/modules.jsonc"
+}
\ No newline at end of file
diff --git a/configs/waybar/config.jsonc b/configs/waybar/config.jsonc
new file mode 100644
index 0000000..fd59164
--- /dev/null
+++ b/configs/waybar/config.jsonc
@@ -0,0 +1,17 @@
+[
+ {
+ "output": "DP-1",
+ "name": "DP-1",
+ "include": "~/.config/waybar/bar_DP-1.jsonc"
+ },
+ {
+ "output": "DP-2",
+ "name": "DP-2",
+ "include": "~/.config/waybar/bar_DP-2.jsonc"
+ },
+ {
+ "output": "DP-3",
+ "name": "DP-3",
+ "include": "~/.config/waybar/bar_DP-3.jsonc"
+ }
+]
\ No newline at end of file
diff --git a/configs/waybar/modules.jsonc b/configs/waybar/modules.jsonc
new file mode 100644
index 0000000..f020cec
--- /dev/null
+++ b/configs/waybar/modules.jsonc
@@ -0,0 +1,21 @@
+{
+ "user": {
+ "format": "{work_H}:{work_M}:{work_S}",
+ "interval": 1
+ },
+ "clock": {
+ "interval": 1,
+ "format": "{:%Y-%m-%d %H:%M:%S}",
+ "tooltip-format": "{:%Y %B}\n{calendar}",
+ "format-alt": "{:%Y-%m-%d}"
+ },
+ "custom/colorpicker": {
+ "format": "",
+ "on-click": "hyprpicker -a",
+ "tooltip": false
+ },
+ "hyprland/workspaces": {
+ "format": "{name}",
+ "on-click": "activate"
+ }
+}
\ No newline at end of file
diff --git a/configs/waybar/style.css b/configs/waybar/style.css
new file mode 100644
index 0000000..cedbdb7
--- /dev/null
+++ b/configs/waybar/style.css
@@ -0,0 +1,97 @@
+* {
+ border: none;
+ border-radius: 0;
+ font-family: "JetBrainsMono Nerd Font", "Roboto", sans-serif;
+ font-size: 14px;
+ min-height: 0;
+ transition: all 0.3s ease;
+ color: #ebdbb2;
+}
+
+window#waybar {
+ background: rgba(40, 40, 40, 0.0);
+ border-radius: 10px;
+ margin: 8px;
+ padding: 4px;
+}
+
+#workspaces button {
+ border: 2px solid rgba(168, 153, 132, 0.5);
+ padding: 0 8px;
+ margin: 4px 2px;
+ margin-top: 0;
+ background: #504945;
+ border-radius: 8px;
+ color: #ebdbb2;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+#workspaces button.active {
+ background: #7c6f64;
+ color: #ebdbb2;
+ border-top: 2px solid #ebdbb2;
+}
+
+#workspaces button.urgent {
+ background: rgba(204, 36, 29, 0.6);
+ box-shadow: inset 0 -3px #fb4934;
+}
+
+#clock,
+#custom-colorpicker,
+#user,
+#custom-waymisu {
+ background: #504945;
+ padding: 0 12px;
+ margin: 4px 4px;
+ margin-top: 0;
+ border-radius: 8px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ border: 2px solid rgba(168, 153, 132, 0.5);
+}
+
+tooltip {
+ background: rgba(40, 40, 40, 0.95);
+ border: 2px solid rgba(168, 153, 132, 0.2);
+ border-radius: 8px;
+}
+
+#user {
+ background: rgba(40, 40, 40, 0.0);
+ border: 0px;
+}
+
+#user label {
+ color: rgba(40, 40, 40, 0.0);
+}
+
+#custom-colorpicker {
+ padding-right: 16px;
+}
+
+tooltip label {
+ color: #ebdbb2;
+}
+
+#custom-waymisu.empty {
+ background: transparent;
+ border: none;
+ padding: 0;
+ margin: 0;
+ opacity: 0;
+}
+
+#custom-waymisu.low {
+ background: #ebdbb2;
+ border: 1px solid #ebdbb2;
+ color: #7c6f64;
+}
+
+#custom-waymisu.high {
+ background: #cc241d;
+ border: 2px solid #ebdbb2;
+ color: #ebdbb2;
+}
+
diff --git a/docs/README.md b/docs/README.md
index 785bb51..4125579 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -19,6 +19,7 @@ Welcome to the Manjikaze documentation. This guide will help you understand and
- [GUIs](features/gui.md)
- [Runtimes](features/mise-runtime-manager.md)
- [AWS tools](features/aws-tools.md)
+- [Hyprland](feature/hyprland.md)
### [Security](security/README.md)
diff --git a/docs/features/README.md b/docs/features/README.md
index ee03443..e77d98e 100644
--- a/docs/features/README.md
+++ b/docs/features/README.md
@@ -12,6 +12,7 @@ This section documents the various features and capabilities of Manjikaze.
- [Runtimes](mise-runtime-manager.md) - Language runtimes and package managers
- [AWS Tools](aws-tools.md) - AWS CLI and AWS Vault configuration
- [Cursor Installation](cursor-installation.md) - Cursor AI-editor installation
+- [Hyprland](hyprland.md) - Setup for Hyprland ecosystem
---
diff --git a/docs/features/cursor-installation.md b/docs/features/cursor-installation.md
index d820a0f..465d712 100644
--- a/docs/features/cursor-installation.md
+++ b/docs/features/cursor-installation.md
@@ -52,4 +52,4 @@ install_cursor
---
-[← AWS Tools](aws-tools.md) | [Documentation Home](../README.md)
\ No newline at end of file
+[← AWS Tools](aws-tools.md) | [Hyprland](hyprland.md)
\ No newline at end of file
diff --git a/docs/features/hyprland.md b/docs/features/hyprland.md
new file mode 100644
index 0000000..b90ade4
--- /dev/null
+++ b/docs/features/hyprland.md
@@ -0,0 +1,86 @@
+# Hyprland, Waybar & Rofi
+
+This page explains how Manjikaze sets up the **Hyprland** Wayland compositor together with **Waybar** and **Rofi**, and how you can adapt the defaults to your liking.
+
+---
+
+## 1. Installing & Enabling Hyprland
+
+1. Run `manjikaze` in a terminal.
+2. Choose **Setup → Choose optional apps** and select **hyprland** (this also installs Waybar and Rofi). This also sets default configurations for Hyprland, Waybar and Rofi.
+3. After the installation, open **Configuration → Select window manager** and pick **Hyprland**.
+
+---
+
+## 2. File Layout
+
+| Path | Purpose |
+|-----------------------------------|-------------------------------------------------------------------|
+| `~/.config/hypr/hyprland.conf` | Root file – imports the rest and starts Waybar/Hyprpaper/Hypridle |
+| `~/.config/hypr/base.conf` | Gaps, borders, animations, input defaults |
+| `~/.config/hypr/keybindings.conf` | All shortcuts (see next section) |
+| `~/.config/hypr/theme.conf` | Gruvbox colour palette |
+| `~/.config/hypr/rules.conf` | Per-app rules (floating, size, etc.) |
+| `~/.config/hypr/custom.conf` | Empty – put your own overrides here (it is **never** overwritten) |
+| `~/.config/waybar/*` | Per-monitor Waybar config + CSS |
+| `~/.config/rofi/*` | Rofi behaviour and theme |
+
+Hyprland will automatically enable hot reloading, so any change in config will immediatly take effect.
+
+---
+
+## 3. Default Keybindings
+
+`$mainMod` is `SUPER` (the *Windows/Command* key).
+
+Which applications are launched on a keybind can easily be changed by setting `$terminal`, `$fileManager`, `$browser` and `$menu` in `~/.config/hyprland.conf`.
+
+| Action | Keys |
+|----------------------------------------|---------------------------|
+| Open terminal (`kitty`) | `Super + Enter` |
+| Open browser (`firefox`) | `Super + Shift + Enter` |
+| Application launcher (Rofi) | `Super + Space` |
+| Reload config | `Super + Esc` |
+| Close window | `Super + R` |
+| Lock screen | `Super + Z` |
+| Toggle floating | `Super + T` |
+| Move focus | `Super + H/J/K/L` |
+| Move window | `Super + Shift + H/J/K/L` |
+| Resize window | `Super + Alt + H/J/K/L` |
+| Next / previous workspace | `Super + W / Q` |
+| Move window to next / prev workspace | `Super + Shift + W / Q` |
+| Focus next / prev monitor | `Super + A / S` |
+| Move window to next / prev monitor | `Super + Shift + A / S` |
+| Create new workspace | `Super + E` |
+| Move window into a new empty workspace | `Super + Shift + E` |
+
+---
+
+## 4. Waybar
+
+Waybar sits at the top of each monitor.
+Configuration is JSONC (JSON with comments) and split per output (e.g. `bar_DP-2.jsonc`).
+The default assumes 3 monitors, this can easily be configured.
+
+* Modules are defined in `modules.jsonc` once and then referenced by each bar.
+* Styling is done via `style.css` – regular CSS.
+* Reload by running `pkill -SIGUSR2 waybar` or simply `hyprctl reload`.
+
+A lot of information can be found on the [Waybar Wiki](https://github.com/Alexays/Waybar/wiki)
+
+---
+
+## 5. Rofi
+
+Rofi provides the application launcher and a *Projects* mode that searches the `~/Projects` folder via a small shell script.
+
+* Global settings live in `config.rasi`.
+* Colours and spacing are in `theme.rasi`.
+* Launch manually with `rofi -show run`.
+
+To experiment, duplicate `theme.rasi`, update the path in `config.rasi`, reload (`Super + Esc`) and try it.
+
+The script assumes a specific folder structure. It might not initially work, but it easily customizable to your flow.
+
+---
+[Cursor Installation →](cursor-installation.md) | [← Documentation Home](../README.md)
\ No newline at end of file
diff --git a/lib/common.sh b/lib/common.sh
index 009ded2..5595f5a 100644
--- a/lib/common.sh
+++ b/lib/common.sh
@@ -13,7 +13,7 @@ is_installed() {
}
disable_sleep() {
- if [[ "$XDG_CURRENT_DESKTOP" == *"GNOME"* ]]; then
+ if [[ $(get_window_manager) == "gnome" ]]; then
status "Disabling screen lock and sleep during installation..."
gsettings set org.gnome.desktop.screensaver lock-enabled false
gsettings set org.gnome.desktop.session idle-delay 0
@@ -21,7 +21,7 @@ disable_sleep() {
}
enable_sleep() {
- if [[ "$XDG_CURRENT_DESKTOP" == *"GNOME"* ]]; then
+ if [[ $(get_window_manager) == "gnome" ]]; then
status "Re-enabling screen lock and sleep..."
gsettings set org.gnome.desktop.screensaver lock-enabled true
gsettings set org.gnome.desktop.session idle-delay 300
diff --git a/lib/menus.sh b/lib/menus.sh
index 7686e91..5539a57 100644
--- a/lib/menus.sh
+++ b/lib/menus.sh
@@ -25,11 +25,12 @@ setup_menu=(
)
declare -A configuration_menu=(
- ["1:GNOME desktop"]="load_module configuration/configure-gnome.sh"
- ["2:Nautilus file manager"]="load_module configuration/configure-nautilus.sh"
- ["3:Monospace font"]="load_module configuration/configure-font.sh"
- ["4:Git"]="load_module configuration/configure-git.sh"
- ["5:Network printer discovery"]="load_module configuration/configure-printing.sh"
+ ["1:Select window manager"]="load_module configuration/select-window-manager.sh"
+ ["2:GNOME desktop"]="load_module configuration/configure-gnome.sh"
+ ["3:Nautilus file manager"]="load_module configuration/configure-nautilus.sh"
+ ["4:Monospace font"]="load_module configuration/configure-font.sh"
+ ["5:Git"]="load_module configuration/configure-git.sh"
+ ["6:Network printer discovery"]="load_module configuration/configure-printing.sh"
)
declare -A security_menu=(
diff --git a/lib/state.sh b/lib/state.sh
index c9af4f2..c32686c 100644
--- a/lib/state.sh
+++ b/lib/state.sh
@@ -5,7 +5,7 @@ STATE_FILE="$MANJIKAZE_DIR/.manjikaze_state.json"
init_state_file() {
if [[ ! -f "$STATE_FILE" ]]; then
- echo '{"migrations": {}, "audits": {}, "updates": {}}' > "$STATE_FILE"
+ echo '{"migrations": {}, "audits": {}, "updates": {}, "window_manager": "gnome"}' > "$STATE_FILE"
fi
}
@@ -48,3 +48,15 @@ set_update_check_time() {
local temp_state=$(mktemp)
jq --arg ts "$timestamp" '.updates.last_check = $ts' "$STATE_FILE" > "$temp_state" && mv "$temp_state" "$STATE_FILE"
}
+
+get_window_manager() {
+ init_state_file
+ jq -r '.window_manager // ""' "$STATE_FILE"
+}
+
+set_window_manager() {
+ local window_manager="$1"
+ init_state_file
+ local temp_state=$(mktemp)
+ jq --arg wm "$window_manager" '.window_manager = $wm' "$STATE_FILE" > "$temp_state" && mv "$temp_state" "$STATE_FILE"
+}
diff --git a/migrations/1751551513_add_window_manager_state.sh b/migrations/1751551513_add_window_manager_state.sh
new file mode 100644
index 0000000..6aa7fe5
--- /dev/null
+++ b/migrations/1751551513_add_window_manager_state.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+set -e
+
+current_window_manager=$(get_window_manager)
+
+if [ -z "$current_window_manager" ]; then
+ status "No window manager found, setting to gnome"
+ set_window_manager "gnome"
+fi