diff --git a/.gitignore b/.gitignore
index a392386..b2bd4e4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ matlab
mymenu
vim/.vim/bundle
wm
+wallpapers
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c9a5d39
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,8 @@
+{
+ "search.exclude": {
+ "**/node_modules": true,
+ "**/bower_components": true,
+ "**/*.code-search": true,
+ "**/misc/.local": true
+ }
+}
diff --git a/bspwm/.config/bspwm/.DNH-Latitude-7480 b/bspwm/.config/bspwm/.DNH-Latitude-7480
deleted file mode 100644
index d505cdb..0000000
--- a/bspwm/.config/bspwm/.DNH-Latitude-7480
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-# put machine dependent stuff here
-
-bspc rule -a Plank layer=normal manage=on border=off focus=off locked=on
-
-pkill -x wallpaper.sh
-wallpaper.sh &
-
-stalonetray -i 24 -geometry 1x1-430+0 &
-nm-applet &
-
-#redshift -m randr -r -l 52.0685:4.5094 -t 5700:2700 &
-panel &
-
diff --git a/bspwm/.config/bspwm/bspwmrc b/bspwm/.config/bspwm/bspwmrc
index cb1bd16..3afa124 100755
--- a/bspwm/.config/bspwm/bspwmrc
+++ b/bspwm/.config/bspwm/bspwmrc
@@ -1,4 +1,6 @@
#!/bin/zsh
+export XCURSOR_SIZE=64
+
HOST=$(cat /etc/hostname)
@@ -90,6 +92,7 @@ dunst &
# bspc monitor $MON1 -d 6 7 8 9 10
#fi
+pkill panel
setsid panel &
# if type "xrandr"; then
# for m in $(xrandr --query | grep " connected" | cut -d" " -f1); do
diff --git a/bspwm/.config/bspwm/emilia.bspwm.sh b/bspwm/.config/bspwm/emilia.bspwm.sh
index d784b92..5464a59 100644
--- a/bspwm/.config/bspwm/emilia.bspwm.sh
+++ b/bspwm/.config/bspwm/emilia.bspwm.sh
@@ -9,17 +9,20 @@ nm-applet &
blueman-applet &
pkill redshift
-redshift-gtk -m randr -r -l 52.0685:4.5094 -t 5700:2700 &
+redshift-gtk -m randr -r -l 52.0685:4.5094 -t 5700:1500 &
pkill picom
picom --config /dev/null --backend glx --xrender-sync-fence --vsync -b
pkill stalonetray
-stalonetray &
+# stalonetray &
+# somehow the above command renders stalonetray wrapping top right corner to top left corner
+stalonetray -i 24 -geometry 1x1-1+0 &
lxsession &
-xautolock -corners "0000" -time 5 -locker lock.sh &!
+# top right corner prevent xautolock from kicking in
+xautolock -corners "0-00" -time 5 -locker lock.sh &!
setxkbmap -option caps:escape
# after factory resetting my monitors, things got twisted
@@ -28,5 +31,7 @@ setxkbmap -option caps:escape
# bspc monitor HDMI-0 -d 6 7 8 9 10
bspc monitor HDMI-0 -d 1 2 3 4 5 6 7 8 9 10
-sudo fix_bluetooth
+# sudo fix_bluetooth
+cc_token_monitor &
+
(sleep 5 && journalctl -S "$(date "+%F %T")" --no-pager -f -u earlyoom.service | grep --line-buffered "sending" | notifier "EarlyOOM" &)
diff --git a/rofi/.config/rofi/config.rasi.emilia b/rofi/.config/rofi/config.rasi.emilia
new file mode 100644
index 0000000..eb4741a
--- /dev/null
+++ b/rofi/.config/rofi/config.rasi.emilia
@@ -0,0 +1,165 @@
+/*
+rofi.modi: combi,run,window,ssh,drun
+rofi.width: 100
+rofi.lines: 24
+rofi.font: Operator Mono 14
+rofi.color-normal: #00fdf6e3,#ffffff,#00eee8d5,#268bd2,#eee8d5
+rofi.color-window: #DD000000,#000000,#00000000
+rofi.bw: 0
+rofi.padding: 400
+rofi.combi-modi: window,run,ssh,drun
+*/
+configuration {
+/* modes: "window,drun,run,ssh";*/
+ font: "Operator Mono 14";
+/* location: 0;*/
+/* yoffset: 0;*/
+/* xoffset: 0;*/
+/* fixed-num-lines: true;*/
+/* show-icons: false;*/
+/* terminal: "rofi-sensible-terminal";*/
+/* ssh-client: "ssh";*/
+/* ssh-command: "{terminal} -e {ssh-client} {host} [-p {port}]";*/
+/* run-command: "{cmd}";*/
+/* run-list-command: "";*/
+/* run-shell-command: "{terminal} -e {cmd}";*/
+/* window-command: "wmctrl -i -R {window}";*/
+/* window-match-fields: "all";*/
+/* icon-theme: ;*/
+/* drun-match-fields: "name,generic,exec,categories,keywords";*/
+/* drun-categories: ;*/
+/* drun-show-actions: false;*/
+/* drun-display-format: "{name} [({generic})]";*/
+/* drun-url-launcher: "xdg-open";*/
+/* disable-history: false;*/
+/* ignored-prefixes: "";*/
+/* sort: false;*/
+/* sorting-method: "normal";*/
+/* case-sensitive: false;*/
+/* cycle: true;*/
+/* sidebar-mode: false;*/
+/* hover-select: false;*/
+/* eh: 1;*/
+/* auto-select: false;*/
+/* parse-hosts: false;*/
+/* parse-known-hosts: true;*/
+/* combi-modes: "window,run";*/
+/* matching: "normal";*/
+/* tokenize: true;*/
+/* m: "-5";*/
+/* filter: ;*/
+/* dpi: -1;*/
+/* threads: 0;*/
+/* scroll-method: 0;*/
+/* window-format: "{w} {c} {t}";*/
+/* click-to-exit: true;*/
+/* max-history-size: 25;*/
+/* combi-hide-mode-prefix: false;*/
+/* combi-display-format: "{mode} {text}";*/
+/* matching-negate-char: '-' /* unsupported */;*/
+/* cache-dir: ;*/
+/* window-thumbnail: false;*/
+/* drun-use-desktop-cache: false;*/
+/* drun-reload-desktop-cache: false;*/
+/* normalize-match: false;*/
+/* steal-focus: false;*/
+/* application-fallback-icon: ;*/
+/* refilter-timeout-limit: 8192;*/
+/* xserver-i300-workaround: false;*/
+/* pid: "/run/user/1000/rofi.pid";*/
+/* display-window: ;*/
+/* display-windowcd: ;*/
+/* display-run: ;*/
+/* display-ssh: ;*/
+/* display-drun: ;*/
+/* display-combi: ;*/
+/* display-keys: ;*/
+/* display-filebrowser: ;*/
+/* kb-primary-paste: "Control+V,Shift+Insert";*/
+/* kb-secondary-paste: "Control+v,Insert";*/
+/* kb-clear-line: "Control+w";*/
+/* kb-move-front: "Control+a";*/
+/* kb-move-end: "Control+e";*/
+/* kb-move-word-back: "Alt+b,Control+Left";*/
+/* kb-move-word-forward: "Alt+f,Control+Right";*/
+/* kb-move-char-back: "Left,Control+b";*/
+/* kb-move-char-forward: "Right,Control+f";*/
+/* kb-remove-word-back: "Control+Alt+h,Control+BackSpace";*/
+/* kb-remove-word-forward: "Control+Alt+d";*/
+/* kb-remove-char-forward: "Delete,Control+d";*/
+/* kb-remove-char-back: "BackSpace,Shift+BackSpace,Control+h";*/
+/* kb-remove-to-eol: "Control+k";*/
+/* kb-remove-to-sol: "Control+u";*/
+/* kb-accept-entry: "Control+j,Control+m,Return,KP_Enter";*/
+/* kb-accept-custom: "Control+Return";*/
+/* kb-accept-custom-alt: "Control+Shift+Return";*/
+/* kb-accept-alt: "Shift+Return";*/
+/* kb-delete-entry: "Shift+Delete";*/
+/* kb-mode-next: "Shift+Right,Control+Tab";*/
+/* kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab";*/
+/* kb-mode-complete: "Control+l";*/
+/* kb-row-left: "Control+Page_Up";*/
+/* kb-row-right: "Control+Page_Down";*/
+/* kb-row-up: "Up,Control+p";*/
+/* kb-row-down: "Down,Control+n";*/
+/* kb-row-tab: "";*/
+/* kb-element-next: "Tab";*/
+/* kb-element-prev: "ISO_Left_Tab";*/
+/* kb-page-prev: "Page_Up";*/
+/* kb-page-next: "Page_Down";*/
+/* kb-row-first: "Home,KP_Home";*/
+/* kb-row-last: "End,KP_End";*/
+/* kb-row-select: "Control+space";*/
+/* kb-screenshot: "Alt+S";*/
+/* kb-ellipsize: "Alt+period";*/
+/* kb-toggle-case-sensitivity: "grave,dead_grave";*/
+/* kb-toggle-sort: "Alt+grave";*/
+/* kb-cancel: "Escape,Control+g,Control+bracketleft";*/
+/* kb-custom-1: "Alt+1";*/
+/* kb-custom-2: "Alt+2";*/
+/* kb-custom-3: "Alt+3";*/
+/* kb-custom-4: "Alt+4";*/
+/* kb-custom-5: "Alt+5";*/
+/* kb-custom-6: "Alt+6";*/
+/* kb-custom-7: "Alt+7";*/
+/* kb-custom-8: "Alt+8";*/
+/* kb-custom-9: "Alt+9";*/
+/* kb-custom-10: "Alt+0";*/
+/* kb-custom-11: "Alt+exclam";*/
+/* kb-custom-12: "Alt+at";*/
+/* kb-custom-13: "Alt+numbersign";*/
+/* kb-custom-14: "Alt+dollar";*/
+/* kb-custom-15: "Alt+percent";*/
+/* kb-custom-16: "Alt+dead_circumflex";*/
+/* kb-custom-17: "Alt+ampersand";*/
+/* kb-custom-18: "Alt+asterisk";*/
+/* kb-custom-19: "Alt+parenleft";*/
+/* kb-select-1: "Super+1";*/
+/* kb-select-2: "Super+2";*/
+/* kb-select-3: "Super+3";*/
+/* kb-select-4: "Super+4";*/
+/* kb-select-5: "Super+5";*/
+/* kb-select-6: "Super+6";*/
+/* kb-select-7: "Super+7";*/
+/* kb-select-8: "Super+8";*/
+/* kb-select-9: "Super+9";*/
+/* kb-select-10: "Super+0";*/
+/* ml-row-left: "ScrollLeft";*/
+/* ml-row-right: "ScrollRight";*/
+/* ml-row-up: "ScrollUp";*/
+/* ml-row-down: "ScrollDown";*/
+/* me-select-entry: "MousePrimary";*/
+/* me-accept-entry: "MouseDPrimary";*/
+/* me-accept-custom: "Control+MouseDPrimary";*/
+ timeout {
+ action: "kb-cancel";
+ delay: 0;
+ }
+ filebrowser {
+ directories-first: true;
+ sorting-method: "name";
+ }
+}
+
+@theme "gruvbox-dark-hard.rasi"
+/* @theme "sidebar-v2.rasi" */
diff --git a/rofi/.config/rofi/gruvbox-common.rasi b/rofi/.config/rofi/gruvbox-common.rasi
new file mode 100644
index 0000000..69330e2
--- /dev/null
+++ b/rofi/.config/rofi/gruvbox-common.rasi
@@ -0,0 +1,131 @@
+/* ==========================================================================
+ File: gruvbox-common.rasi
+ Desc: Shared rules between all gruvbox themes
+ Author: bardisty
+ Source: https://github.com/bardisty/gruvbox-rofi
+ Modified: Mon Feb 12 2018 06:06:47 PST -0800
+ ========================================================================== */
+
+window {
+ background-color: @background;
+ border: 2;
+ padding: 2;
+}
+
+mainbox {
+ border: 0;
+ padding: 0;
+}
+
+message {
+ border: 2px 0 0;
+ border-color: @separatorcolor;
+ padding: 1px;
+}
+
+textbox {
+ highlight: @highlight;
+ text-color: @foreground;
+}
+
+listview {
+ border: 2px solid 0 0;
+ padding: 2px 0 0;
+ border-color: @separatorcolor;
+ spacing: 2px;
+ scrollbar: @scrollbar;
+}
+
+element {
+ border: 0;
+ padding: 2px;
+}
+
+element.normal.normal {
+ background-color: @normal-background;
+ text-color: @normal-foreground;
+}
+
+element.normal.urgent {
+ background-color: @urgent-background;
+ text-color: @urgent-foreground;
+}
+
+element.normal.active {
+ background-color: @active-background;
+ text-color: @active-foreground;
+}
+
+element.selected.normal {
+ background-color: @selected-normal-background;
+ text-color: @selected-normal-foreground;
+}
+
+element.selected.urgent {
+ background-color: @selected-urgent-background;
+ text-color: @selected-urgent-foreground;
+}
+
+element.selected.active {
+ background-color: @selected-active-background;
+ text-color: @selected-active-foreground;
+}
+
+element.alternate.normal {
+ background-color: @alternate-normal-background;
+ text-color: @alternate-normal-foreground;
+}
+
+element.alternate.urgent {
+ background-color: @alternate-urgent-background;
+ text-color: @alternate-urgent-foreground;
+}
+
+element.alternate.active {
+ background-color: @alternate-active-background;
+ text-color: @alternate-active-foreground;
+}
+
+scrollbar {
+ width: 4px;
+ border: 0;
+ handle-color: @scrollbar-handle;
+ handle-width: 8px;
+ padding: 0;
+}
+
+mode-switcher {
+ border: 2px 0 0;
+ border-color: @separatorcolor;
+}
+
+inputbar {
+ spacing: 0;
+ text-color: @normal-foreground;
+ padding: 2px;
+ children: [ prompt, textbox-prompt-sep, entry, case-indicator ];
+}
+
+case-indicator,
+entry,
+prompt,
+button {
+ spacing: 0;
+ text-color: @normal-foreground;
+}
+
+button.selected {
+ background-color: @selected-normal-background;
+ text-color: @selected-normal-foreground;
+}
+
+textbox-prompt-sep {
+ expand: false;
+ str: ":";
+ text-color: @normal-foreground;
+ margin: 0 0.3em 0 0;
+}
+element-text, element-icon {
+ background-color: inherit;
+ text-color: inherit;
+}
diff --git a/rofi/.config/rofi/gruvbox-dark-hard.rasi b/rofi/.config/rofi/gruvbox-dark-hard.rasi
new file mode 100644
index 0000000..f09507e
--- /dev/null
+++ b/rofi/.config/rofi/gruvbox-dark-hard.rasi
@@ -0,0 +1,62 @@
+/* ==========================================================================
+ Rofi color theme
+
+ Based on the Gruvbox color scheme for Vim by morhetz
+ https://github.com/morhetz/gruvbox
+
+ File: gruvbox-dark-hard.rasi
+ Desc: Gruvbox dark (hard contrast) color theme for Rofi
+ Author: bardisty
+ Source: https://github.com/bardisty/gruvbox-rofi
+ Modified: Mon Feb 12 2018 06:04:26 PST -0800
+ ========================================================================== */
+
+* {
+ /* Theme settings */
+ highlight: bold italic;
+ scrollbar: true;
+
+ /* Gruvbox dark colors */
+ gruvbox-dark-bg0-hard: #1d2021;
+ gruvbox-dark-bg0: #282828;
+ gruvbox-dark-bg2: #504945;
+ gruvbox-dark-fg0: #fbf1c7;
+ gruvbox-dark-fg1: #ebdbb2;
+ gruvbox-dark-red-dark: #cc241d;
+ gruvbox-dark-red-light: #fb4934;
+ gruvbox-dark-yellow-dark: #d79921;
+ gruvbox-dark-yellow-light: #fabd2f;
+ gruvbox-dark-gray: #a89984;
+
+ /* Theme colors */
+ background: @gruvbox-dark-bg0-hard;
+ background-color: @background;
+ foreground: @gruvbox-dark-fg1;
+ border-color: @gruvbox-dark-gray;
+ separatorcolor: @border-color;
+ scrollbar-handle: @border-color;
+
+ normal-background: @background;
+ normal-foreground: @foreground;
+ alternate-normal-background: @gruvbox-dark-bg0;
+ alternate-normal-foreground: @foreground;
+ selected-normal-background: @gruvbox-dark-bg2;
+ selected-normal-foreground: @gruvbox-dark-fg0;
+
+ active-background: @gruvbox-dark-yellow-dark;
+ active-foreground: @background;
+ alternate-active-background: @active-background;
+ alternate-active-foreground: @active-foreground;
+ selected-active-background: @gruvbox-dark-yellow-light;
+ selected-active-foreground: @active-foreground;
+
+ urgent-background: @gruvbox-dark-red-dark;
+ urgent-foreground: @background;
+ alternate-urgent-background: @urgent-background;
+ alternate-urgent-foreground: @urgent-foreground;
+ selected-urgent-background: @gruvbox-dark-red-light;
+ selected-urgent-foreground: @urgent-foreground;
+}
+
+@import "gruvbox-common.rasi"
+
diff --git a/rofi/.config/rofi/sidebar-v2.rasi b/rofi/.config/rofi/sidebar-v2.rasi
new file mode 100644
index 0000000..e0ee824
--- /dev/null
+++ b/rofi/.config/rofi/sidebar-v2.rasi
@@ -0,0 +1,125 @@
+/**
+ * ROFI Color theme
+ * User: Qball
+ * Copyright: Dave Davenport
+ */
+
+* {
+ background-color: transparent;
+ // Bold, Italic, Underline
+ highlight: bold #ffffff;
+}
+window {
+ background-color: black / 80%;
+ border-color: white;
+ border-radius: 0 15mm 15mm 0;
+
+ padding: 10mm;
+
+ height: 100%;
+ width: 150mm;
+ border: 1mm 1mm 1mm 0px;
+ text-color: white;
+
+
+ location: west;
+ anchor: west;
+}
+inputbar {
+ background-color: transparent;
+ text-color: black;
+ children: [prompt, entry, textbox-end];
+ spacing: 1mm;
+}
+prompt {
+ border-radius: 5mm 0mm 0mm 5mm;
+ width: 15mm;
+}
+textbox-end {
+ border-radius: 0mm 5mm 5mm 0mm;
+ width: 15mm;
+ expand: false;
+}
+entry {
+ background-color: grey;
+}
+prompt, entry, textbox-end, num-filtered-rows {
+ background-color: white;
+ text-color: inherit;
+ padding: 2mm;
+ vertical-align: 0.5;
+}
+element {
+ border-radius: 5mm;
+ children: [element-icon];
+}
+textbox-current-entry {
+ border-radius: 5mm;
+ background-color: lightgreen;
+ text-color: black;
+ placeholder: "n/a";
+ padding: 2mm;
+ horizontal-align: 0.5;
+ }
+element-icon {
+ expand: true;
+ size: 10mm;
+ vertial-align: 0.5;
+ horizontal-align: 0.5;
+ padding: 2mm;
+}
+
+
+mainbox {
+ expand: true;
+ background-color: transparent;
+ spacing: 5mm;
+ children: [
+ inputbar,
+ listview,
+ icon-current-entry,
+ textbox-current-entry
+ ];
+}
+icon-current-entry {
+ size: 100mm;
+ }
+listview {
+ padding: 0em;
+ dynamic: false;
+ lines: 0;
+ columns: 8;
+ flow: horizontal;
+}
+element selected normal {
+ background-color: MediumSlateBlue;
+}
+element normal active {
+ text-color: MediumTurquoise;
+}
+element normal urgent {
+ text-color: red;
+}
+element alternate normal {
+}
+element alternate active {
+ text-color: MediumTurquoise;
+}
+element alternate urgent {
+ text-color: MediumVioletRed;
+}
+element selected active {
+ background-color: MediumTurquoise;
+ text-color: black;
+}
+element selected urgent {
+ background-color: MediumVioletRed;
+ text-color: black;
+}
+error-message {
+ expand: true;
+ background-color: red;
+ border-color: darkred;
+ border: 2px;
+ padding: 1em;
+}
diff --git a/scripts/bin/ban_hackers b/scripts/bin/ban_hackers
new file mode 100755
index 0000000..f8fd28f
--- /dev/null
+++ b/scripts/bin/ban_hackers
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+# File containing the IP addresses
+IP_FILE="/home/dino/unique_ssh_hacker_ip_addresses.txt"
+
+# Loop through each IP address in the file and add an iptables rule to ban it
+while IFS= read -r ip; do
+ sudo iptables -A INPUT -s "$ip" -j DROP
+done < "$IP_FILE"
+
+# Save the iptables rules
+sudo iptables-save
+
diff --git a/scripts/bin/big_screen_off b/scripts/bin/big_screen_off
new file mode 100755
index 0000000..d06405f
--- /dev/null
+++ b/scripts/bin/big_screen_off
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+xrandr --output DP-2 --off
+bspc monitor DP-0 -d 1 2 3 4 5 6 7 8 9 10
+pkill panel
+panel &!
diff --git a/scripts/bin/big_screen_on b/scripts/bin/big_screen_on
new file mode 100755
index 0000000..3287b55
--- /dev/null
+++ b/scripts/bin/big_screen_on
@@ -0,0 +1,5 @@
+#/bin/bash
+xrandr --output DP-2 --auto
+setup_monitors
+pkill panel
+panel &!
diff --git a/scripts/bin/cc_token_monitor b/scripts/bin/cc_token_monitor
new file mode 100755
index 0000000..8353be4
--- /dev/null
+++ b/scripts/bin/cc_token_monitor
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+while true;
+do
+ cost=$(npx ccusage@latest daily --order desc --json | jq ".daily[0].modelBreakdowns[0].cost")
+ to_fifo "Q Claude Code Today: \$ $(printf '%.2f' "$cost")"
+ sleep 15
+done
diff --git a/scripts/bin/chill b/scripts/bin/chill
new file mode 100755
index 0000000..89459a8
--- /dev/null
+++ b/scripts/bin/chill
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+set -x
+
+while true; do
+ ipmitool -I lanplus -H 192.168.50.138 -U USERID -P PASSW0RD raw 0x3a 0x07 0x01 0x12 0x01
+ ipmitool -I lanplus -H 192.168.50.138 -U USERID -P PASSW0RD raw 0x3a 0x07 0x02 0x12 0x01
+ sleep 2
+done
diff --git a/scripts/bin/clear_partial_yay_cache b/scripts/bin/clear_partial_yay_cache
new file mode 100755
index 0000000..dc95d3c
--- /dev/null
+++ b/scripts/bin/clear_partial_yay_cache
@@ -0,0 +1,5 @@
+#!/bin/sh
+# copy pasted from: https://gist.github.com/luukvbaal/2c697b5e068471ee989bff8a56507142
+yaycache="$(find /home/$USER/.cache/yay -maxdepth 1 -type d | awk '{ print "-c " $1 }' | tail -n +2)"
+echo "==> Keep last 2 installed versions"
+/usr/bin/paccache -rvk2 -c /var/cache/pacman/pkg $yaycache
diff --git a/scripts/bin/fix_bluetooth b/scripts/bin/fix_bluetooth
new file mode 100755
index 0000000..f191f1e
--- /dev/null
+++ b/scripts/bin/fix_bluetooth
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+sudo rmmod btusb
+sudo rmmod btintel
+
+sudo modprobe btintel
+sudo modprobe btusb
+
diff --git a/scripts/bin/geth-size b/scripts/bin/geth-size
new file mode 100755
index 0000000..e553e08
--- /dev/null
+++ b/scripts/bin/geth-size
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+du -sh /data4/geth-data-volume | grep -Po "\d{1,4}G"
diff --git a/scripts/bin/list-efi-vars b/scripts/bin/list-efi-vars
new file mode 100755
index 0000000..586fd11
--- /dev/null
+++ b/scripts/bin/list-efi-vars
@@ -0,0 +1,24 @@
+#!/usr/bin/python3
+import os
+
+efivars_path = '/sys/firmware/efi/efivars'
+
+
+
+for root, dirs, files in os.walk(efivars_path):
+ for efi_filename in files:
+ with open(os.path.join(root, efi_filename), mode='rb') as f:
+ print(efi_filename)
+ value = f.read()
+ try:
+ value = value.decode('utf-8')
+ print('STR:')
+ print(value)
+ except UnicodeDecodeError as exc:
+ # print(exc)
+ print('HEX:')
+ print(value.hex())
+
+ print('--------')
+
+# print(b'danaher'.hex())
diff --git a/scripts/bin/monitor_mi50_temp.sh b/scripts/bin/monitor_mi50_temp.sh
new file mode 100755
index 0000000..0100d29
--- /dev/null
+++ b/scripts/bin/monitor_mi50_temp.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# monitor_mi50_temp.sh
+# Continuously monitor AMD MI50 GPU temperature
+
+set -euo pipefail
+
+# Check dependencies
+if ! command -v rocm-smi &>/dev/null; then
+ echo "Error: rocm-smi not found. Install with: sudo pacman -S rocm-smi"
+ exit 1
+fi
+
+INTERVAL=${1:-5} # seconds between updates
+
+echo "Monitoring MI50 temperature every ${INTERVAL}s (press Ctrl+C to stop)"
+echo "-------------------------------------------------------------"
+
+# Loop forever
+while true; do
+ clear
+ date '+%Y-%m-%d %H:%M:%S'
+ echo "-------------------------------------------------------------"
+
+ # Print temperature and power info
+ rocm-smi --showtemp --showpower --showfan --showvoltage | grep -E "GPU\[[0-9]+\]|Temperature|Power|Fan|Voltage"
+
+ sleep "$INTERVAL"
+done
+
diff --git a/scripts/bin/organize_media.py b/scripts/bin/organize_media.py
index 9a7da85..a1ae40b 100755
--- a/scripts/bin/organize_media.py
+++ b/scripts/bin/organize_media.py
@@ -49,6 +49,7 @@
re.compile(r"^(?P\d{4}-\d{2}-\d{2})\s+\d{2}\.\d{2}\.\d{2}.*$", re.IGNORECASE),
re.compile(r"^(VID|VIDEOPLAYER)-(?P\d{8})-.*$", re.IGNORECASE),
re.compile(r"^IMG_(?P\d{8})_\d{6}.*$", re.IGNORECASE),
+ re.compile(r"VID_(?P\d{8})_\d{6}\..*$", re.IGNORECASE),
]
# ── helpers ──────────────────────────────────────────────────────────────── #
diff --git a/scripts/bin/pacman_future_conflit_check.py b/scripts/bin/pacman_future_conflit_check.py
new file mode 100644
index 0000000..211455b
--- /dev/null
+++ b/scripts/bin/pacman_future_conflit_check.py
@@ -0,0 +1,91 @@
+"""The following command checks which packages have a dependency on a given package checking through
+all packages even though not installed locally:
+pacman -Sii nodejs-lts-gallium | grep "Req" | sed -e 's/Required By : //g'
+
+This returns a string of packages separated by spaces and some prefix.
+
+This script does the same thing but then in python and tells you which packages you currently have
+installed of those. This is inspired by getting "warning: removing 'nodejs' from target list because
+it conflicts with 'nodejs-lts-gallium'" why trying to run pacman -Syu today.
+The warning does not help, it should tell me where the warning is coming from.
+"""
+
+import sys
+import subprocess
+from typing import List
+
+
+def run(cmd: str, timeout=None) -> subprocess.CompletedProcess:
+ return subprocess.run(cmd,
+ shell=True,
+ stderr=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ universal_newlines=True,
+ timeout=timeout)
+
+
+def query_required_by_for_package(package_name: str) -> List[str]:
+ """Returns list of 'Required By'-packages for which given package"""
+
+ cmd = f'pacman -Sii {package_name} | grep "Required By" | tr -s \' \' | sed -e \'s/Required By : //g\''
+ res = run(cmd)
+ packages: list = res.stdout.strip().split(' ')
+ return packages
+
+
+def pacman_Qq() -> List[str]:
+ """Returns all installed packages"""
+
+ cmd = 'pacman -Qq'
+ res = run(cmd)
+ packages: list = res.stdout.strip().split('\n')
+ return packages
+
+
+def pacman_Sii_depends_on(package: str) -> List[str]:
+ """Returns 'Depends On'-packages based on package info from the database, so not based on
+ currently installed package so potentially there can be a difference, for instance when in the
+ next version a depends on is added/changed than this is only reflected by -Sii instead of -Qi
+ which looks only at currently installed. This also helps because it does not require you to have
+ the package already installed because it looks in the pacman database."""
+
+ cmd = f'pacman -Sii {package} | grep "Depends On" | tr -s \' \' | sed -e \'s/Depends On : //g\''
+ res = run(cmd)
+ packages: list = res.stdout.strip().split(' ')
+ return packages
+
+
+def find_out(package_name: str):
+ packages = query_required_by_for_package(given_package)
+ # print(packages)
+
+ installed_packages = pacman_Qq()
+ # print(installed_packages)
+
+ # intersection of installed packages and required-by-packages-for-given-package
+ intersection = set(packages).intersection(installed_packages)
+
+ true_candidates = []
+
+ for candidate_pkg in intersection:
+ candidate_depends_on_pkgs = pacman_Sii_depends_on(candidate_pkg)
+ if candidate_depends_on_pkgs:
+ if given_package in candidate_depends_on_pkgs:
+ true_candidates.append(candidate_pkg)
+
+ print(
+ f'for given package {given_package} these packages are currently installed for which (future or currently installed) versions depend on this package:'
+ )
+ for true_candidate in true_candidates:
+ print(true_candidate)
+
+
+if __name__ == "__main__":
+ try:
+ given_package = sys.argv[1]
+ except IndexError:
+ print(f'usage: python3 {__file__} ')
+ sys.exit(1)
+
+ find_out(given_package)
+ sys.exit(0)
diff --git a/scripts/bin/pushover b/scripts/bin/pushover
new file mode 100755
index 0000000..ddc9723
--- /dev/null
+++ b/scripts/bin/pushover
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+# push/send message ios and android using API from my Linux box
+
+set -euo pipefail
+
+# Bash function to push notification to my iPhone
+# yes you can push/send message android too using the same function
+stdin_message=""
+if [[ ! -t 0 ]]; then
+ stdin_message="$(cat)"
+fi
+
+if [[ -n "$stdin_message" ]]; then
+ t="${1:-cli-app}"
+ m="$stdin_message"
+elif [[ $# -eq 0 ]]; then
+ t="cli-app"
+ m=""
+elif [[ $# -eq 1 ]]; then
+ t="cli-app"
+ m="$1"
+else
+ t="$1"
+ m="$2"
+fi
+
+if [[ -z "$m" ]]; then
+ printf 'Usage: %s [title] message\n' "$(basename "$0")" >&2
+ printf ' or: command | %s [title]\n' "$(basename "$0")" >&2
+ exit 2
+fi
+
+# Take env vars from ~/.pushover.env
+env_file="$HOME/.pushover.env"
+
+if [[ -f "$env_file" ]]; then
+ # shellcheck disable=SC1090
+ source "$env_file"
+fi
+
+: "${PUSHOVER_TOKEN:?PUSHOVER_TOKEN is not set}"
+: "${PUSHOVER_USER:?PUSHOVER_USER is not set}"
+
+if [[ -n "$m" ]]; then
+ curl -fsS \
+ --form-string "token=${PUSHOVER_TOKEN}" \
+ --form-string "user=${PUSHOVER_USER}" \
+ --form-string "title=$t" \
+ --form-string "message=$m" \
+ https://api.pushover.net/1/messages.json
+fi
diff --git a/scripts/bin/tmux-fans.sh b/scripts/bin/tmux-fans.sh
new file mode 100755
index 0000000..0e67c9c
--- /dev/null
+++ b/scripts/bin/tmux-fans.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# Ensure we're inside tmux
+if [[ -z "${TMUX:-}" ]]; then
+ echo "Please run this from inside an existing tmux session." >&2
+ exit 1
+fi
+
+# Create a new window named "fans"
+tmux new-window -n fans
+
+# Pane 1 (top-left): sensors watcher
+tmux send-keys 'watch -n1 sensors it8792-isa-0a60' C-m
+
+# Split horizontally for Pane 2 (top-right): pwm3 watcher
+tmux split-window -h
+tmux send-keys 'watch -n0.1 -- cat /sys/class/hwmon/hwmon4/pwm3' C-m
+
+# Split Pane 1 vertically for Pane 3 (bottom-left): fancontrol (sudo)
+tmux select-pane -L # go back to left/top pane
+tmux split-window -v
+tmux send-keys 'sudo fancontrol' C-m
+
+# Split Pane 2 vertically for Pane 4 (bottom-right): blank for typing
+tmux select-pane -R # go to right/top pane
+tmux split-window -v
+# leave this pane blank for manual commands
+
+# Make it tidy
+tmux select-layout tiled
+tmux select-pane -L # put cursor on the blank pane (bottom-right after tiled may vary)
+
diff --git a/scripts/bin/volume-notification b/scripts/bin/volume-notification
new file mode 100755
index 0000000..0b84dcb
--- /dev/null
+++ b/scripts/bin/volume-notification
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+# Get the current volume
+VOLUME=$(pamixer --get-volume)
+
+# Send notification using dunst
+dunstify -t 1000 -r 2593 -u low "Volume: ${VOLUME}%"
+
+# Update volume icon (optional)
+if [ "$VOLUME" -eq 0 ]; then
+ ICON="audio-volume-muted"
+elif [ "$VOLUME" -lt 30 ]; then
+ ICON="audio-volume-low"
+elif [ "$VOLUME" -lt 70 ]; then
+ ICON="audio-volume-medium"
+else
+ ICON="audio-volume-high"
+fi
+
+# Send notification with an icon
+dunstify -i "$ICON" -t 1000 -r 2593 -u low "Volume: ${VOLUME}%"
+
diff --git a/scripts/bin/wallpaper.sh b/scripts/bin/wallpaper.sh
index ce16855..74290a6 100755
--- a/scripts/bin/wallpaper.sh
+++ b/scripts/bin/wallpaper.sh
@@ -1,5 +1,5 @@
#!/bin/bash
while true; do
- find -L /home/dino/dotfiles/wallpapers/Pictures/Wallpapers -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -print0 | shuf -n1 -z | xargs -0 -I {} feh --bg-fill "{}"
+ find -L ~/Pictures/Wallpapers -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -print0 | shuf -n1 -z | xargs -0 -I {} feh --bg-fill "{}"
sleep 2m
done
diff --git a/sxhkd/.config/sxhkd/sxhkdrc b/sxhkd/.config/sxhkd/sxhkdrc
index 771a875..2652c70 100644
--- a/sxhkd/.config/sxhkd/sxhkdrc
+++ b/sxhkd/.config/sxhkd/sxhkdrc
@@ -156,6 +156,9 @@ shift + alt + m
super + n
feh ~/mollie-retry-schema.png
+super + r
+ bspc node @/ -R 90
+
# Volume
XF86Audio{RaiseVolume,LowerVolume,Mute}
volumectl {up 2, down 2, toggle-mute}; \
diff --git a/xfiles/.xbindkeysrc b/xfiles/.xbindkeysrc
index 5d192ca..10725e0 100644
--- a/xfiles/.xbindkeysrc
+++ b/xfiles/.xbindkeysrc
@@ -6,9 +6,9 @@
# b:9
# thumb wheel up => increase volume
-"pactl set-sink-volume @DEFAULT_SINK@ +2%"
- b:6
+# "pactl set-sink-volume @DEFAULT_SINK@ +2%"
+# b:6
# thumb wheel down => lower volume
-"pactl set-sink-volume @DEFAULT_SINK@ -2%"
- b:7
+# "pactl set-sink-volume @DEFAULT_SINK@ -2%"
+# b:7
diff --git a/zsh/.zshrc b/zsh/.zshrc
index 6a6c2b5..883a206 100644
--- a/zsh/.zshrc
+++ b/zsh/.zshrc
@@ -1,5 +1,7 @@
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH
+export PATH="$HOME/.viazshrc:$PATH"
+
export PATH=$HOME/bin:$PATH:$HOME/.local/bin
export ZSH="$HOME/.oh-my-zsh"
@@ -108,3 +110,6 @@ fi
. ~/bin/tmux-auto-window-name
source $ZSH/oh-my-zsh.sh
+
+# opencode
+export PATH=/home/dino/.opencode/bin:$PATH