diff --git a/.gitignore b/.gitignore
index 3ba6249..fea9734 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
agent/
+.claude/
diff --git a/themes/dracula/.config/fish/conf.d/fish_frozen_key_bindings.fish b/themes/base/.config/fish/conf.d/fish_frozen_key_bindings.fish
similarity index 100%
rename from themes/dracula/.config/fish/conf.d/fish_frozen_key_bindings.fish
rename to themes/base/.config/fish/conf.d/fish_frozen_key_bindings.fish
diff --git a/themes/dracula/.config/fish/conf.d/rustup.fish b/themes/base/.config/fish/conf.d/rustup.fish
similarity index 100%
rename from themes/dracula/.config/fish/conf.d/rustup.fish
rename to themes/base/.config/fish/conf.d/rustup.fish
diff --git a/themes/dracula/.config/fish/config.fish b/themes/base/.config/fish/config.fish
similarity index 100%
rename from themes/dracula/.config/fish/config.fish
rename to themes/base/.config/fish/config.fish
diff --git a/themes/dracula/.config/fish/fish_variables b/themes/base/.config/fish/fish_variables
similarity index 100%
rename from themes/dracula/.config/fish/fish_variables
rename to themes/base/.config/fish/fish_variables
diff --git a/themes/dracula/.config/fish/functions/awww_set_wallpaper.fish b/themes/base/.config/fish/functions/awww_set_wallpaper.fish
similarity index 100%
rename from themes/dracula/.config/fish/functions/awww_set_wallpaper.fish
rename to themes/base/.config/fish/functions/awww_set_wallpaper.fish
diff --git a/themes/dracula/.config/fish/functions/yazi-cd.fish b/themes/base/.config/fish/functions/yazi-cd.fish
similarity index 100%
rename from themes/dracula/.config/fish/functions/yazi-cd.fish
rename to themes/base/.config/fish/functions/yazi-cd.fish
diff --git a/themes/dracula/.config/gtk-3.0/bookmarks b/themes/base/.config/gtk-3.0/bookmarks
similarity index 100%
rename from themes/dracula/.config/gtk-3.0/bookmarks
rename to themes/base/.config/gtk-3.0/bookmarks
diff --git a/themes/dracula/.config/hypr/config/environment.conf b/themes/base/.config/hypr/config/environment.conf
similarity index 100%
rename from themes/dracula/.config/hypr/config/environment.conf
rename to themes/base/.config/hypr/config/environment.conf
diff --git a/themes/dracula/.config/hypr/gamemode.sh b/themes/base/.config/hypr/gamemode.sh
similarity index 100%
rename from themes/dracula/.config/hypr/gamemode.sh
rename to themes/base/.config/hypr/gamemode.sh
diff --git a/themes/dracula/.config/hyprmoncfg/profiles/laptop.json b/themes/base/.config/hyprmoncfg/profiles/laptop.json
similarity index 100%
rename from themes/dracula/.config/hyprmoncfg/profiles/laptop.json
rename to themes/base/.config/hyprmoncfg/profiles/laptop.json
diff --git a/themes/dracula/.config/hyprmoncfg/profiles/normal.json b/themes/base/.config/hyprmoncfg/profiles/normal.json
similarity index 100%
rename from themes/dracula/.config/hyprmoncfg/profiles/normal.json
rename to themes/base/.config/hyprmoncfg/profiles/normal.json
diff --git a/themes/dracula/.config/kitty/diff.conf b/themes/base/.config/kitty/diff.conf
similarity index 100%
rename from themes/dracula/.config/kitty/diff.conf
rename to themes/base/.config/kitty/diff.conf
diff --git a/themes/dracula/.config/mpv/mpv.conf b/themes/base/.config/mpv/mpv.conf
similarity index 100%
rename from themes/dracula/.config/mpv/mpv.conf
rename to themes/base/.config/mpv/mpv.conf
diff --git a/themes/dracula/.config/rofi/wallpaper_selector.sh b/themes/base/.config/rofi/wallpaper_selector.sh
similarity index 100%
rename from themes/dracula/.config/rofi/wallpaper_selector.sh
rename to themes/base/.config/rofi/wallpaper_selector.sh
diff --git a/themes/dracula/.config/spotify-player/keymap.toml b/themes/base/.config/spotify-player/keymap.toml
similarity index 100%
rename from themes/dracula/.config/spotify-player/keymap.toml
rename to themes/base/.config/spotify-player/keymap.toml
diff --git a/themes/base/.config/sway/config.d/50-systemd-user.conf b/themes/base/.config/sway/config.d/50-systemd-user.conf
new file mode 100644
index 0000000..8781db9
--- /dev/null
+++ b/themes/base/.config/sway/config.d/50-systemd-user.conf
@@ -0,0 +1,16 @@
+# sway does not set DISPLAY/WAYLAND_DISPLAY in the systemd user environment
+# See FS#63021
+# Adapted from xorg's 50-systemd-user.sh, which achieves a similar goal.
+
+# Upstream refuses to set XDG_CURRENT_DESKTOP so we have to.
+exec systemctl --user set-environment XDG_CURRENT_DESKTOP=sway
+exec systemctl --user import-environment DISPLAY \
+ SWAYSOCK \
+ WAYLAND_DISPLAY \
+ XDG_CURRENT_DESKTOP
+
+exec hash dbus-update-activation-environment 2>/dev/null && \
+ dbus-update-activation-environment --systemd DISPLAY \
+ SWAYSOCK \
+ XDG_CURRENT_DESKTOP=sway \
+ WAYLAND_DISPLAY
diff --git a/themes/base/.config/sway/launch.sh b/themes/base/.config/sway/launch.sh
new file mode 100755
index 0000000..9269713
--- /dev/null
+++ b/themes/base/.config/sway/launch.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+export WLR_NO_HARDWARE_CURSORS=1
+export GBM_BACKEND=nvidia-drm
+export __GLX_VENDOR_LIBRARY_NAME=nvidia
+export WLR_RENDERER=vulkan
+exec sway --unsupported-gpu
diff --git a/themes/base/.config/sway/monitors b/themes/base/.config/sway/monitors
new file mode 100644
index 0000000..eba2090
--- /dev/null
+++ b/themes/base/.config/sway/monitors
@@ -0,0 +1,9 @@
+# Wallpaper
+output * bg /mnt/data/Wallpapers/solid_background_dark.png fill
+
+# My monitors (change to work for yours):
+output HDMI-A-1 res 1920x1080@239.76Hz pos 0,0 transform 0
+output DP-1 res 2560x1440@59.95Hz pos 1920,0 transform 270
+output eDP-2 disable
+
+# You can get the names of your outputs by running: swaymsg -t get_outputs
diff --git a/themes/dracula/.config/waybar/mediaplayer.py b/themes/base/.config/waybar/mediaplayer.py
similarity index 100%
rename from themes/dracula/.config/waybar/mediaplayer.py
rename to themes/base/.config/waybar/mediaplayer.py
diff --git a/themes/dracula/.config/waybar/modules/mail.py b/themes/base/.config/waybar/modules/mail.py
similarity index 100%
rename from themes/dracula/.config/waybar/modules/mail.py
rename to themes/base/.config/waybar/modules/mail.py
diff --git a/themes/dracula/.config/waybar/modules/spotify.sh b/themes/base/.config/waybar/modules/spotify.sh
similarity index 100%
rename from themes/dracula/.config/waybar/modules/spotify.sh
rename to themes/base/.config/waybar/modules/spotify.sh
diff --git a/themes/dracula/.config/waybar/modules/storage.sh b/themes/base/.config/waybar/modules/storage.sh
similarity index 100%
rename from themes/dracula/.config/waybar/modules/storage.sh
rename to themes/base/.config/waybar/modules/storage.sh
diff --git a/themes/dracula/.config/waybar/modules/update-check.sh b/themes/base/.config/waybar/modules/update-check.sh
similarity index 100%
rename from themes/dracula/.config/waybar/modules/update-check.sh
rename to themes/base/.config/waybar/modules/update-check.sh
diff --git a/themes/dracula/.config/waybar/modules/weather.sh b/themes/base/.config/waybar/modules/weather.sh
similarity index 100%
rename from themes/dracula/.config/waybar/modules/weather.sh
rename to themes/base/.config/waybar/modules/weather.sh
diff --git a/themes/dracula/.config/waybar/waybar.sh b/themes/base/.config/waybar/waybar.sh
similarity index 100%
rename from themes/dracula/.config/waybar/waybar.sh
rename to themes/base/.config/waybar/waybar.sh
diff --git a/themes/dracula/.config/waybar/wittr.sh b/themes/base/.config/waybar/wittr.sh
similarity index 100%
rename from themes/dracula/.config/waybar/wittr.sh
rename to themes/base/.config/waybar/wittr.sh
diff --git a/themes/dracula/.config/xdg-desktop-portal-termfilechooser/config b/themes/base/.config/xdg-desktop-portal-termfilechooser/config
similarity index 100%
rename from themes/dracula/.config/xdg-desktop-portal-termfilechooser/config
rename to themes/base/.config/xdg-desktop-portal-termfilechooser/config
diff --git a/themes/dracula/.config/xdg-desktop-portal-termfilechooser/lf-wrapper.sh b/themes/base/.config/xdg-desktop-portal-termfilechooser/lf-wrapper.sh
similarity index 100%
rename from themes/dracula/.config/xdg-desktop-portal-termfilechooser/lf-wrapper.sh
rename to themes/base/.config/xdg-desktop-portal-termfilechooser/lf-wrapper.sh
diff --git a/themes/dracula/.config/xdg-desktop-portal-termfilechooser/nnn-wrapper.sh b/themes/base/.config/xdg-desktop-portal-termfilechooser/nnn-wrapper.sh
similarity index 100%
rename from themes/dracula/.config/xdg-desktop-portal-termfilechooser/nnn-wrapper.sh
rename to themes/base/.config/xdg-desktop-portal-termfilechooser/nnn-wrapper.sh
diff --git a/themes/dracula/.config/xdg-desktop-portal-termfilechooser/ranger-wrapper.sh b/themes/base/.config/xdg-desktop-portal-termfilechooser/ranger-wrapper.sh
similarity index 100%
rename from themes/dracula/.config/xdg-desktop-portal-termfilechooser/ranger-wrapper.sh
rename to themes/base/.config/xdg-desktop-portal-termfilechooser/ranger-wrapper.sh
diff --git a/themes/dracula/.config/xdg-desktop-portal-termfilechooser/systemd/xdg-desktop-portal-termfilechooser.service.in b/themes/base/.config/xdg-desktop-portal-termfilechooser/systemd/xdg-desktop-portal-termfilechooser.service.in
similarity index 100%
rename from themes/dracula/.config/xdg-desktop-portal-termfilechooser/systemd/xdg-desktop-portal-termfilechooser.service.in
rename to themes/base/.config/xdg-desktop-portal-termfilechooser/systemd/xdg-desktop-portal-termfilechooser.service.in
diff --git a/themes/dracula/.config/xdg-desktop-portal-termfilechooser/vifm-wrapper.sh b/themes/base/.config/xdg-desktop-portal-termfilechooser/vifm-wrapper.sh
similarity index 100%
rename from themes/dracula/.config/xdg-desktop-portal-termfilechooser/vifm-wrapper.sh
rename to themes/base/.config/xdg-desktop-portal-termfilechooser/vifm-wrapper.sh
diff --git a/themes/dracula/.config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh b/themes/base/.config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh
similarity index 100%
rename from themes/dracula/.config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh
rename to themes/base/.config/xdg-desktop-portal-termfilechooser/yazi-wrapper.sh
diff --git a/themes/dracula/.config/xdg-desktop-portal/portals.conf b/themes/base/.config/xdg-desktop-portal/portals.conf
similarity index 100%
rename from themes/dracula/.config/xdg-desktop-portal/portals.conf
rename to themes/base/.config/xdg-desktop-portal/portals.conf
diff --git a/themes/dracula/.config/yazi/init.lua b/themes/base/.config/yazi/init.lua
similarity index 100%
rename from themes/dracula/.config/yazi/init.lua
rename to themes/base/.config/yazi/init.lua
diff --git a/themes/dracula/.config/yazi/keymap.toml b/themes/base/.config/yazi/keymap.toml
similarity index 100%
rename from themes/dracula/.config/yazi/keymap.toml
rename to themes/base/.config/yazi/keymap.toml
diff --git a/themes/dracula/.config/yazi/package.toml b/themes/base/.config/yazi/package.toml
similarity index 100%
rename from themes/dracula/.config/yazi/package.toml
rename to themes/base/.config/yazi/package.toml
diff --git a/themes/dracula/.config/yazi/plugins/recycle-bin.yazi/LICENSE b/themes/base/.config/yazi/plugins/recycle-bin.yazi/LICENSE
similarity index 100%
rename from themes/dracula/.config/yazi/plugins/recycle-bin.yazi/LICENSE
rename to themes/base/.config/yazi/plugins/recycle-bin.yazi/LICENSE
diff --git a/themes/dracula/.config/yazi/plugins/recycle-bin.yazi/README.md b/themes/base/.config/yazi/plugins/recycle-bin.yazi/README.md
similarity index 100%
rename from themes/dracula/.config/yazi/plugins/recycle-bin.yazi/README.md
rename to themes/base/.config/yazi/plugins/recycle-bin.yazi/README.md
diff --git a/themes/dracula/.config/yazi/plugins/recycle-bin.yazi/main.lua b/themes/base/.config/yazi/plugins/recycle-bin.yazi/main.lua
similarity index 100%
rename from themes/dracula/.config/yazi/plugins/recycle-bin.yazi/main.lua
rename to themes/base/.config/yazi/plugins/recycle-bin.yazi/main.lua
diff --git a/themes/dracula/.config/yazi/yazi.toml b/themes/base/.config/yazi/yazi.toml
similarity index 100%
rename from themes/dracula/.config/yazi/yazi.toml
rename to themes/base/.config/yazi/yazi.toml
diff --git a/themes/dracula/.config/youtube-tui/cmdefine.yml b/themes/base/.config/youtube-tui/cmdefine.yml
similarity index 100%
rename from themes/dracula/.config/youtube-tui/cmdefine.yml
rename to themes/base/.config/youtube-tui/cmdefine.yml
diff --git a/themes/dracula/.config/youtube-tui/commandbindings.yml b/themes/base/.config/youtube-tui/commandbindings.yml
similarity index 100%
rename from themes/dracula/.config/youtube-tui/commandbindings.yml
rename to themes/base/.config/youtube-tui/commandbindings.yml
diff --git a/themes/dracula/.config/youtube-tui/commands.yml b/themes/base/.config/youtube-tui/commands.yml
similarity index 100%
rename from themes/dracula/.config/youtube-tui/commands.yml
rename to themes/base/.config/youtube-tui/commands.yml
diff --git a/themes/dracula/.config/youtube-tui/keybindings.yml b/themes/base/.config/youtube-tui/keybindings.yml
similarity index 100%
rename from themes/dracula/.config/youtube-tui/keybindings.yml
rename to themes/base/.config/youtube-tui/keybindings.yml
diff --git a/themes/dracula/.config/youtube-tui/main.yml b/themes/base/.config/youtube-tui/main.yml
similarity index 100%
rename from themes/dracula/.config/youtube-tui/main.yml
rename to themes/base/.config/youtube-tui/main.yml
diff --git a/themes/dracula/.config/youtube-tui/pages.yml b/themes/base/.config/youtube-tui/pages.yml
similarity index 100%
rename from themes/dracula/.config/youtube-tui/pages.yml
rename to themes/base/.config/youtube-tui/pages.yml
diff --git a/themes/dracula/.config/youtube-tui/remaps.yml b/themes/base/.config/youtube-tui/remaps.yml
similarity index 100%
rename from themes/dracula/.config/youtube-tui/remaps.yml
rename to themes/base/.config/youtube-tui/remaps.yml
diff --git a/themes/dracula/.config/youtube-tui/search.yml b/themes/base/.config/youtube-tui/search.yml
similarity index 100%
rename from themes/dracula/.config/youtube-tui/search.yml
rename to themes/base/.config/youtube-tui/search.yml
diff --git a/themes/dracula/.config/sway/config b/themes/dracula/.config/sway/config
new file mode 100644
index 0000000..be8d8e9
--- /dev/null
+++ b/themes/dracula/.config/sway/config
@@ -0,0 +1,170 @@
+include ./monitors
+include ./exec
+include ./theme
+
+exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway
+set $gnome-schema org.gnome.desktop.interface
+exec_always {
+ export WLR_NO_HARDWARE_CURSORS=1
+ export GBM_BACKEND=nvidia-drm
+ export __GLX_VENDOR_LIBRARY_NAME=nvidia
+ export WLR_RENDERER=vulkan
+}
+
+include "$(/usr/libexec/sway/layered-include '/usr/share/sway/config.d/*.conf' '/etc/sway/config.d/*.conf')"
+
+set $mod Mod4
+
+# direction keys
+set $left h
+set $down j
+set $up k
+set $right l
+
+set $term kitty
+set $menu rofi -show drun
+set $browser /home/henry/AppImages/helium.appimage
+set $filemanager kitty -e yazi
+for_window [app_id="rofi"] floating enable
+
+# -Key bindings-
+
+# Basics:
+ bindsym $mod+Return exec $term
+ bindsym $mod+q kill
+ bindsym $mod+space exec $menu
+ floating_modifier $mod normal
+ bindsym $mod+Shift+r reload
+ bindsym $mod+Shift+e exit
+
+# App launchers:
+ bindsym $mod+b exec $browser
+ bindsym $mod+e exec $filemanager
+ bindsym $mod+w exec ~/.config/rofi/wallpaper_selector.sh
+ bindsym $mod+p exec wlogout
+ bindsym $mod+s exec steam
+ bindsym $mod+a exec mumble
+ bindsym $mod+z exec swaylock -f -c 282a36
+ bindsym $mod+o exec killall -SIGUSR2 waybar
+
+# Moving around:
+ bindsym $mod+$left focus left
+ bindsym $mod+$down focus down
+ bindsym $mod+$up focus up
+ bindsym $mod+$right focus right
+ bindsym $mod+Left focus left
+ bindsym $mod+Down focus down
+ bindsym $mod+Up focus up
+ bindsym $mod+Right focus right
+
+ bindsym $mod+Shift+$left move left
+ bindsym $mod+Shift+$down move down
+ bindsym $mod+Shift+$up move up
+ bindsym $mod+Shift+$right move right
+ bindsym $mod+Shift+Left move left
+ bindsym $mod+Shift+Down move down
+ bindsym $mod+Shift+Up move up
+ bindsym $mod+Shift+Right move right
+
+# Workspaces:
+ bindsym $mod+1 workspace number 1
+ bindsym $mod+2 workspace number 2
+ bindsym $mod+3 workspace number 3
+ bindsym $mod+4 workspace number 4
+ bindsym $mod+5 workspace number 5
+ bindsym $mod+6 workspace number 6
+ bindsym $mod+7 workspace number 7
+ bindsym $mod+8 workspace number 8
+ bindsym $mod+9 workspace number 9
+ bindsym $mod+0 workspace number 10
+ bindsym $mod+n workspace number 11
+ bindsym $mod+m workspace number 12
+
+# Move window silently to workspace:
+ bindsym $mod+Shift+1 move container to workspace number 1
+ bindsym $mod+Shift+2 move container to workspace number 2
+ bindsym $mod+Shift+3 move container to workspace number 3
+ bindsym $mod+Shift+4 move container to workspace number 4
+ bindsym $mod+Shift+5 move container to workspace number 5
+ bindsym $mod+Shift+6 move container to workspace number 6
+ bindsym $mod+Shift+7 move container to workspace number 7
+ bindsym $mod+Shift+8 move container to workspace number 8
+ bindsym $mod+Shift+9 move container to workspace number 9
+ bindsym $mod+Shift+0 move container to workspace number 10
+ bindsym $mod+Shift+n move container to workspace number 11
+ bindsym $mod+Shift+m move container to workspace number 12
+
+# Move window to workspace and follow:
+ bindsym $mod+Ctrl+1 move container to workspace number 1; workspace number 1
+ bindsym $mod+Ctrl+2 move container to workspace number 2; workspace number 2
+ bindsym $mod+Ctrl+3 move container to workspace number 3; workspace number 3
+ bindsym $mod+Ctrl+4 move container to workspace number 4; workspace number 4
+ bindsym $mod+Ctrl+5 move container to workspace number 5; workspace number 5
+ bindsym $mod+Ctrl+6 move container to workspace number 6; workspace number 6
+ bindsym $mod+Ctrl+7 move container to workspace number 7; workspace number 7
+ bindsym $mod+Ctrl+8 move container to workspace number 8; workspace number 8
+ bindsym $mod+Ctrl+9 move container to workspace number 9; workspace number 9
+ bindsym $mod+Ctrl+0 move container to workspace number 10; workspace number 10
+ bindsym $mod+Ctrl+Left move container to workspace prev; workspace prev
+ bindsym $mod+Ctrl+Right move container to workspace next; workspace next
+
+# Workspace cycling:
+ bindsym $mod+period workspace next_on_output
+ bindsym $mod+comma workspace prev_on_output
+ bindsym $mod+slash workspace back_and_forth
+
+# Scratchpad:
+ bindsym $mod+minus move scratchpad
+ bindsym $mod+equal scratchpad show
+
+# Layout stuff:
+ bindsym $mod+Shift+b splith
+ bindsym $mod+Shift+v splitv
+ bindsym $mod+Shift+s layout stacking
+ bindsym $mod+Shift+w layout tabbed
+ bindsym $mod+t layout toggle split
+ bindsym $mod+f fullscreen
+ bindsym $mod+v floating toggle
+
+# Resize mode:
+ bindsym $mod+r mode "resize"
+ mode "resize" {
+ bindsym $left resize shrink width 15px
+ bindsym $down resize grow height 15px
+ bindsym $up resize shrink height 15px
+ bindsym $right resize grow width 15px
+ bindsym Left resize shrink width 15px
+ bindsym Down resize grow height 15px
+ bindsym Up resize shrink height 15px
+ bindsym Right resize grow width 15px
+ bindsym $mod+Ctrl+Shift+Left resize shrink width 15px
+ bindsym $mod+Ctrl+Shift+Down resize grow height 15px
+ bindsym $mod+Ctrl+Shift+Up resize shrink height 15px
+ bindsym $mod+Ctrl+Shift+Right resize grow width 15px
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+ bindsym $mod+r mode "default"
+ }
+
+# Utilities:
+ # Volume
+ bindsym --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
+ bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
+ bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
+ bindsym --locked XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
+ # Brightness
+ bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
+ bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+
+ # Screenshots
+ bindsym Print exec grim -g "$(slurp)" - | wl-copy
+ bindsym Shift+Print exec grim - | wl-copy
+ bindsym Ctrl+Print exec grim -o $(swaymsg -t get_outputs | jq -r '.[] | select(.focused) | .name') - | wl-copy
+ # Playback
+ bindsym $mod+bracketright exec playerctl --player=spotify_player next
+ bindsym $mod+bracketleft exec playerctl --player=spotify_player previous
+ bindsym $mod+backslash exec playerctl --player=spotify_player play-pause
+ bindsym XF86AudioPlay exec playerctl play-pause
+ bindsym XF86AudioNext exec playerctl next
+ bindsym XF86AudioPrev exec playerctl previous
+
+include @sysconfdir@/sway/config.d/*
diff --git a/themes/dracula/.config/sway/exec b/themes/dracula/.config/sway/exec
new file mode 100644
index 0000000..a67e3de
--- /dev/null
+++ b/themes/dracula/.config/sway/exec
@@ -0,0 +1,8 @@
+exec_always autotiling
+exec export QT_QPA_PLATFORMTHEME=qt6ct
+exec export XDG_CURRENT_DESKTOP=sway
+exec systemctl --user set-environment XDG_CURRENT_DESKTOP=sway
+exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP
+exec systemctl --user start xdg-desktop-portal-wlr.service
+exec waybar -c ~/.config/waybar/sway-config -s ~/.config/waybar/style.css
+exec $term
diff --git a/themes/dracula/.config/sway/theme b/themes/dracula/.config/sway/theme
new file mode 100644
index 0000000..148478b
--- /dev/null
+++ b/themes/dracula/.config/sway/theme
@@ -0,0 +1,27 @@
+gaps inner 2px
+gaps outer 2px
+
+default_border pixel 2px
+default_floating_border pixel 2px
+
+# cursor
+seat seat0 xcursor_theme Dracula 24
+
+# Status Bar:
+bar {
+ swaybar_command waybar
+}
+
+# -Colors-
+# name border bg text ind child_border
+client.focused #bd93f9 #282a36 #f8f8f2 #bd93f9 #bd93f9
+client.focused_inactive #44475a #282a36 #f8f8f2 #44475a #44475a
+client.unfocused #282a36 #282a36 #6272a4 #282a36 #282a36
+client.urgent #ff5555 #282a36 #f8f8f2 #ff5555 #ff5555
+client.placeholder #282a36 #282a36 #f8f8f2 #282a36 #282a36
+
+# Swayfx
+# comment these out if you don't use swayfx
+#blur enable
+#corner_radius 4
+#shadows enable
diff --git a/themes/dracula/.config/waybar/sway-config b/themes/dracula/.config/waybar/sway-config
new file mode 100644
index 0000000..30b2713
--- /dev/null
+++ b/themes/dracula/.config/waybar/sway-config
@@ -0,0 +1,58 @@
+{
+ "layer": "top",
+ "position": "top",
+ "height": 24,
+ "spacing": 4,
+ "modules-left": [
+ "sway/workspaces"
+ ],
+ "modules-center": [
+ "sway/window"
+ ],
+ "modules-right": [
+ "custom/media",
+ "custom/updates",
+ "custom/storage",
+ "tray",
+ "clock"
+ ],
+ "sway/workspaces": {
+ "disable-scroll": false,
+ "all-outputs": false,
+ "format": "{name}"
+ },
+ "sway/window": {
+ "max-length": 128
+ },
+ "clock": {
+ "format": "{:%m/%d/%Y %I:%M %p}",
+ "tooltip-format": "{:%Y %B}\n{calendar}"
+ },
+ "tray": {
+ "spacing": 4
+ },
+ "custom/media": {
+ "exec": "~/.config/waybar/mediaplayer.py --player spotify_player",
+ "return-type": "json",
+ "interval": 0,
+ "on-click": "playerctl play-pause",
+ "tooltip": false
+ },
+ "custom/storage": {
+ "exec": "~/.config/waybar/modules/storage.sh",
+ "return-type": "json",
+ "interval": 900,
+ "format": "{}",
+ "tooltip": false
+ },
+ "custom/updates": {
+ "exec": "~/.config/waybar/modules/update-check.sh",
+ "interval": 900,
+ "return-type": "json",
+ "format": "{text}",
+ "on-click": "kitty -e fish -ic 'update'",
+ "on-output": "class: no-updates",
+ "on-error": "class: updates-available",
+ "tooltip": false
+ }
+}
diff --git a/themes/dracula/.config/yazi/flavor.toml b/themes/dracula/.config/yazi/flavor.toml
deleted file mode 100644
index ea9a748..0000000
--- a/themes/dracula/.config/yazi/flavor.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-[flavor]
-dark = "dracula"
-light = "dracula"
diff --git a/themes/hacker/.config/cava/config b/themes/hacker/.config/cava/config
new file mode 100644
index 0000000..d3f53ae
--- /dev/null
+++ b/themes/hacker/.config/cava/config
@@ -0,0 +1,38 @@
+## Configuration file for CAVA.
+
+[general]
+; framerate = 60
+; autosens = 1
+; bars = 0
+; bar_width = 2
+; bar_spacing = 1
+
+[input]
+; method = pipewire
+; source = auto
+
+[output]
+; method = noncurses
+
+[color]
+
+# Gradient from dim to bright orange
+gradient = 1
+gradient_color_1 = '#2a2b2a'
+gradient_color_2 = '#7a4020'
+gradient_color_3 = '#b05a28'
+gradient_color_4 = '#d07038'
+gradient_color_5 = '#ef934d'
+gradient_color_6 = '#f4a868'
+gradient_color_7 = '#f8c090'
+gradient_color_8 = '#f4decd'
+
+[smoothing]
+; noise_reduction = 77
+
+[eq]
+; 1 = 1
+; 2 = 1
+; 3 = 1
+; 4 = 1
+; 5 = 1
diff --git a/themes/hacker/.config/fish/config.fish b/themes/hacker/.config/fish/config.fish
new file mode 100644
index 0000000..a6d03f9
--- /dev/null
+++ b/themes/hacker/.config/fish/config.fish
@@ -0,0 +1,34 @@
+source /usr/share/cachyos-fish-config/cachyos-config.fish
+
+fish_config theme choose "Hacker"
+
+oh-my-posh init fish --config ~/.config/oh-my-posh/hacker.omp.json | source
+
+alias mntnas="sudo mount -a"
+
+# Set Zed as the default editor
+set -gx EDITOR /usr/local/bin/zed_sudo_wrapper
+set -gx VISUAL "zeditor --wait"
+set -gx SUDO_EDITOR "zeditor --wait"
+
+# Start SSH agent if not already running
+if not set -q SSH_AGENT_PID
+ eval (ssh-agent -c)
+end
+
+function update
+ sudo pacman -Syu --noconfirm
+ paru -Syu --noconfirm
+ sudo pacman -Sc --noconfirm
+ paru -Sc --noconfirm
+end
+
+function helium
+ exec /usr/bin/helium-0.6.9.1-x86_64.AppImage
+end
+
+function add_ssh_key
+ set -l ssh_key ~/.ssh/github-ssh
+ echo "Adding SSH key..."
+ ssh-add $ssh_key
+end
diff --git a/themes/hacker/.config/fish/themes/Hacker.theme b/themes/hacker/.config/fish/themes/Hacker.theme
new file mode 100644
index 0000000..3b04e67
--- /dev/null
+++ b/themes/hacker/.config/fish/themes/Hacker.theme
@@ -0,0 +1,32 @@
+# Hacker theme for fish shell
+
+fish_color_normal f4decd
+fish_color_command ef934d
+fish_color_keyword ef934d
+fish_color_quote e8c97e
+fish_color_redirection 71b4d6
+fish_color_end f4decd
+fish_color_error f16e65
+fish_color_param f4decd
+fish_color_comment 6a6a6a
+fish_color_selection --background=2a2b2a
+fish_color_search_match --background=1e1f1e
+fish_color_operator ef934d
+fish_color_escape f4decd
+fish_color_autosuggestion 6a6a6a
+fish_color_cwd ef934d
+fish_color_cwd_root f16e65
+fish_color_valid_path --underline
+fish_color_user ef934d
+fish_color_host f4decd
+fish_color_host_remote e8c97e
+fish_color_cancel f16e65
+fish_pager_color_progress 6a6a6a
+fish_pager_color_background
+fish_pager_color_prefix ef934d
+fish_pager_color_completion f4decd
+fish_pager_color_description 6a6a6a
+fish_pager_color_selected_background --background=2a2b2a
+fish_pager_color_selected_prefix ef934d
+fish_pager_color_selected_completion f4decd
+fish_pager_color_selected_description e8c97e
diff --git a/themes/hacker/.config/fsel/config.toml b/themes/hacker/.config/fsel/config.toml
new file mode 100644
index 0000000..1bc83c1
--- /dev/null
+++ b/themes/hacker/.config/fsel/config.toml
@@ -0,0 +1,21 @@
+highlight_color = "#ef934d"
+cursor = "█"
+terminal_launcher = "kitty -e"
+hard_stop = false
+
+rounded_borders = false
+
+main_border_color = "#3b403c"
+apps_border_color = "#3b403c"
+input_border_color = "#3b403c"
+
+main_text_color = "#f4decd"
+apps_text_color = "#f4decd"
+input_text_color = "#f4decd"
+
+fancy_mode = true
+
+header_title_color = "#ef934d"
+
+title_panel_height_percent = 30
+input_panel_height = 3
diff --git a/themes/hacker/.config/gtk-3.0/settings.ini b/themes/hacker/.config/gtk-3.0/settings.ini
new file mode 100644
index 0000000..c21ec57
--- /dev/null
+++ b/themes/hacker/.config/gtk-3.0/settings.ini
@@ -0,0 +1,17 @@
+[Settings]
+gtk-theme-name=Adwaita-dark
+gtk-icon-theme-name=Papirus-Dark
+gtk-font-name=Inter Variable 11
+gtk-cursor-theme-name=Bibata-Original-Ice
+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=1
diff --git a/themes/hacker/.config/gtk-4.0/settings.ini b/themes/hacker/.config/gtk-4.0/settings.ini
new file mode 100644
index 0000000..f446216
--- /dev/null
+++ b/themes/hacker/.config/gtk-4.0/settings.ini
@@ -0,0 +1,7 @@
+[Settings]
+gtk-theme-name=Adwaita-dark
+gtk-icon-theme-name=Papirus-Dark
+gtk-font-name=Inter Variable 11
+gtk-cursor-theme-name=Bibata-Original-Ice
+gtk-cursor-theme-size=24
+gtk-application-prefer-dark-theme=1
diff --git a/themes/hacker/.config/kitty/hacker.conf b/themes/hacker/.config/kitty/hacker.conf
new file mode 100644
index 0000000..11ba6fb
--- /dev/null
+++ b/themes/hacker/.config/kitty/hacker.conf
@@ -0,0 +1,56 @@
+foreground #f4decd
+background #141514
+selection_foreground #141514
+selection_background #ef934d
+
+url_color #71b4d6
+
+# black
+color0 #141514
+color8 #2a2b2a
+
+# red
+color1 #f16e65
+color9 #ff8a82
+
+# green
+color2 #7ec97e
+color10 #a8e6a8
+
+# yellow
+color3 #e8c97e
+color11 #f5dfa0
+
+# blue
+color4 #71b4d6
+color12 #9ecfe8
+
+# magenta
+color5 #ef934d
+color13 #f5b07a
+
+# cyan
+color6 #7ec9c4
+color14 #a8e6e2
+
+# white
+color7 #f4decd
+color15 #ffffff
+
+# Cursor colors
+cursor #ef934d
+cursor_text_color background
+
+# Tab bar colors
+active_tab_foreground #141514
+active_tab_background #ef934d
+inactive_tab_foreground #6a6a6a
+inactive_tab_background #1e1f1e
+
+# Marks
+mark1_foreground #141514
+mark1_background #f16e65
+
+# Splits/Windows
+active_border_color #ef934d
+inactive_border_color #1e1f1e
diff --git a/themes/hacker/.config/kitty/kitty.conf b/themes/hacker/.config/kitty/kitty.conf
new file mode 100644
index 0000000..92816c0
--- /dev/null
+++ b/themes/hacker/.config/kitty/kitty.conf
@@ -0,0 +1,10 @@
+include hacker.conf
+
+confirm_os_window_close 0
+
+# BEGIN_KITTY_FONTS
+font_family family="Iosevka Term"
+bold_font auto
+italic_font auto
+bold_italic_font auto
+# END_KITTY_FONTS
diff --git a/themes/hacker/.config/mako/config b/themes/hacker/.config/mako/config
new file mode 100644
index 0000000..a5bf5a1
--- /dev/null
+++ b/themes/hacker/.config/mako/config
@@ -0,0 +1,14 @@
+width=350
+height=110
+margin=5
+padding=10
+border-size=2
+border-radius=0
+icons=1
+max-icon-size=64
+default-timeout=5000
+text-alignment=left
+
+background-color=#141514
+text-color=#f4decd
+border-color=#ef934d
diff --git a/themes/hacker/.config/nwg-look/config b/themes/hacker/.config/nwg-look/config
new file mode 100644
index 0000000..3f49ae5
--- /dev/null
+++ b/themes/hacker/.config/nwg-look/config
@@ -0,0 +1,7 @@
+{
+ "export-settings-ini": true,
+ "export-gtkrc-20": true,
+ "export-index-theme": true,
+ "export-xsettingsd": true,
+ "export-gtk4-symlinks": true
+}
\ No newline at end of file
diff --git a/themes/hacker/.config/oh-my-posh/hacker.omp.json b/themes/hacker/.config/oh-my-posh/hacker.omp.json
new file mode 100644
index 0000000..de6ff99
--- /dev/null
+++ b/themes/hacker/.config/oh-my-posh/hacker.omp.json
@@ -0,0 +1,90 @@
+{
+ "$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json",
+ "blocks": [
+ {
+ "alignment": "left",
+ "segments": [
+ {
+ "foreground": "#ef934d",
+ "style": "plain",
+ "template": "{{ .UserName }}@{{ .HostName }} ",
+ "type": "session"
+ },
+ {
+ "foreground": "#f4decd",
+ "style": "plain",
+ "properties": {
+ "style": "folder"
+ },
+ "template": "{{ .Path }} ",
+ "type": "path"
+ },
+ {
+ "foreground": "#6a6a6a",
+ "style": "plain",
+ "properties": {
+ "branch_icon": " ",
+ "fetch_status": true,
+ "fetch_upstream_icon": true
+ },
+ "template": "{{ .UpstreamIcon }}{{ .HEAD }}{{if .BranchStatus }} {{ .BranchStatus }}{{ end }}{{ if .Working.Changed }}<#ef934d> *>{{ end }}{{ if and (.Working.Changed) (.Staging.Changed) }} |{{ end }}{{ if .Staging.Changed }}<#7ec97e> +>{{ end }}{{ if gt .StashCount 0 }}<#6a6a6a> {{ .StashCount }}>{{ end }} ",
+ "type": "git"
+ },
+ {
+ "foreground": "#6a6a6a",
+ "style": "plain",
+ "properties": {
+ "style": "austin",
+ "threshold": 500
+ },
+ "template": "{{ .FormattedMs }} ",
+ "type": "executiontime"
+ }
+ ],
+ "type": "prompt"
+ },
+ {
+ "alignment": "right",
+ "segments": [
+ {
+ "foreground": "#6a6a6a",
+ "style": "plain",
+ "properties": {
+ "time_format": "01/02 15:04"
+ },
+ "template": "{{ .CurrentDate | date .Format }}",
+ "type": "time"
+ }
+ ],
+ "type": "prompt"
+ },
+ {
+ "alignment": "left",
+ "newline": true,
+ "segments": [
+ {
+ "foreground": "#ef934d",
+ "foreground_templates": [
+ "{{ if gt .Code 0 }}#f16e65{{ end }}"
+ ],
+ "style": "plain",
+ "properties": {
+ "always_enabled": true
+ },
+ "template": "❯ ",
+ "type": "status"
+ }
+ ],
+ "type": "prompt"
+ }
+ ],
+ "transient_prompt": {
+ "foreground": "#ef934d",
+ "foreground_templates": [
+ "{{ if gt .Code 0 }}#f16e65{{ end }}"
+ ],
+ "template": "❯ "
+ },
+ "console_title_template": "{{ .Folder }}",
+ "version": 3
+}
diff --git a/themes/hacker/.config/otter-launcher/config.toml b/themes/hacker/.config/otter-launcher/config.toml
new file mode 100644
index 0000000..55f0278
--- /dev/null
+++ b/themes/hacker/.config/otter-launcher/config.toml
@@ -0,0 +1,117 @@
+[general]
+default_module = "app"
+empty_module = "a"
+exec_cmd = "sh -c"
+vi_mode = true
+esc_to_abort = true
+cheatsheet_entry = "?"
+cheatsheet_viewer = "less -R; clear"
+clear_screen_after_execution = false
+loop_mode = false
+external_editor = ""
+
+[interface]
+header = """
+ \u001B[34;1m >\u001B[0m $USER@$(echo $HOSTNAME) \u001B[31m\u001B[0m $(cat /proc/loadavg | cut -d ' ' -f 1) \u001B[33m\u001B[0m $(free -h | awk 'FNR == 2 {print $3}' | sed 's/i//')
+ \u001B[34;1m>\u001B[0;1m """
+header_cmd = ""
+header_cmd_trimmed_lines = 0
+header_concatenate = false
+list_prefix = " "
+selection_prefix = " \u001B[31;1m> "
+place_holder = "type and search"
+default_module_message = " \u001B[33msearch\u001B[0m the internet"
+empty_module_message = ""
+suggestion_mode = "list"
+suggestion_lines = 12
+indicator_with_arg_module = "\u001B[31m^\u001B[0m "
+indicator_no_arg_module = "\u001B[31m$\u001B[0m "
+prefix_padding = 3
+prefix_color = "\u001B[33m"
+description_color = "\u001B[39m"
+place_holder_color = "\u001B[30m"
+hint_color = "\u001B[30m"
+move_right = 0
+move_up = 0
+
+
+[[modules]]
+description = "search with brave"
+prefix = "br"
+cmd = "setsid -f xdg-open 'https://search.brave.com/search?q={}'"
+with_argument = true
+url_encode = true
+
+[[modules]]
+description = "kill a running app"
+prefix = "k"
+cmd = 'ps -u "$USER" -o comm= | sort -u | fsel --dmenu | xargs -r pkill -9'
+with_argument = true
+url_encode = true
+
+[[modules]]
+description = "launch apps with fsel"
+prefix = "a"
+cmd = "fsel -vv -r -d -ss \"{}\""
+with_argument = true
+
+[[modules]]
+description = "launch apps instantly"
+prefix = "app"
+cmd = "fsel -vv -r -d -p {}"
+with_argument = true
+
+[[modules]]
+description = "manage clipboard with fsel"
+prefix = "cl"
+cmd = """
+fsel --cclip
+"""
+
+[[modules]]
+description = "find pkgs"
+prefix = "pm"
+cmd = "pmux -SD {}"
+with_argument = true
+
+[[modules]]
+description = "install pkgs"
+prefix = "i"
+cmd = "pmux -S {}"
+with_argument = true
+
+[[modules]]
+description = "power menu"
+prefix = "p"
+cmd = """
+function power {
+if [[ -n $1 ]]; then
+case $1 in
+"logout") swaymsg exit ;;
+"suspend") systemctl suspend ;;
+"hibernate") systemctl hibernate ;;
+"reboot") systemctl reboot ;;
+"shutdown") systemctl poweroff ;;
+esac fi }
+power $(echo -e 'reboot\nshutdown\nlogout\nsuspend\nhibernate' | fzf --reverse --no-scrollbar --padding 1,3 --prompt 'Power Menu: ' | tail -1)
+"""
+
+[[modules]]
+description = "run command in terminal"
+prefix = "s"
+cmd = "setsid -f kitty -e {}"
+with_argument = true
+
+[[modules]]
+description = "search archwiki"
+prefix = "w"
+cmd = "setsid -f xdg-open https://wiki.archlinux.org/index.php?search='{}'"
+with_argument = true
+url_encode = true
+
+[[modules]]
+description = "cambridge dictionary"
+prefix = "dc"
+cmd = "setsid -f xdg-open 'https://dictionary.cambridge.org/dictionary/english/{}'"
+with_argument = true
+url_encode = true
diff --git a/themes/hacker/.config/rofi/config.rasi b/themes/hacker/.config/rofi/config.rasi
new file mode 100644
index 0000000..7aa5c3e
--- /dev/null
+++ b/themes/hacker/.config/rofi/config.rasi
@@ -0,0 +1,86 @@
+* {
+ bg: #141514;
+ bg-alt: #1e1f1e;
+ bg-active: #2a2b2a;
+ fg: #f4decd;
+ fg-dim: #6a6a6a;
+ accent: #ef934d;
+ urgent: #f16e65;
+}
+
+configuration {
+ font: "RobotoMono Nerd Font 11";
+ show-icons: true;
+ icon-theme: "Papirus-Dark";
+}
+
+window {
+ background-color: @bg;
+ border: 2px solid;
+ border-color: @accent;
+ border-radius: 0px;
+ padding: 0px;
+ width: 600px;
+}
+
+mainbox {
+ background-color: transparent;
+ children: [inputbar, listview];
+ spacing: 0px;
+}
+
+inputbar {
+ background-color: @bg-alt;
+ border: 0 0 2px 0;
+ border-color: @bg-active;
+ border-radius: 0px;
+ padding: 8px;
+ children: [prompt, entry];
+}
+
+prompt {
+ background-color: transparent;
+ text-color: @accent;
+ padding: 0 6px 0 0;
+}
+
+entry {
+ background-color: transparent;
+ text-color: @fg;
+ placeholder-color: @fg-dim;
+ placeholder: "search...";
+}
+
+listview {
+ background-color: transparent;
+ columns: 1;
+ lines: 8;
+ spacing: 0px;
+ scrollbar: false;
+ padding: 4px 0;
+}
+
+element {
+ background-color: transparent;
+ padding: 6px 8px;
+ border-radius: 0px;
+}
+
+element selected {
+ background-color: @bg-active;
+ text-color: @fg;
+ border: 0 0 0 2px;
+ border-color: @accent;
+}
+
+element-text {
+ background-color: transparent;
+ text-color: inherit;
+ vertical-align: 0.5;
+}
+
+element-icon {
+ background-color: transparent;
+ size: 1.2em;
+ vertical-align: 0.5;
+}
diff --git a/themes/hacker/.config/spotify-player/app.toml b/themes/hacker/.config/spotify-player/app.toml
new file mode 100644
index 0000000..6a60c4c
--- /dev/null
+++ b/themes/hacker/.config/spotify-player/app.toml
@@ -0,0 +1,73 @@
+theme = "Hacker"
+client_id = "a5e67511fd004d1d96bc0d1cfc8c29fc"
+client_port = 8080
+login_redirect_uri = "http://127.0.0.1:8989/login"
+playback_format = """
+{status} {track} • {artists} {liked}
+{album} • {genres}
+{metadata}"""
+playback_metadata_fields = [
+ "repeat",
+ "shuffle",
+ "volume",
+ "device",
+]
+notify_timeout_in_secs = 0
+tracks_playback_limit = 50
+app_refresh_duration_in_ms = 32
+playback_refresh_duration_in_ms = 0
+page_size_in_rows = 20
+play_icon = "▶"
+pause_icon = "▌▌"
+liked_icon = "♥"
+border_type = "Plain"
+progress_bar_type = "Rectangle"
+progress_bar_position = "Bottom"
+genre_num = 2
+cover_img_length = 9
+cover_img_width = 5
+cover_img_scale = 1.0
+enable_media_control = true
+enable_streaming = "Always"
+enable_notify = true
+enable_cover_image_cache = true
+default_device = "cachyos-player"
+notify_streaming_only = false
+seek_duration_secs = 5
+sort_artist_albums_by_type = false
+
+[notify_format]
+summary = "{track} • {artists}"
+body = "{album}"
+
+[layout]
+playback_window_position = "Top"
+playback_window_height = 6
+
+[layout.library]
+playlist_percent = 40
+album_percent = 40
+
+[device]
+name = "cachyos-player"
+device_type = "speaker"
+volume = 70
+bitrate = 320
+audio_cache = false
+normalization = false
+autoplay = false
+
+[[themes]]
+name = "Hacker"
+[themes.component_style]
+block_title = { fg = "Yellow" }
+border = { fg = "DarkGray" }
+playback_track = { fg = "Yellow", modifiers = "Bold" }
+playback_artists = { fg = "White" }
+playback_album = { fg = "DarkGray" }
+playback_metadata = { fg = "DarkGray" }
+playback_progress_bar = { bg = "Yellow", fg = "DarkGray" }
+current_playing = { fg = "Yellow", modifiers = "Bold" }
+page_desc = { fg = "DarkGray", modifiers = "Italic" }
+table_header = { fg = "Yellow" }
+selection = { bg = "DarkGray", modifiers = "Bold" }
diff --git a/themes/hacker/.config/sway/config b/themes/hacker/.config/sway/config
new file mode 100644
index 0000000..4ea47d4
--- /dev/null
+++ b/themes/hacker/.config/sway/config
@@ -0,0 +1,171 @@
+include ./monitors
+include ./exec
+include ./theme
+
+exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway
+set $gnome-schema org.gnome.desktop.interface
+exec_always {
+ export WLR_NO_HARDWARE_CURSORS=1
+ export GBM_BACKEND=nvidia-drm
+ export __GLX_VENDOR_LIBRARY_NAME=nvidia
+ export WLR_RENDERER=vulkan
+}
+
+include "$(/usr/libexec/sway/layered-include '/usr/share/sway/config.d/*.conf' '/etc/sway/config.d/*.conf')"
+
+set $mod Mod4
+
+# direction keys
+set $left h
+set $down j
+set $up k
+set $right l
+
+set $term kitty
+set $menu kitty --app-id fsel fsel -r -d
+set $launcher kitty --app-id otter-launcher otter-launcher
+set $browser /home/henry/AppImages/helium.appimage
+set $filemanager kitty -e yazi
+for_window [app_id="fsel"] border pixel 2
+for_window [app_id="otter-launcher"] border pixel 2
+
+# -Key bindings-
+
+# Basics:
+ bindsym $mod+Return exec $term
+ bindsym $mod+q kill
+ bindsym $mod+space exec $menu
+ bindsym $mod+d exec $launcher
+ floating_modifier $mod normal
+ bindsym $mod+Shift+r reload
+ bindsym $mod+Shift+e exit
+
+# App launchers:
+ bindsym $mod+b exec $browser
+ bindsym $mod+e exec $filemanager
+ bindsym $mod+w exec ~/.config/rofi/wallpaper_selector.sh
+ bindsym $mod+p exec wlogout
+ bindsym $mod+s exec steam
+ bindsym $mod+a exec mumble
+
+# Moving around:
+ bindsym $mod+$left focus left
+ bindsym $mod+$down focus down
+ bindsym $mod+$up focus up
+ bindsym $mod+$right focus right
+ bindsym $mod+Left focus left
+ bindsym $mod+Down focus down
+ bindsym $mod+Up focus up
+ bindsym $mod+Right focus right
+
+ bindsym $mod+Shift+$left move left
+ bindsym $mod+Shift+$down move down
+ bindsym $mod+Shift+$up move up
+ bindsym $mod+Shift+$right move right
+ bindsym $mod+Shift+Left move left
+ bindsym $mod+Shift+Down move down
+ bindsym $mod+Shift+Up move up
+ bindsym $mod+Shift+Right move right
+
+# Workspaces:
+ bindsym $mod+1 workspace number 1
+ bindsym $mod+2 workspace number 2
+ bindsym $mod+3 workspace number 3
+ bindsym $mod+4 workspace number 4
+ bindsym $mod+5 workspace number 5
+ bindsym $mod+6 workspace number 6
+ bindsym $mod+7 workspace number 7
+ bindsym $mod+8 workspace number 8
+ bindsym $mod+9 workspace number 9
+ bindsym $mod+0 workspace number 10
+ bindsym $mod+n workspace number 11
+ bindsym $mod+m workspace number 12
+
+# Move window silently to workspace:
+ bindsym $mod+Shift+1 move container to workspace number 1
+ bindsym $mod+Shift+2 move container to workspace number 2
+ bindsym $mod+Shift+3 move container to workspace number 3
+ bindsym $mod+Shift+4 move container to workspace number 4
+ bindsym $mod+Shift+5 move container to workspace number 5
+ bindsym $mod+Shift+6 move container to workspace number 6
+ bindsym $mod+Shift+7 move container to workspace number 7
+ bindsym $mod+Shift+8 move container to workspace number 8
+ bindsym $mod+Shift+9 move container to workspace number 9
+ bindsym $mod+Shift+0 move container to workspace number 10
+ bindsym $mod+Shift+n move container to workspace number 11
+ bindsym $mod+Shift+m move container to workspace number 12
+
+# Move window to workspace and follow:
+ bindsym $mod+Ctrl+1 move container to workspace number 1; workspace number 1
+ bindsym $mod+Ctrl+2 move container to workspace number 2; workspace number 2
+ bindsym $mod+Ctrl+3 move container to workspace number 3; workspace number 3
+ bindsym $mod+Ctrl+4 move container to workspace number 4; workspace number 4
+ bindsym $mod+Ctrl+5 move container to workspace number 5; workspace number 5
+ bindsym $mod+Ctrl+6 move container to workspace number 6; workspace number 6
+ bindsym $mod+Ctrl+7 move container to workspace number 7; workspace number 7
+ bindsym $mod+Ctrl+8 move container to workspace number 8; workspace number 8
+ bindsym $mod+Ctrl+9 move container to workspace number 9; workspace number 9
+ bindsym $mod+Ctrl+0 move container to workspace number 10; workspace number 10
+ bindsym $mod+Ctrl+Left move container to workspace prev; workspace prev
+ bindsym $mod+Ctrl+Right move container to workspace next; workspace next
+
+# Workspace cycling:
+ bindsym $mod+period workspace next_on_output
+ bindsym $mod+comma workspace prev_on_output
+ bindsym $mod+slash workspace back_and_forth
+
+# Scratchpad:
+ bindsym $mod+minus move scratchpad
+ bindsym $mod+equal scratchpad show
+
+# Layout stuff:
+ bindsym $mod+Shift+b splith
+ bindsym $mod+Shift+v splitv
+ bindsym $mod+Shift+s layout stacking
+ bindsym $mod+Shift+w layout tabbed
+ bindsym $mod+t layout toggle split
+ bindsym $mod+f fullscreen
+ bindsym $mod+v floating toggle
+
+# Resize mode:
+ bindsym $mod+r mode "resize"
+ mode "resize" {
+ bindsym $left resize shrink width 15px
+ bindsym $down resize grow height 15px
+ bindsym $up resize shrink height 15px
+ bindsym $right resize grow width 15px
+ bindsym Left resize shrink width 15px
+ bindsym Down resize grow height 15px
+ bindsym Up resize shrink height 15px
+ bindsym Right resize grow width 15px
+ bindsym $mod+Ctrl+Shift+Left resize shrink width 15px
+ bindsym $mod+Ctrl+Shift+Down resize grow height 15px
+ bindsym $mod+Ctrl+Shift+Up resize shrink height 15px
+ bindsym $mod+Ctrl+Shift+Right resize grow width 15px
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+ bindsym $mod+r mode "default"
+ }
+
+# Utilities:
+ # Volume
+ bindsym --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
+ bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
+ bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
+ bindsym --locked XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
+ # Brightness
+ bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
+ bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+
+ # Screenshots
+ bindsym Print exec grim -g "$(slurp)" - | wl-copy
+ bindsym Shift+Print exec grim - | wl-copy
+ bindsym Ctrl+Print exec grim -o $(swaymsg -t get_outputs | jq -r '.[] | select(.focused) | .name') - | wl-copy
+ # Playback
+ bindsym $mod+bracketright exec playerctl --player=spotify_player next
+ bindsym $mod+bracketleft exec playerctl --player=spotify_player previous
+ bindsym $mod+backslash exec playerctl --player=spotify_player play-pause
+ bindsym XF86AudioPlay exec playerctl play-pause
+ bindsym XF86AudioNext exec playerctl next
+ bindsym XF86AudioPrev exec playerctl previous
+
+include @sysconfdir@/sway/config.d/*
diff --git a/themes/hacker/.config/sway/exec b/themes/hacker/.config/sway/exec
new file mode 100644
index 0000000..3f9253c
--- /dev/null
+++ b/themes/hacker/.config/sway/exec
@@ -0,0 +1,6 @@
+exec_always autotiling
+exec export QT_QPA_PLATFORMTHEME=qt6ct
+exec export XDG_CURRENT_DESKTOP=sway
+exec systemctl --user set-environment XDG_CURRENT_DESKTOP=sway
+exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP
+exec systemctl --user start xdg-desktop-portal-wlr.service
diff --git a/themes/hacker/.config/sway/monitors b/themes/hacker/.config/sway/monitors
new file mode 100644
index 0000000..07310a5
--- /dev/null
+++ b/themes/hacker/.config/sway/monitors
@@ -0,0 +1,19 @@
+# Wallpaper - solid color
+output * bg #141514 solid_color
+
+# Monitors:
+output HDMI-A-1 res 1920x1080@239.76Hz pos 0,0 transform 0
+output DP-1 res 2560x1440@59.95Hz pos 1920,0 transform 270
+output eDP-2 disable
+
+# Workspace assignments:
+# 1-2 → HDMI-A-1 (primary)
+# 3-5 → DP-1 (secondary)
+# 6-12 → follows focused output
+workspace 1 output HDMI-A-1
+workspace 2 output HDMI-A-1
+workspace 3 output DP-1
+workspace 4 output DP-1
+workspace 5 output DP-1
+
+workspace 1
diff --git a/themes/hacker/.config/sway/theme b/themes/hacker/.config/sway/theme
new file mode 100644
index 0000000..163829a
--- /dev/null
+++ b/themes/hacker/.config/sway/theme
@@ -0,0 +1,44 @@
+gaps inner 2px
+gaps outer 2px
+
+default_border pixel 2px
+default_floating_border pixel 2px
+
+# cursor
+seat seat0 xcursor_theme Bibata-Original-Ice 14
+
+# Status Bar:
+bar {
+ swaybar_command swaybar
+ font Iosevka Term 12
+ position top
+ workspace_min_width 36
+ tray_padding 4
+ status_command while date +'%m/%d/%Y %I:%M %p'; do sleep 30; done
+ colors {
+ background #141514
+ statusline #ef934d
+ separator #ef934d
+ focused_background #1e1f1e
+ focused_statusline #ef934d
+ focused_separator #ef934d
+ focused_workspace #ef934d #141514 #ef934d
+ active_workspace #7ec97e #141514 #7ec97e
+ inactive_workspace #141514 #141514 #6a6a6a
+ urgent_workspace #f16e65 #141514 #f16e65
+ binding_mode #71b4d6 #141514 #71b4d6
+ }
+}
+
+# -Colors-
+# name border bg text ind child_border
+client.focused #ef944d #141514 #f4decd #ef944d #ef944d
+client.focused_inactive #1e1f1e #141514 #f4decd #1e1f1e #1e1f1e
+client.unfocused #1e1f1e #141514 #f4decd #1e1f1e #1e1f1e
+client.urgent #f16e65 #141514 #f4decd #f16e65 #f16e65
+client.placeholder #1e1f1e #141514 #f4decd #1e1f1e #1e1f1e
+
+# Swayfx
+#blur enable
+#corner_radius 0
+#shadows enable
diff --git a/themes/hacker/.config/waybar/colors.css b/themes/hacker/.config/waybar/colors.css
new file mode 100644
index 0000000..464e06d
--- /dev/null
+++ b/themes/hacker/.config/waybar/colors.css
@@ -0,0 +1,13 @@
+@define-color background-darkest rgba(12, 14, 12, 255);
+@define-color background-darker rgba(20, 21, 20, 230);
+@define-color background #141514;
+@define-color background-active #1e1f1e;
+@define-color selection #2a2b2a;
+@define-color foreground #f4decd;
+@define-color comment #6a6a6a;
+@define-color orange #ef934d;
+@define-color red #f16e65;
+@define-color green #7ec97e;
+@define-color blue #71b4d6;
+@define-color yellow #e8c97e;
+@define-color cyan #7ec9c4;
diff --git a/themes/hacker/.config/waybar/config b/themes/hacker/.config/waybar/config
new file mode 100644
index 0000000..30b2713
--- /dev/null
+++ b/themes/hacker/.config/waybar/config
@@ -0,0 +1,58 @@
+{
+ "layer": "top",
+ "position": "top",
+ "height": 24,
+ "spacing": 4,
+ "modules-left": [
+ "sway/workspaces"
+ ],
+ "modules-center": [
+ "sway/window"
+ ],
+ "modules-right": [
+ "custom/media",
+ "custom/updates",
+ "custom/storage",
+ "tray",
+ "clock"
+ ],
+ "sway/workspaces": {
+ "disable-scroll": false,
+ "all-outputs": false,
+ "format": "{name}"
+ },
+ "sway/window": {
+ "max-length": 128
+ },
+ "clock": {
+ "format": "{:%m/%d/%Y %I:%M %p}",
+ "tooltip-format": "{:%Y %B}\n{calendar}"
+ },
+ "tray": {
+ "spacing": 4
+ },
+ "custom/media": {
+ "exec": "~/.config/waybar/mediaplayer.py --player spotify_player",
+ "return-type": "json",
+ "interval": 0,
+ "on-click": "playerctl play-pause",
+ "tooltip": false
+ },
+ "custom/storage": {
+ "exec": "~/.config/waybar/modules/storage.sh",
+ "return-type": "json",
+ "interval": 900,
+ "format": "{}",
+ "tooltip": false
+ },
+ "custom/updates": {
+ "exec": "~/.config/waybar/modules/update-check.sh",
+ "interval": 900,
+ "return-type": "json",
+ "format": "{text}",
+ "on-click": "kitty -e fish -ic 'update'",
+ "on-output": "class: no-updates",
+ "on-error": "class: updates-available",
+ "tooltip": false
+ }
+}
diff --git a/themes/hacker/.config/waybar/style.css b/themes/hacker/.config/waybar/style.css
new file mode 100644
index 0000000..aeff7ed
--- /dev/null
+++ b/themes/hacker/.config/waybar/style.css
@@ -0,0 +1,61 @@
+@import url("./colors.css");
+* {
+ border: none;
+ border-radius: 0;
+ font-family: "RobotoMono Nerd Font", "Iosevka Term", monospace;
+ font-size: 11pt;
+ min-height: 0;
+}
+window#waybar {
+ background: @background;
+ color: @foreground;
+ border-bottom: 2px solid @orange;
+}
+#workspaces button {
+ padding: 0 10px;
+ background: @background;
+ color: @comment;
+ border-radius: 0;
+}
+#workspaces button:hover {
+ box-shadow: inherit;
+ text-shadow: inherit;
+ background: @background-active;
+ color: @foreground;
+}
+#workspaces button.focused,
+#workspaces button.active {
+ background: @background-active;
+ color: @orange;
+ border-bottom: 2px solid @orange;
+}
+#workspaces button.urgent {
+ background: @background-active;
+ color: @red;
+ border-bottom: 2px solid @red;
+}
+#clock {
+ padding: 0 8px;
+ color: @foreground;
+}
+#custom-updates.no-updates {
+ color: @comment;
+}
+#custom-updates.updates-available {
+ color: @orange;
+}
+#custom-media {
+ color: @foreground;
+ padding: 0 4px;
+}
+#custom-storage {
+ color: @comment;
+ padding: 0 4px;
+}
+#tray {
+ padding: 0 4px;
+}
+#window {
+ color: @comment;
+ padding: 0 4px;
+}
diff --git a/themes/hacker/.config/wlogout/icons/hibernate.png b/themes/hacker/.config/wlogout/icons/hibernate.png
new file mode 100644
index 0000000..b60616c
Binary files /dev/null and b/themes/hacker/.config/wlogout/icons/hibernate.png differ
diff --git a/themes/hacker/.config/wlogout/icons/logout.png b/themes/hacker/.config/wlogout/icons/logout.png
new file mode 100644
index 0000000..33bb77b
Binary files /dev/null and b/themes/hacker/.config/wlogout/icons/logout.png differ
diff --git a/themes/hacker/.config/wlogout/icons/reboot.png b/themes/hacker/.config/wlogout/icons/reboot.png
new file mode 100644
index 0000000..d9e8a59
Binary files /dev/null and b/themes/hacker/.config/wlogout/icons/reboot.png differ
diff --git a/themes/hacker/.config/wlogout/icons/shutdown.png b/themes/hacker/.config/wlogout/icons/shutdown.png
new file mode 100644
index 0000000..52475a0
Binary files /dev/null and b/themes/hacker/.config/wlogout/icons/shutdown.png differ
diff --git a/themes/hacker/.config/wlogout/icons/suspend.png b/themes/hacker/.config/wlogout/icons/suspend.png
new file mode 100644
index 0000000..7da1033
Binary files /dev/null and b/themes/hacker/.config/wlogout/icons/suspend.png differ
diff --git a/themes/hacker/.config/wlogout/layout b/themes/hacker/.config/wlogout/layout
new file mode 100644
index 0000000..9ff42bc
--- /dev/null
+++ b/themes/hacker/.config/wlogout/layout
@@ -0,0 +1,30 @@
+{
+ "label" : "hibernate",
+ "action" : "systemctl hibernate",
+ "text" : "Hibernate",
+ "keybind" : "h"
+}
+{
+ "label" : "logout",
+ "action" : "swaymsg exit",
+ "text" : "Logout",
+ "keybind" : "e"
+}
+{
+ "label" : "shutdown",
+ "action" : "systemctl poweroff",
+ "text" : "Shutdown",
+ "keybind" : "s"
+}
+{
+ "label" : "suspend",
+ "action" : "systemctl suspend",
+ "text" : "Suspend",
+ "keybind" : "u"
+}
+{
+ "label" : "reboot",
+ "action" : "systemctl reboot",
+ "text" : "Reboot",
+ "keybind" : "r"
+}
diff --git a/themes/hacker/.config/wlogout/style.css b/themes/hacker/.config/wlogout/style.css
new file mode 100644
index 0000000..941f1d7
--- /dev/null
+++ b/themes/hacker/.config/wlogout/style.css
@@ -0,0 +1,47 @@
+* {
+ background-image: none;
+ box-shadow: none;
+}
+
+window {
+ background-color: rgba(20, 21, 20, 0.92);
+}
+
+button {
+ border-radius: 0px;
+ margin: 4px;
+ border-style: solid;
+ border-width: 2px;
+ border-color: #ef934d;
+ background-color: #1e1f1e;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 25%;
+ color: #ef934d;
+}
+
+button:focus, button:active, button:hover {
+ border-color: #ef934d;
+ background-color: #2a2b2a;
+ outline-style: none;
+}
+
+#logout {
+ background-image: image(url("icons/logout.png"));
+}
+
+#suspend {
+ background-image: image(url("icons/suspend.png"));
+}
+
+#hibernate {
+ background-image: image(url("icons/hibernate.png"));
+}
+
+#shutdown {
+ background-image: image(url("icons/shutdown.png"));
+}
+
+#reboot {
+ background-image: image(url("icons/reboot.png"));
+}
diff --git a/themes/hacker/.config/wob/wob_horizontal.ini b/themes/hacker/.config/wob/wob_horizontal.ini
new file mode 100644
index 0000000..2d1254f
--- /dev/null
+++ b/themes/hacker/.config/wob/wob_horizontal.ini
@@ -0,0 +1,14 @@
+margin = 50
+anchor = bottom center
+
+background_color = 141514ff
+bar_color = ef934dff
+border_color = ef934dff
+
+overflow_background_color = 141514ff
+overflow_bar_color = f16e65ff
+overflow_border_color = f16e65ff
+
+[style.muted]
+bar_color = 2a2b2aff
+overflow_bar_color = 2a2b2aff
diff --git a/themes/hacker/.config/xsettingsd/xsettingsd.conf b/themes/hacker/.config/xsettingsd/xsettingsd.conf
new file mode 100644
index 0000000..b6b1901
--- /dev/null
+++ b/themes/hacker/.config/xsettingsd/xsettingsd.conf
@@ -0,0 +1,9 @@
+Net/ThemeName "Adwaita-dark"
+Net/IconThemeName "Papirus-Dark"
+Gtk/CursorThemeName "Bibata-Original-Ice"
+Net/EnableEventSounds 1
+EnableInputFeedbackSounds 0
+Xft/Antialias 1
+Xft/Hinting 1
+Xft/HintStyle "hintslight"
+Xft/RGBA "rgb"
diff --git a/themes/hacker/.config/yazi/flavors/hacker.yazi/flavor.toml b/themes/hacker/.config/yazi/flavors/hacker.yazi/flavor.toml
new file mode 100644
index 0000000..46752d9
--- /dev/null
+++ b/themes/hacker/.config/yazi/flavors/hacker.yazi/flavor.toml
@@ -0,0 +1,81 @@
+[manager]
+cwd = { fg = "#ef934d" }
+
+hovered = { fg = "#f4decd", bg = "#2a2b2a", bold = true }
+preview_hovered = { fg = "#f4decd", bg = "#1e1f1e" }
+
+find_keyword = { fg = "#ef934d", bold = true }
+find_position = { fg = "#f4decd", bg = "#2a2b2a" }
+
+marker_selected = { fg = "#ef934d", bg = "#ef934d" }
+marker_copied = { fg = "#7ec97e", bg = "#7ec97e" }
+marker_cut = { fg = "#f16e65", bg = "#f16e65" }
+
+tab_active = { fg = "#141514", bg = "#ef934d", bold = true }
+tab_inactive = { fg = "#6a6a6a", bg = "#1e1f1e" }
+tab_width = 1
+
+count_copied = { fg = "#141514", bg = "#7ec97e" }
+count_cut = { fg = "#141514", bg = "#f16e65" }
+
+border_symbol = "│"
+border_style = { fg = "#2a2b2a" }
+
+[status]
+separator_open = ""
+separator_close = ""
+separator_style = { fg = "#1e1f1e", bg = "#1e1f1e" }
+
+mode_normal = { fg = "#141514", bg = "#ef934d", bold = true }
+mode_select = { fg = "#141514", bg = "#7ec97e", bold = true }
+mode_unset = { fg = "#141514", bg = "#f16e65", bold = true }
+
+progress_label = { fg = "#f4decd", bold = true }
+progress_normal = { fg = "#ef934d", bg = "#1e1f1e" }
+progress_error = { fg = "#f16e65", bg = "#1e1f1e" }
+
+permissions_t = { fg = "#ef934d" }
+permissions_r = { fg = "#e8c97e" }
+permissions_w = { fg = "#f16e65" }
+permissions_x = { fg = "#7ec97e" }
+permissions_s = { fg = "#6a6a6a" }
+
+[input]
+border = { fg = "#ef934d" }
+title = { fg = "#ef934d" }
+value = { fg = "#f4decd" }
+selected = { fg = "#141514", bg = "#ef934d" }
+
+[completion]
+border = { fg = "#2a2b2a" }
+active = { fg = "#f4decd", bg = "#2a2b2a" }
+inactive = { fg = "#6a6a6a" }
+
+[tasks]
+border = { fg = "#ef934d" }
+title = { fg = "#ef934d" }
+hovered = { fg = "#f4decd", bg = "#2a2b2a" }
+
+[which]
+mask = { bg = "#141514" }
+cand = { fg = "#ef934d" }
+rest = { fg = "#6a6a6a" }
+desc = { fg = "#f4decd" }
+separator = " "
+separator_style = { fg = "#2a2b2a" }
+
+[notify]
+title_info = { fg = "#ef934d", bold = true }
+title_warn = { fg = "#e8c97e", bold = true }
+title_error = { fg = "#f16e65", bold = true }
+
+icon_info = ""
+icon_warn = ""
+icon_error = ""
+
+[help]
+on = { fg = "#ef934d" }
+run = { fg = "#f4decd" }
+desc = { fg = "#6a6a6a" }
+hovered = { fg = "#141514", bg = "#ef934d" }
+footer = { fg = "#141514", bg = "#2a2b2a" }
diff --git a/themes/hacker/.config/yazi/theme.toml b/themes/hacker/.config/yazi/theme.toml
new file mode 100644
index 0000000..3c6e861
--- /dev/null
+++ b/themes/hacker/.config/yazi/theme.toml
@@ -0,0 +1,20 @@
+[filetype]
+rules = [
+ # Directories (trailing slash in name matches dirs)
+ { name = "*/", fg = "#ef934d" },
+ # Executables
+ { is = "exec", fg = "#7ec97e" },
+ # Symlinks
+ { is = "link", fg = "#71b4d6" },
+ { is = "orphan", fg = "#f16e65" },
+ # Archives
+ { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio}", fg = "#e8c97e" },
+ # Images
+ { mime = "image/*", fg = "#f4decd" },
+ # Audio/Video
+ { mime = "{audio,video}/*", fg = "#bd93f9" },
+ # Documents/Text
+ { mime = "text/*", fg = "#f4decd" },
+ # Fallback
+ { name = "*", fg = "#c8c8c8" },
+]
diff --git a/themes/hacker/.config/yazi/yazi.toml b/themes/hacker/.config/yazi/yazi.toml
new file mode 100644
index 0000000..87fdff7
--- /dev/null
+++ b/themes/hacker/.config/yazi/yazi.toml
@@ -0,0 +1,258 @@
+# A TOML linter such as https://taplo.tamasfe.dev/ can use this schema to validate your config.
+# If you encounter any issues, please make an issue at https://github.com/yazi-rs/schemas.
+"$schema" = "https://yazi-rs.github.io/schemas/yazi.json"
+
+[mgr]
+ratio = [ 1, 4, 3 ]
+sort_by = "alphabetical"
+sort_sensitive = false
+sort_reverse = false
+sort_dir_first = true
+sort_translit = false
+linemode = "none"
+show_hidden = true
+show_symlink = true
+scrolloff = 5
+mouse_events = [ "click", "scroll" ]
+title_format = "Yazi: {cwd}"
+
+[preview]
+wrap = "no"
+tab_size = 2
+max_width = 600
+max_height = 900
+cache_dir = ""
+image_delay = 30
+image_filter = "triangle"
+image_quality = 75
+ueberzug_scale = 1
+ueberzug_offset = [ 0, 0, 0, 0 ]
+
+[opener]
+edit = [
+ { run = "/usr/local/bin/zed_sudo_wrapper %s", desc = "Zed (sudo fallback)", for = "unix", block = true },
+ { run = "code %s", desc = "code", for = "windows", orphan = true },
+ { run = "code -w %s", desc = "code (block)", for = "windows", block = true },
+]
+play = [
+ { run = "xdg-open %s1", desc = "Play", for = "linux" },
+ { run = "open %s", desc = "Play", for = "macos" },
+ { run = 'start "" %s1', orphan = true, desc = "Play", for = "windows" },
+ { run = "termux-open %s1", desc = "Play", for = "android" },
+ { run = "mediainfo %s1; echo 'Press enter to exit'; read _", block = true, desc = "Show media info", for = "unix" },
+ { run = "mediainfo %s1 & pause", block = true, desc = "Show media info", for = "windows" },
+]
+open = [
+ { run = "xdg-open %s1", desc = "Open", for = "linux" },
+ { run = "open %s", desc = "Open", for = "macos" },
+ { run = 'start "" %s1', desc = "Open", for = "windows", orphan = true },
+ { run = "termux-open %s1", desc = "Open", for = "android" },
+]
+reveal = [
+ { run = "xdg-open %d1", desc = "Reveal", for = "linux" },
+ { run = "open -R %s1", desc = "Reveal", for = "macos" },
+ { run = "explorer /select,%s1", desc = "Reveal", for = "windows", orphan = true },
+ { run = "termux-open %d1", desc = "Reveal", for = "android" },
+ { run = "clear; exiftool %s1; echo 'Press enter to exit'; read _", desc = "Show EXIF", for = "unix", block = true },
+]
+extract = [
+ { run = "ya pub extract --list %s", desc = "Extract here" },
+]
+download = [
+ { run = "ya emit download --open %S", desc = "Download and open" },
+ { run = "ya emit download %S", desc = "Download" },
+]
+pdf = [
+ { run = "zathura %s", desc = "Zathura", block = true },
+]
+zedproj = [
+ { run = "zeditor -n %s", desc = "Zed (project)", for = "unix", orphan = true, block = false },
+]
+
+[open]
+rules = [
+ # Folder
+ { url = "*/", use = [ "zedproj", "open", "reveal" ] },
+ # TOML (force editor regardless of mime detector differences)
+ { url = "*.toml", use = [ "edit", "reveal" ] },
+ { mime = "application/{toml,x-toml}", use = [ "edit", "reveal" ] },
+ # Common config formats (force editor)
+ { url = "*.{yaml,yml,conf,ini}", use = [ "edit", "reveal" ] },
+ # Text
+ { mime = "text/*", use = [ "edit", "reveal" ] },
+ # Image
+ { mime = "image/*", use = [ "open", "reveal" ] },
+ # Media
+ { mime = "{audio,video}/*", use = [ "play", "reveal" ] },
+ # Archive
+ { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", use = [ "extract", "reveal" ] },
+ # JSON
+ { mime = "application/{json,ndjson}", use = [ "edit", "reveal" ] },
+ { mime = "*/javascript", use = [ "edit", "reveal" ] },
+ # Empty file
+ { mime = "inode/empty", use = [ "edit", "reveal" ] },
+ # Virtual file system
+ { mime = "vfs/{absent,stale}", use = "download" },
+ # PDF
+ { mime = "application/pdf", use = [ "pdf" ], desc = "Open PDF" },
+ # Fallback
+ { url = "*", use = [ "open", "reveal" ] },
+]
+
+[tasks]
+micro_workers = 10
+macro_workers = 10
+bizarre_retry = 3
+image_alloc = 536870912 # 512MB
+image_bound = [ 10000, 10000 ]
+suppress_preload = false
+
+[plugin]
+fetchers = [
+ # Mimetype
+ { id = "mime", url = "*/", run = "mime.dir", prio = "high" },
+ { id = "mime", url = "local://*", run = "mime.local", prio = "high" },
+ { id = "mime", url = "remote://*", run = "mime.remote", prio = "high" },
+]
+spotters = [
+ { url = "*/", run = "folder" },
+ # Code
+ { mime = "text/*", run = "code" },
+ { mime = "application/{mbox,javascript,wine-extension-ini}", run = "code" },
+ # Image
+ { mime = "image/{avif,hei?,jxl}", run = "magick" },
+ { mime = "image/svg+xml", run = "svg" },
+ { mime = "image/*", run = "image" },
+ # Video
+ { mime = "video/*", run = "video" },
+ # Virtual file system
+ { mime = "vfs/*", run = "vfs" },
+ # Error
+ { mime = "null/*", run = "null" },
+ # Fallback
+ { url = "*", run = "file" },
+]
+preloaders = [
+ # Image
+ { mime = "image/{avif,hei?,jxl}", run = "magick" },
+ { mime = "image/svg+xml", run = "svg" },
+ { mime = "image/*", run = "image" },
+ # Video
+ { mime = "video/*", run = "video" },
+ # PDF
+ { mime = "application/pdf", run = "pdf" },
+ # Font
+ { mime = "font/*", run = "font" },
+ { mime = "application/ms-opentype", run = "font" },
+]
+previewers = [
+ { url = "*/", run = "folder" },
+ # Code
+ { mime = "text/*", run = "code" },
+ { mime = "application/{mbox,javascript,wine-extension-ini}", run = "code" },
+ # JSON
+ { mime = "application/{json,ndjson}", run = "json" },
+ # Image
+ { mime = "image/{avif,hei?,jxl}", run = "magick" },
+ { mime = "image/svg+xml", run = "svg" },
+ { mime = "image/*", run = "image" },
+ # Video
+ { mime = "video/*", run = "video" },
+ # PDF
+ { mime = "application/pdf", run = "pdf" },
+ # Archive
+ { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", run = "archive" },
+ { mime = "application/{debian*-package,redhat-package-manager,rpm,android.package-archive}", run = "archive" },
+ { url = "*.{AppImage,appimage}", run = "archive" },
+ # Virtual Disk / Disk Image
+ { mime = "application/{iso9660-image,qemu-disk,ms-wim,apple-diskimage}", run = "archive" },
+ { mime = "application/virtualbox-{vhd,vhdx}", run = "archive" },
+ { url = "*.{img,fat,ext,ext2,ext3,ext4,squashfs,ntfs,hfs,hfsx}", run = "archive" },
+ # Font
+ { mime = "font/*", run = "font" },
+ { mime = "application/ms-opentype", run = "font" },
+ # Empty file
+ { mime = "inode/empty", run = "empty" },
+ # Virtual file system
+ { mime = "vfs/*", run = "vfs" },
+ # Error
+ { mime = "null/*", run = "null" },
+ # Fallback
+ { url = "*", run = "file" },
+]
+
+[input]
+cursor_blink = false
+
+# cd
+cd_title = "Change directory:"
+cd_origin = "top-center"
+cd_offset = [ 0, 2, 50, 3 ]
+
+# create
+create_title = [ "Create:", "Create (dir):" ]
+create_origin = "top-center"
+create_offset = [ 0, 2, 50, 3 ]
+
+# rename
+rename_title = "Rename:"
+rename_origin = "hovered"
+rename_offset = [ 0, 1, 50, 3 ]
+
+# filter
+filter_title = "Filter:"
+filter_origin = "top-center"
+filter_offset = [ 0, 2, 50, 3 ]
+
+# find
+find_title = [ "Find next:", "Find previous:" ]
+find_origin = "top-center"
+find_offset = [ 0, 2, 50, 3 ]
+
+# search
+search_title = "Search via {n}:"
+search_origin = "top-center"
+search_offset = [ 0, 2, 50, 3 ]
+
+# shell
+shell_title = [ "Shell:", "Shell (block):" ]
+shell_origin = "top-center"
+shell_offset = [ 0, 2, 50, 3 ]
+
+[confirm]
+# trash
+trash_title = "Trash {n} selected file{s}?"
+trash_origin = "center"
+trash_offset = [ 0, 0, 70, 20 ]
+
+# delete
+delete_title = "Permanently delete {n} selected file{s}?"
+delete_origin = "center"
+delete_offset = [ 0, 0, 70, 20 ]
+
+# overwrite
+overwrite_title = "Overwrite file?"
+overwrite_body = "Will overwrite the following file:"
+overwrite_origin = "center"
+overwrite_offset = [ 0, 0, 50, 15 ]
+
+# quit
+quit_title = "Quit?"
+quit_body = "The following tasks are still running, are you sure you want to quit?"
+quit_origin = "center"
+quit_offset = [ 0, 0, 50, 15 ]
+
+[pick]
+open_title = "Open with:"
+open_origin = "hovered"
+open_offset = [ 0, 1, 50, 7 ]
+
+[which]
+sort_by = "none"
+sort_sensitive = false
+sort_reverse = false
+sort_translit = false
+
+[flavor]
+dark = "hacker"
+light = "hacker"
diff --git a/themes/hacker/.config/youtube-tui/appearance.yml b/themes/hacker/.config/youtube-tui/appearance.yml
new file mode 100644
index 0000000..dc08a3f
--- /dev/null
+++ b/themes/hacker/.config/youtube-tui/appearance.yml
@@ -0,0 +1,27 @@
+borders: Plain
+colors:
+ text: Reset
+ text_special: Reset
+ text_secondary: Reset
+ text_error: LightRed
+ outline: DarkGray
+ outline_selected: Yellow
+ outline_hover: LightRed
+ outline_secondary: DarkGray
+ message_outline: Yellow
+ message_error_outline: LightRed
+ message_success_outline: LightGreen
+ command_capture: Yellow
+ item_info:
+ tag: DarkGray
+ title: Yellow
+ description: DarkGray
+ author: White
+ viewcount: DarkGray
+ length: DarkGray
+ published: DarkGray
+ video_count: DarkGray
+ sub_count: DarkGray
+ likes: DarkGray
+ genre: DarkGray
+ page_turner: DarkGray
diff --git a/themes/hacker/.config/zed/settings.json b/themes/hacker/.config/zed/settings.json
new file mode 100644
index 0000000..c316c39
--- /dev/null
+++ b/themes/hacker/.config/zed/settings.json
@@ -0,0 +1,27 @@
+// Zed settings
+{
+ "title_bar": {
+ "show_sign_in": false
+ },
+ "ui_font_family": "Inter Variable",
+ "buffer_font_family": "Iosevka Term",
+ "vim_mode": false,
+ "disable_ai": true,
+ "telemetry": {
+ "diagnostics": false,
+ "metrics": false
+ },
+ "languages": {
+ "Markdown": {
+ "format_on_save": "on"
+ }
+ },
+ "icon_theme": "Zed (Default)",
+ "ui_font_size": 16,
+ "buffer_font_size": 15,
+ "theme": {
+ "mode": "dark",
+ "light": "Hacker",
+ "dark": "Hacker"
+ }
+}
diff --git a/themes/hacker/.config/zed/themes/hacker.json b/themes/hacker/.config/zed/themes/hacker.json
new file mode 100644
index 0000000..cb513d7
--- /dev/null
+++ b/themes/hacker/.config/zed/themes/hacker.json
@@ -0,0 +1,146 @@
+{
+ "$schema": "https://zed.dev/schema/themes/v0.2.0.json",
+ "name": "Hacker",
+ "author": "local",
+ "themes": [
+ {
+ "name": "Hacker",
+ "appearance": "dark",
+ "style": {
+ "accents": [
+ "#ef934dff",
+ "#f4decdff",
+ "#71b4d6ff",
+ "#7ec97eff",
+ "#e8c97eff",
+ "#f16e65ff",
+ "#7ec9c4ff"
+ ],
+ "border": "#2a2b2aff",
+ "border.variant": "#ef934d33",
+ "border.focused": "#ef934d99",
+ "border.selected": "#ef934dcc",
+ "border.transparent": "#00000000",
+ "border.disabled": null,
+ "elevated_surface.background": "#1e1f1eff",
+ "surface.background": "#1a1b1aff",
+ "background": "#141514ff",
+ "element.background": "#1e1f1eff",
+ "element.hover": "#2a2b2aff",
+ "element.active": "#3a3b3aff",
+ "element.selected": "#2a2b2aff",
+ "element.disabled": "#6a6a6aff",
+ "drop_target.background": "#2a2b2aff",
+ "ghost_element.background": "#00000000",
+ "ghost_element.hover": "#ef934d20",
+ "ghost_element.active": "#ef934d35",
+ "ghost_element.selected": "#ef934d18",
+ "ghost_element.disabled": "#6a6a6aff",
+ "text": "#f4decdff",
+ "text.muted": "#b09080ff",
+ "text.placeholder": "#6a6a6aff",
+ "text.disabled": "#6a6a6aaa",
+ "text.accent": "#ef934dff",
+ "icon": "#f4decdff",
+ "icon.muted": "#f4decd70",
+ "icon.disabled": "#f4decd40",
+ "icon.placeholder": "#6a6a6aff",
+ "icon.accent": "#ef934dff",
+ "status_bar.background": "#0c0e0cff",
+ "title_bar.background": "#0c0e0cff",
+ "title_bar.inactive_background": "#141514ff",
+ "toolbar.background": "#141514ff",
+ "tab_bar.background": "#1e1f1eff",
+ "tab.inactive_background": "#1e1f1eff",
+ "tab.active_background": "#141514ff",
+ "search.match_background": "#ef934d40",
+ "panel.background": "#0c0e0cff",
+ "panel.focused_border": "#ef934dff",
+ "panel.indent_guide": "#2a2b2aff",
+ "panel.indent_guide_active": "#ef934d99",
+ "pane.focused_border": "#ef934dff",
+ "scrollbar.thumb.background": "#2a2b2aff",
+ "scrollbar.thumb.hover_background": "#ef934d99",
+ "scrollbar.thumb.border": "#2a2b2aff",
+ "scrollbar.track.background": "#141514ff",
+ "scrollbar.track.border": "#1e1f1eff",
+ "editor.foreground": "#f4decdff",
+ "editor.background": "#141514ff",
+ "editor.gutter.background": "#141514ff",
+ "editor.subheader.background": "#1e1f1eff",
+ "editor.active_line.background": "#1e1f1e99",
+ "editor.highlighted_line.background": "#2a2b2a60",
+ "editor.line_number": "#6a6a6aff",
+ "editor.active_line_number": "#ef934dff",
+ "editor.invisible": "#2a2b2aff",
+ "editor.wrap_guide": "#2a2b2aff",
+ "editor.active_wrap_guide": "#3a3b3aff",
+ "editor.document_highlight.read_background": "#ef934d25",
+ "editor.document_highlight.write_background": "#ef934d40",
+ "terminal.background": "#141514ff",
+ "terminal.foreground": "#f4decdff",
+ "terminal.bright_foreground": "#ffffffff",
+ "terminal.dim_foreground": "#6a6a6aff",
+ "terminal.ansi.black": "#141514ff",
+ "terminal.ansi.bright_black": "#2a2b2aff",
+ "terminal.ansi.red": "#f16e65ff",
+ "terminal.ansi.bright_red": "#ff8a82ff",
+ "terminal.ansi.green": "#7ec97eff",
+ "terminal.ansi.bright_green": "#a8e6a8ff",
+ "terminal.ansi.yellow": "#e8c97eff",
+ "terminal.ansi.bright_yellow": "#f5dfa0ff",
+ "terminal.ansi.blue": "#71b4d6ff",
+ "terminal.ansi.bright_blue": "#9ecfe8ff",
+ "terminal.ansi.magenta": "#ef934dff",
+ "terminal.ansi.bright_magenta": "#f5b07aff",
+ "terminal.ansi.cyan": "#7ec9c4ff",
+ "terminal.ansi.bright_cyan": "#a8e6e2ff",
+ "terminal.ansi.white": "#f4decdff",
+ "terminal.ansi.bright_white": "#ffffffff",
+ "syntax": {
+ "attribute": { "color": "#ef934dff" },
+ "boolean": { "color": "#ef934dff" },
+ "comment": { "color": "#6a6a6aff", "font_style": "italic" },
+ "comment.doc": { "color": "#8a9a8aff", "font_style": "italic" },
+ "constant": { "color": "#ef934dff" },
+ "constructor": { "color": "#f4decdff", "font_weight": 700 },
+ "embedded": { "color": "#f4decdff" },
+ "emphasis": { "font_style": "italic" },
+ "emphasis.strong": { "font_weight": 700 },
+ "enum": { "color": "#e8c97eff" },
+ "function": { "color": "#f4decdff", "font_weight": 700 },
+ "hint": { "color": "#6a6a6aff" },
+ "keyword": { "color": "#ef934dff" },
+ "label": { "color": "#ef934dff" },
+ "link_text": { "color": "#71b4d6ff", "font_style": "italic" },
+ "link_uri": { "color": "#71b4d6ff" },
+ "number": { "color": "#ef934dff" },
+ "operator": { "color": "#f4decdff" },
+ "predictive": { "color": "#6a6a6aff", "font_style": "italic" },
+ "preproc": { "color": "#ef934dff" },
+ "primary": { "color": "#f4decdff" },
+ "property": { "color": "#f4decdff" },
+ "punctuation": { "color": "#6a6a6aff" },
+ "punctuation.bracket": { "color": "#6a6a6aff" },
+ "punctuation.delimiter": { "color": "#6a6a6aff" },
+ "punctuation.list_marker": { "color": "#ef934dff" },
+ "punctuation.special": { "color": "#ef934dff" },
+ "string": { "color": "#7ec97eff" },
+ "string.escape": { "color": "#f4decdff" },
+ "string.regex": { "color": "#7ec9c4ff" },
+ "string.special": { "color": "#7ec97eff" },
+ "string.special.symbol": { "color": "#ef934dff" },
+ "tag": { "color": "#ef934dff" },
+ "text.literal": { "color": "#7ec97eff" },
+ "title": { "color": "#f4decdff", "font_weight": 700 },
+ "type": { "color": "#e8c97eff" },
+ "type.builtin": { "color": "#e8c97eff" },
+ "variable": { "color": "#f4decdff" },
+ "variable.builtin": { "color": "#ef934dff" },
+ "variable.member": { "color": "#f4decdff" },
+ "variable.parameter": { "color": "#f4decdff", "font_style": "italic" }
+ }
+ }
+ }
+ ]
+}