Full Code of vyrx-dev/dotfiles for AI

master ad6f26e25ca5 cached
113 files
259.9 KB
79.4k tokens
1 requests
Download .txt
Showing preview only (303K chars total). Download the full file or copy to clipboard to get everything.
Repository: vyrx-dev/dotfiles
Branch: master
Commit: ad6f26e25ca5
Files: 113
Total size: 259.9 KB

Directory structure:
gitextract_i8z07tjz/

├── .config/
│   ├── fish/
│   │   ├── aliases.fish
│   │   ├── completions/
│   │   │   └── pipx.fish
│   │   ├── config.fish
│   │   └── functions/
│   │       ├── android-studio-wayland.fish
│   │       ├── flutter-watch.fish
│   │       ├── sessionizer.fish
│   │       └── yazi.fish
│   ├── fuzzel/
│   │   └── fuzzel.ini
│   ├── geary/
│   │   └── user-style.css
│   ├── ghostty/
│   │   └── config
│   ├── kanshi/
│   │   └── config
│   ├── kitty/
│   │   └── kitty.conf
│   ├── mako/
│   │   ├── colors
│   │   └── config
│   ├── mpd/
│   │   └── mpd.conf
│   ├── mpdscribble/
│   │   └── mpdscribble.conf
│   ├── niri/
│   │   └── config.kdl
│   ├── nvim/
│   │   ├── .luarc.json
│   │   ├── after/
│   │   │   └── ftplugin/
│   │   │       ├── css.lua
│   │   │       ├── dart.lua
│   │   │       ├── go.lua
│   │   │       ├── html.lua
│   │   │       ├── javascript.lua
│   │   │       ├── lua.lua
│   │   │       ├── python.lua
│   │   │       └── typescript.lua
│   │   ├── init.lua
│   │   ├── lua/
│   │   │   ├── config/
│   │   │   │   ├── autocmd.lua
│   │   │   │   ├── keymaps.lua
│   │   │   │   ├── lazy.lua
│   │   │   │   └── options.lua
│   │   │   ├── plugins/
│   │   │   │   ├── ai.lua
│   │   │   │   ├── alpha.lua
│   │   │   │   ├── cmp.lua
│   │   │   │   ├── color-picker.lua
│   │   │   │   ├── colorscheme.lua
│   │   │   │   ├── dap.lua
│   │   │   │   ├── flutter.lua
│   │   │   │   ├── fzf.lua
│   │   │   │   ├── git.lua
│   │   │   │   ├── lsp-config.lua
│   │   │   │   ├── mini.lua
│   │   │   │   ├── navigation.lua
│   │   │   │   ├── nvim-tree.lua
│   │   │   │   ├── preview.lua
│   │   │   │   ├── sloat.lua
│   │   │   │   ├── treesitter.lua
│   │   │   │   ├── trouble.lua
│   │   │   │   ├── ui.lua
│   │   │   │   └── yazi.lua
│   │   │   ├── servers/
│   │   │   │   ├── bashls.lua
│   │   │   │   ├── dockerls.lua
│   │   │   │   ├── efm-langserver.lua
│   │   │   │   ├── emmet_ls.lua
│   │   │   │   ├── gopls.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── jsonls.lua
│   │   │   │   ├── lua_ls.lua
│   │   │   │   ├── pyright.lua
│   │   │   │   ├── tailwindcss.lua
│   │   │   │   ├── ts_ls.lua
│   │   │   │   └── yamlls.lua
│   │   │   └── utils/
│   │   │       ├── diagnostics.lua
│   │   │       └── lsp.lua
│   │   └── stylua.toml
│   ├── rmpc/
│   │   ├── config.ron
│   │   ├── fetch-lyrics
│   │   └── themes/
│   │       └── theme.ron
│   ├── starship.toml
│   ├── sway/
│   │   └── config
│   ├── swayidle/
│   │   └── config
│   ├── swaylock/
│   │   └── config
│   ├── waybar/
│   │   ├── config.jsonc
│   │   └── style.css
│   └── yazi/
│       └── theme.toml
├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .tmux.conf
├── LICENSE
├── README.md
└── Scripts/
    ├── add-audio
    ├── audio-switch
    ├── battery-monitor
    ├── beats
    ├── choose-shell
    ├── clone
    ├── code-in-tmux
    ├── dual-dac
    ├── flutter-post-upgrade
    ├── fuzzel-emoji
    ├── ide
    ├── ignore-power-button
    ├── indicator-record
    ├── kanshi-switch
    ├── launch-webapp
    ├── open_github
    ├── powermenu
    ├── restart-app
    ├── run-scrcpy
    ├── screenrecord
    ├── screenshot
    ├── sessionX
    ├── set-wallpaper
    ├── set-wallpaper-new
    ├── setup-dns
    ├── setup-greetd
    ├── toggle-output
    ├── toggle-terminal-transparency
    ├── toggle-waybar
    ├── toggle-wlsunset
    ├── webapp-install
    ├── webapp-remove
    └── webapps

================================================
FILE CONTENTS
================================================

================================================
FILE: .config/fish/aliases.fish
================================================
# ┌─────────┐
# │ Aliases │
# └─────────┘

# ── Listing ──
alias ls 'eza -1 --icons=auto'
alias l 'eza -lh --icons=auto'
alias ll 'eza -lha --icons=auto --sort=name --group-directories-first'
alias ld 'eza -lhD --icons=auto'
alias lt 'eza --icons=auto --tree'
alias ltt 'eza --tree --level=2 --long --icons --git'
alias lta 'lt -a'

# ── Navigation ──
alias cd 'z'
alias .. 'cd ..'
alias ... 'cd ../..'

# ── Editors ──
abbr -a n nvim
alias zed 'zeditor'
abbr -a c 'code .'

# ── Config files ──
alias bfile 'nvim ~/.bashrc'
alias ffile 'nvim ~/.config/fish/config.fish'

# ── File managers & terminals ──
abbr -a zz yazi
abbr -a open 'thunar .'

# ── Search & history ──
abbr -a h "history | grep "

# ── Dev tools ──
abbr -a nd 'npm run dev'
abbr -a mr 'make run'
abbr -a mp 'makepkg -si'
abbr -a lg lazygit
abbr -a d docker
abbr -a gits 'git status'
abbr -a ghp 'gh repo create --public $(basename "$PWD") --source=. --description="desc" --push'

# ── Mobile & Android ──
alias emu "QT_QPA_PLATFORM=xcb ~/Android/Sdk/emulator/emulator -avd Pixel_9 &"

# ── Media ──
alias rip "yt-dlp -x --audio-format=\"mp3\""

# ── TTY fonts ──
abbr -a bigfont "setfont ter-132b"
abbr -a regfont "setfont default8x16"

# ── Safety wrappers ──
abbr -a mkdir 'mkdir -p'
abbr -a ping 'ping -c 10'
abbr -a tar "tar -xvf"

# ── System ──
alias last-updated 'grep -i "full system upgrade" /var/log/pacman.log | tail -n 1'
alias pwreset 'faillock --reset --user vyrx'
abbr -a pg 'ping -c 10 google.com'
alias cache 'du -sh /var/cache/pacman/pkg .cache/paru'
alias folders 'du -h --max-depth=1'

# ── Package management ──
alias pp "paru -Slq | fzf --multi --preview 'paru -Sii {1}' --preview-window=down:55% | xargs -ro paru -S"
alias cleanup 'sudo pacman -Rns (pacman -Qdtq)'
alias mirrorfix 'sudo reflector --latest 20 --sort rate --save /etc/pacman.d/mirrorlist'
alias cleanc 'sudo pacman -Sc && yay -Sc'

# ── Shell switching ──
alias tobash "chsh $USER -s /usr/bin/bash && echo 'Log out and log back in for change to take effect.'"
alias tofish "chsh $USER -s /usr/bin/fish && echo 'Log out and log back in for change to take effect.'"

# ── Tmux ──
abbr -a tmuxk 'tmux kill-session'

# ── Misc ──
abbr -a chx 'chmod +x'
abbr -a x exit

# ── Snapper / BTRFS ──
abbr -a slsr 'sudo snapper -c root list'
abbr -a slsh 'sudo snapper -c home list'
abbr -a sdu 'sudo btrfs filesystem du -s /.snapshots/*'
abbr -a sdelr 'sudo snapper -c root delete'
abbr -a sdelh 'sudo snapper -c home delete --sync'
abbr -a sbdel 'sudo btrfs subvolume delete'


================================================
FILE: .config/fish/completions/pipx.fish
================================================

function __fish_pipx_complete
    set -x _ARGCOMPLETE 1
    set -x _ARGCOMPLETE_DFS \t
    set -x _ARGCOMPLETE_IFS \n
    set -x _ARGCOMPLETE_SUPPRESS_SPACE 1
    set -x _ARGCOMPLETE_SHELL fish
    set -x COMP_LINE (commandline -p)
    set -x COMP_POINT (string length (commandline -cp))
    set -x COMP_TYPE
    if set -q _ARC_DEBUG
        pipx 8>&1 9>&2 1>&9 2>&1
    else
        pipx 8>&1 9>&2 1>/dev/null 2>&1
    end
end
complete --command pipx -f -a '(__fish_pipx_complete)'


================================================
FILE: .config/fish/config.fish
================================================
set -g fish_greeting
fish_default_key_bindings

# Environment
set -gx EDITOR nvim
set -gx SUDO_EDITOR $EDITOR
set -gx VISUAL nvim
set -gx TERMINAL kitty
set -gx MANPAGER "nvim +Man!"
set -gx MPD_HOST "/run/user/"(id -u)"/mpd/socket"

# PATH
fish_add_path ~/.local/bin
# fish_add_path ~/Scripts
fish_add_path ~/dev-tools/flutter/bin
fish_add_path ~/.pub-cache/bin
fish_add_path ~/.spicetify/bin

# Keybinds
bind \ck sessionizer

# Tools
fzf --fish | source
zoxide init fish | source
starship init fish | source

# Keychain
if status is-interactive
    keychain --eval --quiet id_rsa | source
end

# Aliases
source ~/.config/fish/aliases.fish


================================================
FILE: .config/fish/functions/android-studio-wayland.fish
================================================
function android-studio-wayland
    env GDK_BACKEND=x11 android-studio $argv
end


================================================
FILE: .config/fish/functions/flutter-watch.fish
================================================
function flutter-watch
    # Ensure the temp file for the PID is available
    set pid_file "/tmp/tf1.pid"
    touch $pid_file

    # Run flutter and watch for changes
    tmux send-keys "flutter run $argv --pid-file=$pid_file" Enter \; \
         split-window -v \; \
         send-keys 'npx -y nodemon -e dart -x "cat /tmp/tf1.pid | xargs kill -s USR1"' Enter \; \
         resize-pane -y 5 -t 1 \; \
         select-pane -t 0 \;
end


================================================
FILE: .config/fish/functions/sessionizer.fish
================================================
function sessionizer --description "Launch sessionX script"
    $HOME/Scripts/sessionX
end


================================================
FILE: .config/fish/functions/yazi.fish
================================================
# yazi shell wrapper (change the current working directory when exiting Yazi)
function y
    set tmp (mktemp -t "yazi-cwd.XXXXXX")
    yazi $argv --cwd-file="$tmp"
    if read -z cwd <"$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ]
        builtin cd -- "$cwd"
    end
    rm -f -- "$tmp"
end


================================================
FILE: .config/fuzzel/fuzzel.ini
================================================
[main]
font=Inter:size=9.5
width=28
lines=8
anchor=center
prompt="> "
terminal=kitty
icon-theme=Papirus-Dark
icons-enabled=yes
match-mode=fuzzy
horizontal-pad=10
vertical-pad=6
inner-pad=6
line-height=15
dpi-aware=auto
layer=overlay
exit-on-keyboard-focus-loss=yes

[colors]
background=0d0d0dff
text=999999ff
match=ccccccff
selection=1a1a1aff
selection-text=e0e0e0ff
selection-match=ffffffc0
border=0d0d0dff

[border]
width=0
radius=10

[key-bindings]
delete-line-forward=none
prev=Up Control+p Control+k
next=Down Control+n Control+j
cancel=Escape


================================================
FILE: .config/geary/user-style.css
================================================
@media (prefers-color-scheme: dark) {
  :root,
  body,
  *:not(a) {
    background-color: #1e1e1e !important;
    color: #dcdcdc !important;
  }

  a {
    color: #78aeed !important;
  }

  table,
  div,
  section {
    background-color: transparent !important;
  }

  img {
    filter: brightness(0.85) !important;
  }
}


================================================
FILE: .config/ghostty/config
================================================
# Fonts
font-family = "JetBrainsMono Nerd Font"
font-style = Medium
font-size = 11

# Mouse
mouse-hide-while-typing = true

# Window
window-theme = ghostty
window-padding-x = 10
window-padding-y = 0
confirm-close-surface=false
resize-overlay = never
gtk-toolbar-style = flat
# gtk-single-instance = false
background-opacity = 1

# Cursor
cursor-style = block
cursor-style-blink = false
shell-integration-features = no-cursor

# Keybindings
keybind = ctrl+shift+h=goto_split:left
keybind = ctrl+shift+j=goto_split:bottom
keybind = ctrl+shift+k=goto_split:top
keybind = ctrl+shift+l=goto_split:right
keybind = super+shift+enter=new_split:auto
keybind = super+alt+m=toggle_split_zoom
keybind = super+shift+q=close_surface
keybind = ctrl+shift+comma=reload_config

# Scrolling
scrollback-limit = 100000
mouse-scroll-multiplier = 2

background = #0a0a0a
foreground = #c0c0c0
cursor-color = #c0c0c0
selection-foreground = #0a0a0a
selection-background = #c0c0c0

palette = 0=#1a1a1a
palette = 1=#a85858
palette = 2=#6a8a5a
palette = 3=#c4a65a
palette = 4=#6a7a8a
palette = 5=#8a6a8a
palette = 6=#6a8a8a
palette = 7=#a0a0a0
palette = 8=#3a3a3a
palette = 9=#c06060
palette = 10=#8aaa7a
palette = 11=#d4b87c
palette = 12=#7a8a9a
palette = 13=#9a7a9a
palette = 14=#7a9a9a
palette = 15=#c0c0c0


================================================
FILE: .config/kanshi/config
================================================
# swaymsg -t get_outputs  →  check output names & modes
# kanshictl switch <name>  →  switch to a profile by name

profile laptop-only {
    output eDP-1 enable mode 1920x1080@144.003Hz
}

profile laptop-left {
    output eDP-1    enable mode 1920x1080@144.003Hz position 0,0
    output HDMI-A-1 enable mode 1920x1080@100Hz     position 1920,0
}

profile monitor-top {
    output HDMI-A-1 enable mode 1920x1080@100Hz     position 0,0
    output eDP-1    enable mode 1920x1080@144.003Hz position 0,1080
}

profile monitor-right {
    output HDMI-A-1 enable mode 1920x1080@100Hz     position 0,0
    output eDP-1    enable mode 1920x1080@144.003Hz position 1920,0
}

profile monitor-only {
    output HDMI-A-1 enable mode 1920x1080@100Hz position 0,0
    output eDP-1    disable
}


================================================
FILE: .config/kitty/kitty.conf
================================================
# Fonts
font_family JetBrainsMono Nerd Font
bold_italic_font auto
font_size 11

# Window
window_padding_width 0 5
# background_opacity 0.95
hide_window_decorations yes
scrollback_indicator_opacity 0.0

# Cursor
cursor_trail 1
cursor_shape block
cursor_blink_interval 0
shell_integration no-cursor

# Behavior
enable_audio_bello no
confirm_os_window_close 0
allow_remote_control yes

# Colors
background #0d0d0d
foreground #c1c1c1
cursor #c1c1c1
cursor_text_color #000000
selection_foreground #000000
selection_background #c1c1c1

color0 #000000
color1 #c45555
color2 #9b8d7f
color3 #8c7f70
color4 #7a9aaa
color5 #999999
color6 #a7c7c7
color7 #c1c1c1
color8 #333333
color9 #d47070
color10 #9b8d7f
color11 #8c7f70
color12 #4a5f6a
color13 #999999
color14 #9cb7b7
color15 #c1c1c1


================================================
FILE: .config/mako/colors
================================================
background-color=#0d0d0dee
text-color=#c1c1c1
border-color=#b3c7cc


================================================
FILE: .config/mako/config
================================================
include=~/.config/mako/colors
sort=-time
layer=overlay
width=320
height=100
border-size=0
border-radius=4
margin=10
padding=10
icons=1
max-icon-size=64
max-history=10
default-timeout=10000
ignore-timeout=1
font=Inter 11

[app-name=lol]
layer=overlay
history=0




================================================
FILE: .config/mpd/mpd.conf
================================================
# ~/.config/mpd/mpd.conf

music_directory     "~/Music/mpd"
playlist_directory  "~/Music/Playlists"

auto_update         "yes"
bind_to_address    "127.0.0.1"
bind_to_address    "/run/user/1000/mpd/socket"
restore_paused     "yes"
max_output_buffer_size "16384"

# Audio output for your system (choose one)
audio_output {
    type "pulse"
    name "pulse audio"
}

# FIFO output for cava visualizer
audio_output {
    type   "fifo"
    name   "cava_fifo"
    path   "/tmp/mpd.fifo"
    format "44100:16:2"
}


================================================
FILE: .config/mpdscribble/mpdscribble.conf
================================================
[last.fm]
url = https://post.audioscrobbler.com/
username = YOUR_LASTFM_USERNAME
password = YOUR_LASTFM_PASSWORD


================================================
FILE: .config/niri/config.kdl
================================================
// Niri Configuration
// https://github.com/YaLTeR/niri/wiki/Configuration

// ╭───────────────────────────────────────────────────────────────────────╮
// │ ENVIRONMENT & INPUT                                                   │
// ╰───────────────────────────────────────────────────────────────────────╯

prefer-no-csd
screenshot-path null

environment {
    ELECTRON_OZONE_PLATFORM_HINT "auto"
    QT_QPA_PLATFORM "wayland"
    QT_WAYLAND_DISABLE_WINDOWDECORATION "1"
    XDG_SESSION_TYPE "wayland"
    XDG_CURRENT_DESKTOP "niri"
    QT_QPA_PLATFORMTHEME "qt6ct"
    TERMINAL "ghostty"
    XCURSOR_THEME "Bibata-Modern-Ice"
    XCURSOR_SIZE "24"
}

hotkey-overlay {
    skip-at-startup
}

debug {
    honor-xdg-activation-with-invalid-serial
}

input {
    keyboard {
        xkb {
            layout "us"
        }
        numlock
        repeat-delay 200
        repeat-rate 60
    }

    touchpad {
        tap
        natural-scroll
    }

    focus-follows-mouse
    workspace-auto-back-and-forth
}


// ╭───────────────────────────────────────────────────────────────────────╮
// │ OUTPUTS                                                               │
// ╰───────────────────────────────────────────────────────────────────────╯

output "eDP-1" {
    mode "1920x1080@144.003"
    scale 1
    position x=0 y=0
}

output "HDMI-A-1" {
    mode "1920x1080@100.000"
    scale 1
    // transform "90"      
    position x=1920 y=0
}

// ╭───────────────────────────────────────────────────────────────────────╮
// │ LAYOUT & APPEARANCE                                                   │
// ╰───────────────────────────────────────────────────────────────────────╯

layout {
    gaps 0
    center-focused-column "never"
    default-column-width { proportion 0.5; }
    background-color "transparent"

    preset-column-widths {
        proportion 0.33333
        proportion 0.5
        proportion 0.66667
    }

    struts {}

    focus-ring {
        on
        width 1
        active-color "#ffffff66"
        inactive-color "#ffffff11"
    }
}

overview {
    backdrop-color "#1a1a1a"
    zoom 0.3
    workspace-shadow {
        off
    }
}


// ╭───────────────────────────────────────────────────────────────────────╮
// │ ANIMATIONS                                                            │
// ╰───────────────────────────────────────────────────────────────────────╯

animations {
    workspace-switch {
        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
    }
    window-open {
        duration-ms 100
        curve "ease-out-quad"
    }
    window-close {
        duration-ms 100
        curve "ease-out-cubic"
    }
    horizontal-view-movement {
        spring damping-ratio=1.0 stiffness=900 epsilon=0.0001
    }
    window-movement {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }
    window-resize {
        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
    }
    config-notification-open-close {
        spring damping-ratio=0.6 stiffness=1200 epsilon=0.001
    }
    screenshot-ui-open {
        duration-ms 300
        curve "ease-out-quad"
    }
    overview-open-close {
        spring damping-ratio=1.0 stiffness=900 epsilon=0.0001
    }
}


// ╭───────────────────────────────────────────────────────────────────────╮
// │ LAYER RULES                                                           │
// ╰───────────────────────────────────────────────────────────────────────╯

layer-rule {
    match namespace="waybar"
    match at-startup=true
    opacity 0.90

    shadow {
        on
        softness 10
        spread 5
        offset x=0 y=5
    }

    geometry-corner-radius 10
}


// ╭───────────────────────────────────────────────────────────────────────╮
// │ WINDOW RULES                                                          │
// ╰───────────────────────────────────────────────────────────────────────╯

// Global defaults
window-rule {
    geometry-corner-radius 0
    open-maximized true
    clip-to-geometry true
}

// Floating dialogs & popups
window-rule {
    match app-id="confirm"
    match app-id="satty"
    match app-id="com.network.manager"
    match app-id="pavucontrol"
    match app-id="blueman-manager"
    match app-id="nm-connection-editor"
    match app-id="localsend"
    match app-id="easyeffects"
    match app-id="Hello"
    match app-id="xdg-desktop-portal-gtk"
    match app-id="system-config-printer"
    match app-id="ghostty_journalctl"
    match title=r#".*Extension.*Bitwarden.*"#
    match app-id="brave-keep"
    match app-id="thunar"
    match title="Oklch Color Picker"
    open-floating true
    default-column-width { proportion 0.5; }
    default-window-height { proportion 0.5; }
}

// Terminal applications that should float
window-rule {
    match app-id="ghostty" title="rmpc-music"
    match app-id="ghostty" title="btop-system"
    match app-id="ghostty" title="yazi-files"
    match app-id="ghostty" title="webapp-list"
    match app-id="ghostty" title="webapp-list"
    match app-id="ghostty" title="gh-notify"
    open-floating true
    default-column-width { proportion 0.6; }
    default-window-height { proportion 0.7; }
}

window-rule {
    match app-id="ghostty" title="gh-dash"
    open-fullscreen true
}

// Transparent applications
window-rule {
    draw-border-with-background false
    match app-id="zed"
    match app-id="code"
    match app-id="ghostty"
    match app-id="vesktop"
    match app-id="org.qbittorrent.qBittorrent"
    match app-id="thunar"
    match app-id="org.gnome.Nautilus"
    match app-id="zathura"
    match app-id="obsidian"
    match app-id="obs-studio"
    opacity 0.95
}

// Terminal windows
window-rule {
    match app-id="com.mitchellh.ghostty"
    open-maximized false
    draw-border-with-background false
    default-column-width { proportion 0.5; }
}

// Picture-in-Picture
window-rule {
    match app-id=r#"firefox$"# title="^Picture-in-Picture$"
    match app-id="zen" title="^Picture-in-Picture$"
    open-floating true
    open-focused false
    default-floating-position x=32 y=32 relative-to="bottom-right"
    default-column-width { proportion 0.3; }
    default-window-height { proportion 0.3; }
}

// Block Bitwarden from screen capture
window-rule {
    match app-id=r#"Bitwarden"#
    block-out-from "screen-capture"
}

// scrcpy (Android screen mirror)
window-rule {
    match app-id="scrcpy"
    open-maximized false
    default-column-width { fixed 478; }
    default-window-height { fixed 1080; }
}


// ╭───────────────────────────────────────────────────────────────────────╮
// │ STARTUP APPLICATIONS                                                  │
// ╰───────────────────────────────────────────────────────────────────────╯

spawn-sh-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1"
spawn-sh-at-startup "swayidle -w timeout 300 'swaylock -f' timeout 600 'niri msg action power-off-monitors' resume 'niri msg action power-on-monitors' before-sleep 'swaylock -f'"
spawn-at-startup "waybar"
spawn-at-startup "mako"
spawn-sh-at-startup "wl-clip-persist --clipboard regular"
spawn-sh-at-startup "wl-paste --watch cliphist store"
spawn-at-startup "kdeconnect-indicator"
spawn-sh-at-startup "$HOME/Scripts/battery-monitor"
spawn-sh-at-startup "$HOME/Scripts/set-wallpaper random"


// ╭───────────────────────────────────────────────────────────────────────╮
// │ KEYBINDINGS                                                           │
// ╰───────────────────────────────────────────────────────────────────────╯

binds {

    // ─── Core Applications ───
    Mod+Return                          hotkey-overlay-title="Open Terminal: ghostty" { spawn "ghostty"; }
    Mod+Space                           hotkey-overlay-title="Open App Launcher: fuzzel" { spawn-sh "fuzzel"; }
    // Mod+B                               hotkey-overlay-title="Open Browser: zen-browser" { spawn "zen-browser"; }
    Mod+B                              hotkey-overlay-title="Open Browser: Brave Browser" { spawn "brave"; }
    Mod+E                               hotkey-overlay-title="File Manager: Thunar" { spawn "thunar"; }
    Mod+C                               hotkey-overlay-title="Open Vs Code Editor" { spawn "code"; }
    Mod+D                               hotkey-overlay-title="Open Discord" { spawn "vesktop"; }
    // Mod+M                               hotkey-overlay-title="Open Spotify" { spawn "spotify-launcher"; }
    Mod+SHIFT+G                         hotkey-overlay-title="Open Email" { spawn "geary"; }

    // ─── Terminal Applications ───
    Mod+Shift+D                         hotkey-overlay-title="Open Lazy Docker" { spawn-sh "ghostty -e lazydocker"; }
    Alt+Slash                           hotkey-overlay-title="Open btop" { spawn-sh "ghostty --title='btop-system' -e btop"; }
    Alt+N                               hotkey-overlay-title="Open Nvim" { spawn-sh "ghostty -e nvim"; }
    Alt+Q                               hotkey-overlay-title="Open Yazi" { spawn-sh "ghostty --title='yazi-files' -e yazi"; }
    Alt+M                               hotkey-overlay-title="Open Rmpc" { spawn-sh "ghostty --title='rmpc-music' -e rmpc"; }
    Alt+Return                          hotkey-overlay-title="Open Github notify" { spawn-sh "ghostty --title='gh-notify' -e sh -c 'gh notify; read'"; }
    Alt+G                               hotkey-overlay-title="Open Github dash" { spawn-sh "ghostty --title='gh-dash' -e gh dash"; }
    

    // ─── Web Applications ───
    Mod+A                               hotkey-overlay-title="Open ChatGpt" { spawn-sh "~/Scripts/launch-webapp https://chatgpt.com"; }
    Mod+Shift+A                         hotkey-overlay-title="Open Gemini" { spawn-sh "~/Scripts/launch-webapp https://gemini.google.com"; }
    Mod+Alt+A                               hotkey-overlay-title="Open perplexity" { spawn-sh "~/Scripts/launch-webapp https://perplexity.ai"; }
    Mod+T                               hotkey-overlay-title="Open Todoist" { spawn-sh "~/Scripts/launch-webapp https://todoist.com"; }
    Alt+C                               hotkey-overlay-title="Open Calendar" { spawn-sh "~/Scripts/launch-webapp https://calendar.google.com"; }
    Mod+Y                               hotkey-overlay-title="Open Youtube" { spawn-sh "~/Scripts/launch-webapp https://youtube.com"; }
    Mod+G                               hotkey-overlay-title="Open Github" { spawn-sh "~/Scripts/launch-webapp https://github.com"; }
    Mod+W                               hotkey-overlay-title="Open Whatsapp" { spawn-sh "~/Scripts/launch-webapp https://web.whatsapp.com"; }
    Mod+M                               hotkey-overlay-title="Open Spotify" { spawn-sh "~/Scripts/launch-webapp https://open.spotify.com/"; }
    Mod+X                               hotkey-overlay-title="Open X" { spawn-sh "~/Scripts/launch-webapp https://x.com"; }
    Mod+Backslash                       hotkey-overlay-title="Open DevHints" { spawn-sh "~/Scripts/launch-webapp https://devhints.io"; }
    Mod+I                               hotkey-overlay-title="Install Webapps" { spawn-sh " ghostty --title='webapp-list' -e ~/Scripts/webapps"; }
    Mod+Shift+I                         hotkey-overlay-title="Remove Webapps" { spawn-sh " ghostty --title='webapp-list' -e ~/Scripts/webapp-remove"; }

    // ─── Utilities & Tools ───
    Alt+comma                           hotkey-overlay-title="Open Clipboard" { spawn-sh "cliphist list | fuzzel --dmenu | cliphist decode | wl-copy"; }
    Alt+period                          hotkey-overlay-title="Open Emoji" { spawn-sh "~/Scripts/fuzzel-emoji"; }
    Mod+S                               hotkey-overlay-title="Open Volume Control" { spawn "pavucontrol"; }
    Mod+Backspace                       hotkey-overlay-title="Toggle Terminal Transparency" { spawn-sh "~/Scripts/toggle-terminal-transparency"; }
    Mod+Shift+Space                     hotkey-overlay-title="Toggle Waybar" { spawn-sh "~/Scripts/toggle-waybar"; }
    Mod+SHIFT+M                         hotkey-overlay-title="Online Music" { spawn-sh "~/Scripts/beats"; }
    Mod+Shift+Backspace                 hotkey-overlay-title="Mirror Phone" { spawn-sh "~/Scripts/run-scrcpy mirror"; }
    Mod+Ctrl+Backspace                  hotkey-overlay-title="Phone Webcam" { spawn-sh "~/Scripts/run-scrcpy webcam"; }
    Mod+Alt+Return                      hotkey-overlay-title="Attach Existing Tmux Session" { spawn-sh "ghostty -e tmux a"; }
    Mod+Alt+N                           hotkey-overlay-title="Nightlight" { spawn-sh "~/Scripts/toggle-wlsunset"; }
    Mod+N                               hotkey-overlay-title="Notification Restore" { spawn-sh "makoctl restore"; }
    Mod+Shift+N                         hotkey-overlay-title="Notification Clear" { spawn-sh "makoctl dismiss -a"; }
    // Alt+Space                           hotkey-overlay-title="Run Code in Tmux" { spawn-sh "ghostty -e ~/Scripts/code-in-tmux"; }
    Alt+Space                           hotkey-overlay-title="Run Portfolio in Localhost" { spawn-sh "launch-webapp https://vyrx.dev"; }
    Print                               hotkey-overlay-title="Color Picker" { spawn-sh "niri msg pick-color| wl-copy"; }
    Mod+Alt+P                           hotkey-overlay-title="Launch Android Emulator" { spawn-sh "env QT_QPA_PLATFORM=xcb ~/Android/Sdk/emulator/emulator -avd Pixel_9 &"; }

    // ─── Wallpaper ───
    Ctrl+Alt+Space                      hotkey-overlay-title="Random Wallpaper" { spawn-sh "~/Scripts/set-wallpaper random"; }
    Super+Ctrl+Shift+Space              hotkey-overlay-title="Choose Wallpaper" { spawn-sh "~/Scripts/set-wallpaper choose"; }

    // ─── Screenshots & Recording ───
    Mod+P                               { spawn-sh "$HOME/Scripts/screenshot"; }
    Mod+Shift+P                         { spawn-sh "$HOME/Scripts/screenshot fullscreen"; }
    Mod+R                               hotkey-overlay-title="Record Screen (Desktop Audio)" { spawn-sh "~/Scripts/screenrecord --with-desktop-audio"; }
    Mod+Shift+R                         hotkey-overlay-title="Record Screen (Microphone)" { spawn-sh "~/Scripts/screenrecord --with-microphone-audio"; }

    // ─── Session & Power ───
    Mod+ALT+L                           hotkey-overlay-title="Lock Screen: swaylock" { spawn-sh "swaylock"; }
    Mod+Escape                          hotkey-overlay-title="Session Menu: powermenu" { spawn-sh "~/Scripts/powermenu"; }
    CTRL+ALT+Delete                     { quit; }

    // ─── Monitor Power Controls ───
    Ctrl+Shift+1                        hotkey-overlay-title="Toggle laptop monitor" { spawn-sh "$HOME/Scripts/toggle-output eDP-1"; }
    Ctrl+Shift+2                        hotkey-overlay-title="Toggle external monitor" { spawn-sh "$HOME/Scripts/toggle-output HDMI-A-1"; }

    // ─── Audio Controls ───
    XF86AudioRaiseVolume                allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
    XF86AudioLowerVolume                allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
    XF86AudioMute                       allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
    XF86AudioMicMute                    allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
    Mod+XF86AudioMute                   allow-when-locked=true { spawn-sh "~/Scripts/audio-switch"; }

    // ─── Media Controls ───
    Mod+F10                             allow-when-locked=true { spawn-sh "playerctl previous"; }
    Mod+F11                             allow-when-locked=true { spawn-sh "playerctl play-pause"; }
    Mod+F12                             allow-when-locked=true { spawn-sh "playerctl next"; }

    // ─── Brightness Controls ───
    XF86MonBrightnessUp                 allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
    XF86MonBrightnessDown               allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
    Mod+Alt+XF86AudioRaiseVolume        allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
    Mod+Alt+XF86AudioLowerVolume        allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
    Mod+XF86AudioRaiseVolume            allow-when-locked=true { spawn-sh "ddcutil setvcp 10 + 10"; }
    Mod+XF86AudioLowerVolume            allow-when-locked=true { spawn-sh "ddcutil setvcp 10 - 10"; }

    // ─── Window Management ───
    Mod+Q                               { close-window; }
    Mod+V                               { toggle-window-floating; }
    Mod+F                               { maximize-column; }
    Mod+Shift+F                         { fullscreen-window; }
    Mod+Shift+C                         { center-visible-columns; }
    Mod+Ctrl+R                          { reset-window-height; }
    Mod+BracketLeft                     { consume-or-expel-window-left; }
    Mod+BracketRight                    { consume-or-expel-window-right; }

    // ─── Window Focus (Vim-style) ───
    Mod+H                               { focus-column-left; }
    Mod+L                               { focus-column-right; }
    Mod+K                               { focus-window-or-workspace-up; }
    Mod+J                               { focus-window-or-workspace-down; }
    Mod+Left                            { focus-column-left; }
    Mod+Right                           { focus-column-right; }
    Mod+Up                              { focus-window-up; }
    Mod+Down                            { focus-window-down; }

    // ─── Window Movement ───
    Mod+CTRL+H                          { move-column-left; }
    Mod+CTRL+L                          { move-column-right; }
    Mod+Ctrl+K                          { move-window-up-or-to-workspace-up; }
    Mod+Ctrl+J                          { move-window-down-or-to-workspace-down; }
    Mod+CTRL+Left                       { move-column-left; }
    Mod+CTRL+Right                      { move-column-right; }
    Mod+CTRL+UP                         { move-window-up; }
    Mod+CTRL+Down                       { move-window-down; }

    // ─── Monitor Focus & Movement ───
    Mod+Shift+H                         { focus-monitor-left; }
    Mod+Shift+L                         { focus-monitor-right; }
    Mod+Shift+K                         { focus-monitor-up; }
    Mod+Shift+J                         { focus-monitor-down; }
    Mod+Shift+CTRL+H                    { move-column-to-monitor-left; }
    Mod+Shift+CTRL+L                    { move-column-to-monitor-right; }
    Mod+Shift+CTRL+K                    { move-column-to-monitor-up; }
    Mod+Shift+CTRL+J                    { move-column-to-monitor-down; }

    // ─── Workspace Navigation ───
    Mod+1                               { focus-workspace 1; }
    Mod+2                               { focus-workspace 2; }
    Mod+3                               { focus-workspace 3; }
    Mod+4                               { focus-workspace 4; }
    Mod+5                               { focus-workspace 5; }
    Mod+6                               { focus-workspace 6; }
    Mod+7                               { focus-workspace 7; }
    Mod+8                               { focus-workspace 8; }
    Mod+9                               { focus-workspace 9; }
    Mod+TAB                             { focus-workspace-previous; }
    Mod+O                               repeat=false { toggle-overview; }

    // ─── Move Window to Workspace ───
    Mod+SHIFT+1                         { move-column-to-workspace 1; }
    Mod+SHIFT+2                         { move-column-to-workspace 2; }
    Mod+SHIFT+3                         { move-column-to-workspace 3; }
    Mod+SHIFT+4                         { move-column-to-workspace 4; }
    Mod+SHIFT+5                         { move-column-to-workspace 5; }
    Mod+SHIFT+6                         { move-column-to-workspace 6; }
    Mod+SHIFT+7                         { move-column-to-workspace 7; }
    Mod+SHIFT+8                         { move-column-to-workspace 8; }
    Mod+SHIFT+9                         { move-column-to-workspace 9; }

    // ─── Mouse Wheel Workspace Switching ───
    Mod+WheelScrollDown                 cooldown-ms=150 { focus-workspace-down; }
    Mod+WheelScrollUp                   cooldown-ms=150 { focus-workspace-up; }
    Mod+CTRL+WheelScrollDown            cooldown-ms=150 { move-column-to-workspace-down; }
    Mod+CTRL+WheelScrollUp              cooldown-ms=150 { move-column-to-workspace-up; }

    // ─── Mouse Wheel Column Navigation ───
    Mod+WheelScrollRight                { focus-column-right; }
    Mod+WheelScrollLeft                 { focus-column-left; }
    Mod+CTRL+WheelScrollRight           { move-column-right; }
    Mod+CTRL+WheelScrollLeft            { move-column-left; }
    Mod+Shift+WheelScrollDown           { focus-column-right; }
    Mod+Shift+WheelScrollUp             { focus-column-left; }
    Mod+CTRL+Shift+WheelScrollDown      { move-column-right; }
    Mod+CTRL+Shift+WheelScrollUp        { move-column-left; }

    // ─── Window Resizing ───
    Mod+Minus                           { set-column-width "-10%"; }
    Mod+Equal                           { set-column-width "+9%"; }
    Mod+Shift+Minus                     { set-window-height "-10%"; }
    Mod+Shift+Equal                     { set-window-height "+10%"; }
}


================================================
FILE: .config/nvim/.luarc.json
================================================
{
  "diagnostics.globals": ["vim"]
}


================================================
FILE: .config/nvim/after/ftplugin/css.lua
================================================
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
vim.opt_local.softtabstop = 2
vim.opt_local.expandtab = true


================================================
FILE: .config/nvim/after/ftplugin/dart.lua
================================================
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
vim.opt_local.softtabstop = 2
vim.opt_local.expandtab = true


================================================
FILE: .config/nvim/after/ftplugin/go.lua
================================================
vim.opt_local.shiftwidth = 4
vim.opt_local.tabstop = 4
vim.opt_local.softtabstop = 4
vim.opt_local.expandtab = false


================================================
FILE: .config/nvim/after/ftplugin/html.lua
================================================
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
vim.opt_local.softtabstop = 2
vim.opt_local.expandtab = true


================================================
FILE: .config/nvim/after/ftplugin/javascript.lua
================================================
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
vim.opt_local.softtabstop = 2
vim.opt_local.expandtab = true


================================================
FILE: .config/nvim/after/ftplugin/lua.lua
================================================
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
vim.opt_local.softtabstop = 2
vim.opt_local.expandtab = true


================================================
FILE: .config/nvim/after/ftplugin/python.lua
================================================
vim.opt_local.shiftwidth = 4
vim.opt_local.tabstop = 4
vim.opt_local.softtabstop = 4
vim.opt_local.expandtab = true


================================================
FILE: .config/nvim/after/ftplugin/typescript.lua
================================================
vim.opt_local.shiftwidth = 2
vim.opt_local.tabstop = 2
vim.opt_local.softtabstop = 2
vim.opt_local.expandtab = true


================================================
FILE: .config/nvim/init.lua
================================================
vim.opt.termguicolors = true

require("config.lazy")



================================================
FILE: .config/nvim/lua/config/autocmd.lua
================================================
-- ================================================================================================
-- TITLE : auto-commands
-- ABOUT : automatically run code on defined events (e.g. save, yank)
-- ================================================================================================
local on_attach = require("utils.lsp").on_attach

-- Restore last cursor position when reopening a file
local last_cursor_group = vim.api.nvim_create_augroup("LastCursorGroup", {})
vim.api.nvim_create_autocmd("BufReadPost", {
  group = last_cursor_group,
  callback = function()
    local mark = vim.api.nvim_buf_get_mark(0, '"')
    local lcount = vim.api.nvim_buf_line_count(0)
    if mark[1] > 0 and mark[1] <= lcount then
      pcall(vim.api.nvim_win_set_cursor, 0, mark)
    end
  end,
})

-- Highlight the yanked text for 200ms
local highlight_yank_group = vim.api.nvim_create_augroup("HighlightYank", {})
vim.api.nvim_create_autocmd("TextYankPost", {
  group = highlight_yank_group,
  pattern = "*",
  callback = function()
    vim.hl.on_yank {
      higroup = "IncSearch",
      timeout = 200,
    }
  end,
})

-- format on save using efm langserver and configured formatters
local lsp_fmt_group = vim.api.nvim_create_augroup("FormatOnSaveGroup", {})
vim.api.nvim_create_autocmd("BufWritePre", {
  group = lsp_fmt_group,
  callback = function()
    -- Check if autoformat is enabled
    if not vim.g.autoformat_enabled then
      return
    end

    local efm = vim.lsp.get_clients { name = "efm" }
    if vim.tbl_isempty(efm) then
      return
    end
    vim.lsp.buf.format { name = "efm", async = true }
  end,
})

-- Toggle autoformat command
vim.g.autoformat_enabled = true --Global toggle for autoformatting (default: enabled)
vim.api.nvim_create_user_command("ToggleAutoformat", function()
  vim.g.autoformat_enabled = not vim.g.autoformat_enabled
  if vim.g.autoformat_enabled then
    vim.notify("Autoformat enabled", vim.log.levels.INFO)
  else
    vim.notify("Autoformat disabled", vim.log.levels.WARN)
  end
end, {})

-- on attach function shortcuts
local lsp_on_attach_group = vim.api.nvim_create_augroup("LspMappings", {})
vim.api.nvim_create_autocmd("LspAttach", {
  group = lsp_on_attach_group,
  callback = on_attach,
})


================================================
FILE: .config/nvim/lua/config/keymaps.lua
================================================
-- Set leader key
vim.g.mapleader = " "
vim.g.maplocalleader = " "

-- Keymap helper
local set = vim.keymap.set
local opts = { noremap = true, silent = true }

-- jj to escape insert mode
set("i", "jj", "<Esc>", opts)

-- Disable the spacebar key's default behavior in Normal and Visual modes
set({ "n", "v" }, "<Space>", "<Nop>", { silent = true })

-- Split window
set("n", "ss", ":split<Return>", opts)
set("n", "sv", ":vsplit<Return>", opts)
set("n", "sx", "<cmd>close<CR>", opts)

-- Make current file executable
vim.keymap.set("n", "<leader>X", "<cmd>!chmod +x %<CR>", { silent = true, desc = "Make current file executable" })

-- Jumping
set({ "n", "o", "x" }, "<s-h>", "^", { desc = "Jump to beginning of line" })
set({ "n", "o", "x" }, "<s-l>", "g_", { desc = "Jump to end of line" })

-- Copy file paths
set("n", "<leader>cf", '<cmd>let @+ = expand("%")<CR>', { desc = "Copy File Name" })

-- live-server
set("n", "<leader>ps", ":LiveServerStart<CR>", { desc = "Start Live Server" })
set("n", "<leader>pe", ":LiveServerStop<CR>", { desc = "Stop Live Server" })

-- file-explorer
set("n", "<leader>e", ":NvimTreeToggle<CR>", { desc = "Nvim tree " })

-- Center the screen after scrolling up/down with Ctrl-u/d
set("n", "<C-u>", "<C-u>zz")
set("n", "<C-d>", "<C-d>zz")
set("n", "n", "nzzzv", opts)
set("n", "N", "Nzzzv", opts)

-- Stay in indent mode
set("v", "<", "<gv", opts)
set("v", ">", ">gv", opts)

-- Toggle line wrapping
set("n", "<leader>lw", "<cmd>set wrap!<CR>", opts)

-- save, quit
set("n", "<leader>w", "<cmd> w <cr>", opts)
set("n", "<leader>sn", ":<cmd>noautocmd w <cr>", opts)

-- move a blocks of text up/down with K/J in visual mode
set("v", "K", ":m '<-2<CR>gv=gv", { silent = true })
set("v", "J", ":m '>+1<CR>gv=gv", { silent = true })

-- delete single character without copying into register
set("n", "x", '"_x', opts)

-- search and replace the word under cursor in the file with <leader>s
set("n", "<leader>sr", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]])

-- lazygit
set("n", "<leader>gg", ":LazyGit<CR>", opts)

-- Disable continuations
set("n", "<Leader>o", "o<Esc>^Da", opts)
set("n", "<Leader>O", "O<Esc>^Da", opts)

-- delete without yanking
set({ "n", "v" }, "<leader>d", [["_d]])

-- Paste in visual mode without yanking replaced text
set("x", "p", [["_dP]])

-- Resize window
set("n", "<leader><left>", ":vertical resize +20<cr>")
set("n", "<leader><right>", ":vertical resize -20<cr>")
set("n", "<leader><up>", ":resize +10<cr>")
set("n", "<leader><down>", ":resize -10<cr>")

-- Buffers
set("n", "<Tab>", ":bnext<cr>", opts)
set("n", "<S-Tab>", ":bprevious<cr>", opts)
set("n", "<leader>bd", ":bdelete!<cr>", opts) --close buffer
set("n", "<leader>bn", "<cmd> enew <cr>", opts) -- new buffer

-- Lazy and Mason
set("n", "<leader>ll", "<cmd>Lazy<CR>", { desc = "Open Lazy plugin manager" })
set("n", "<leader>lm", "<cmd>Mason<CR>", { desc = "Open Mason LSP installer" })

-- Toggle autoformat on save
set("n", "<leader>tf", ":ToggleAutoformat<CR>", { desc = "Toggle format on save" })

-- Markdown render
set("n", "<leader>pt", "<cmd>RenderMarkdown toggle<CR>", { desc = "Toggle Markdown Render" })

-- Flutter watch
set(
  "n",
  "<leader>ff",
  "<cmd>silent !tmux new-window -n flutter-run -c %:p:h && tmux send-keys 'flutter-watch' Enter<CR>",
  { desc = "Flutter watch" }
)



================================================
FILE: .config/nvim/lua/config/lazy.lua
================================================
-- Install lazy.nvim
local lazypath = vim.fn.stdpath "data" .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system {
    "git",
    "clone",
    "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable",
    lazypath,
  }
end
vim.opt.rtp:prepend(lazypath)

-- Config
require "config.options"
require "config.keymaps"
require "config.autocmd"

require("lazy").setup {
  spec = {
    { import = "plugins" },
  },
  rtp = {
    disabled_plugins = {
      "netrw",
      "netrwPlugin",
    },
  },
  -- automatically check for plugin updates
  checker = { enabled = true },
}


================================================
FILE: .config/nvim/lua/config/options.lua
================================================
vim.opt.fillchars = { eob = " " }
vim.opt.winbar = nil
vim.o.hlsearch = false -- Set highlight on search
vim.wo.number = true -- Make line numbers default
vim.o.mouse = "a" -- Enable mouse mode
vim.o.clipboard = "unnamedplus" -- Sync clipboard between OS and Neovim.
vim.o.breakindent = true -- Enable break indent
vim.o.undofile = true -- Save undo history
vim.o.ignorecase = true -- Case-insensitive searching UNLESS \C or capital in search
vim.o.smartcase = true -- smart case
vim.wo.signcolumn = "yes" -- Keep signcolumn on by default
vim.o.updatetime = 250 -- Decrease update time
vim.o.timeoutlen = 300 -- time to wait for a mapped sequence to complete (in milliseconds)
vim.o.backup = false -- creates a backup file
vim.o.writebackup = false -- if a file is being edited by another program (or was written to file while editing with another program), it is not allowed to be edited
vim.o.completeopt = "menuone,noselect" -- Set completeopt to have a better completion experience
vim.opt.termguicolors = true -- set termguicolors to enable highlight groups
vim.o.whichwrap = "bs<>[]hl" -- which "horizontal" keys are allowed to travel to prev/next line
vim.o.wrap = false -- display lines as one long line
vim.o.linebreak = true -- companion to wrap don't split words
vim.o.scrolloff = 4 -- minimal number of screen lines to keep above and below the cursor
vim.o.sidescrolloff = 8 -- minimal number of screen columns either side of cursor if wrap is `false`
vim.o.relativenumber = true -- set relative numbered lines
vim.o.numberwidth = 4 -- set number column width to 2 {default 4}
vim.o.shiftwidth = 4 -- the number of spaces inserted for each indentation
vim.o.tabstop = 4 -- insert n spaces for a tab
vim.o.softtabstop = 4 -- Number of spaces that a tab counts for while performing editing operations
vim.o.expandtab = true -- convert tabs to spaces
vim.o.cursorline = false -- highlight the current line
vim.o.splitbelow = true -- force all horizontal splits to go below current window
vim.o.splitright = true -- force all vertical splits to go to the right of current window
vim.o.swapfile = false -- creates a swapfile
vim.o.smartindent = true -- make indenting smarter again
vim.o.showmode = false -- we don't need to see things like -- INSERT -- anymore
vim.o.showtabline = 1 -- show if there are at least two tabs
vim.o.backspace = "indent,eol,start" -- allow backspace on
vim.o.pumheight = 10 -- pop up menu height
vim.o.conceallevel = 0 -- so that `` is visible in markdown files
vim.o.fileencoding = "utf-8" -- the encoding written to a file
vim.o.cmdheight = 1 -- more space in the neovim command line for displaying messages
vim.o.autoindent = true -- copy indent from current line when starting new one
vim.opt.shortmess:append "c" -- don't give |ins-completion-menu| messages
vim.opt.iskeyword:append "-" -- hyphenated words recognized by searches
vim.opt.formatoptions:remove { "c", "r", "o" } -- don't insert the current comment leader automatically for auto-wrapping comments using 'textwidth', hitting <Enter> in insert mode, or hitting 'o' or 'O' in normal mode.
vim.opt.runtimepath:remove "/usr/share/vim/vimfiles" -- separate vim plugins from neovim in case vim still in use



================================================
FILE: .config/nvim/lua/plugins/ai.lua
================================================
return {
  {
    "Exafunction/windsurf.nvim",
    dependencies = {
      "nvim-lua/plenary.nvim",
      "hrsh7th/nvim-cmp",
    },
    config = function()
      require("codeium").setup {}
    end,
    keys = {
      { "<leader>ct", "<cmd>Codeium Toggle<CR>", mode = "n", desc = "Toggle Codeium" },
      { "<leader>cc", "<cmd>Codeium Chat<CR>", mode = "n", desc = "Codeium Chat" },
    },
  },
  {
    "zbirenbaum/copilot.lua",
    opts = {
      suggestion = {
        auto_trigger = false,
        keymap = {
          accept = "<C-l>",
          accept_word = "<M-l>",
          accept_line = "<M-S-l>",
          next = "<M-]>",
          prev = "<M-[>",
          dismiss = "<C-]>",
        },
      },
      filetypes = {
        markdown = true,
        help = true,
      },
    },
  },

  -- copilot chat
  {
    "CopilotC-Nvim/CopilotChat.nvim",
    dependencies = {
      { "nvim-lua/plenary.nvim", branch = "master" },
    },
    build = "make tiktoken",
    opts = {
      -- See Configuration section for options
      mappings = {
        reset = {
          insert = "<C-c>",
          normal = "<C-c>",
        },
      },
      prompts = {
        Tutor = {
          prompt = "You are an AI coding instructor designed to assist and guide me as I learn to code. Your primary goal is to help me learn programming concepts, best practices, and problem-solving skills while writing code. Always assume I'm a beginner with limited programming knowledge.Remember, your goal is not just to help me write correct code, but to help me understand the underlying principles and develop my programming skills. Always strive to be clear, patient, and encouraging in your responses.",
        },
        Feedback = {
          prompt = "Review the code and provide feedback. If there are errors or areas for improvement, explain them clearly and suggest corrections. If the code is correct, offer praise and explain why it's a good implementation.Structure your responses as follows: 1- Answer my question, 2- Code review and feedback, 3- Suggestions for further learning or practice",
        },
        FixBuffer = {
          prompt = "Given these diagnostics in the file '$file' which is a '$language' file, please fix the issues: $diagnostics",
        },
      },
    },
    keys = {
      { "<leader>a", "<cmd>CopilotChat<CR>", mode = "n", desc = "Open Copilot Chat" },
      { "<leader>te", "<cmd>CopilotChatExplain<CR>", mode = "v", desc = "Explain Code" },
      { "<leader>tr", "<cmd>CopilotChatReview<CR>", mode = "v", desc = "Review Code" },
      { "<leader>tf", "<cmd>CopilotChatFix<CR>", mode = "v", desc = "Fix Code Issues" },
      { "<leader>to", "<cmd>CopilotChatOptimize<Cr>", mode = "v", desc = "Optimize Code" },
      { "<leader>td", "<cmd>CopilotChatDocs<CR>", mode = "v", desc = "Generate Docs" },
      { "<leader>tt", "<cmd>CopilotChatTests<CR>", mode = "v", desc = "Generate Tests" },
      { "<leader>tm", "<cmd>CopilotChatCommit<CR>", mode = "n", desc = "Generate Commit Message" },
      { "<leader>ts", "<cmd>CopilotChatCommit<CR>", mode = "v", desc = "Generate Commit for Selection" },
    },
  },
}


================================================
FILE: .config/nvim/lua/plugins/alpha.lua
================================================
-- Startup screen
return {
  "goolord/alpha-nvim",
  dependencies = {
    "echasnovski/mini.icons",
  },

  config = function()
    local alpha = require "alpha"
    local dashboard = require "alpha.themes.dashboard"

    dashboard.section.header.opts.hl = {
      {
        { "I2A0", 0, 3 },
        { "I2A0", 3, 6 },
        { "I2A0", 6, 9 },
        { "I2A0", 9, 12 },
        { "I2A0", 12, 15 },
        { "I2A0", 15, 18 },
        { "I2A0", 18, 21 },
        { "I2A0", 21, 24 },
        { "I2A0", 24, 27 },
        { "I2A0", 27, 30 },
        { "I2A0", 30, 33 },
        { "I2A0", 33, 36 },
        { "I2A0", 36, 39 },
        { "I2A0", 39, 42 },
        { "I2A0", 42, 45 },
        { "I2A0", 45, 48 },
        { "I2A0", 48, 51 },
        { "I2A0", 51, 54 },
        { "I2A0", 54, 57 },
        { "I2A0", 57, 60 },
        { "I2A0", 60, 63 },
        { "I2A0", 63, 66 },
        { "I2A0", 66, 69 },
        { "I2A0", 69, 72 },
        { "I2A0", 72, 75 },
        { "I2A0", 75, 78 },
        { "I2A0", 78, 81 },
        { "I2A0", 81, 84 },
        { "I2A0", 84, 87 },
        { "I2A0", 87, 90 },
        { "I2A0", 90, 93 },
        { "I2A0", 93, 96 },
        { "I2A0", 96, 99 },
        { "I2A0", 99, 102 },
        { "I2A0", 102, 105 },
        { "I2A0", 105, 108 },
        { "I2A0", 108, 111 },
      },
      {
        { "I2A1", 0, 3 },
        { "I2A2", 3, 6 },
        { "I2A2", 6, 9 },
        { "I2A2", 9, 12 },
        { "I2A2", 12, 15 },
        { "I2A2", 15, 18 },
        { "I2A2", 18, 21 },
        { "I2A2", 21, 24 },
        { "I2A2", 24, 27 },
        { "I2A2", 27, 30 },
        { "I2A2", 30, 33 },
        { "I2A2", 33, 36 },
        { "I2A2", 36, 39 },
        { "I2A3", 39, 42 },
        { "I2A4", 42, 45 },
        { "I2A5", 45, 48 },
        { "I2A6", 48, 51 },
        { "I2A7", 51, 54 },
        { "I2A8", 54, 57 },
        { "I2A4", 57, 60 },
        { "I2A9", 60, 63 },
        { "I2A2", 63, 66 },
        { "I2A2", 66, 69 },
        { "I2A10", 69, 72 },
        { "I2A2", 72, 75 },
        { "I2A2", 75, 78 },
        { "I2A2", 78, 81 },
        { "I2A2", 81, 84 },
        { "I2A2", 84, 87 },
        { "I2A2", 87, 90 },
        { "I2A2", 90, 93 },
        { "I2A2", 93, 96 },
        { "I2A11", 96, 99 },
        { "I2A12", 99, 102 },
        { "I2A12", 102, 105 },
        { "I2A13", 105, 108 },
        { "I2A12", 108, 111 },
      },
      {
        { "I2A2", 0, 3 },
        { "I2A2", 3, 6 },
        { "I2A2", 6, 9 },
        { "I2A2", 9, 12 },
        { "I2A2", 12, 15 },
        { "I2A2", 15, 18 },
        { "I2A2", 18, 21 },
        { "I2A2", 21, 24 },
        { "I2A2", 24, 27 },
        { "I2A2", 27, 30 },
        { "I2A2", 30, 33 },
        { "I2A2", 33, 36 },
        { "I2A14", 36, 39 },
        { "I2A15", 39, 42 },
        { "I2A16", 42, 45 },
        { "I2A17", 45, 48 },
        { "I2A2", 48, 51 },
        { "I2A2", 51, 54 },
        { "I2A18", 54, 57 },
        { "I2A19", 57, 60 },
        { "I2A20", 60, 63 },
        { "I2A21", 63, 66 },
        { "I2A2", 66, 69 },
        { "I2A2", 69, 72 },
        { "I2A22", 72, 75 },
        { "I2A22", 75, 78 },
        { "I2A2", 78, 81 },
        { "I2A2", 81, 84 },
        { "I2A2", 84, 87 },
        { "I2A23", 87, 90 },
        { "I2A2", 90, 93 },
        { "I2A2", 93, 96 },
        { "I2A2", 96, 99 },
        { "I2A2", 99, 102 },
        { "I2A2", 102, 105 },
        { "I2A2", 105, 108 },
        { "I2A2", 108, 111 },
      },
      {
        { "I2A24", 0, 3 },
        { "I2A25", 3, 6 },
        { "I2A2", 6, 9 },
        { "I2A2", 9, 12 },
        { "I2A2", 12, 15 },
        { "I2A2", 15, 18 },
        { "I2A2", 18, 21 },
        { "I2A2", 21, 24 },
        { "I2A2", 24, 27 },
        { "I2A2", 27, 30 },
        { "I2A2", 30, 33 },
        { "I2A26", 33, 36 },
        { "I2A27", 36, 39 },
        { "I2A27", 39, 42 },
        { "I2A28", 42, 45 },
        { "I2A29", 45, 48 },
        { "I2A30", 48, 51 },
        { "I2A31", 51, 54 },
        { "I2A32", 54, 57 },
        { "I2A33", 57, 60 },
        { "I2A34", 60, 63 },
        { "I2A35", 63, 66 },
        { "I2A27", 66, 69 },
        { "I2A36", 69, 72 },
        { "I2A2", 72, 75 },
        { "I2A2", 75, 78 },
        { "I2A37", 78, 81 },
        { "I2A38", 81, 84 },
        { "I2A2", 84, 87 },
        { "I2A2", 87, 90 },
        { "I2A2", 90, 93 },
        { "I2A2", 93, 96 },
        { "I2A2", 96, 99 },
        { "I2A2", 99, 102 },
        { "I2A38", 102, 105 },
        { "I2A22", 105, 108 },
        { "I2A39", 108, 111 },
      },
      {
        { "I2A40", 0, 3 },
        { "I2A41", 3, 6 },
        { "I2A42", 6, 9 },
        { "I2A43", 9, 12 },
        { "I2A40", 12, 15 },
        { "I2A42", 15, 18 },
        { "I2A44", 18, 21 },
        { "I2A45", 21, 24 },
        { "I2A46", 24, 27 },
        { "I2A46", 27, 30 },
        { "I2A46", 30, 33 },
        { "I2A27", 33, 36 },
        { "I2A27", 36, 39 },
        { "I2A47", 39, 42 },
        { "I2A48", 42, 45 },
        { "I2A2", 45, 48 },
        { "I2A2", 48, 51 },
        { "I2A1", 51, 54 },
        { "I2A2", 54, 57 },
        { "I2A2", 57, 60 },
        { "I2A49", 60, 63 },
        { "I2A50", 63, 66 },
        { "I2A47", 66, 69 },
        { "I2A7", 69, 72 },
        { "I2A51", 72, 75 },
        { "I2A52", 75, 78 },
        { "I2A52", 78, 81 },
        { "I2A53", 81, 84 },
        { "I2A54", 84, 87 },
        { "I2A55", 87, 90 },
        { "I2A56", 90, 93 },
        { "I2A57", 93, 96 },
        { "I2A2", 96, 99 },
        { "I2A58", 99, 102 },
        { "I2A59", 102, 105 },
        { "I2A60", 105, 108 },
        { "I2A61", 108, 111 },
      },
      {
        { "I2A62", 0, 3 },
        { "I2A62", 3, 6 },
        { "I2A63", 6, 9 },
        { "I2A63", 9, 12 },
        { "I2A63", 12, 15 },
        { "I2A62", 15, 18 },
        { "I2A64", 18, 21 },
        { "I2A63", 21, 24 },
        { "I2A64", 24, 27 },
        { "I2A62", 27, 30 },
        { "I2A65", 30, 33 },
        { "I2A66", 33, 36 },
        { "I2A67", 36, 39 },
        { "I2A68", 39, 42 },
        { "I2A69", 42, 45 },
        { "I2A70", 45, 48 },
        { "I2A2", 48, 51 },
        { "I2A2", 51, 54 },
        { "I2A71", 54, 57 },
        { "I2A50", 57, 60 },
        { "I2A50", 60, 63 },
        { "I2A72", 63, 66 },
        { "I2A73", 66, 69 },
        { "I2A74", 69, 72 },
        { "I2A75", 72, 75 },
        { "I2A75", 75, 78 },
        { "I2A76", 78, 81 },
        { "I2A77", 81, 84 },
        { "I2A50", 84, 87 },
        { "I2A50", 87, 90 },
        { "I2A78", 90, 93 },
        { "I2A79", 93, 96 },
        { "I2A80", 96, 99 },
        { "I2A81", 99, 102 },
        { "I2A82", 102, 105 },
        { "I2A83", 105, 108 },
        { "I2A84", 108, 111 },
      },
      {
        { "I2A83", 0, 3 },
        { "I2A83", 3, 6 },
        { "I2A85", 6, 9 },
        { "I2A86", 9, 12 },
        { "I2A87", 12, 15 },
        { "I2A88", 15, 18 },
        { "I2A87", 18, 21 },
        { "I2A89", 21, 24 },
        { "I2A90", 24, 27 },
        { "I2A91", 27, 30 },
        { "I2A92", 30, 33 },
        { "I2A93", 33, 36 },
        { "I2A94", 36, 39 },
        { "I2A95", 39, 42 },
        { "I2A96", 42, 45 },
        { "I2A97", 45, 48 },
        { "I2A98", 48, 51 },
        { "I2A99", 51, 54 },
        { "I2A100", 54, 57 },
        { "I2A69", 57, 60 },
        { "I2A101", 60, 63 },
        { "I2A75", 63, 66 },
        { "I2A102", 66, 69 },
        { "I2A103", 69, 72 },
        { "I2A104", 72, 75 },
        { "I2A105", 75, 78 },
        { "I2A50", 78, 81 },
        { "I2A106", 81, 84 },
        { "I2A50", 84, 87 },
        { "I2A50", 87, 90 },
        { "I2A50", 90, 93 },
        { "I2A107", 93, 96 },
        { "I2A50", 96, 99 },
        { "I2A108", 99, 102 },
        { "I2A83", 102, 105 },
        { "I2A109", 105, 108 },
        { "I2A109", 108, 111 },
      },
      {
        { "I2A98", 0, 3 },
        { "I2A110", 3, 6 },
        { "I2A98", 6, 9 },
        { "I2A98", 9, 12 },
        { "I2A111", 12, 15 },
        { "I2A112", 15, 18 },
        { "I2A113", 18, 21 },
        { "I2A27", 21, 24 },
        { "I2A27", 24, 27 },
        { "I2A27", 27, 30 },
        { "I2A27", 30, 33 },
        { "I2A114", 33, 36 },
        { "I2A75", 36, 39 },
        { "I2A75", 39, 42 },
        { "I2A115", 42, 45 },
        { "I2A116", 45, 48 },
        { "I2A117", 48, 51 },
        { "I2A115", 51, 54 },
        { "I2A118", 54, 57 },
        { "I2A75", 57, 60 },
        { "I2A119", 60, 63 },
        { "I2A120", 63, 66 },
        { "I2A50", 66, 69 },
        { "I2A50", 69, 72 },
        { "I2A50", 72, 75 },
        { "I2A50", 75, 78 },
        { "I2A50", 78, 81 },
        { "I2A50", 81, 84 },
        { "I2A50", 84, 87 },
        { "I2A50", 87, 90 },
        { "I2A50", 90, 93 },
        { "I2A50", 93, 96 },
        { "I2A50", 96, 99 },
        { "I2A121", 99, 102 },
        { "I2A122", 102, 105 },
        { "I2A123", 105, 108 },
        { "I2A110", 108, 111 },
      },
      {
        { "I2A98", 0, 3 },
        { "I2A98", 3, 6 },
        { "I2A98", 6, 9 },
        { "I2A124", 9, 12 },
        { "I2A125", 12, 15 },
        { "I2A126", 15, 18 },
        { "I2A27", 18, 21 },
        { "I2A127", 21, 24 },
        { "I2A128", 24, 27 },
        { "I2A129", 27, 30 },
        { "I2A130", 30, 33 },
        { "I2A75", 33, 36 },
        { "I2A75", 36, 39 },
        { "I2A75", 39, 42 },
        { "I2A131", 42, 45 },
        { "I2A132", 45, 48 },
        { "I2A75", 48, 51 },
        { "I2A75", 51, 54 },
        { "I2A75", 54, 57 },
        { "I2A133", 57, 60 },
        { "I2A134", 60, 63 },
        { "I2A134", 63, 66 },
        { "I2A134", 66, 69 },
        { "I2A134", 69, 72 },
        { "I2A135", 72, 75 },
        { "I2A136", 75, 78 },
        { "I2A50", 78, 81 },
        { "I2A50", 81, 84 },
        { "I2A137", 84, 87 },
        { "I2A138", 87, 90 },
        { "I2A139", 90, 93 },
        { "I2A50", 93, 96 },
        { "I2A140", 96, 99 },
        { "I2A50", 99, 102 },
        { "I2A141", 102, 105 },
        { "I2A142", 105, 108 },
        { "I2A143", 108, 111 },
      },
      {
        { "I2A98", 0, 3 },
        { "I2A98", 3, 6 },
        { "I2A144", 6, 9 },
        { "I2A145", 9, 12 },
        { "I2A146", 12, 15 },
        { "I2A147", 15, 18 },
        { "I2A50", 18, 21 },
        { "I2A50", 21, 24 },
        { "I2A50", 24, 27 },
        { "I2A50", 27, 30 },
        { "I2A148", 30, 33 },
        { "I2A149", 33, 36 },
        { "I2A150", 36, 39 },
        { "I2A130", 39, 42 },
        { "I2A75", 42, 45 },
        { "I2A75", 45, 48 },
        { "I2A75", 48, 51 },
        { "I2A151", 51, 54 },
        { "I2A152", 54, 57 },
        { "I2A153", 57, 60 },
        { "I2A154", 60, 63 },
        { "I2A2", 63, 66 },
        { "I2A155", 66, 69 },
        { "I2A156", 69, 72 },
        { "I2A157", 72, 75 },
        { "I2A158", 75, 78 },
        { "I2A50", 78, 81 },
        { "I2A50", 81, 84 },
        { "I2A50", 84, 87 },
        { "I2A50", 87, 90 },
        { "I2A50", 90, 93 },
        { "I2A50", 93, 96 },
        { "I2A50", 96, 99 },
        { "I2A159", 99, 102 },
        { "I2A50", 102, 105 },
        { "I2A160", 105, 108 },
        { "I2A161", 108, 111 },
      },
      {
        { "I2A98", 0, 3 },
        { "I2A162", 3, 6 },
        { "I2A163", 6, 9 },
        { "I2A164", 9, 12 },
        { "I2A50", 12, 15 },
        { "I2A165", 15, 18 },
        { "I2A50", 18, 21 },
        { "I2A50", 21, 24 },
        { "I2A50", 24, 27 },
        { "I2A50", 27, 30 },
        { "I2A50", 30, 33 },
        { "I2A166", 33, 36 },
        { "I2A134", 36, 39 },
        { "I2A75", 39, 42 },
        { "I2A75", 42, 45 },
        { "I2A167", 45, 48 },
        { "I2A168", 48, 51 },
        { "I2A169", 51, 54 },
        { "I2A170", 54, 57 },
        { "I2A171", 57, 60 },
        { "I2A1", 60, 63 },
        { "I2A172", 63, 66 },
        { "I2A173", 66, 69 },
        { "I2A174", 69, 72 },
        { "I2A75", 72, 75 },
        { "I2A75", 75, 78 },
        { "I2A175", 78, 81 },
        { "I2A50", 81, 84 },
        { "I2A50", 84, 87 },
        { "I2A50", 87, 90 },
        { "I2A50", 90, 93 },
        { "I2A50", 93, 96 },
        { "I2A176", 96, 99 },
        { "I2A177", 99, 102 },
        { "I2A178", 102, 105 },
        { "I2A179", 105, 108 },
        { "I2A180", 108, 111 },
      },
      {
        { "I2A98", 0, 3 },
        { "I2A98", 3, 6 },
        { "I2A181", 6, 9 },
        { "I2A182", 9, 12 },
        { "I2A183", 12, 15 },
        { "I2A184", 15, 18 },
        { "I2A50", 18, 21 },
        { "I2A50", 21, 24 },
        { "I2A185", 24, 27 },
        { "I2A50", 27, 30 },
        { "I2A50", 30, 33 },
        { "I2A50", 33, 36 },
        { "I2A186", 36, 39 },
        { "I2A187", 39, 42 },
        { "I2A188", 42, 45 },
        { "I2A189", 45, 48 },
        { "I2A190", 48, 51 },
        { "I2A191", 51, 54 },
        { "I2A192", 54, 57 },
        { "I2A193", 57, 60 },
        { "I2A194", 60, 63 },
        { "I2A195", 63, 66 },
        { "I2A196", 66, 69 },
        { "I2A197", 69, 72 },
        { "I2A198", 72, 75 },
        { "I2A95", 75, 78 },
        { "I2A50", 78, 81 },
        { "I2A50", 81, 84 },
        { "I2A199", 84, 87 },
        { "I2A50", 87, 90 },
        { "I2A50", 90, 93 },
        { "I2A200", 93, 96 },
        { "I2A201", 96, 99 },
        { "I2A202", 99, 102 },
        { "I2A203", 102, 105 },
        { "I2A204", 105, 108 },
        { "I2A204", 108, 111 },
      },
    }

    dashboard.section.header.val = {

      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢴⣾⣿⣿⣿⣿⣦⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣛⣛⣛⣻⣿⣿⣿⣿⣷⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⣐⣌⣂⡐⣒⣒⣒⣒⣒⣒⠟⠛⣿⣿⡷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⣻⣿⣿⣟⣓⡒⠒⣒⣒⣒⣒⡀⠀⢀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠲⣿⣿⡏⠂⠀⠀⠀⠀⡒⢒⣒⣒⢒⣲⣿⡸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⢴⣿⣿⣯⡄⠀⠀⠀⠀⠀⠀⠒⠆⢒⠞⣂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠺⣿⣿⣿⣧⡄⠀⠤⠤⠄⠄⠅⠹⠏⠯⠁⠀⠀⠀⢀⠀⠀⠀⠤⠄⠮⠭⠭⠭⠀⠤⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠠⠠⠄⠀⠍⠭⠭⠭⠩⠠⢭⣯⣭⡅⠈⠠⠄⠀⠀⠀⠀⠠⠤⠨⠋⠩⠭⠭⠭⠭⠭⠭⠭⠁⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠠⠌⠤⠤⠤⠤⠌⠉⠀⠤⠍⢿⣿⣿⣿⠥⠬⠄⠀⠀⠀⠀⠅⠍⠩⠈⠭⠭⠭⠭⠍⠉⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠉⠀⠁⠀⠈⠉⣿⣿⣿⡧⠁⠉⠁⠀⢣⠉⠀⠀⠠⠭⠭⠩⠭⠭⠭⠭⠄⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠿⣿⣿⣿⣂⠀⠀⠈⠸⢁⡀⠀⠈⠛⠿⠁⠈⠙⠛⠁⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⡖⡀⠀⡒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⣐⣒⣒⣒⣒⣒⣐⣒⣒⢂⣲⣿⣟⣺⣿⣿⠒⣂⣒⣒⣒⡒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⢀⣀⣀⣒⣒⠀⢒⠂⣐⢘⣿⣗⢸⣿⣿⡖⠂⡒⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⡇⢸⣿⣿⣷⠀⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⡏⠀⣿⣿⣿⡏⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠼⠿⠿⠿⠅⠀⠈⠉⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
      [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀]],
    }

    dashboard.section.buttons.val = {
      dashboard.button("z", "  > Zoxide", ":FzfLua zoxide list<CR>"),
      dashboard.button("f", "  > Find file", ":FzfLua files<CR>"),
      dashboard.button("p", "λ  > Projects", function() vim.cmd "cd ~/Projects" vim.cmd "Yazi cwd" end),
      dashboard.button("s", "󰯂  > Browse scripts", ":FzfLua files cwd=~/Scripts<CR>"),
      vim.api.nvim_buf_set_keymap(0, "n", "q", ":q<CR>", { noremap = true, silent = true }),
    }

    dashboard.section.footer.opts.position = "center"
    vim.api.nvim_create_autocmd("User", {
      once = true,
      pattern = "LazyVimStarted",
      callback = function()
        local stats = require("lazy").stats()
        local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
        dashboard.section.footer.val = " " .. stats.loaded .. " plugins   " .. ms .. "ms"
        dashboard.section.footer.opts.hl = "I2A0"
        pcall(vim.cmd.AlphaRedraw)
      end,
    })
    alpha.setup(dashboard.opts)
  end,
}


================================================
FILE: .config/nvim/lua/plugins/cmp.lua
================================================
-- Autocompletion
return {
  "hrsh7th/nvim-cmp",
  dependencies = {
    "onsails/lspkind.nvim", -- Adds VS Code-like pictograms/icons to the completion menu
    "saadparwaiz1/cmp_luasnip", -- Enables LuaSnip as a source for nvim-cmp autocompletion
    {
      "L3MON4D3/LuaSnip", -- Snippet engine for Neovim (write and expand code snippets)
      version = "v2.*",
      build = "make install_jsregexp",
    },
    "rafamadriz/friendly-snippets", -- Large collection of pre-made snippets for various languages
    "hrsh7th/cmp-nvim-lsp", -- nvim-cmp source for LSP-based autocompletion
    "hrsh7th/cmp-buffer", -- nvim-cmp source for words from the current buffer
    "hrsh7th/cmp-path", -- nvim-cmp source for filesystem paths
    "hrsh7th/cmp-nvim-lsp-signature-help", -- function signatures
  },
  config = function()
    local lspkind = require "lspkind"
    local cmp = require "cmp"
    local luasnip = require "luasnip"

    require("luasnip.loaders.from_vscode").lazy_load()

    cmp.setup {
      snippet = {
        expand = function(args)
          luasnip.lsp_expand(args.body)
        end,
      },

      formatting = {
        format = lspkind.cmp_format {
          mode = "symbol_text",
          menu = {
            codeium = "",
            luasnip = "",
            buffer = "",
            path = "",
            nvim_lsp = "🅻",
          },
        },
      },

      mapping = cmp.mapping.preset.insert {
        ["<C-k>"] = cmp.mapping.select_prev_item(),
        ["<C-j>"] = cmp.mapping.select_next_item(),
        ["<C-b>"] = cmp.mapping.scroll_docs(-4),
        ["<C-f>"] = cmp.mapping.scroll_docs(4),
        ["<C-Space>"] = cmp.mapping.complete(),
        ["<C-e>"] = cmp.mapping.abort(),
        ["<CR>"] = cmp.mapping.confirm { select = false },
      },

      sources = {
        { name = "codeium" },
        { name = "luasnip" },
        { name = "nvim_lsp" },
        { name = "buffer" },
        { name = "path" },
        { name = "nvim_lsp_signature_help" },
      },
    }
  end,
}


================================================
FILE: .config/nvim/lua/plugins/color-picker.lua
================================================
return {
  {
    "eero-lehtinen/oklch-color-picker.nvim",
    event = "VeryLazy",
    -- version = "*", -- Pinning version is optional
    keys = {
      -- One handed keymap recommended, you will be using the mouse
      { "<leader>co", function() require("oklch-color-picker").open_picker() end, desc = "Open Color Picker" },
      { "<leader>cu", function() require("oklch-color-picker").pick_under_cursor() end, desc = "Pick Color Under Cursor" },
    },
    opts = {
      -- for example, to highlight colors in the buffer
      highlight_colors = {
        enable = true,
      },
      -- for example, to use a different keymap to confirm the color
      keymaps = {
        confirm = "<CR>",
      },
    },
  },
}


================================================
FILE: .config/nvim/lua/plugins/colorscheme.lua
================================================
return {
  { "ellisonleao/gruvbox.nvim", lazy = true, opts = { transparent_mode = true } },
  { "folke/tokyonight.nvim", lazy = true, opts = { style = "night", transparent = true } },

  -- superior gruvbox variant
  {
    "sainnhe/gruvbox-material",
    lazy = true,
    config = function()
      vim.g.gruvbox_material_enable_italic = true
      vim.g.gruvbox_material_background = "hard"
      vim.g.gruvbox_material_transparent_background = 1
    end,
  },
  -- fav theme (only this will be loaded on startup)
  {
    "vague2k/vague.nvim",
    priority = 1000,
    lazy = false,
    opts = { transparent = true },
    config = function(_, opts)
      require("vague").setup(opts)
      vim.cmd.colorscheme "vague"
    end,
  },
}


================================================
FILE: .config/nvim/lua/plugins/dap.lua
================================================
-- Debug Adapter Protocol (DAP) - Centralized debugging for all languages
-- Supports: Flutter/Dart (via flutter-tools), Go (via nvim-dap-go)
return {
  {
    "mfussenegger/nvim-dap",
    dependencies = {
      { "rcarriga/nvim-dap-ui", dependencies = { "nvim-neotest/nvim-nio" } },
      { "theHamsta/nvim-dap-virtual-text", opts = {} },
      "leoluz/nvim-dap-go",
    },
    keys = {
      { "<leader>xb", function() require("dap").toggle_breakpoint() end, desc = "Debug: Toggle Breakpoint" },
      { "<leader>xB", function() require("dap").set_breakpoint(vim.fn.input("Condition: ")) end, desc = "Debug: Conditional Breakpoint" },
      { "<leader>xc", function() require("dap").continue() end, desc = "Debug: Continue/Start" },
      { "<leader>xn", function() require("dap").step_over() end, desc = "Debug: Step Over" },
      { "<leader>xi", function() require("dap").step_into() end, desc = "Debug: Step Into" },
      { "<leader>xo", function() require("dap").step_out() end, desc = "Debug: Step Out" },
      { "<leader>xt", function() require("dap").terminate() end, desc = "Debug: Terminate" },
      { "<leader>xr", function() require("dap").repl.toggle() end, desc = "Debug: Toggle REPL" },
      { "<leader>xu", function() require("dapui").toggle() end, desc = "Debug: Toggle UI" },
      { "<leader>xg", function() require("dap-go").debug_test() end, ft = "go", desc = "Debug: Go Test (nearest)" },
      { "<leader>xG", function() require("dap-go").debug_last_test() end, ft = "go", desc = "Debug: Go Test (last)" },
    },
    config = function()
      local dap = require "dap"
      local dapui = require "dapui"
      dapui.setup()

      -- NO auto-open UI - virtual text shows values inline
      -- Press <leader>xu to toggle UI panels when needed
      dap.listeners.before.event_terminated["dapui_config"] = function() dapui.close() end
      dap.listeners.before.event_exited["dapui_config"] = function() dapui.close() end

      require("dap-go").setup()
    end,
  },
}


================================================
FILE: .config/nvim/lua/plugins/flutter.lua
================================================
-- Flutter development tools
-- NOTE: This plugin manages dartls LSP - do NOT configure dartls separately
-- NOTE: Debug keybindings use <leader>x prefix (see lua/plugins/dap.lua)
return {
  "nvim-flutter/flutter-tools.nvim",
  ft = "dart",
  dependencies = {
    "nvim-lua/plenary.nvim",
    "stevearc/dressing.nvim",
    "mfussenegger/nvim-dap",
  },
  config = function()
    require("flutter-tools").setup {
      flutter_path = "/home/vyrx/dev-tools/flutter/bin/flutter",
      widget_guides = { enabled = true },
      debugger = {
        enabled = true,
        evaluate_to_string_in_debug_views = true,
      },
      lsp = {
        color = { enabled = true, virtual_text = true },
        settings = {
          showTodos = true,
          completeFunctionCalls = true,
          renameFilesWithClasses = "always",
          enableSnippets = true,
          updateImportsOnRename = true,
          analysisExcludedFolders = {
            vim.fn.expand "$HOME/.pub-cache",
            vim.fn.expand "$HOME/dev-tools/flutter/",
          },
        },
      },
    }
  end,
  keys = {
    { "<leader>kr", "<cmd>FlutterReload<cr>", desc = "Flutter: Hot Reload" },
    { "<leader>kR", "<cmd>FlutterRestart<cr>", desc = "Flutter: Hot Restart" },
    { "<leader>kd", "<cmd>FlutterRun<cr>", desc = "Flutter: Run" },
    { "<leader>kD", "<cmd>FlutterDebug<cr>", desc = "Flutter: Debug Mode" },
    { "<leader>kq", "<cmd>FlutterQuit<cr>", desc = "Flutter: Quit" },
    { "<leader>ko", "<cmd>FlutterOutlineToggle<cr>", desc = "Flutter: Toggle Outline" },
    { "<leader>ke", "<cmd>FlutterEmulators<cr>", desc = "Flutter: Emulators" },
    { "<leader>km", "<cmd>FlutterDevices<cr>", desc = "Flutter: Devices" },
    { "<leader>ks", "<cmd>FlutterSuper<cr>", desc = "Flutter: Go to Super" },
    { "<leader>kl", "<cmd>FlutterLogToggle<cr>", desc = "Flutter: Toggle Log" },
  },
}


================================================
FILE: .config/nvim/lua/plugins/fzf.lua
================================================
-- Fuzzy finder (fzf gets the job done, never needed telescope)
return {
  "ibhagwan/fzf-lua",
  cmd = "FzfLua",
  dependencies = { "nvim-tree/nvim-web-devicons" },
  keys = {
    -- Quick access
    { ";r", function() require("fzf-lua").live_grep({ hidden = true }) end, desc = "Live Grep" },
    { ";c", function() require("fzf-lua").colorschemes() end, desc = "Colorschemes" },
    { ";a", function() require("fzf-lua").buffers() end, desc = "Buffers" },
    { "<leader><leader>", function() require("fzf-lua").files({ hidden = true }) end, desc = "Search Files" },
    { "\\\\", function() require("fzf-lua").resume() end, desc = "Resume Picker" },

    -- Leader + s - Search operations
    { "<leader>sh", function() require("fzf-lua").help_tags() end, desc = "Search Help" },
    { "<leader>sk", function() require("fzf-lua").keymaps() end, desc = "Search Keymaps" },
    { "<leader>ss", function() require("fzf-lua").builtin() end, desc = "Search Select" },
    { "<leader>sw", function() require("fzf-lua").grep_cword() end, desc = "Search Word" },
    { "<leader>sd", function() require("fzf-lua").diagnostics_document() end, desc = "Search Diagnostics" },
    { "<leader>sD", function() require("fzf-lua").diagnostics_workspace() end, desc = "Search Diagnostics" },
    { "<leader>s.", function() require("fzf-lua").oldfiles() end, desc = "Search Recent Files" },
    { "<leader>sp", function() require("fzf-lua").files { cwd = require("lazy.core.config").options.root } end, desc = "Search Plugin Files" },
    { "<leader>sn", function() require("fzf-lua").files { cwd = vim.fn.stdpath "config" } end, desc = "Search Neovim Config" },

    -- Other
    { "<leader>/", function() require("fzf-lua").blines() end, desc = "Search Current Buffer" },
  },
  opts = {},
}


================================================
FILE: .config/nvim/lua/plugins/git.lua
================================================
return {
  -- git tui
  {
    "kdheepak/lazygit.nvim",
    dependencies = { "nvim-lua/plenary.nvim" },
    cmd = {
      "LazyGit",
      "LazyGitConfig",
      "LazyGitCurrentFile",
      "LazyGitFilter",
      "LazyGitFilterCurrentFile",
    },
  },

  {
    "lewis6991/gitsigns.nvim",
    event = { "BufReadPre", "BufNewFile" },
    opts = {
      on_attach = function(bufnr)
        local gitsigns = require "gitsigns"

        local function map(mode, l, r, opts)
          opts = opts or {}
          opts.buffer = bufnr
          vim.keymap.set(mode, l, r, opts)
        end

        -- Navigation
        map("n", "]c", function() if vim.wo.diff then vim.cmd.normal { "]c", bang = true } else gitsigns.nav_hunk "next" end end, { desc = "Next Hunk" })
        map("n", "[c", function() if vim.wo.diff then vim.cmd.normal { "[c", bang = true } else gitsigns.nav_hunk "prev" end end, { desc = "Prev Hunk" })

        -- Actions
        map("n", "<leader>hs", gitsigns.stage_hunk, { desc = "Stage hunk" })
        map("n", "<leader>hr", gitsigns.reset_hunk, { desc = "Reset hunk" })

        map("n", "<leader>hS", gitsigns.stage_buffer, { desc = "Stage buffer" })
        map("n", "<leader>hR", gitsigns.reset_buffer, { desc = "Reset buffer" })
        map("n", "<leader>hp", gitsigns.preview_hunk, { desc = "Preview hunk" })

        map("n", "<leader>hb", function() gitsigns.blame_line { full = true } end, { desc = "Blame line" })
        map("n", "<leader>hd", gitsigns.diffthis, { desc = "Diff this" })
        map("n", "<leader>hD", function() gitsigns.diffthis "~" end, { desc = "Diff this ~" })

        -- Toggles
        map("n", "<leader>tb", gitsigns.toggle_current_line_blame, { desc = "Toggle line blame" })
        map("n", "<leader>tw", gitsigns.toggle_word_diff, { desc = "Toggle word diff" })

        -- Text object
        map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", { desc = "Gitsigns select hunk" })
      end,
    },
  },
}


================================================
FILE: .config/nvim/lua/plugins/lsp-config.lua
================================================
return {
  -- Auto-install LSPs, formatters, linters via Mason on startup
  {
    "WhoIsSethDaniel/mason-tool-installer.nvim",
    dependencies = {
      "mason-org/mason.nvim",
    },
    config = function()
      require("mason").setup()
      require("mason-tool-installer").setup {
        ensure_installed = {
          -- LSP Servers
          "bash-language-server",
          "docker-language-server",
          "emmet-ls",
          "gopls",
          "lua-language-server",
          "pyright",
          "typescript-language-server",
          "json-lsp",
          "yaml-language-server",
          "tailwindcss-language-server",
          "efm",

          -- Formatters
          "prettierd",
          "stylua",
          "gofumpt",
          "shfmt",
          "fixjson",

          -- Linters
          "eslint_d",
          "flake8",
          -- "luacheck",
          "hadolint",
          "shellcheck",
          "revive",
        },
        auto_update = false,
        run_on_start = true,
        start_delay = 3000, -- 3 sec delay to avoid blocking startup
      }
    end,
  },

  -- Core LSP configurations and server setups
  {
    "neovim/nvim-lspconfig",
    dependencies = {
      "mason-org/mason.nvim", -- LSP/DAP/Linter installer & manager
      "creativenull/efmls-configs-nvim", -- Preconfigured EFM Language Server setups
      "hrsh7th/cmp-nvim-lsp", -- nvim-cmp source for LSP-based completion
    },
    config = function()
      require("utils.diagnostics").setup()
      require "servers"
    end,
  },

  -- Better UI for LSP actions (hover, rename, diagnostics, etc.)
  {
    "glepnir/lspsaga.nvim",
    event = "LspAttach",
    dependencies = {
      "nvim-treesitter/nvim-treesitter",
    },
    config = function()
      require("lspsaga").setup {
        move_in_saga = { prev = "<C-k>", next = "<C-j>" },
        finder_action_keys = {
          open = "<CR>",
        },
        definition_action_keys = {
          edit = "<CR>",
        },
        symbol_in_winbar = {
          enable = false,
        },
      }
    end,
  },
}


================================================
FILE: .config/nvim/lua/plugins/mini.lua
================================================
return {
  { "echasnovski/mini.ai", version = "*", opts = {} },
  { "echasnovski/mini.icons", opts = {} },
  { "echasnovski/mini.pairs", opts = {} },

  -- minimal notification UI
  {
    "echasnovski/mini.notify",
    opts = {
      window = {
        winblend = 0, -- transparency
        max_width_share = 0.5,
      },
      lsp_progress = {
        enable = false, -- disable LSP progress (handled by fidget.nvim)
        duration_last = 10000,
      },
    },
  },

  -- fast surround editing
  {
    "echasnovski/mini.surround",
    opts = {
      mappings = {
        add = "sa", -- Add surrounding in Normal and Visual modes
        delete = "sd", -- Delete surrounding
        find = "", -- Find surrounding (to the right)
        find_left = "", -- Find surrounding (to the left)
        highlight = "", -- Highlight surrounding
        replace = "sr", -- Replace surrounding
      },
      n_lines = 30,
    },
  },
}


================================================
FILE: .config/nvim/lua/plugins/navigation.lua
================================================
return {
  -- Tmux integration
  {
    "christoomey/vim-tmux-navigator",
    cmd = {
      "TmuxNavigateLeft",
      "TmuxNavigateDown",
      "TmuxNavigateUp",
      "TmuxNavigateRight",
      "TmuxNavigatePrevious",
      "TmuxNavigatorProcessList",
    },
    keys = {
      { "<c-h>", "<cmd><C-U>TmuxNavigateLeft<cr>" },
      { "<c-j>", "<cmd><C-U>TmuxNavigateDown<cr>" },
      { "<c-k>", "<cmd><C-U>TmuxNavigateUp<cr>" },
      { "<c-l>", "<cmd><C-U>TmuxNavigateRight<cr>" },
      { "<c-\\>", "<cmd><C-U>TmuxNavigatePrevious<cr>" },
    },

    -- fast navigation (better f)
    {
      "folke/flash.nvim",
      event = "VeryLazy",
      ---@type Flash.Config
      opts = {},
      keys = {
        { "zn", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" },
        { "zN", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
        { "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" },
        { "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" },
        { "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" },
      },
    },
  },
}


================================================
FILE: .config/nvim/lua/plugins/nvim-tree.lua
================================================
-- File explorer (rarely used, mainly for screensharing)
return
{
  "nvim-tree/nvim-tree.lua",
  cmd = { "NvimTreeToggle", "NvimTreeFocus" },
  config = function()
    -- remove background color from the nvimtree window (ui fix)
    vim.cmd [[hi nvimtreenormal guibg=none ctermbg=none]]
    require("nvim-tree").setup {
      filters = { dotfiles = false },
      disable_netrw = true,
      hijack_cursor = true,
      sync_root_with_cwd = true,
      update_focused_file = {
        enable = true,
        update_root = false,
      },
      view = {
        width = 30,
        preserve_window_proportions = true,
      },
      renderer = {
        root_folder_label = false,
        highlight_git = true,
        indent_markers = { enable = true },
        icons = {
          glyphs = {
            default = "󰈚",
            folder = {
              default = "",
              empty = "",
              empty_open = "",
              open = "",
              symlink = "",
            },
            git = { unmerged = "" },
          },
        },
      },
    }
  end,
}



================================================
FILE: .config/nvim/lua/plugins/preview.lua
================================================
-- Preview tools
return {
  -- HTML preview
  {
    "barrett-ruth/live-server.nvim",
    build = "npm install -g live-server",
    cmd = { "LiveServerStart", "LiveServerStop" },
    config = true,
  },

  -- Markdown preview
  {
    "toppair/peek.nvim",
    event = { "VeryLazy" },
    build = "deno task --quiet build:fast",
    config = function()
      require("peek").setup {
        close_on_bdelete = true,
        theme = "dark",
        app = "brave", -- Or 'browser' for your default
      }
      vim.api.nvim_create_user_command("PeekOpen", require("peek").open, {})
      vim.api.nvim_create_user_command("PeekClose", require("peek").close, {})
    end,
    keys = {
      { "<leader>pm", function() require("peek").open() end, desc = "Markdown Preview Open" },
      { "<leader>pc", function() require("peek").close() end, desc = "Markdown Preview  Close" },
    },
  },

  -- Markdown render
  {
    "MeanderingProgrammer/render-markdown.nvim",
    ft = "markdown",
    dependencies = { "nvim-treesitter/nvim-treesitter", "echasnovski/mini.icons" },
    opts = {},
  },
}


================================================
FILE: .config/nvim/lua/plugins/sloat.lua
================================================
return {
  "vyrx-dev/sloat",
  opts = {
    float = {
      width = 0.4, -- bigger float
      height = 0.5,
      border = "single", -- different border
    },
    bottom = {
      height = 15, -- taller bottom split
    },
    root_patterns = { ".git", "Cargo.toml" }, -- custom root detection
  },
  keys = {
    { ";t", "<cmd>Sloat float<cr>", mode = { "n", "t" } },
    { ";st", "<cmd>Sloat bottom<cr>" },
    { ";d", "<cmd>Sloat kill<cr>" },
  },
}


================================================
FILE: .config/nvim/lua/plugins/treesitter.lua
================================================
-- Syntax highlighting
return {
  "nvim-treesitter/nvim-treesitter",
  branch = "main",
  build = ":TSUpdate",
  event = { "BufReadPost", "BufNewFile" },
  lazy = false,
  config = function()
    require("nvim-treesitter.config").setup {
      -- language parsers that MUST be installed
      ensure_installed = {
        "bash",
        "css",
        "dockerfile",
        "go",
        "html",
        "javascript",
        "json",
        "lua",
        "markdown",
        "markdown_inline",
        "python",
        "typescript",
        "vue",
        "yaml",
      },
      auto_install = true, -- auto-install any other parsers on opening new language files
      sync_install = false,
      highlight = {
        enable = true,
        additional_vim_regex_highlighting = false,
      },
      indent = { enable = true },
      incremental_selection = {
        enable = true,
      },
    }
  end,
}


================================================
FILE: .config/nvim/lua/plugins/trouble.lua
================================================
-- Diagnostics viewer
return {
  "folke/trouble.nvim",
  opts = {}, -- for default options, refer to the configuration section for custom setup.
  cmd = "Trouble",
  lazy = true,
  keys = {
    {"<leader>xx", "<cmd>Trouble diagnostics toggle<cr>", desc = "Workspace Diagnostics (Trouble)"},
    {"<leader>xX", "<cmd>Trouble diagnostics toggle filter.buf=0<cr>", desc = "Buffer Diagnostics (Trouble)"},
    {"<leader>cs", "<cmd>Trouble symbols toggle focus=false<cr>", desc = "Symbols (Trouble)"},
    {"<leader>cl", "<cmd>Trouble lsp toggle focus=false win.position=right<cr>", desc = "LSP Definitions / references / ... (Trouble)"},
    {"<leader>xL", "<cmd>Trouble loclist toggle<cr>", desc = "Location List (Trouble)"},
    {"<leader>xQ", "<cmd>Trouble qflist toggle<cr>", desc = "Quickfix List (Trouble)"},
  },
}


================================================
FILE: .config/nvim/lua/plugins/ui.lua
================================================
-- UI enhancements
return {
  -- focus mode (hide everything except the the file)
  {
    "folke/zen-mode.nvim",
    cmd = "ZenMode",
    opts = {
      plugins = {
        options = {
          laststatus = 0,
        },
        tmux = true,
        kitty = { enabled = false, font = "+4" },
        alacritty = { enabled = true, font = "18" },
      },
    },
    keys = { { "<leader>z", "<cmd>ZenMode<cr>", desc = "Zen Mode" } },
  },

  -- indent line
  {
    "lukas-reineke/indent-blankline.nvim",
    main = "ibl",
    opts = {
      indent = {
        char = "▏",
      },
      scope = {
        show_start = false,
        show_end = false,
        show_exact_scope = false,
      },
      exclude = {
        filetypes = {
          "help",
          "startify",
          "dashboard",
          "packer",
          "neogitstatus",
          "NvimTree",
          "Trouble",
        },
      },
    },
  },

  -- status bar
  {
    "nvim-lualine/lualine.nvim",
    config = function()
      require("lualine").setup {
        options = {
          theme = "auto",
        },
        sections = {
          lualine_x = {
            {
              function()
                return vim.g.autoformat_enabled and "󰉼 fmt" or "󰉼 fmt"
              end,
              color = function()
                return vim.g.autoformat_enabled and { fg = "#a6e3a1" } or { fg = "#f38ba8" }
              end,
            },
            "encoding",
            "fileformat",
            "filetype",
          },
        },
      }
    end,
  },

  -- keymaps hints
  {
    "folke/which-key.nvim",
    event = "VeryLazy",
    opts = {},
    keys = {
      {
        "<leader>?",
        function()
          require("which-key").show { global = false }
        end,
        desc = "Buffer Local Keymaps (which-key)",
      },
    },
  },

  -- lsp progress notification
  {
    "j-hui/fidget.nvim",
    opts = {
      notification = {
        window = {
          winblend = 0,
          normal_hl = "FloatBorder",
          override_vim_notify = false, -- let mini.notify handle vim.notify
        },
      },
    },
  },

  -- better comments highlights
  {
    "folke/todo-comments.nvim",
    event = "VimEnter",
    dependencies = { "nvim-lua/plenary.nvim" },
    opts = { signs = false },
  },

  -- Undo history
  {
    "mbbill/undotree",
    config = function()
      vim.keymap.set("n", "<leader>u", vim.cmd.UndotreeToggle)
    end,
  },

  -- Incremental rename
  {
    "smjonas/inc-rename.nvim",
    cmd = "IncRename",
    config = true,
  },

  -- split and join
  {
    "Wansmer/treesj",
    keys = { "<space>m" },
    dependencies = { "nvim-treesitter/nvim-treesitter" },
    config = function()
      require("treesj").setup { max_join_length = 200 }
    end,
  },
}


================================================
FILE: .config/nvim/lua/plugins/yazi.lua
================================================
-- Yazi file manager
return {
  "mikavilpas/yazi.nvim",
  event = "VeryLazy",
  keys = {
    { "sf", "<cmd>Yazi<cr>", desc = "Open Yazi at current file" },
    { "<leader>cw", "<cmd>Yazi cwd<cr>", desc = "Open the file manager in nvim's working directory" },
    { "<c-up>", "<cmd>Yazi toggle<cr>", desc = "Resume the last yazi session" },
  },
  opts = {
    open_for_directories = false,
    keymaps = { show_help = "<f1>" },
    yazi_floating_window_border = "none",
  },
}


================================================
FILE: .config/nvim/lua/servers/bashls.lua
================================================
-- ================================================================================================
-- TITLE : bashls (Bash Language Server) LSP Setup
-- LINKS :
--   > github: https://github.com/bash-lsp/bash-language-server
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function(capabilities)
	vim.lsp.config('bashls',{
		capabilities = capabilities,
		filetypes = { "sh", "bash", "zsh" },
	})
end


================================================
FILE: .config/nvim/lua/servers/dockerls.lua
================================================
-- ================================================================================================
-- TITLE : dockerls (Docker Language Server) LSP Setup
-- LINKS :
--   > github: https://github.com/rcjsuen/dockerfile-language-server-nodejs
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function(capabilities)
	vim.lsp.config('dockerls',{
		capabilities = capabilities,
		filetypes = { "dockerfile" },
	})
end


================================================
FILE: .config/nvim/lua/servers/efm-langserver.lua
================================================
-- ================================================================================================
-- TITLE : efm-langserver
-- ABOUT : a general purpose language server protocol implemented here for linters/formatters
-- LINKS :
--   > github : https://github.com/mattn/efm-langserver
--   > configs: https://github.com/creativenull/efmls-configs-nvim/tree/main
-- ================================================================================================

--- @param capabilities table LSP client capabilities (from nvim-cmp)
--- @return nil
return function(capabilities)
  local luacheck = require "efmls-configs.linters.luacheck" -- lua linter
  local stylua = require "efmls-configs.formatters.stylua" -- lua formatter
  local flake8 = require "efmls-configs.linters.flake8" -- python linter
  local black = require "efmls-configs.formatters.black" -- python formatter
  local go_revive = require "efmls-configs.linters.go_revive" -- go linter
  local gofumpt = require "efmls-configs.formatters.gofumpt" -- go formatter
  local prettier_d = require "efmls-configs.formatters.prettier_d" -- ts/js/solidity/json/docker/html/css/react/svelte/vue formatter
  local eslint_d = require "efmls-configs.linters.eslint_d" -- ts/js/solidity/json/react/svelte/vue linter
  local fixjson = require "efmls-configs.formatters.fixjson" -- json formatter
  local shellcheck = require "efmls-configs.linters.shellcheck" -- bash linter
  local shfmt = require "efmls-configs.formatters.shfmt" -- bash formatter
  local hadolint = require "efmls-configs.linters.hadolint" -- docker linter

  vim.lsp.config("efm", {
    capabilities = capabilities,
    filetypes = {
      "css",
      "docker",
      "go",
      "html",
      "javascript",
      "javascriptreact",
      "json",
      "jsonc",
      "lua",
      "markdown",
      "python",
      "sh",
      "svelte",
      "typescript",
      "typescriptreact",
      -- "vue",
    },
    init_options = {
      documentFormatting = true,
      documentRangeFormatting = true,
      hover = true,
      documentSymbol = true,
      codeAction = true,
      completion = true,
    },
    settings = {
      languages = {
        css = { prettier_d },
        docker = { hadolint, prettier_d },
        go = { gofumpt, go_revive },
        html = { prettier_d },
        javascript = { eslint_d, prettier_d },
        javascriptreact = { eslint_d, prettier_d },
        json = { eslint_d, fixjson },
        jsonc = { eslint_d, fixjson },
        lua = { luacheck, stylua },
        markdown = { prettier_d },
        python = { flake8, black },
        sh = { shellcheck, shfmt },
        svelte = { eslint_d, prettier_d },
        typescript = { eslint_d, prettier_d },
        typescriptreact = { eslint_d, prettier_d },
        -- vue = { eslint_d, prettier_d },
      },
    },
  })
end


================================================
FILE: .config/nvim/lua/servers/emmet_ls.lua
================================================
-- ================================================================================================
-- TITLE : emmet_ls (Emmet Language Server) LSP Setup
-- ABOUT : Configures Emmet Language Server for web-related (e.g. TS/JS, CSS, Sass, Svelte, Vue)
-- LINKS :
--   > github: https://github.com/aca/emmet-ls
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function(capabilities)
	vim.lsp.config('emmet_ls', {
		capabilities = capabilities,
		filetypes = {
			"html",
			"typescript",
			"javascript",
			"javascriptreact",
			"typescriptreact",
			"css",
			"sass",
			"scss",
			"svelte",
			"vue",
		},
	})
end


================================================
FILE: .config/nvim/lua/servers/gopls.lua
================================================
-- ================================================================================================
-- TITLE : gopls (Golang Language Server) LSP Setup
-- LINKS :
--   > github: https://github.com/golang/tools/tree/master/gopls
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function(capabilities)
  vim.lsp.config("gopls", {
    capabilities = capabilities,
    filetypes = { "go" },
  })
end


================================================
FILE: .config/nvim/lua/servers/init.lua
================================================
local capabilities = require("cmp_nvim_lsp").default_capabilities()

-- Language Server Protocol (LSP)
require "servers.lua_ls"(capabilities)
require("servers.pyright")(capabilities)
require("servers.gopls")(capabilities)
require("servers.jsonls")(capabilities)
require("servers.ts_ls")(capabilities)
require("servers.bashls")(capabilities)
require("servers.dockerls")(capabilities)
require("servers.emmet_ls")(capabilities)
require("servers.yamlls")(capabilities)
require("servers.tailwindcss")(capabilities)

-- Linters & Formatters
require("servers.efm-langserver")(capabilities)

vim.lsp.enable {
  "lua_ls",
  "pyright",
  "gopls",
  "jsonls",
  "ts_ls",
  "bashls",
  "dockerls",
  "emmet_ls",
  "yamlls",
  "tailwindcss",
  "efm",
}


================================================
FILE: .config/nvim/lua/servers/jsonls.lua
================================================
-- ================================================================================================
-- TITLE : jsonls (JSON Language Server) LSP Setup
-- LINKS :
--   > github: https://github.com/microsoft/vscode-json-languageservice
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function(capabilities)
	vim.lsp.config('jsonls', {
		capabilities = capabilities,
		filetypes = { "json", "jsonc" },
	})
end


================================================
FILE: .config/nvim/lua/servers/lua_ls.lua
================================================
-- ================================================================================================
-- TITLE : lua_ls (Lua Language Server) LSP Setup
-- LINKS :
--   > github: https://github.com/LuaLS/lua-language-server
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function(capabilities)
	vim.lsp.config('lua_ls', {
		capabilities = capabilities,
		settings = {
			Lua = {
				diagnostics = {
					globals = { "vim" },
				},
				workspace = {
					library = {
						vim.fn.expand("$VIMRUNTIME/lua"),
						vim.fn.expand("$XDG_CONFIG_HOME") .. "/nvim/lua",
					},
				},
			},
		},
	})
end


================================================
FILE: .config/nvim/lua/servers/pyright.lua
================================================
-- ================================================================================================
-- TITLE : pyright (Python Language Server) LSP Setup
-- LINKS :
--   > github: https://github.com/microsoft/pyright
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil This function doesn't return a value, it configures the LSP server
return function(capabilities)
  vim.lsp.config("pyright", {
    capabilities = capabilities,
    settings = {
      pyright = {
        disableOrganizeImports = false,
        analysis = {
          useLibraryCodeForTypes = true,
          autoSearchPaths = true,
          diagnosticMode = "workspace",
          autoImportCompletions = true,
        },
      },
    },
  })
end


================================================
FILE: .config/nvim/lua/servers/tailwindcss.lua
================================================
-- ================================================================================================
-- TITLE : tailwindcss LSP Setup
-- LINKS :
--   > github: https://github.com/tailwindlabs/tailwindcss-intellisense
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function(capabilities)
	vim.lsp.config('tailwindcss', {
		capabilities = capabilities,
		filetypes = {
			"javascript",
			"javascriptreact",
			"typescript",
			"typescriptreact",
			"vue",
			"svelte",
		},
	})
end


================================================
FILE: .config/nvim/lua/servers/ts_ls.lua
================================================
-- ================================================================================================
-- TITLE : ts_ls (TypeScript Language Server) LSP Setup
-- LINKS :
--   > github: https://github.com/typescript-language-server/typescript-language-server
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function( capabilities)
	vim.lsp.config('ts_ls', {
		capabilities = capabilities,
		filetypes = {
			"typescript",
			"javascript",
			"typescriptreact",
			"javascriptreact",
		},
		settings = {
			typescript = {
				indentStyle = "space",
				indentSize = 2,
			},
		},
	})
end


================================================
FILE: .config/nvim/lua/servers/yamlls.lua
================================================
-- ================================================================================================
-- TvITLE : yamlls (YAML Language Server) LSP Setup
-- LINKS :
--   > github: https://github.com/redhat-developer/yaml-language-server
-- ================================================================================================

--- @param capabilities table LSP client capabilities (typically from nvim-cmp or similar)
--- @return nil
return function(capabilities)
	vim.lsp.config('yamlls', {
		capabilities = capabilities,
		settings = {
			yaml = {
				schemas = {
					["https://json.schemastore.org/composer.json"] = "composer.json",
					["https://json.schemastore.org/docker-compose.json"] = "docker-compose*.yml",
				},
				validate = true,
				format = {
					enable = true,
				},
			},
		},
		filetypes = { "yaml" },
	})
end


================================================
FILE: .config/nvim/lua/utils/diagnostics.lua
================================================
local M = {}

local diagnostic_signs = {
	Error = " ",
	Warn = " ",
	Hint = "",
	Info = "",
}

M.setup = function()
	vim.diagnostic.config({
		signs = {
			text = {
				[vim.diagnostic.severity.ERROR] = diagnostic_signs.Error,
				[vim.diagnostic.severity.WARN] = diagnostic_signs.Warn,
				[vim.diagnostic.severity.INFO] = diagnostic_signs.Info,
				[vim.diagnostic.severity.HINT] = diagnostic_signs.Hint,
			},
		},
	})
end

return M


================================================
FILE: .config/nvim/lua/utils/lsp.lua
================================================
local M = {}

M.on_attach = function(event)
  local client = vim.lsp.get_client_by_id(event.data.client_id)
  if not client then
    return
  end
  local bufnr = event.buf
  local keymap = vim.keymap.set
  local opts = {
    noremap = true, -- prevent recursive mapping
    silent = true, -- don't print the command to the cli
    buffer = bufnr, -- restrict the keymap to the local buffer number
  }

  -- native neovim keymaps
  keymap("n", "gd", "<cmd>Lspsaga peek_definition<CR>", opts) -- goto definition
  keymap("n", "gD", "<cmd>Lspsaga goto_definition<CR>", opts) -- goto definition
  keymap("n", "gS", "<cmd>vsplit | Lspsaga goto_definition<CR>", opts) -- goto definition in split
  keymap("n", "<leader>ca", "<cmd>Lspsaga code_action<CR>", opts) -- Code actions
  keymap("n", "<leader>rn", "<cmd>Lspsaga rename<CR>", opts) -- Rename symbol
  keymap("n", "<leader>D", "<cmd>Lspsaga show_line_diagnostics<CR>", opts) -- Line diagnostics (float)
  keymap("n", "<leader>d", "<cmd>Lspsaga show_cursor_diagnostics<CR>", opts) -- Cursor diagnostics
  keymap("n", "[d", "<cmd>Lspsaga diagnostic_jump_prev<CR>", opts) -- previous diagnostic
  keymap("n", "]d", "<cmd>Lspsaga diagnostic_jump_next<CR>", opts) -- next diagnostic
  keymap("n", "K", "<cmd>Lspsaga hover_doc<CR>", opts) -- hover documentation

  -- fzf-lua keymaps
  keymap("n", "<leader>fd", "<cmd>FzfLua lsp_finder<CR>", opts) -- LSP Finder (definition + references)
  keymap("n", "<leader>fr", "<cmd>FzfLua lsp_references<CR>", opts) -- Show all references to the symbol under the cursor
  keymap("n", "<leader>ft", "<cmd>FzfLua lsp_typedefs<CR>", opts) -- Jump to the type definition of the symbol under the cursor
  keymap("n", "<leader>fs", "<cmd>FzfLua lsp_document_symbols<CR>", opts) -- List all symbols (functions, classes, etc.) in the current file
  keymap("n", "<leader>fw", "<cmd>FzfLua lsp_workspace_symbols<CR>", opts) -- Search for any symbol across the entire project/workspace
  keymap("n", "<leader>fi", "<cmd>FzfLua lsp_implementations<CR>", opts) -- Go to implementation

  -- Order Imports (if supported by the client LSP)
  if client:supports_method("textDocument/codeAction", bufnr) then
    keymap("n", "<leader>oi", function()
      m.lsp.buf.code_action {
        context = {
          only = { "source.organizeImports" },
          diagnostics = {},
        },
        apply = true,
        bufnr = bufnr,
      }
      -- format after changing import order
      vim.defer_fn(function()
        vim.lsp.buf.format { bufnr = bufnr }
      end, 50) -- slight delay to allow for the import order to go first
    end, opts)
  end
end

return M


================================================
FILE: .config/nvim/stylua.toml
================================================
indent_type = "Spaces"
indent_width = 2
no_call_parentheses = true


================================================
FILE: .config/rmpc/config.ron
================================================
#![enable(implicit_some)]
#![enable(unwrap_newtypes)]
#![enable(unwrap_variant_newtypes)]
(
    address: "127.0.0.1:6600",
    cache_dir: Some("/tmp/rmpc/cache"),
    lyrics_dir: "~/Music/lyrics",
    on_song_change: ["~/.config/rmpc/fetch-lyrics"],
    theme: "theme",
    password: None,
    enable_config_hot_reload: true,
    volume_step: 5,
    max_fps: 30,
    scrolloff: 0,
    wrap_navigation: false,
    enable_mouse: true,
    status_update_interval_ms: 1000,
    select_current_song_on_change: false,
    album_art: (
        method: Auto,
        max_size_px: (width: 500, height: 500),
        disabled_protocols: ["http://", "https://"],
        vertical_align: Top,
        horizontal_align: Center,
    ),
    keybinds: (
        global: {
            ":":       CommandMode,
            ",":       VolumeDown,
            "s":       Stop,
            ".":       VolumeUp,
            "<Tab>":   NextTab,
            "<S-Tab>": PreviousTab,
            "1":       SwitchToTab("Playing"),
            "2":       SwitchToTab("Artists"),
            "3":       SwitchToTab("Albums"),
            "4":       SwitchToTab("Find"),
            "9":       SwitchToTab("Lists"),
            "0":       SwitchToTab("Dir"),
            "q":       Quit,
            ">":       NextTrack,
            "p":       TogglePause,
            "<":       PreviousTrack,
            "f":       SeekForward,
            "z":       ToggleRepeat,
            "x":       ToggleRandom,
            "c":       ToggleConsume,
            "v":       ToggleSingle,
            "b":       SeekBack,
            "~":       ShowHelp,
            "I":       ShowCurrentSongInfo,
            "O":       ShowOutputs,
            "P":       ShowDecoders,
        },
        navigation: {
            "k":         Up,
            "j":         Down,
            "h":         Left,
            "l":         Right,
            "<Up>":      Up,
            "<Down>":    Down,
            "<Left>":    Left,
            "<Right>":   Right,
            "<C-k>":     PaneUp,
            "<C-j>":     PaneDown,
            "<C-h>":     PaneLeft,
            "<C-l>":     PaneRight,
            "<C-u>":     UpHalf,
            "N":         PreviousResult,
            "a":         Add,
            "A":         AddAll,
            "r":         Rename,
            "n":         NextResult,
            "g":         Top,
            "<Space>":   Select,
            "<C-Space>": InvertSelection,
            "G":         Bottom,
            "<CR>":      Confirm,
            "i":         FocusInput,
            "J":         MoveDown,
            "<C-d>":     DownHalf,
            "/":         EnterSearch,
            "<C-c>":     Close,
            "<Esc>":     Close,
            "K":         MoveUp,
            "D":         Delete,
        },
        queue: {
            "D":       DeleteAll,
            "<CR>":    Play,
            "<C-s>":   Save,
            "a":       AddToPlaylist,
            "d":       Delete,
            "i":       ShowInfo,
            "C":       JumpToCurrent,
        },
    ),
    search: (
        case_sensitive: false,
        mode: Contains,
        tags: [
            (value: "any",         label: "Any Tag"),
            (value: "artist",      label: "Artist"),
            (value: "album",       label: "Album"),
            (value: "title",       label: "Title"),
            (value: "filename",    label: "Filename"),
            (value: "genre",       label: "Genre"),
        ],
    ),
    artists: (
        album_display_mode: SplitByDate,
        album_sort_by: Date,
    ),
    tabs: [
        (
            name: "Playing",
            pane: Split(
                direction: Horizontal,
                panes: [
                    (
                        size: "25%",
                        pane: Split(
                            direction: Vertical,
                            panes: [
                                (size: "50%", pane: Pane(AlbumArt)),
                                (size: "50%", borders: "TOP", pane: Pane(Lyrics)),
                            ],
                        ),
                    ),
                    (
                        size: "75%",
                        borders: "LEFT",
                        pane: Pane(Queue),
                    ),
                ],
            ),
        ),
        (
         name: "Artists",
         pane: Pane(Artists),
        ),
        (
         name: "Albums",
         pane: Pane(Albums),
        ),
        (
         name: "Find",
         pane: Pane(Search),
        ),
         (
          name: "Lists",
          pane: Pane(Playlists),
         ),
        (
         name: "Dir",
         pane: Pane(Directories),
        ),
    ],
)



================================================
FILE: .config/rmpc/fetch-lyrics
================================================
#!/bin/sh

# ═══════════════════════════════════════════════════════════
# rmpc on_song_change script
# - Sends desktop notification with album art
# - Auto-fetches lyrics from LRCLIB
# ═══════════════════════════════════════════════════════════

TMP_DIR="/tmp/rmpc"
ALBUM_ART_PATH="$TMP_DIR/notification_cover.jpg"
LRCLIB_INSTANCE="https://lrclib.net"

mkdir -p "$TMP_DIR"

# ───────────────────────────────────────────────────────────
# Desktop Notification
# ───────────────────────────────────────────────────────────

# Get album art for notification
if rmpc albumart --output "$ALBUM_ART_PATH" 2>/dev/null; then
    ICON="$ALBUM_ART_PATH"
else
    ICON="audio-x-generic"
fi

# Send notification
notify-send -i "$ICON" "Now Playing" "$ARTIST - $TITLE"

# ───────────────────────────────────────────────────────────
# Auto-fetch Lyrics
# ───────────────────────────────────────────────────────────

if [ "$HAS_LRC" = "false" ]; then
    mkdir -p "$(dirname "$LRC_FILE")"

    LYRICS="$(curl -X GET -sG \
        -H "Lrclib-Client: rmpc-$VERSION" \
        --data-urlencode "artist_name=$ARTIST" \
        --data-urlencode "track_name=$TITLE" \
        --data-urlencode "album_name=$ALBUM" \
        "$LRCLIB_INSTANCE/api/get" | jq -r '.syncedLyrics')"

    if [ -z "$LYRICS" ]; then
        rmpc remote --pid "$PID" status "No lyrics found for $ARTIST - $TITLE" --level warn
        exit
    fi

    if [ "$LYRICS" = "null" ]; then
        rmpc remote --pid "$PID" status "Lyrics not available for $ARTIST - $TITLE" --level warn
        exit
    fi

    # Write lyrics file with metadata
    echo "[ar:$ARTIST]" > "$LRC_FILE"
    echo "[al:$ALBUM]" >> "$LRC_FILE"
    echo "[ti:$TITLE]" >> "$LRC_FILE"
    echo "$LYRICS" | sed -E '/^\[(ar|al|ti):/d' >> "$LRC_FILE"

    # Index and notify
    rmpc remote --pid "$PID" indexlrc --path "$LRC_FILE"
    rmpc remote --pid "$PID" status "Downloaded lyrics for $TITLE" --level info
fi


================================================
FILE: .config/rmpc/themes/theme.ron
================================================
#![enable(implicit_some)]
#![enable(unwrap_newtypes)]
#![enable(unwrap_variant_newtypes)]
(
    default_album_art_path: None,
    show_song_table_header: false,
    draw_borders: true,
    browser_column_widths: [20, 38, 42],
    text_color: "#c1c1c1",
    tab_bar: (
        enabled: true,
        active_style: (fg: "#c1c1c1", bg: "#000000", modifiers: "Bold"),
        inactive_style: (fg: "#333333", modifiers: ""),
    ),
    highlighted_item_style: (fg: "#b3c7cc", modifiers: "Bold"),
    current_item_style: (fg: "#000000", bg: "#b3c7cc", modifiers: "Bold"),
    borders_style: (fg: "#333333", modifiers: ""),
    highlight_border_style: (fg: "#b3c7cc"),
    symbols: (song: "󰝚 ", dir: " ", marker: "* ", ellipsis: "..."),
    progress_bar: (
        symbols: ["█", "█", "█"],
        track_style: (fg: "#333333"),
        elapsed_style: (fg: "#b3c7cc"),
        thumb_style: (fg: "#b3c7cc"),
    ),
    scrollbar: (
        symbols: ["", "", "", ""],
        track_style: (fg: "#333333"),
        ends_style: (fg: "#333333"),
        thumb_style: (fg: "#b3c7cc"),
    ),
    song_table_format: [
        (
            prop: (kind: Property(Title), style: (fg: "#c1c1c1"),
                highlighted_item_style: (fg: "#000000", modifiers: "Bold"),
                default: (kind: Property(Filename), style: (fg: "#333333"),)
            ),
            width: "70%",
        ),
        (
            prop: (kind: Property(Album), style: (fg: "#333333"),
                default: (kind: Text("Unknown Album"), style: (fg: "#333333"))
            ),
            width: "30%",
        ),
    ],
    layout: Split(
        direction: Vertical,
        panes: [
            (
                size: "3",
                pane: Pane(Tabs),
            ),
            (
                size: "4",
                pane: Split(
                    direction: Horizontal,
                    panes: [
                        (
                            size: "100%",
                            pane: Split(
                                direction: Vertical,
                                panes: [
                                    (
                                        size: "4",
                                        borders: "ALL",
                                        pane: Pane(Header),
                                    ),
                                ]
                            )
                        ),
                    ]
                ),
            ),
            (
                size: "100%",
                pane: Split(
                    direction: Horizontal,
                    panes: [
                        (
                            size: "100%",
                            borders: "NONE",
                            pane: Pane(TabContent),
                        ),
                    ]
                ),
            ),
            (
                size: "3",
                borders: "TOP | BOTTOM",
                pane: Pane(ProgressBar),
            ),
        ],
    ),
    header: (
        rows: [
            (
                left: [
                    (kind: Property(Status(StateV2(playing_label: " ", paused_label: "❚❚", stopped_label: "❚❚"))), style: (fg: "#b3c7cc", modifiers: "Bold")),
                ],
                center: [
                    (kind: Property(Song(Title)), style: (fg: "#c1c1c1", modifiers: "Bold"),
                        default: (kind: Property(Song(Filename)), style: (fg: "#c1c1c1", modifiers: "Bold"))
                    )
                ],
                right: [
                    (kind: Text("Vol: "), style: (fg: "#b3c7cc", modifiers: "Bold")),
                    (kind: Property(Status(Volume)), style: (fg: "#b3c7cc", modifiers: "Bold")),
                    (kind: Text("% "), style: (fg: "#b3c7cc", modifiers: "Bold"))
                ]
            ),
            (
left: [
                    (kind: Property(Status(Elapsed)), style: (fg: "#c1c1c1")),
                    (kind: Text("/"), style: (fg: "#333333")),
                    (kind: Property(Status(Duration)), style: (fg: "#c1c1c1")),
                ],
                center: [
                    (kind: Property(Song(Artist)), style: (fg: "#5f8787", modifiers: "Bold"),
                        default: (kind: Text("Unknown Artist"), style: (fg: "#333333", modifiers: ""))
                    ),
                ],
                right: [
                    (
                        kind: Property(Widget(States(
                            active_style: (fg: "#b3c7cc", modifiers: "Bold"),
                            separator_style: (fg: "#333333")))
                        ),
                        style: (fg: "#333333")
                    ),
                ]
            ),
        ],
    ),
    browser_song_format: [
        (
            kind: Group([
                (kind: Property(Track)),
                (kind: Text(" ")),
            ])
        ),
        (
            kind: Group([
                (kind: Property(Artist)),
                (kind: Text(" - ")),
                (kind: Property(Title)),
            ]),
            default: (kind: Property(Filename))
        ),
    ],
)


================================================
FILE: .config/starship.toml
================================================
# Symphony by vyrx
# Theme: Espresso Harmony

"$schema" = 'https://starship.rs/config-schema.json'

add_newline = true
command_timeout = 200
format = """$hostname$directory$git_branch$git_status$character"""
palette = "colors"

[palettes.colors]
# black-metal-theme
primary = '#b3c7cc'       # directory, prompt
secondary = '#9b8d7f'     # git branch
error = '#653738'         # errors, git status (muted red)

# espresso-theme
# primary = '#e8b89a'       # directory, prompt 
# secondary = '#C97A65'     # git branch
# error = '#D4776B'         # errors, git status

[hostname]
ssh_only = true
style = "fg:primary"
format = "[@$hostname]($style) "

[directory]
style = "fg:primary bold"
read_only = " 󰌾"
read_only_style = "fg:error"
truncation_length = 3
truncation_symbol = "…/"
format = "[$path]($style)[$read_only]($read_only_style) "

[character]
success_symbol = '[❯](fg:primary bold)'
error_symbol = '[❯](fg:error bold)'

[git_branch]
style = "fg:secondary"
format = '[$branch]($style) '

[git_status]
ahead = '⇡${count}'
behind = '⇣${count}'
diverged = '⇕⇡${ahead_count}⇣${behind_count}'
format = '[$all_status$ahead_behind](fg:error) '

[line_break]
disabled = true


================================================
FILE: .config/sway/config
================================================
# Sway Configuration
# man 5 sway


# ╭───────────────────────────────────────────────────────────────────────╮
# │ STARTUP                                                               │
# ╰───────────────────────────────────────────────────────────────────────╯
exec kanshi
exec_always kanshictl reload
exec waybar
exec mako
exec kdeconnect-indicator
exec wl-clip-persist --clipboard regular
exec wl-paste --watch cliphist store
exec ~/Scripts/battery-monitor
# exec ~/Scripts/set-wallpaper random

# ╭───────────────────────────────────────────────────────────────────────╮
# │ VARIABLES                                                             │
# ╰───────────────────────────────────────────────────────────────────────╯
set $mod Mod4
set $left h
set $down j
set $up k
set $right l
set $term ghostty
set $menu fuzzel


# ╭───────────────────────────────────────────────────────────────────────╮
# │ OUTPUT                                                                │
# ╰───────────────────────────────────────────────────────────────────────╯
# Run: swaymsg -t get_outputs
output * bg /home/vyrx/Pictures/Wallpapers/others/a_forest_of_trees_with_fog.jpg fill
# output * bg /home/vyrx/Pictures/Wallpapers/others/a_sculpture_of_a_man_with_a_face_on_his_head.png fill

# ╭───────────────────────────────────────────────────────────────────────╮
# │ INPUT & IDLE                                                          │
# ╰───────────────────────────────────────────────────────────────────────╯
input type:touchpad {
    dwt enabled
    tap enabled
    natural_scroll enabled
    middle_emulation enabled
}

input * {
    repeat_delay 200
    repeat_rate 60
}

# Lock after 300s (5min), turn off monitors after 600s (10min), lock before sleep
# exec swayidle -w \
#     timeout 300 'swaylock -f' \
#     timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \
#     before-sleep 'swaylock -f'


# Basic touchpad settings
input type:touchpad {
    tap enabled
    natural_scroll enabled
    dwt enabled              # Disable while typing
    scroll_method two_finger
    middle_emulation enabled
    click_method clickfinger
}

# ╭───────────────────────────────────────────────────────────────────────╮
# │ APPEARANCE & BEHAVIOR                                                 │
# ╰───────────────────────────────────────────────────────────────────────╯
# Border colors: black-metal theme
client.focused #718096 #404552 #f7fafc #718096 #718096

gaps inner 5
smart_gaps on
default_border pixel 2
default_floating_border pixel 2

# font pango:monospace 0.1
font pango:DejaVu Sans Mono 9
titlebar_border_thickness 0
titlebar_padding 3
hide_edge_borders --i3 smart

workspace_auto_back_and_forth yes
focus_on_window_activation focus
floating_modifier $mod normal
focus_on_window_activation urgent
focus_wrapping no
mouse_warping output

seat * hide_cursor 8000
seat * hide_cursor when-typing enable

# ╭───────────────────────────────────────────────────────────────────────╮
# │ WINDOW RULES                                                          │
# ╰───────────────────────────────────────────────────────────────────────╯
# ─── Workspace Assignments ───
assign [app_id="vesktop"] workspace number 10
assign [class="Vesktop"] workspace number 10
assign [app_id="obsidian"] workspace number 8
assign [app_id="spotify"] workspace number 9
assign [app_id="code"] workspace number 2
assign [app_id="org.telegram.desktop"] workspace number 7
assign [app_id="brave-todoist.com__-Default"] workspace number 6
assign [app_id="brave-web.whatsapp.com__-Default"] workspace number 5
assign [app_id="mpv"] workspace number 4

# ─── Focus on Open ───
for_window [app_id="vesktop"] focus
for_window [class="Vesktop"] focus
for_window [app_id="obsidian"] focus
for_window [app_id="spotify"] focus
for_window [app_id="code"] focus
for_window [app_id="org.telegram.desktop"] focus
for_window [app_id="brave-todoist.com__-Default"] focus
for_window [app_id="brave-web.whatsapp.com__-Default"] focus
for_window [app_id="mpv"] focus

# ─── Floating Windows ───
for_window [app_id="mpv"] floating enable, resize set width 960 height 540, move position center
for_window [app_id="thunar"] floating enable, resize set width 1000 height 600, move position center
for_window [class="feh"] floating enable, resize set width 960 height 540, move position center
for_window [app_id="com.github.wwmm.easyeffects"] floating enable, resize set 1000 600, move position center
for_window [app_id="com.vyrx.kanshi-switch"] floating enable, resize set width 400 height 220, move position center

# ╭───────────────────────────────────────────────────────────────────────╮
# │ KEYBINDINGS                                                           │
# ╰───────────────────────────────────────────────────────────────────────╯
# ─── Core Applications ───
bindsym $mod+Return exec $term
bindsym $mod+Space exec $menu
bindsym $mod+b exec brave
bindsym $mod+e exec thunar
bindsym $mod+c exec code
bindsym $mod+o exec obsidian
bindsym $mod+Shift+G exec geary
bindsym $mod+q kill

# ─── Communication & Media ───
bindsym $mod+d exec vesktop
bindsym $mod+m exec spotify-launcher

# ─── Terminal Applications ───
bindsym Alt+slash exec ghostty -e btop
bindsym Alt+N exec ghostty -e nvim
bindsym Alt+M exec ghostty -e rmpc
bindsym Alt+Q exec ghostty -e yazi
bindsym Alt+I exec ghostty --class=com.vyrx.kanshi-switch -e ~/Scripts/kanshi-switch
# bindsym $mod+Shift+Return exec ghostty -e tmux a 
bindsym $mod+Shift+BackSpace exec ~/Scripts/run-scrcpy mirror

bindsym --locked XF86PowerOff exec systemctl suspend | swaylock


# ─── Web Applications ───
bindsym $mod+a exec ~/Scripts/launch-webapp https://chatgpt.com
bindsym $mod+Alt+a exec ~/Scripts/launch-webapp https://chat.z.ai
# bindsym $mod+Alt+a exec ~/Scripts/launch-webapp https://www.kimi.com/en
# bindsym $mod+Alt+a exec ~/Scripts/launch-webapp https://perplexity.ai
bindsym $mod+Shift+a exec ~/Scripts/launch-webapp https://gemini.google.com
bindsym $mod+T exec ~/Scripts/launch-webapp https://app.todoist.com/app
bindsym $mod+Y exec ~/Scripts/launch-webapp https://youtube.com
bindsym $mod+G exec ~/Scripts/launch-webapp https://github.com
# bindsym $mod+Shift+G exec ~/Scripts/launch-webapp https://mail.google.com
bindsym Alt+G exec ghostty --title='gh-dash' -e gh dash
bindsym $mod+X exec ~/Scripts/launch-webapp https://X.com
bindsym $mod+Shift+W exec ~/Scripts/launch-webapp https://web.whatsapp.com
bindsym $mod+Backslash exec ~/Scripts/launch-webapp https://devhints.io
bindsym Alt+Space exec ~/Scripts/launch-webapp https://vyrx.dev

# ─── Utilities ───
bindsym $mod+Alt+m exec ~/Scripts/dual-dac
bindsym Alt+comma exec cliphist list | fuzzel --dmenu | cliphist decode | wl-copy
bindsym Alt+period exec ~/Scripts/fuzzel-emoji
bindsym Alt+P exec hyprpicker -a
bindsym $mod+BackSpace exec ~/Scripts/toggle-terminal-transparency
bindsym $mod+Shift+Space exec ~/Scripts/toggle-waybar
bindsym $mod+Shift+M exec ~/Scripts/beats
bindsym $mod+XF86AudioMute exec ~/Scripts/audio-switch
bindsym $mod+Shift+n exec makoctl dismiss -a
bindsym $mod+n exec makoctl restore
bindsym $mod+Alt+n exec ~/Scripts/toggle-wlsunset
bindsym $mod+R exec ~/Scripts/screenrecord --with-desktop-audio 
bindsym $mod+Shift+R exec ~/Scripts/screenrecord --with-microphone-audio 
bindsym $mod+P exec ~/Scripts/screenshot
bindsym $mod+Shift+P exec ~/Scripts/screenshot fullscreen
bindsym Print exec grim

# Launch Pixel_9
bindsym $mod+Alt+p exec ~/Android/Sdk/emulator/emulator -avd Pixel_9 &

# ─── Wallpaper ───
bindsym Ctrl+Alt+Space exec ~/Scripts/set-wallpaper random
bindsym $mod+Ctrl+Shift+Space exec ~/Scripts/set-wallpaper choose

# ─── Session & Power ───
bindsym $mod+Alt+l exec swaylock
bindsym $mod+escape exec ~/Scripts/powermenu
bindsym $mod+Shift+c reload
bindsym $mod+Shift+e exec swaynag -t warning -m 'Exit sway?' -B 'Yes' 'swaymsg exit'

# ─── Monitor Toggle ───
bindsym Ctrl+Shift+1 exec ~/Scripts/toggle-output eDP-1
bindsym Ctrl+Shift+2 exec ~/Scripts/toggle-output HDMI-A-1

# ─── Hardware Keys ───
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

# Laptop brightness (brightnessctl)
bindsym --locked XF86MonBrightnessDown exec brightnessctl set 10%-
bindsym --locked XF86MonBrightnessUp exec brightnessctl set 10%+
bindsym $mod+Alt+XF86AudioRaiseVolume exec brightnessctl --class=backlight set +10%
bindsym $mod+Alt+XF86AudioLowerVolume exec brightnessctl --class=backlight set 10%-

# External monitor brightness (DDC/CI)
bindsym $mod+XF86AudioRaiseVolume exec ddcutil setvcp 10 + 10
bindsym $mod+XF86AudioLowerVolume exec ddcutil setvcp 10 - 10

# Media controls
bindsym $mod+F10 exec playerctl previous
bindsym $mod+F11 exec playerctl play-pause
bindsym $mod+F12 exec playerctl next

# ─── Window Focus (Vim-style) ───
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

# ─── Window Movement ───
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

# ─── Workspace Navigation ───
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 Alt+K workspace next
bindsym Alt+J workspace prev

# ─── Move 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

# ─── Layout ───
bindsym $mod+w layout tabbed
bindsym $mod+V layout toggle split
bindsym $mod+f fullscreen
bindsym $mod+Shift+V floating toggle

# ─── Scratchpad ───
bindsym $mod+Shift+minus move scratchpad
bindsym $mod+minus scratchpad show

# ─── Resize Mode ───
bindsym $mod+Alt+r mode "resize"
mode "resize" {
    bindsym $left resize shrink width 10px
    bindsym $down resize grow height 10px
    bindsym $up resize shrink height 10px
    bindsym $right resize grow width 10p
    bindsym Left resize shrink width 10px
    bindsym Down resize grow height 10px
    bindsym Up resize shrink height 10px
    bindsym Right resize grow width 10px
    bindsym Return mode "default"
    bindsym Escape mode "default"
}

# ╭───────────────────────────────────────────────────────────────────────╮
# │ INCLUDES                                                              │
# ╰───────────────────────────────────────────────────────────────────────╯
include /etc/sway/config.d/*


================================================
FILE: .config/swayidle/config
================================================
# swayidle configuration file
# Idle timeout events for Sway

# Lock screen after 5 minutes (300 seconds) of inactivity
timeout 300 'swaylock -f'

# Screen off after 5.5 minutes (330 seconds) of inactivity
timeout 330 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"'

# Lock session before sleep
before-sleep 'swaylock -f'


================================================
FILE: .config/swaylock/config
================================================
# --- Appearance & Blur ---
# image=~/Wallpapers/monochrome/mac__.jpg
screenshots
clock
indicator
indicator-radius=100
indicator-thickness=10

# Performance Trick: Downscale before blurring for instant locking
effect-scale=0.5
effect-blur=7x5
effect-scale=2
effect-vignette=0.5:0.5

# --- Midnight Obsidian Colors ---
ring-color=3e4451
key-hl-color=5c6370
inside-color=0f0f17cc
text-color=abb2bf
line-color=00000000
separator-color=00000000

# --- Feedback Colors ---
ring-ver-color=5c6370
inside-ver-color=0f0f17cc
ring-wrong-color=e06c75
text-wrong-color=e06c75

# --- Behavior ---
ignore-empty-password
show-failed-attempts
font="Inter"
datestr=%a, %B %e
timestr=%I:%M %p


================================================
FILE: .config/waybar/config.jsonc
================================================
{
  "reload_style_on_change": true,
  "layer": "top",
  "position": "bottom",
  "spacing": 0,
  "height": 28,
  "modules-left": [
    "sway/workspaces",
    "niri/workspaces"
  ],
  "modules-center": [
    "mpris"
  ],
  "modules-right": [
    "group/tray-drawer",
    "custom/screenrecording-indicator",
    "cpu",
    "memory",
    "disk",
    "network",
    "pulseaudio",
    "battery",
    "clock"
  ],
  "group/tray-drawer": {
    "orientation": "horizontal",
    "drawer": {
      "transition-duration": 200
    },
    "modules": [
      "custom/expand",
      "tray"
    ]
  },
  "custom/expand": {
    "format": "❮",
    "tooltip": false
  },
  "custom/screenrecording-indicator": {
    "on-click": "~/Scripts/screenrecord",
    "exec": "~/Scripts/indicator-record",
    "signal": 8,
    "return-type": "json"
  },
  "niri/workspaces": {
    "on-scroll-up": "niri msg action focus-window-or-workspace-up",
    "on-scroll-down": "niri msg action focus-column-right-or-first"
  },
  "sway/workspaces": {
    "disable-scroll": false,
    "all-outputs": false,
    "format": "{name}",
    "on-click": "activate"
  },
  "cpu": {
    "interval": 2,
    "format": "cpu {usage}%",
    "on-click": "ghostty -e btop"
  },
  "memory": {
    "format": "mem {used:0.1f}gb",
    "interval": 2,
    "on-click": "ghostty -e btop"
  },
  "disk": {
    "interval": 30,
    "format": "disk {percentage_free}%",
    "tooltip-format": "Used: {used}\nFree: {free}\nTotal: {total}",
    "path": "/",
    "on-click": "ghostty -e duf"
  },
  "clock": {
    "format": "{:%H:%M}",
    "format-alt": "{:L%A %d %B}",
    "tooltip": false
  },
  "network": {
    "interface": "wlan*",
    "format-wifi": "wifi {essid}",
    "format-ethernet": "eth {ifname}",
    "format-disconnected": "wifi --",
    "tooltip-format-wifi": "{essid} ({frequency} GHz)\n⇣{bandwidthDownBytes}  ⇡{bandwidthUpBytes}",
    "tooltip-format-ethernet": "⇣{bandwidthDownBytes}  ⇡{bandwidthUpBytes}",
    "tooltip-format-disconnected": "Disconnected",
    "interval": 3,
    "on-click": "nmgui"
  },
  "battery": {
    "format": "bat {capacity}%",
    "format-discharging": "bat {capacity}%",
    "format-charging": "bat {capacity}%",
    "format-plugged": "bat {capacity}%",
    "tooltip-format-discharging": "{power:>1.0f}W↓ {capacity}%",
    "tooltip-format-charging": "{power:>1.0f}W↑ {capacity}%",
    "interval": 5,
    "states": {
      "warning": 20,
      "critical": 10
    }
  },
  "pulseaudio": {
    "format": "vol {volume}%",
    "on-click": "pavucontrol",
    "on-click-right": "pamixer -t",
    "tooltip-format": "vol {volume}%",
    "scroll-step": 5,
    "format-muted": "vol muted"
  },
  "tray": {
    "icon-size": 12,
    "spacing": 4
  },
  "mpris": {
    "format": "{artist} • {title}",
    "format-paused": "{artist} • {title}",
    "format-stopped": "",
    "max-length": 55
  }
}


================================================
FILE: .config/waybar/style.css
================================================
/* colors */
@define-color waybar-bg #121212;
@define-color waybar-fg #d0d0d0;

@define-color waybar-warning #7a8b6e;
@define-color waybar-danger #6b3a3a;

@define-color waybar-surface #1e1e1e;
@define-color waybar-surface-hover #2a2a2a;
@define-color waybar-border #3a3a3a;
@define-color waybar-workspace-active-bg #333333;
@define-color waybar-workspace-occupied-fg #a0a0a0;
@define-color waybar-workspace-empty-fg #505050;

* {
  background-color: transparent;
  color: @waybar-fg;
  border: none;
  border-radius: 0;
  font-family: "Inter";
  font-size: 11px;
}

tooltip {
  background: @waybar-bg;
  border-radius: 4px;
  padding: 6px 10px;
}

menu {
  background: @waybar-surface;
  border: 1px solid @waybar-border;
  padding: 4px;
}

menu menuitem:hover {
  background: @waybar-surface-hover;
}

window#waybar {
  background: @waybar-bg;
}

.modules-center {
  padding: 0 80px;
}

#workspaces button {
  padding: 0 2px;
  margin: 0 1px;
  min-width: 12px;
  min-height: 12px;
  background-color: transparent;
  color: @waybar-workspace-empty-fg;
  font-weight: 400;
  transition: all 100ms ease;
  border-radius: 0;
  border: none;
}

#workspaces button.focused {
  background-color: @waybar-workspace-active-bg;
  font-weight: 500;
}

#workspaces button.persistent,
#workspaces button.empty {
  color: @waybar-workspace-empty-fg;
  opacity: 0.5;
}

#workspaces button.visible {
  color: @waybar-workspace-occupied-fg;
}

#mpris.paused {
  opacity: 0.4;
}

#memory,
#cpu,
#disk,
#battery,
#network,
#pulseaudio,
#backlight,
#tray,
#custom-screenrecording-indicator,
#custom-expand,
#mpris,
#clock,
#custom-idle-indicator,
#custom-dnd-indicator {
  padding: 0 6px;
  font-weight: 600;
  opacity: 1;
  transition: opacity 150ms ease;
}

#clock {
  font-weight: 700;
}

#custom-expand {
  font-size: 10px;
}

#custom-screenrecording-indicator {
  min-width: 12px;
  font-size: 12px;
}

#custom-screenrecording-indicator.active {
  color: @waybar-danger;
}

#bluetooth,
#battery.warning {
  color: @waybar-warning;
}

#battery.critical {
  color: @waybar-danger;
  animation: blink 1s infinite;
}

#cpu,
#memory,
#network,
#pulseaudio,
#battery,
#clock {
  margin: 0 1px;
}

@keyframes blink {
  50% {
    opacity: 0.5;
  }
}


================================================
FILE: .config/yazi/theme.toml
================================================
# Symphony by vyrx
# Theme: Black Metal
# https://github.com/vyrx-dev

# : Manager [[[

[mgr]
cwd = { fg = "#c1c1c1" }

# Find
find_keyword = { fg = "#5f8787", bold = true, italic = true, underline = true }
find_position = { fg = "#5f8787", bold = true, italic = true }

# Marker
marker_copied = { fg = "#9b8d7f", bg = "#9b8d7f" }
marker_cut = { fg = "#653738", bg = "#653738" }
marker_marked = { fg = "#5f8787", bg = "#5f8787" }
marker_selected = { fg = "#b3c7cc", bg = "#b3c7cc" }

# Count
count_copied = { fg = "#000000", bg = "#9b8d7f" }
count_cut = { fg = "#000000", bg = "#653738" }
count_selected = { fg = "#000000", bg = "#b3c7cc" }

# Border
border_symbol = " "
border_style  = { fg = "#b3c7cc" }

# : ]]]


# : Status [[[

[status]
sep_left = { open = "", close = "🭠" }
sep_right = { open = "🭁", close = "" }

# Permissions
perm_type = { fg = "#b3c7cc" }
perm_read = { fg = "#9b8d7f" }
perm_write = { fg = "#5f8787" }
perm_exec = { fg = "#653738" }
perm_sep = { fg = "#999999" }

# Progress
progress_label = { bold = true }
progress_normal = { fg = "#b3c7cc", bg = "#333333" }
progress_error = { fg = "#653738", bg = "#333333" }

[mode]
# Mode
normal_main = { bg = "#b3c7cc", fg = "#000000", bold = true }
normal_alt  = { bg = "#333333", fg = "#c1c1c1" }

# Select mode
select_main = { bg = "#999999", fg = "#000000", bold = true }
select_alt  = { bg = "#333333", fg = "#c1c1c1" }

# Unset mode
unset_main = { bg = "#9b8d7f", fg = "#000000", bold = true }
unset_alt  = { bg = "#333333", fg = "#c1c1c1" }

# : ]]]


# : Select [[[

[select]
border = { fg = "#b3c7cc" }
active = { fg = "#9b8d7f", bold = true }

# : ]]]


# : Input [[[

[input]
border = { fg = "#b3c7cc" }
value = { fg = "#c1c1c1" }

# : ]]]

# : Tabs [[[

[tabs]
active = { fg = "#b3c7cc", bold = true, bg = "#000000" }
inactive = { fg = "#999999", bg = "#000000" }
sep_inner = { open = "[", close = "]" }

# : ]]]


# : Completion [[[

[cmp]
border = { fg = "#b3c7cc", bg = "#333333" }

# : ]]]


# : Tasks [[[

[tasks]
border = { fg = "#b3c7cc" }
title = {}
hovered = { fg = "#999999", underline = true }

# : ]]]


# : Which [[[

[which]
cols = 3
mask = { bg = "#333333" }
cand = { fg = "#b3c7cc" }
rest = { fg = "#999999" }
desc = { fg = "#c1c1c1" }
separator = " ▶ "
separator_style = { fg = "#c1c1c1" }

# : ]]]


# : Help [[[

[help]
on = { fg = "#c1c1c1" }
run = { fg = "#c1c1c1" }
footer = { fg = "#000000", bg = "#999999" }

# : ]]]


# : Notify [[[

[notify]
title_info = { fg = "#b3c7cc" }
title_warn = { fg = "#5f8787" }
title_error = { fg = "#653738" }

# : ]]]


# : File-specific styles [[[

[filetype]

rules = [
    # Images
    { mime = "image/*", fg = "#b3c7cc" },

    # Media
    { mime = "{audio,video}/*", fg = "#5f8787" },

    # Archives
    { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", fg = "#999999" },

    # Documents
    { mime = "application/{pdf,doc,rtf}", fg = "#a7c7c7" },

    # Special files
    { url = "*", is = "orphan", bg = "#653738" },
    { url = "*", is = "exec", fg = "#c1c1c1" },

    # Fallback
    { url = "*", fg = "#c1c1c1" },
    { url = "*/", fg = "#b3c7cc" },
]

# : ]]]


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi:  vyrxx
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .gitignore
================================================
# Fish shell auto-generated files
.config/fish/fish_variables

# Neovim plugin lock (auto-generated)
.config/nvim/lazy-lock.json

# Binary files
Scripts/yt-dlp


================================================
FILE: .tmux.conf
================================================
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB"

####  PREFIX KEY ####
unbind C-b
set -g prefix C-s  #Suggestion: Remap CAPSLOCK to CTRL

####  RELOAD  tmux.conf  ####
unbind r
bind R source-file ~/.tmux.conf \; display "Reloaded!"


####  KEY BINDINGS  ####
setw -g mode-keys vi

set -g base-index 1          # start indexing windows at 1 instead of 0
set -g detach-on-destroy off # don't exit from tmux when closing a session
set -g escape-time 0         # zero-out escape time delay
set -g history-limit 1000000 # increase history size (from 2,000)
set -g mouse on              # enable mouse support
set -g focus-events on       # enable focus events
set -g renumber-windows on   # renumber all windows when any window is closed
set -g set-clipboard on      # use system clipboard
set -g status-interval 3     # update the status bar every 3 seconds
bind-key x kill-pane         # skip "kill-pane 1? (y/n)" prompt

#### Pane resizing ####
bind -r S-Left resize-pane -L 5
bind -r S-Down resize-pane -D 5
bind -r S-Up resize-pane -U 5
bind -r S-Right resize-pane -R 5
bind -r m resize-pane -Z

#### Navigation ####
bind-key -n C-h select-pane -L
bind-key -n C-j select-pane -D
bind-key -n C-k select-pane -U
bind-key -n C-l select-pane -R

##### Splits ####
unbind '"'
unbind %
bind v split-window -h -c "#{pane_current_path}"
bind S split-window -v -c "#{pane_current_path}"

# New windows in same directory
bind c new-window -c "#{pane_current_path}"

#### status bar ####
set-option -g status-position top
bind u set -g status

##### Display Popups #####
bind f display-popup -w 80% -h 80% -E 'rmpc'

bind -r g display-popup -d '#{pane_current_path}' -w80% -h80% -E lazygit

##### scripts #####
bind C-l display-popup -w 40% -h 20% -E "~/Scripts/clone"
bind C-k run-shell 'tmux neww ~/Scripts/sessionX'
bind C-c run-shell "~/Scripts/sessionX ~/dotfiles/.config/"
bind C-p run-shell '~/Scripts/sessionX ~/Projects/'
bind C-g run-shell "~/Scripts/open_github"
bind C-j run-shell "~/Scripts/ide"

##### Display Menu ##### 
bind l display-menu -T "#[align=centre]Dotfiles" -x C -y C \
  "sessionX"      x  "display-popup -E -w 80% -h 80% 'nvim ~/Scripts/sessionX'" \
  "aliases.fish"  f  "display-popup -E -w 80% -h 80% 'nvim ~/.config/fish/aliases.fish'" \
  "tmux.conf"     t  "display-popup -E -w 80% -h 80% 'nvim ~/.config/tmux/tmux.conf'" \
  "bindings.conf" b  "display-popup -E -w 80% -h 80% 'nvim ~/.config/hypr/bindings.conf'" \
  "keymaps.lua"   k  "display-popup -E -w 80% -h 80% 'nvim ~/.config/nvim/lua/config/keymaps.lua'" \
  "Exit"          q  ""

#### Plugins ####
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'christoomey/vim-tmux-navigator'

#### statusline ####
set -g mode-style "fg=black,bg=cyan"
set -g message-style "fg=#fafafa,bg=#18181b"
set -g message-command-style "fg=#fafafa,bg=#18181b"
set -g pane-border-style "fg=#27272a"
set -g pane-active-border-style "fg=cyan"
set -g status "on"
set -g status-interval 1
set -g status-justify "centre"
set -g status-style "fg=#fafafa,bg=#09090b"
set -g status-bg "#09090b"
set -g status-left-length "100"
set -g status-right-length "100"
set -g status-left-style NONE
set -g status-right-style NONE
set -g status-left "#[fg=#fafafa,bg=#09090b,bold]#S#[fg=#52525b]:#[fg=#71717a]#(tmux list-sessions | wc -l)  "
set -g status-right "#[fg=#52525b]%H:%M"
setw -g window-status-activity-style "underscore,fg=cyan,bg=#09090b"
setw -g window-status-separator "  "
setw -g window-status-style "NONE,fg=#52525b,bg=#09090b"
setw -g window-status-format '#[fg=#71717a]#I#[fg=#52525b]:#W'
setw -g window-status-current-format '#[fg=cyan,bold]#I#[fg=cyan,bold]:#W'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2026 Amit

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# dotfiles

This is a fairly boring setup focused on development work. Feel free to use whatever you would like from it, a mention would be nice if you find it useful.

Sway is my main compositor with animations and gaps disabled. Sometimes I switch to Niri for fun, it is a really good project.

## Setup

<img src="assets/setup-1.png" alt="Setup 1">

<img src="assets/nvim-tmux.png" alt="Neovim + Tmux">

## Usage

```
git clone https://github.com/vyrx-dev/dotfiles.git
cd dotfiles
stow .
```

## Highlights

- Neovim configured for Flutter/Dart, Go, Python, TypeScript with LSP, DAP debugging, Copilot + Codeium
- MPD + rmpc with auto-fetch lyrics from LRCLIB
- Kanshi for multi-monitor profiles
- Scripts for daily tasks like screen recording, screenshots, audio switching

## Other Stuff

- [symphony](https://github.com/vyrx-dev/symphony) - my other setup with more eye candy
- [wallpapers](https://github.com/vyrx-dev/Wallpapers) - my wallpaper collection


================================================
FILE: Scripts/add-audio
================================================
#!/bin/bash

echo "Usage: add-audio video.mp4 audio.flac name=\"output.mp4\""
echo "Supports: mp4, mkv, avi, mov, webm (video) | flac, mp3, wav, aac, ogg (audio)"
echo ""

# Parse arguments
video=""
audio=""
name=""

for arg in "$@"; do
	if [[ $arg == name=* ]]; then
		name="${arg#name=}"
		name="${name#\"}"
		name="${name%\"}"
	elif [[ -z "$video" ]]; then
		video="$arg"
	elif [[ -z "$audio" ]]; then
		audio="$arg"
	fi
done

# If no arguments, check for hardcoded values
if [ -z "$video" ] || [ -z "$audio" ] || [ -z "$name" ]; then
	# Set your paths here (edit these if running without arguments)
	video=""
	audio=""
	name=""

	if [ -z "$video" ] || [ -z "$audio" ] || [ -z "$name" ]; then
		echo "Error: Missing arguments or hardcoded values"
		exit 1
	fi
fi

ffmpeg -i "$video" -i "$audio" -c:v copy -map 0:v:0 -map 1:a:0 -shortest -c:a aac -b:a 320k "$name"

echo "Created: $name"

# What each flag does:
# -i "$video"        = input video file
# -i "$audio"        = input audio file
# -c:v copy          = copy video without re-encoding (no quality loss)
# -map 0:v:0         = use video from first input (the video file)
# -map 1:a:0         = use audio from second input (the audio file)
# -shortest          = cut audio to match video length
# -c:a aac           = encode audio as AAC
# -b:a 320k          = audio bitrate 320kbps (high quality)
# "$name"            = output file name


================================================
FILE: Scripts/audio-switch
================================================
#!/bin/bash

focused_monitor="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')"

sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]')
sinks_count=$(echo "$sinks" | jq '. | length')

if [ "$sinks_count" -eq 0 ]; then
  swayosd-client \
    --monitor "$focused_monitor" \
    --custom-message "No audio devices found"
  exit 1
fi

current_sink_name=$(pactl get-default-sink)
current_sink_index=$(echo "$sinks" | jq -r --arg name "$current_sink_name" 'map(.name) | index($name)')

if [ "$current_sink_index" != "null" ]; then
  next_sink_index=$(((current_sink_index + 1) % sinks_count))
else
  next_sink_index=0
fi

next_sink=$(echo "$sinks" | jq -r ".[$next_sink_index]")
next_sink_name=$(echo "$next_sink" | jq -r '.name')

next_sink_description=$(echo "$next_sink" | jq -r '.description')
if [ "$next_sink_description" = "(null)" ] || [ "$next_sink_description" = "null" ] || [ -z "$next_sink_description" ]; then
  sink_id=$(echo "$next_sink" | jq -r '.properties."object.id"')
  next_sink_description=$(wpctl status | grep -E "\s+\*?\s+${sink_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
fi

next_sink_volume=$(echo "$next_sink" | jq -r \
  '.volume | to_entries[0].value.value_percent | sub("%"; "")')
next_sink_is_muted=$(echo "$next_sink" | jq -r '.mute')

if [ "$next_sink_is_muted" = "true" ] || [ "$next_sink_volume" -eq 0 ]; then
  icon_state="muted"
elif [ "$next_sink_volume" -le 33 ]; then
  icon_state="low"
elif [ "$next_sink_volume" -le 66 ]; then
  icon_state="medium"
else
  icon_state="high"
fi

next_sink_volume_icon="sink-volume-${icon_state}-symbolic"

if [ "$next_sink_name" != "$current_sink_name" ]; then
  pactl set-default-sink "$next_sink_name"
fi

swayosd-client \
  --monitor "$focused_monitor" \
  --custom-message "$next_sink_description" \
  --custom-icon "$next_sink_volume_icon"


================================================
FILE: Scripts/battery-monitor
================================================
#!/bin/bash

CHECK_INTERVAL=60
NOTIFY_LEVELS=(20 15)
LOCK_LEVEL=10
LOCK_TIMEOUT=30

get_battery_path() {
	for bat in /sys/class/power_supply/BAT*; do
		[[ -d "$bat" ]] && {
			echo "$bat"
			return
		}
	done
}

BATTERY_PATH=$(get_battery_path)
[[ -z "$BATTERY_PATH" ]] && {
	echo "No battery found"
	exit 1
}

script_name=$(basename "$0")
if pgrep -f "$script_name" | grep -v $$ >/dev/null 2>&1; then
	echo "Battery monitor already running"
	exit 0
fi

is_charging() {
	local status
	status=$(cat "$BATTERY_PATH/status" 2>/dev/null)
	[[ "$status" == "Charging" || "$status" == "Full" ]]
}

get_percentage() {
	cat "$BATTERY_PATH/capacity" 2>/dev/null || echo 100
}

is_notified() {
	local level=$1
	[[ -f "/tmp/battery-notified-$level" ]]
}

mark_notified() {
	touch "/tmp/battery-notified-$1"
}

clear_notifications() {
	rm -f /tmp/battery-notified-*
}

lock_and_suspend() {
	local i=$LOCK_TIMEOUT
	while [[ $i -gt 0 ]]; do
		notify-send -u critical -t 1100 "Battery Critical" "Suspending in ${i}s..."
		sleep 1
		((i--))
	done
	swaylock -f
	systemctl suspend
}

while true; do
	if is_charging; then
		clear_notifications
	else
		percentage=$(get_percentage)

		for level in "${NOTIFY_LEVELS[@]}"; do
			if [[ $percentage -le $level ]] && ! is_notified "$level"; then
				notify-send -u normal "Low Battery" "${percentage}% remaining"
				mark_notified "$level"
			fi
		done

		if [[ $percentage -le $LOCK_LEVEL ]] && ! is_notified "lock"; then
			lock_and_suspend
			mark_notified "lock"
		fi
	fi

	sleep $CHECK_INTERVAL
done


================================================
FILE: Scripts/beats
================================================
#!/bin/bash

FUZZEL_OPTS="--dmenu --index"

declare -A stations=(
	["Radio - Lofi Girl"]="https://play.streamafrica.net/lofiradio"
	["Radio - Chillhop"]="http://stream.zeno.fm/fyn8eh3h5f8uv"
	["FM - Love Radio 90.7"]="https://radio-stations-philippines.com/love"
	["YT - Relaxing Music"]="https://youtube.com/playlist?list=PLMIbmfP_9vb8BCxRoraJpoo4q1yMFg4CE"
	["YT - Youtube Remix"]="https://youtube.com/playlist?list=PLeqTkIUlrZXlSNn3tcXAa-zbo95j0iN-0&si=4w8ngfzzs0BgdTg0"
	["YT - Korean Drama OST"]="https://youtube.com/playlist?list=PLUge_o9AIFp4HuA-A3e3ZqENh63LuRRlQ"
	["YT - Relaxing Piano Jazz"]="https://youtu.be/85UEqRat6E4?si=jXQL1Yp2VP_G6NSn"
	["YT - John Snow reveal"]="https://youtu.be/dNOZ7MuET2E?si=MDfxr_LrpEEcYslC"
	["YT - Moody Classic"]="https://youtube.com/playlist?list=PLgIxeDoNjzdD0EpiuE6KaBWiIrgGI2QvE&si=Z6C-Vm8u9cNZ8tny"
	["YT - Japanese City Pop"]="https://youtu.be/Rh7u_cbAiZc?si=gRa6zNjYQZweSm8u"
	["YT - Starboy Vibes"]="https://youtu.be/fykM0vDDUnU?si=bnfSyV-LTxVfSyhU"
	["YT - Jazz Lounge"]="https://youtu.be/kJl319t76z8?si=ny03bA2GHDRwXW5-"
	["YT - Friends S1"]="https://youtube.com/playlist?list=PLnS-KSZtIXlH8YNow_rTIflrX6ZEF1uNd&si=Y-0aWZSaBJ4peNfu"
	["YT - Hindi Cover Songs"]="https://youtube.com/playlist?list=PLjqy7NBQvw8wnorOYEom-tBnd1wtiveQZ&si=hVjVxPXF5Bl8zH8l"
	["YT - Friends From Starting"]="https://youtube.com/playlist?list=PL7PQp2APUAPL-q1GnguwovMusN6g3RdwX&si=K_uGlMO2HvIOR1Ha"
	["YT - Entourage Soundtrack"]="https://youtube.com/playlist?list=PLIwK6Ozzhumi6NJDgPc1iN1HcDFL-IT48&si=veHxopeG-D974jv-"
	["YT - Punjabi Sad"]="https://youtube.com/playlist?list=PLIwK6Ozzhumi6NJDgPc1iN1HcDFL-IT48&si=veHxopeG-D974jv-"
	["YT - Rock Melody"]="https://youtu.be/X8CsR8nkOPQ"
	["YT - Dream On"]="https://youtu.be/Yq4KA0mUnC8"
)

# Toggle logic: Stop playback if already running
if pkill -x mpv; then
	notify-send -u low "Music Player" "Playback stopped"
	exit 0
fi

# Prepare and sort station names
mapfile -t station_names < <(printf "%s\n" "${!stations[@]}" | sort)

# Get selection index from Fuzzel
choice_index=$(printf "%s\n" "${station_names[@]}" | fuzzel $FUZZEL_OPTS)

# Exit if user cancels (Esc)
[[ -z "$choice_index" ]] && exit 0

# Extract selection
selected_name="${station_names[$choice_index]}"
url="${stations[$selected_name]}"

# Notify and play
# --script-opts=ytdl_hook-ytdl_path=yt-dlp forces mpv to use the correct tool
notify-send -u normal "Now Playing" "$selected_name"
mpv --vid=no --script-opts=ytdl_hook-ytdl_path=$HOME/yt-dlp "$url"


================================================
FILE: Scripts/choose-shell
================================================
#!/usr/bin/env bash

BOLD='\e[1m'
YELLOW='\e[93m'
GREEN='\e[92m'
RESET='\e[0m'

info()  { echo -e "${BOLD}${YELLOW}$1${RESET}"; }
ok()    { echo -e "${BOLD}${GREEN}>> $1${RESET}\n"; }

install_if_missing() {
  command -v "$1" &>/dev/null && return
  info "$1 not found. Installing..."
  sudo pacman -S --noconfirm "$1"
}

set_shell() {
  install_if_missing "$1"
  sudo chsh -s "$(command -v "$1")" "$USER"
  ok "Shell choice: $1"
  echo "Logout and log back in for the change to take effect."
  sleep 2
}

shell=$(gum choose --height 5 --header "Choose your default shell" bash fish zsh quit)

case $shell in
  bash|fish|zsh) set_shell "$shell" ;;
  quit) echo "Exiting."; exit 0 ;;
  *)    echo "Invalid choice."; exit 1 ;;
esac


================================================
FILE: Scripts/clone
================================================
#!/bin/bash

cd "$HOME/Git/" || exit

echo "Enter git repository URL to clone:"
read repo_url

git clone "$repo_url"

repo_name=$(basename -s .git "$repo_url")

if ! tmux has-session -t "$repo_name" 2>/dev/null; then
	tmux new-session -ds "$repo_name" -c "$HOME/Git/$repo_name"
fi

tmux switch-client -t "$repo_name"


================================================
FILE: Scripts/code-in-tmux
================================================
#!/bin/bash

PROJECT_DIR="$HOME/Projects/flutter_projects/cloud"
SESSION_NAME=$(basename "$PROJECT_DIR")

if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
	tmux attach -t "$SESSION_NAME"
	exit 0
fi

tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_DIR"
tmux new-window -t "$SESSION_NAME:2" -c "$PROJECT_DIR"
tmux new-window -t "$SESSION_NAME:3" -c "$PROJECT_DIR"
tmux send-keys -t "$SESSION_NAME:2" "opencode" Enter
tmux send-keys -t "$SESSION_NAME:3" "flutter-watch" Enter
sleep 1
tmux select-window -t "$SESSION_NAME:1"
tmux attach -t "$SESSION_NAME"


================================================
FILE: Scripts/dual-dac
================================================
#!/usr/bin/env bash
#
# ============================================================================
# dual-dac - Mirror audio to multiple outputs for shared listening
# ============================================================================
#
# WHAT THIS SCRIPT DOES:
#   Enables simultaneous audio playback on two audio outputs (e.g., two USB
#   DACs, or one DAC + laptop speakers). Perfect for sharing audio with
#   someone using separate headphones or speakers from the same source.
#
# HOW PIPEWIRE LOOPBACK WORKS:
#   PipeWire's module-loopback creates a virtual audio path between a source
#   and a sink. A sink's ".monitor" is a special source that captures whatever
#   audio is currently playing to that sink - essentially tapping the stream.
#
#   The loopback captures from: <sink>.monitor → plays to: <another_sink>
#
#   This allows one audio stream to be duplicated to multiple physical outputs
#   without requiring application-level support for multi-output.
#
# AUDIO ROUTING DIAGRAM:
#
#   Single output mode (normal):
#     ┌─────────┐     ┌─────────────┐     ┌──────┐
#     │   App   │ ──▶ │ EasyEffects │ ──▶ │ DAC1 │ ──▶ 🎧
#     └─────────┘     └─────────────┘     └──────┘
#
#   Dual output mode (with loopback):
#     ┌─────────┐     ┌─────────────┐     ┌──────┐
#     │   App   │ ──▶ │ EasyEffects │ ──▶ │ DAC1 │ ──▶ 🎧 Primary
#     └─────────┘     └──────┬──────┘     └──────┘
#                            │
#                    [.monitor tap]
#                            │
#                            ▼
#                   ┌────────────────┐     ┌──────┐
#                   │ module-loopback│ ──▶ │ DAC2 │ ──▶ 🎧 Secondary
#                   └────────────────┘     └──────┘
#
#   Both outputs receive the same processed audio from EasyEffects.
#
# KEY COMMANDS:
#   pactl load-module module-loopback  - Create audio loopback between source/sink
#     source=<sink>.monitor            - Capture audio from this sink's output
#     sink=<sink>                       - Play captured audio to this sink
#     latency_msec=<ms>                 - Buffer size (lower = less delay)
#
#   pactl unload-module <id>           - Remove a loaded module by ID
#   pactl list sinks short             - List available audio output sinks
#   pactl list modules short           - List all loaded PipeWire/PulseAudio modules
#
#   pw-link -o                         - List PipeWire output ports
#   pw-link <out>:<port> <in>:<port>   - Manually connect PipeWire nodes
#
# BEHAVIOR BY OUTPUT COUNT:
#   0 outputs: Falls back to laptop speakers (pci.*analog-stereo), single mode
#   1 output:  Single output mode - no loopback needed, exits cleanly
#   2+ outputs: Creates loopback to mirror EasyEffects output to second device
#
# USAGE:
#   dual-dac on      Enable dual output mode (if 2+ outputs available)
#   dual-dac off     Disable dual output mode, restore single output
#   dual-dac toggle  Toggle between modes (default when no argument)
#   dual-dac status  Show current state and available outputs
#   dual-dac sync    Sync volume levels between primary and secondary
#   dual-dac help    Show usage information
#
# ============================================================================

set -euo pipefail

# --- Configuration ---

# Identifier for our loopback module (used for finding/cleanup)
MODULE_NAME="dual_dac_loopback"

# Device patterns in priority order
# First match = primary output, second match = secondary output
DEVICE_PATTERNS=(
    "Audiocular_Spark"      # USB DACs (highest priority)
    "pci.*analog-stereo"    # Internal laptop audio (fallback)
)

# --- Logging ---

log() {
    echo "[dual-dac] $*"
}

err() {
    echo "[dual-dac] ERROR: $*" >&2
}

# --- Device Detection ---

# Get all available sinks matching our device patterns
# Returns sinks ordered by pattern priority (USB DACs first, then internal)
get_available_sinks() {
    local all_sinks
    all_sinks=$(pactl list sinks short 2>/dev/null | awk '{print $2}') || return

    # Iterate through patterns in priority order
    for pattern in "${DEVICE_PATTERNS[@]}"; do
        echo "$all_sinks" | while read -r sink; do
            if [[ -n "$sink" && "$sink" =~ $pattern ]]; then
                echo "$sink"
            fi
        done
    done
}

# Count how many audio outputs are available
count_available_sinks() {
    get_available_sinks | grep -c . || echo 0
}

# Get EasyEffects sink (if running)
get_easyeffects_sink() {
    pactl list sinks short 2>/dev/null | grep "easyeffects_sink" | awk '{print $2}'
}

# --- Module Management ---

# Check if our loopback module is currently loaded
is_enabled() {
    pactl list modules short 2>/dev/null | grep -q "$MODULE_NAME"
}

# Get loaded module IDs matching our loopback
get_module_ids() {
    pactl list modules short 2>/dev/null | grep "$MODULE_NAME" | awk '{print $1}'
}

# --- Volume Helpers ---

# Get volume percentage for a sink
get_sink_volume() {
    local sink="$1"
    pactl get-sink-volume "$sink" 2>/dev/null | grep -oP '\d+%' | head -1 || echo "?"
}

# Set volume for a sink
set_sink_volume() {
    local sink="$1"
    local volume="$2"
    pactl set-sink-volume "$sink" "$volume" 2>/dev/null
}

# --- Main Functions ---

# Enable dual output mode by creating a loopback to the secondary sink
enable_dual_mode() {
    # Already enabled?
    if is_enabled; then
        log "Already enabled"
        return 0
    fi

    # Detect available outputs
    mapfile -t sinks < <(get_available_sinks)
    local sink_count=${#sinks[@]}

    # Handle different output scenarios
    case $sink_count in
        0)
            err "No audio outputs detected"
            err "Check PipeWire status: systemctl --user status pipewire"
            return 1
            ;;
        1)
            # Single output - no mirroring possible
            log "Single output - no mirroring needed"
            log "Output: ${sinks[0]}"
            log ""
            log "Connect a second audio device to enable dual mode"
            return 0
            ;;
        *)
            log "Found $sink_count outputs, enabling dual mode..."
            ;;
    esac

    local primary="${sinks[0]}"
    local secondary="${sinks[1]}"

    # Determine source: prefer EasyEffects if running, otherwise primary sink
    local ee_sink source_sink
    ee_sink=$(get_easyeffects_sink)

    if [[ -n "$ee_sink" ]]; then
        source_sink="$ee_sink"
        log "Routing through EasyEffects"
    else
        source_sink="$primary"
        log "EasyEffects not running, using direct routing"
    fi

    log "Primary:   $primary"
    log "Secondary: $secondary"

    # Create loopback module
    # - source: tap the EasyEffects (or primary) monitor
    # - sink: output to secondary device
    # - latency_msec: minimize delay between outputs
    # - media.name: tag for identification and cleanup
    pactl load-module module-loopback \
        source="${source_sink}.monitor" \
        sink="$secondary" \
        latency_msec=1 \
        sink_input_properties="media.name=$MODULE_NAME" \
        source_output_properties="media.name=$MODULE_NAME" \
        > /dev/null

    # Brief pause for PipeWire to create loopback nodes
    sleep 0.3

    # Manually connect loopback if auto-connect didn't work
    local loopback_out
    loopback_out=$(pw-link -o 2>/dev/null | grep "output.loopback" | head -1 | sed 's/:.*//') || true
    if [[ -n "$loopback_out" ]]; then
        pw-link "${loopback_out}:output_FL" "${secondary}:playback_FL" 2>/dev/null || true
        pw-link "${loopback_out}:output_FR" "${secondary}:playback_FR" 2>/dev/null || true
    fi

    # Sync volumes: match secondary to primary
    local primary_vol
    primary_vol=$(get_sink_volume "$primary")
    [[ "$primary_vol" != "?" ]] && set_sink_volume "$secondary" "$primary_vol"

    log "Enabled - audio mirrored to both outputs"
}

# Disable dual output mode by removing loopback modules
disable_dual_mode() {
    # Nothing to disable?
    if ! is_enabled; then
        log "Already in single output mode"
        return 0
    fi

    # Unload all our loopback modules
    local unloaded=0
    while read -r id; do
        if [[ -n "$id" ]]; then
            pactl unload-module "$id" 2>/dev/null || true
            ((unloaded++))
        fi
    done < <(get_module_ids)

    if [[ $unloaded -gt 0 ]]; then
        log "Restored to single output mode"
    else
        log "No loopback modules found"
    fi

    # Show which output is now active
    mapfile -t sinks < <(get_available_sinks)
    if [[ ${#sinks[@]} -gt 0 ]]; then
        log "Active output: ${sinks[0]}"
    fi
}

# Toggle between single and dual output modes
toggle_dual_mode() {
    if is_enabled; then
        disable_dual_mode
    else
        enable_dual_mode
    fi
}

# Display current status and available outputs
show_status() {
    echo "=== Dual DAC Status ==="
    echo ""

    # Current mode
    if is_enabled; then
        echo "Mode: DUAL (loopback active)"
    else
        echo "Mode: SINGLE"
    fi

    # List outputs
    echo ""
    echo "Available outputs:"
    mapfile -t sinks < <(get_available_sinks)

    if [[ ${#sinks[@]} -eq 0 ]]; then
        echo "  (none detected)"
    else
        local i=1
        for sink in "${sinks[@]}"; do
            local vol name role
            vol=$(get_sink_volume "$sink")
            # Clean up sink name for display
            name=$(echo "$sink" | sed 's/alsa_output\.//' | sed 's/\.analog-stereo//' | sed 's/_/ /g')

            case $i in
                1) role="[primary]" ;;
                2) role="[secondary]" ;;
                *) role="" ;;
            esac

            printf "  %d. %-40s vol: %s %s\n" "$i" "$name" "$vol" "$role"
            ((i++))
        done
    fi

    # EasyEffects status
    echo ""
    if [[ -n "$(get_easyeffects_sink)" ]]; then
        echo "EasyEffects: running (audio processed)"
    else
        echo "EasyEffects: not running (direct audio)"
    fi

    # Capability note
    echo ""
    case ${#sinks[@]} in
        0) echo "Note: No outputs detected. Check PipeWire." ;;
        1) echo "Note: Single output. Connect another for dual mode." ;;
        *) echo "Note: ${#sinks[@]} outputs available. Dual mode supported." ;;
    esac
}

# Sync secondary volume to match primary
sync_volume() {
    mapfile -t sinks < <(get_available_sinks)

    if [[ ${#sinks[@]} -lt 2 ]]; then
        err "Need at least 2 outputs to sync"
        return 1
    fi

    local primary="${sinks[0]}"
    local secondary="${sinks[1]}"
    local primary_vol

    primary_vol=$(get_sink_volume "$primary")
    if [[ "$primary_vol" == "?" ]]; then
        err "Could not read primary volume"
        return 1
    fi

    set_sink_volume "$secondary" "$primary_vol"
    log "Synced secondary volume to $primary_vol"
}

# --- Entry Point ---

case "${1:-toggle}" in
    on|enable)
        enable_dual_mode
        ;;
    off|disable)
        disable_dual_mode
        ;;
    toggle)
        toggle_dual_mode
        ;;
    status|s)
        show_status
        ;;
    sync)
        sync_volume
        ;;
    help|--help|-h)
        echo "Usage: dual-dac [command]"
        echo ""
        echo "Commands:"
        echo "  on, enable    Enable dual output (mirror to 2nd output)"
        echo "  off, disable  Disable dual output (single output)"
        echo "  toggle        Toggle mode (default)"
        echo "  status, s     Show current state and outputs"
        echo "  sync          Sync volume between outputs"
        echo "  help          Show this help"
        echo ""
        echo "Behavior:"
        echo "  0 outputs  - Error (check PipeWire)"
        echo "  1 output   - Single mode, no loopback"
        echo "  2+ outputs - Loopback mirrors audio to secondary"
        ;;
    *)
        err "Unknown command: $1"
        echo "Run 'dual-dac help' for usage"
        exit 1
        ;;
esac


================================================
FILE: Scripts/flutter-post-upgrade
================================================
#!/bin/bash

flutter clean
echo
echo ✅ flutter clean → Wipes stale build files
echo

flutter pub get
echo
echo ✅ flutter pub get → Fetches fresh dependencies
echo

dart fix --apply
echo
echo ✅ dart fix --apply → Auto-fixes deprecated API issues
echo

flutter pub outdated
echo
echo ✅ flutter pub outdated → Flags packages needing updates
echo

flutter doctor
echo
echo ✅ flutter doctor → Verifies your dev environment is healthy
echo

echo "it's done maybe the error was not working"


================================================
FILE: Scripts/fuzzel-emoji
================================================
#!/usr/bin/env bash
set -euo pipefail

MODE="${1:-type}"

emoji="$(sed '1,/^### DATA ###$/d' "$0" | fuzzel --match-mode fzf --dmenu | cut -d ' ' -f 1 | tr -d '\n')"

case "$MODE" in
    type)
        wtype "${emoji}" || wl-copy "${emoji}"
        ;;
    copy)
        wl-copy "${emoji}"
        ;;
    both)
        wtype "${emoji}" || true
        wl-copy "${emoji}"
        ;;
    *)
        echo "Usage: $0 [type|copy|both]"
        exit 1
        ;;
esac

exit
### DATA ###
😀 grinning face face smile happy joy :D grin
😃 grinning face with big eyes face happy joy haha :D :) smile funny
😄 grinning face with smiling eyes face happy joy funny haha laugh like :D :) smile
😁 beaming face with smiling eyes face happy smile joy kawaii
🫩 Face with Bags Under Eyes
😆 grinning squinting face happy joy lol satisfied haha face glad XD laugh
😅 grinning face with sweat face hot happy laugh sweat smile relief
🤣 rolling on the floor laughing face rolling floor laughing lol haha rofl
😂 face with tears of joy face cry tears weep happy happytears haha
🙂 slightly smiling face face smile
🙃 upside down face face flipped silly smile
😉 winking face face happy mischievous secret ;) smile eye
😊 smiling face with smiling eyes face smile happy flushed crush embarrassed shy joy
😇 smiling face with halo face angel heaven halo
🥰 smiling face with hearts face love like affection valentines infatuation crush hearts adore
😍 smiling face with heart eyes face love like affection valentines infatuation crush heart
🤩 star struck face smile starry eyes grinning
😘 face blowing a kiss face love like affection valentines infatuation kiss
😗 kissing face love like face 3 valentines infatuation kiss
☺️ smiling face face blush massage happiness
😚 kissing face with closed eyes face love like affection valentines infatuation kiss
😙 kissing face with smiling eyes face affection valentines infatuation kiss
😋 face savoring food happy joy tongue smile face silly yummy nom delicious savouring
😛 face with tongue face prank childish playful mischievous smile tongue
😜 winking face with tongue face prank childish playful mischievous smile wink tongue
🤪 zany face face goofy crazy
😝 squinting face with tongue face prank playful mischievous smile tongue
🤑 money mouth face face rich dollar money
🤗 hugging face face smile hug
🤭 face with hand over mouth face whoops shock surprise
🤫 shushing face face quiet shhh
🤔 thinking face face hmmm think consider
🤐 zipper mouth face face sealed zipper secret
🤨 face with raised eyebrow face distrust scepticism disapproval disbelief surprise
😐 neutral face indifference meh :| neutral
😑 expressionless face face indifferent - - meh deadpan
😶 face without mouth face hellokitty
😏 smirking face face smile mean prank smug sarcasm
😒 unamused face indifference bored straight face serious sarcasm unimpressed skeptical dubious side eye
🙄 face with rolling eyes face eyeroll frustrated
😬 grimacing face face grimace teeth
🤥 lying face face lie pinocchio
😌 relieved face face relaxed phew massage happiness
😔 pensive face face sad depressed upset
😪 sleepy face face tired rest nap
🤤 drooling face face
😴 sleeping face face tired sleepy night zzz
😷 face with medical mask face sick ill disease
🤒 face with thermometer sick temperature thermometer cold fever
🤕 face with head bandage injured clumsy bandage hurt
🤢 nauseated face face vomit gross green sick throw up ill
🤮 face vomiting face sick
🤧 sneezing face face gesundheit sneeze sick allergy
🥵 hot face face feverish heat red sweating
🥶 cold face face blue freezing frozen frostbite icicles
🥴 woozy face face dizzy intoxicated tipsy wavy
😵 dizzy face spent unconscious xox dizzy
🤯 exploding head face shocked mind blown
🤠 cowboy hat face face cowgirl hat
🥳 partying face face celebration woohoo
😎 smiling face with sunglasses face cool smile summer beach sunglass
🤓 nerd face face nerdy geek dork
🧐 face with monocle face stuffy wealthy
😕 confused face face indifference huh weird hmmm :/
😟 worried face face concern nervous :(
🙁 slightly frowning face face frowning disappointed sad upset
☹️ frowning face face sad upset frown
😮 face with open mouth face surprise impressed wow whoa :O
😯 hushed face face woo shh
😲 astonished face face xox surprised poisoned
😳 flushed face face blush shy flattered sex
🥺 pleading face face begging mercy
😦 frowning face with open mouth face aw what
😧 anguished face face stunned nervous
😨 fearful face face scared terrified nervous oops huh
😰 anxious face with sweat face nervous sweat
😥 sad but relieved face face phew sweat nervous
😢 crying face face tears sad depressed upset :'(
😭 loudly crying face face cry tears sad upset depressed sob
😱 face screaming in fear face munch scared omg
😖 confounded face face confused sick unwell oops :S
😣 persevering face face sick no upset oops
😞 disappointed face face sad upset depressed :(
😓 downcast face with sweat face hot sad tired exercise
😩 weary face face tired sleepy sad frustrated upset
😫 tired face sick whine upset frustrated
🥱 yawning face tired sleepy
😤 face with steam from nose face gas phew proud pride
😡 pouting face angry mad hate despise
😠 angry face mad face annoyed frustrated
🤬 face with symbols on mouth face swearing cursing cussing profanity expletive
😈 smiling face with horns devil horns
👿 angry face with horns devil angry horns
💀 skull dead skeleton creepy death
☠️ skull and crossbones poison danger deadly scary death pirate evil
💩 pile of poo hankey shitface fail turd shit
🤡 clown face face
👹 ogre monster red mask halloween scary creepy devil demon japanese ogre
👺 goblin red evil mask monster scary creepy japanese goblin
👻 ghost halloween spooky scary
👽 alien UFO paul weird outer space
👾 alien monster game arcade play
🤖 robot computer machine bot
😺 grinning cat animal cats happy smile
😸 grinning cat with smiling eyes animal cats smile
😹 cat with tears of joy animal cats haha happy tears
😻 smiling cat with heart eyes animal love like affection cats valentines heart
😼 cat with wry smile animal cats smirk
😽 kissing cat animal cats kiss
🙀 weary cat animal cats munch scared scream
😿 crying cat animal tears weep sad cats upset cry
😾 pouting cat animal cats
🙈 see no evil monkey monkey animal nature haha
🙉 hear no evil monkey animal monkey nature
🙊 speak no evil monkey monkey animal nature omg
💋 kiss mark face lips love like affection valentines
💌 love letter email like affection envelope valentines
💘 heart with arrow love like heart affection valentines
💝 heart with ribbon love valentines
💖 sparkling heart love like affection valentines
💗 growing heart like love affection valentines pink
💓 beating heart love like affection valentines pink heart
💞 revolving hearts love like affection valentines
💕 two hearts love like affection valentines heart
💟 heart decoration purple-square love like
❣️ heart exclamation decoration love
💔 broken heart sad sorry break heart heartbreak
❤️ red heart love like valentines
🧡 orange heart love like affection valentines
💛 yellow heart love like affection valentines
💚 green heart love like affection valentines
💙 blue heart love like affection valentines
💜 purple heart love like affection valentines
🤎 brown heart coffee
🖤 black heart evil
🤍 white heart pure
💯 hundred points score perfect numbers century exam quiz test pass hundred
💢 anger symbol angry mad
💥 collision bomb explode explosion collision blown
💫 dizzy star sparkle shoot magic
💦 sweat droplets water drip oops
💨 dashing away wind air fast shoo fart smoke puff
🕳️ hole embarrassing
💣 bomb boom explode explosion terrorism
💬 speech balloon bubble words message talk chatting
👁️‍🗨️ eye in speech bubble info
🗨️ left speech bubble words message talk chatting
🗯️ right anger bubble caption speech thinking mad
💭 thought balloon bubble cloud speech thinking dream
💤 zzz sleepy tired dream
👋 waving hand hands gesture goodbye solong farewell hello hi palm
🤚 raised back of hand fingers raised backhand
🖐️ hand with fingers splayed hand fingers palm
✋ raised hand fingers stop highfive palm ban
🖖 vulcan salute hand fingers spock star trek
👌 ok hand fingers limbs perfect ok okay
🤏 pinching hand tiny small size
✌️ victory hand fingers ohyeah hand peace victory two
🤞 crossed fingers good lucky
🤟 love you gesture hand fingers gesture
🤘 sign of the horns hand fingers evil eye sign of horns rock on
🤙 call me hand hands gesture shaka
👈 backhand index pointing left direction fingers hand left
👉 backhand index pointing right fingers hand direction right
👆 backhand index pointing up fingers hand direction up
🖕 middle finger hand fingers rude middle flipping
👇 backhand index pointing down fingers hand direction down
☝️ index pointing up hand fingers direction up
👍 thumbs up thumbsup yes awesome good agree accept cool hand like +1
👎 thumbs down thumbsdown no dislike hand -1
🫆 Fingerprint
✊ raised fist fingers hand grasp
👊 oncoming fist angry violence fist hit attack hand
🤛 left facing fist hand fistbump
🤜 right facing fist hand fistbump
👏 clapping hands hands praise applause congrats yay
🙌 raising hands gesture hooray yea celebration hands
👐 open hands fingers butterfly hands open
🤲 palms up together hands gesture cupped prayer
🤝 handshake agreement shake
🙏 folded hands please hope wish namaste highfive pray
✍️ writing hand lower left ballpoint pen stationery write compose
💅 nail polish beauty manicure finger fashion nail
🤳 selfie camera phone
💪 flexed biceps arm flex hand summer strong biceps
🦾 mechanical arm accessibility
🦿 mechanical leg accessibility
🦵 leg kick limb
🦶 foot kick stomp
👂 ear face hear sound listen
🦻 ear with hearing aid accessibility
👃 nose smell sniff
🧠 brain smart intelligent
🦷 tooth teeth dentist
🦴 bone skeleton
👀 eyes look watch stalk peek see
👁️ eye face look see watch stare
👅 tongue mouth playful
👄 mouth mouth kiss
👶 baby child boy girl toddler
🧒 child gender-neutral young
👦 boy man male guy teenager
👧 girl female woman teenager
🧑 person gender-neutral person
👱 person blond hair hairstyle
👨 man mustache father dad guy classy sir moustache
🧔 man beard person bewhiskered
👨‍🦰 man red hair hairstyle
👨‍🦱 man curly hair hairstyle
👨‍🦳 man white hair old elder
👨‍🦲 man bald hairless
👩 woman female girls lady
👩‍🦰 woman red hair hairstyle
🧑‍🦰 person red hair hairstyle
👩‍🦱 woman curly hair hairstyle
🧑‍🦱 person curly hair hairstyle
👩‍🦳 woman white hair old elder
🧑‍🦳 person white hair elder old
👩‍🦲 woman bald hairless
🧑‍🦲 person bald hairless
👱‍♀️ woman blond hair woman female girl blonde person
👱‍♂️ man blond hair man male boy blonde guy person
🧓 older person human elder senior gender-neutral
👴 old man human male men old elder senior
👵 old woman human female women lady old elder senior
🙍 person frowning worried
🙍‍♂️ man frowning male boy man sad depressed discouraged unhappy
🙍‍♀️ woman frowning female girl woman sad depressed discouraged unhappy
🙎 person pouting upset
🙎‍♂️ man pouting male boy man
🙎‍♀️ woman pouting female girl woman
🙅 person gesturing no decline
🙅‍♂️ man gesturing no male boy man nope
🙅‍♀️ woman gesturing no female girl woman nope
🙆 person gesturing ok agree
🙆‍♂️ man gesturing ok men boy male blue human man
🙆‍♀️ woman gesturing ok women girl female pink human woman
💁 person tipping hand information
💁‍♂️ man tipping hand male boy man human information
💁‍♀️ woman tipping hand female girl woman human information
🙋 person raising hand question
🙋‍♂️ man raising hand male boy man
🙋‍♀️ woman raising hand female girl woman
🧏 deaf person accessibility
🧏‍♂️ deaf man accessibility
🧏‍♀️ deaf woman accessibility
🙇 person bowing respectiful
🙇‍♂️ man bowing man male boy
🙇‍♀️ woman bowing woman female girl
🤦 person facepalming disappointed
🤦‍♂️ man facepalming man male boy disbelief
🤦‍♀️ woman facepalming woman female girl disbelief
🤷 person shrugging regardless
🤷‍♂️ man shrugging man male boy confused indifferent doubt
🤷‍♀️ woman shrugging woman female girl confused indifferent doubt
🧑‍⚕️ health worker hospital
👨‍⚕️ man health worker doctor nurse therapist healthcare man human
👩‍⚕️ woman health worker doctor nurse therapist healthcare woman human
🧑‍🎓 student learn
👨‍🎓 man student graduate man human
👩‍🎓 woman student graduate woman human
🧑‍🏫 teacher professor
👨‍🏫 man teacher instructor professor man human
👩‍🏫 woman teacher instructor professor woman human
🧑‍⚖️ judge law
👨‍⚖️ man judge justice court man human
👩‍⚖️ woman judge justice court woman human
🧑‍🌾 farmer crops
👨‍🌾 man farmer rancher gardener man human
👩‍🌾 woman farmer rancher gardener woman human
🧑‍🍳 cook food kitchen culinary
👨‍🍳 man cook chef man human
👩‍🍳 woman cook chef woman human
🧑‍🔧 mechanic worker technician
👨‍🔧 man mechanic plumber man human wrench
👩‍🔧 woman mechanic plumber woman human wrench
🧑‍🏭 factory worker labor
👨‍🏭 man factory worker assembly industrial man human
👩‍🏭 woman factory worker assembly industrial woman human
🧑‍💼 office worker business
👨‍💼 man office worker business manager man human
👩‍💼 woman office worker business manager woman human
🧑‍🔬 scientist chemistry
👨‍🔬 man scientist biologist chemist engineer physicist man human
👩‍🔬 woman scientist biologist chemist engineer physicist woman human
🧑‍💻 technologist computer
👨‍💻 man technologist coder developer engineer programmer software man human laptop computer
👩‍💻 woman technologist coder developer engineer programmer software woman human laptop computer
🧑‍🎤 singer song artist performer
👨‍🎤 man singer rockstar entertainer man human
👩‍🎤 woman singer rockstar entertainer woman human
🧑‍🎨 artist painting draw creativity
👨‍🎨 man artist painter man human
👩‍🎨 woman artist painter woman human
🧑‍✈️ pilot fly plane airplane
👨‍✈️ man pilot aviator plane man human
👩‍✈️ woman pilot aviator plane woman human
🧑‍🚀 astronaut outerspace
👨‍🚀 man astronaut space rocket man human
👩‍🚀 woman astronaut space rocket woman human
🧑‍🚒 firefighter fire
👨‍🚒 man firefighter fireman man human
👩‍🚒 woman firefighter fireman woman human
👮 police officer cop
👮‍♂️ man police officer man police law legal enforcement arrest 911
👮‍♀️ woman police officer woman police law legal enforcement arrest 911 female
🕵️ detective human spy detective
🕵️‍♂️ man detective crime
🕵️‍♀️ woman detective human spy detective female woman
💂 guard protect
💂‍♂️ man guard uk gb british male guy royal
💂‍♀️ woman guard uk gb british female royal woman
👷 construction worker labor build
👷‍♂️ man construction worker male human wip guy build construction worker labor
👷‍♀️ woman construction worker female human wip build construction worker labor woman
🤴 prince boy man male crown royal king
👸 princess girl woman female blond crown royal queen
👳 person wearing turban headdress
👳‍♂️ man wearing turban male indian hinduism arabs
👳‍♀️ woman wearing turban female indian hinduism arabs woman
👲 man with skullcap male boy chinese
🧕 woman with headscarf female hijab mantilla tichel
🤵 man in tuxedo couple marriage wedding groom
👰 bride with veil couple marriage wedding woman bride
🤰 pregnant woman baby
🤱 breast feeding nursing baby
👼 baby angel heaven wings halo
🎅 santa claus festival man male xmas father christmas
🤶 mrs claus woman female xmas mother christmas
🦸 superhero marvel
🦸‍♂️ man superhero man male good hero superpowers
🦸‍♀️ woman superhero woman female good heroine superpowers
🦹 supervillain marvel
🦹‍♂️ man supervillain man male evil bad criminal hero superpowers
🦹‍♀️ woman supervillain woman female evil bad criminal heroine superpowers
🧙 mage magic
🧙‍♂️ man mage man male mage sorcerer
🧙‍♀️ woman mage woman female mage witch
🧚 fairy wings magical
🧚‍♂️ man fairy man male
🧚‍♀️ woman fairy woman female
🧛 vampire blood twilight
🧛‍♂️ man vampire man male dracula
🧛‍♀️ woman vampire woman female
🧜 merperson sea
🧜‍♂️ merman man male triton
🧜‍♀️ mermaid woman female merwoman ariel
🧝 elf magical
🧝‍♂️ man elf man male
🧝‍♀️ woman elf woman female
🧞 genie magical wishes
🧞‍♂️ man genie man male
🧞‍♀️ woman genie woman female
🧟 zombie dead
🧟‍♂️ man zombie man male dracula undead walking dead
🧟‍♀️ woman zombie woman female undead walking dead
💆 person getting massage relax
💆‍♂️ man getting massage male boy man head
💆‍♀️ woman getting massage female girl woman head
💇 person getting haircut hairstyle
💇‍♂️ man getting haircut male boy man
💇‍♀️ woman getting haircut female girl woman
🚶 person walking move
🚶‍♂️ man walking human feet steps
🚶‍♀️ woman walking human feet steps woman female
🧍 person standing still
🧍‍♂️ man standing still
🧍‍♀️ woman standing still
🧎 person kneeling pray respectful
🧎‍♂️ man kneeling pray respectful
🧎‍♀️ woman kneeling respectful pray
🧑‍🦯 person with probing cane blind
👨‍🦯 man with probing cane blind
👩‍🦯 woman with probing cane blind
🧑‍🦼 person in motorized wheelchair disability accessibility
👨‍🦼 man in motorized wheelchair disability accessibility
👩‍🦼 woman in motorized wheelchair disability accessibility
🧑‍🦽 person in manual wheelchair disability accessibility
👨‍🦽 man in manual wheelchair disability accessibility
👩‍🦽 woman in manual wheelchair disability accessibility
🏃 person running move
🏃‍♂️ man running man walking exercise race running
🏃‍♀️ woman running woman walking exercise race running female
💃 woman dancing female girl woman fun
🕺 man dancing male boy fun dancer
🕴️ man in suit levitating suit business levitate hover jump
👯 people with bunny ears perform costume
👯‍♂️ men with bunny ears male bunny men boys
👯‍♀️ women with bunny ears female bunny women girls
🧖 person in steamy room relax spa
🧖‍♂️ man in steamy room male man spa steamroom sauna
🧖‍♀️ woman in steamy room female woman spa steamroom sauna
🧗 person climbing sport
🧗‍♂️ man climbing sports hobby man male rock
🧗‍♀️ woman climbing sports hobby woman female rock
🤺 person fencing sports fencing sword
🏇 horse racing animal betting competition gambling luck
⛷️ skier sports winter snow
🏂 snowboarder sports winter
🏌️ person golfing sports business
🏌️‍♂️ man golfing sport
🏌️‍♀️ woman golfing sports business woman female
🏄 person surfing sport sea
🏄‍♂️ man surfing sports ocean sea summer beach
🏄‍♀️ woman surfing sports ocean sea summer beach woman female
🚣 person rowing boat sport move
🚣‍♂️ man rowing boat sports hobby water ship
🚣‍♀️ woman rowing boat sports hobby water ship woman female
🏊 person swimming sport pool
🏊‍♂️ man swimming sports exercise human athlete water summer
🏊‍♀️ woman swimming sports exercise human athlete water summer woman female
⛹️ person bouncing ball sports human
⛹️‍♂️ man bouncing ball sport
⛹️‍♀️ woman bouncing ball sports human woman female
🏋️ person lifting weights sports training exercise
🏋️‍♂️ man lifting weights sport
🏋️‍♀️ woman lifting weights sports training exercise woman female
🚴 person biking sport move
🚴‍♂️ man biking sports bike exercise hipster
🚴‍♀️ woman biking sports bike exercise hipster woman female
🚵 person mountain biking sport move
🚵‍♂️ man mountain biking transportation sports human race bike
🚵‍♀️ woman mountain biking transportation sports human race bike woman female
🤸 person cartwheeling sport gymnastic
🤸‍♂️ man cartwheeling gymnastics
🤸‍♀️ woman cartwheeling gymnastics
🤼 people wrestling sport
🤼‍♂️ men wrestling sports wrestlers
🤼‍♀️ women wrestling sports wrestlers
🤽 person playing water polo sport
🤽‍♂️ man playing water polo sports pool
🤽‍♀️ woman playing water polo sports pool
🤾 person playing handball sport
🤾‍♂️ man playing handball sports
🤾‍♀️ woman playing handball sports
🤹 person juggling performance balance
🤹‍♂️ man juggling juggle balance skill multitask
🤹‍♀️ woman juggling juggle balance skill multitask
🧘 person in lotus position meditate
🧘‍♂️ man in lotus position man male meditation yoga serenity zen mindfulness
🧘‍♀️ woman in lotus position woman female meditation yoga serenity zen mindfulness
🛀 person taking bath clean shower bathroom
🛌 person in bed bed rest
🧑‍🤝‍🧑 people holding hands friendship
👭 women holding hands pair friendship couple love like female people human
👫 woman and man holding hands pair people human love date dating like affection valentines marriage
👬 men holding hands pair couple love like bromance friendship people human
💏 kiss pair valentines love like dating marriage
👩‍❤️‍💋‍👨 kiss woman man love
👨‍❤️‍💋‍👨 kiss man man pair valentines love like dating marriage
👩‍❤️‍💋‍👩 kiss woman woman pair valentines love like dating marriage
💑 couple with heart pair love like affection human dating valentines marriage
👩‍❤️‍👨 couple with heart woman man love
👨‍❤️‍👨 couple with heart man man pair love like affection human dating valentines marriage
👩‍❤️‍👩 couple with heart woman woman pair love like affection human dating valentines marriage
👪 family home parents child mom dad father mother people human
👨‍👩‍👦 family man woman boy love
👨‍👩‍👧 family man woman girl home parents people human child
👨‍👩‍👧‍👦 family man woman girl boy home parents people human children
👨‍👩‍👦‍👦 family man woman boy boy home parents people human children
👨‍👩‍👧‍👧 family man woman girl girl home parents people human children
👨‍👨‍👦 family man man boy home parents people human children
👨‍👨‍👧 family man man girl home parents people human children
👨‍👨‍👧‍👦 family man man girl boy home parents people human children
👨‍👨‍👦‍👦 family man man boy boy home parents people human children
👨‍👨‍👧‍👧 family man man girl girl home parents people human children
👩‍👩‍👦 family woman woman boy home parents people human children
👩‍👩‍👧 family woman woman girl home parents people human children
👩‍👩‍👧‍👦 family woman woman girl boy home parents people human children
👩‍👩‍👦‍👦 family woman woman boy boy home parents people human children
👩‍👩‍👧‍👧 family woman woman girl girl home parents people human children
👨‍👦 family man boy home parent people human child
👨‍👦‍👦 family man boy boy home parent people human children
👨‍👧 family man girl home parent people human child
👨‍👧‍👦 family man girl boy home parent people human children
👨‍👧‍👧 family man girl girl home parent people human children
👩‍👦 family woman boy home parent people human child
👩‍👦‍👦 family woman boy boy home parent people human children
👩‍👧 family woman girl home parent people human child
👩‍👧‍👦 family woman girl boy home parent people human children
👩‍👧‍👧 family woman girl girl home parent people human children
🗣️ speaking head user person human sing say talk
👤 bust in silhouette user person human
👥 busts in silhouette user person human group team
👣 footprints feet tracking walking beach
🐵 monkey face animal nature circus
🐒 monkey animal nature banana circus
🦍 gorilla animal nature circus
🦧 orangutan animal
🐶 dog face animal friend nature woof puppy pet faithful
🐕 dog animal nature friend doge pet faithful
🦮 guide dog animal blind
🐕‍🦺 service dog blind animal
🐩 poodle dog animal 101 nature pet
🐺 wolf animal nature wild
🦊 fox animal nature face
🦝 raccoon animal nature
🐱 cat face animal meow nature pet kitten
🐈 cat animal meow pet cats
🦁 lion animal nature
🐯 tiger face animal cat danger wild nature roar
🐅 tiger animal nature roar
🐆 leopard animal nature
🐴 horse face animal brown nature
🐎 horse animal gamble luck
🦄 unicorn animal nature mystical
🦓 zebra animal nature stripes safari
🦌 deer animal nature horns venison
🐮 cow face beef ox animal nature moo milk
🐂 ox animal cow beef
🐃 water buffalo animal nature ox cow
🐄 cow beef ox animal nature moo milk
🐷 pig face animal oink nature
🐖 pig animal nature
🐗 boar animal nature
🐽 pig nose animal oink
🐏 ram animal sheep nature
🐑 ewe animal nature wool shipit
🐐 goat animal nature
🐪 camel animal hot desert hump
🐫 two hump camel animal nature hot desert hump
🦙 llama animal nature alpaca
🦒 giraffe animal nature spots safari
🐘 elephant animal nature nose th circus
🦏 rhinoceros animal nature horn
🦛 hippopotamus animal nature
🐭 mouse face animal nature cheese wedge rodent
🐁 mouse animal nature rodent
🐀 rat animal mouse rodent
🐹 hamster animal nature
🐰 rabbit face animal nature pet spring magic bunny
🐇 rabbit animal nature pet magic spring
🐿️ chipmunk animal nature rodent squirrel
🦔 hedgehog animal nature spiny
🦇 bat animal nature blind vampire
🐻 bear animal nature wild
🐨 koala animal nature
🐼 panda animal nature panda
🦥 sloth animal
🦦 otter animal
🦨 skunk animal
🦘 kangaroo animal nature australia joey hop marsupial
🦡 badger animal nature honey
🐾 paw prints animal tracking footprints dog cat pet feet
🦃 turkey animal bird
🐔 chicken animal cluck nature bird
🐓 rooster animal nature chicken
🐣 hatching chick animal chicken egg born baby bird
🐤 baby chick animal chicken bird
🐥 front facing baby chick animal chicken baby bird
🐦 bird animal nature fly tweet spring
🐧 penguin animal nature
🕊️ dove animal bird
🦅 eagle animal nature bird
🦆 duck animal nature bird mallard
🦢 swan animal nature bird
🦉 owl animal nature bird hoot
🦩 flamingo animal
🦚 peacock animal nature peahen bird
🦜 parrot animal nature bird pirate talk
🐸 frog animal nature croak toad
🐊 crocodile animal nature reptile lizard alligator
🐢 turtle animal slow nature tortoise
🦎 lizard animal nature reptile
🐍 snake animal evil nature hiss python
🐲 dragon face animal myth nature chinese green
🐉 dragon animal myth nature chinese green
🦕 sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct
🦖 t rex animal nature dinosaur tyrannosaurus extinct
🐳 spouting whale animal nature sea ocean
🐋 whale animal nature sea ocean
🐬 dolphin animal nature fish sea ocean flipper fins beach
🐟 fish animal food nature
🐠 tropical fish animal swim ocean beach nemo
🐡 blowfish animal nature food sea ocean
🦈 shark animal nature fish sea ocean jaws fins beach
🐙 octopus animal creature ocean sea nature beach
🐚 spiral shell nature sea beach
🐌 snail slow animal shell
🦋 butterfly animal insect nature caterpillar
🐛 bug animal insect nature worm
🐜 ant animal insect nature bug
🐝 honeybee animal insect nature bug spring honey
🐞 lady beetle animal insect nature ladybug
🦗 cricket animal cricket chirp
🕷️ spider animal arachnid
🕸️ spider web animal insect arachnid silk
🦂 scorpion animal arachnid
🦟 mosquito animal nature insect malaria
🦠 microbe amoeba bacteria germs virus
💐 bouquet flowers nature spring
🌸 cherry blossom nature plant spring flower
💮 white flower japanese spring
🏵️ rosette flower decoration military
🌹 rose flowers valentines love spring
🥀 wilted flower plant nature flower
🌺 hibiscus plant vegetable flowers beach
🌻 sunflower nature plant fall
🌼 blossom nature flowers yellow
🌷 tulip flowers plant nature summer spring
🌱 seedling plant nature grass lawn spring
🌲 evergreen tree plant nature
🌳 deciduous tree plant nature
🌴 palm tree plant vegetable nature summer beach mojito tropical
🌵 cactus vegetable plant nature
🌾 sheaf of rice nature plant
🌿 herb vegetable plant medicine weed grass lawn
☘️ shamrock vegetable plant nature irish clover
🍀 four leaf clover vegetable plant nature lucky irish
🍁 maple leaf nature plant vegetable ca fall
🫜 root Vegetable
🍂 fallen leaf nature plant vegetable leaves
🪾 Leafless Tree
🍃 leaf fluttering in wind nature plant tree vegetable grass lawn spring
🍇 grapes fruit food wine
🍈 melon fruit nature food
🍉 watermelon fruit food picnic summer
🍊 tangerine food fruit nature orange
🍋 lemon fruit nature
🍌 banana fruit food monkey
🍍 pineapple fruit nature food
🥭 mango fruit food tropical
🍎 red apple fruit mac school
🍏 green apple fruit nature
🍐 pear fruit nature food
🍑 peach fruit nature food
🍒 cherries food fruit
🍓 strawberry fruit food nature
🥝 kiwi fruit fruit food
🍅 tomato fruit vegetable nature food
🥥 coconut fruit nature food palm
🥑 avocado fruit food
🍆 eggplant vegetable nature food aubergine
🥔 potato food tuber vegatable starch
🥕 carrot vegetable food orange
🌽 ear of corn food vegetable plant
🌶️ hot pepper food spicy chilli chili
🥒 cucumber fruit food pickle
🥬 leafy green food vegetable plant bok choy cabbage kale lettuce
🥦 broccoli fruit food vegetable
🧄 garlic food spice cook
🧅 onion cook food spice
🍄 mushroom plant vegetable
🥜 peanuts food nut
🌰 chestnut food squirrel
🍞 bread food wheat breakfast toast
🥐 croissant food bread french
🥖 baguette bread food bread french
🥨 pretzel food bread twisted
🥯 bagel food bread bakery schmear
🥞 pancakes food breakfast flapjacks hotcakes
🧇 waffle food breakfast
🧀 cheese wedge food chadder
🍖 meat on bone good food drumstick
🍗 poultry leg food meat drumstick bird chicken turkey
🥩 cut of meat food cow meat cut chop lambchop porkchop
🥓 bacon food breakfast pork pig meat
🍔 hamburger meat fast food beef cheeseburger mcdonalds burger king
🍟 french fries chips snack fast food
🍕 pizza food party
🌭 hot dog food frankfurter
🥪 sandwich food lunch bread
🌮 taco food mexican
🌯 burrito food mexican
🥙 stuffed flatbread food flatbread stuffed gyro
🧆 falafel food
🥚 egg food chicken breakfast
🍳 cooking food breakfast kitchen egg
🥘 shallow pan of food food cooking casserole paella
🍲 pot of food food meat soup
🥣 bowl with spoon food breakfast cereal oatmeal porridge
🥗 green salad food healthy lettuce
🍿 popcorn food movie theater films snack
🧈 butter food cook
🧂 salt condiment shaker
🥫 canned food food soup
🍱 bento box food japanese box
🍘 rice cracker food japanese
🍙 rice ball food japanese
🍚 cooked rice food china asian
🍛 curry rice food spicy hot indian
🍜 steaming bowl food japanese noodle chopsticks
🍝 spaghetti food italian noodle
🍠 roasted sweet potato food nature
🍢 oden food japanese
🍣 sushi food fish japanese rice
🍤 fried shrimp food anima
Download .txt
gitextract_i8z07tjz/

├── .config/
│   ├── fish/
│   │   ├── aliases.fish
│   │   ├── completions/
│   │   │   └── pipx.fish
│   │   ├── config.fish
│   │   └── functions/
│   │       ├── android-studio-wayland.fish
│   │       ├── flutter-watch.fish
│   │       ├── sessionizer.fish
│   │       └── yazi.fish
│   ├── fuzzel/
│   │   └── fuzzel.ini
│   ├── geary/
│   │   └── user-style.css
│   ├── ghostty/
│   │   └── config
│   ├── kanshi/
│   │   └── config
│   ├── kitty/
│   │   └── kitty.conf
│   ├── mako/
│   │   ├── colors
│   │   └── config
│   ├── mpd/
│   │   └── mpd.conf
│   ├── mpdscribble/
│   │   └── mpdscribble.conf
│   ├── niri/
│   │   └── config.kdl
│   ├── nvim/
│   │   ├── .luarc.json
│   │   ├── after/
│   │   │   └── ftplugin/
│   │   │       ├── css.lua
│   │   │       ├── dart.lua
│   │   │       ├── go.lua
│   │   │       ├── html.lua
│   │   │       ├── javascript.lua
│   │   │       ├── lua.lua
│   │   │       ├── python.lua
│   │   │       └── typescript.lua
│   │   ├── init.lua
│   │   ├── lua/
│   │   │   ├── config/
│   │   │   │   ├── autocmd.lua
│   │   │   │   ├── keymaps.lua
│   │   │   │   ├── lazy.lua
│   │   │   │   └── options.lua
│   │   │   ├── plugins/
│   │   │   │   ├── ai.lua
│   │   │   │   ├── alpha.lua
│   │   │   │   ├── cmp.lua
│   │   │   │   ├── color-picker.lua
│   │   │   │   ├── colorscheme.lua
│   │   │   │   ├── dap.lua
│   │   │   │   ├── flutter.lua
│   │   │   │   ├── fzf.lua
│   │   │   │   ├── git.lua
│   │   │   │   ├── lsp-config.lua
│   │   │   │   ├── mini.lua
│   │   │   │   ├── navigation.lua
│   │   │   │   ├── nvim-tree.lua
│   │   │   │   ├── preview.lua
│   │   │   │   ├── sloat.lua
│   │   │   │   ├── treesitter.lua
│   │   │   │   ├── trouble.lua
│   │   │   │   ├── ui.lua
│   │   │   │   └── yazi.lua
│   │   │   ├── servers/
│   │   │   │   ├── bashls.lua
│   │   │   │   ├── dockerls.lua
│   │   │   │   ├── efm-langserver.lua
│   │   │   │   ├── emmet_ls.lua
│   │   │   │   ├── gopls.lua
│   │   │   │   ├── init.lua
│   │   │   │   ├── jsonls.lua
│   │   │   │   ├── lua_ls.lua
│   │   │   │   ├── pyright.lua
│   │   │   │   ├── tailwindcss.lua
│   │   │   │   ├── ts_ls.lua
│   │   │   │   └── yamlls.lua
│   │   │   └── utils/
│   │   │       ├── diagnostics.lua
│   │   │       └── lsp.lua
│   │   └── stylua.toml
│   ├── rmpc/
│   │   ├── config.ron
│   │   ├── fetch-lyrics
│   │   └── themes/
│   │       └── theme.ron
│   ├── starship.toml
│   ├── sway/
│   │   └── config
│   ├── swayidle/
│   │   └── config
│   ├── swaylock/
│   │   └── config
│   ├── waybar/
│   │   ├── config.jsonc
│   │   └── style.css
│   └── yazi/
│       └── theme.toml
├── .github/
│   └── FUNDING.yml
├── .gitignore
├── .tmux.conf
├── LICENSE
├── README.md
└── Scripts/
    ├── add-audio
    ├── audio-switch
    ├── battery-monitor
    ├── beats
    ├── choose-shell
    ├── clone
    ├── code-in-tmux
    ├── dual-dac
    ├── flutter-post-upgrade
    ├── fuzzel-emoji
    ├── ide
    ├── ignore-power-button
    ├── indicator-record
    ├── kanshi-switch
    ├── launch-webapp
    ├── open_github
    ├── powermenu
    ├── restart-app
    ├── run-scrcpy
    ├── screenrecord
    ├── screenshot
    ├── sessionX
    ├── set-wallpaper
    ├── set-wallpaper-new
    ├── setup-dns
    ├── setup-greetd
    ├── toggle-output
    ├── toggle-terminal-transparency
    ├── toggle-waybar
    ├── toggle-wlsunset
    ├── webapp-install
    ├── webapp-remove
    └── webapps
Condensed preview — 113 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (303K chars).
[
  {
    "path": ".config/fish/aliases.fish",
    "chars": 2524,
    "preview": "# ┌─────────┐\n# │ Aliases │\n# └─────────┘\n\n# ── Listing ──\nalias ls 'eza -1 --icons=auto'\nalias l 'eza -lh --icons=auto'"
  },
  {
    "path": ".config/fish/completions/pipx.fish",
    "chars": 484,
    "preview": "\nfunction __fish_pipx_complete\n    set -x _ARGCOMPLETE 1\n    set -x _ARGCOMPLETE_DFS \\t\n    set -x _ARGCOMPLETE_IFS \\n\n "
  },
  {
    "path": ".config/fish/config.fish",
    "chars": 641,
    "preview": "set -g fish_greeting\nfish_default_key_bindings\n\n# Environment\nset -gx EDITOR nvim\nset -gx SUDO_EDITOR $EDITOR\nset -gx VI"
  },
  {
    "path": ".config/fish/functions/android-studio-wayland.fish",
    "chars": 81,
    "preview": "function android-studio-wayland\n    env GDK_BACKEND=x11 android-studio $argv\nend\n"
  },
  {
    "path": ".config/fish/functions/flutter-watch.fish",
    "chars": 436,
    "preview": "function flutter-watch\n    # Ensure the temp file for the PID is available\n    set pid_file \"/tmp/tf1.pid\"\n    touch $pi"
  },
  {
    "path": ".config/fish/functions/sessionizer.fish",
    "chars": 91,
    "preview": "function sessionizer --description \"Launch sessionX script\"\n    $HOME/Scripts/sessionX\nend\n"
  },
  {
    "path": ".config/fish/functions/yazi.fish",
    "chars": 297,
    "preview": "# yazi shell wrapper (change the current working directory when exiting Yazi)\nfunction y\n    set tmp (mktemp -t \"yazi-cw"
  },
  {
    "path": ".config/fuzzel/fuzzel.ini",
    "chars": 549,
    "preview": "[main]\nfont=Inter:size=9.5\nwidth=28\nlines=8\nanchor=center\nprompt=\"> \"\nterminal=kitty\nicon-theme=Papirus-Dark\nicons-enabl"
  },
  {
    "path": ".config/geary/user-style.css",
    "chars": 322,
    "preview": "@media (prefers-color-scheme: dark) {\n  :root,\n  body,\n  *:not(a) {\n    background-color: #1e1e1e !important;\n    color:"
  },
  {
    "path": ".config/ghostty/config",
    "chars": 1282,
    "preview": "# Fonts\nfont-family = \"JetBrainsMono Nerd Font\"\nfont-style = Medium\nfont-size = 11\n\n# Mouse\nmouse-hide-while-typing = tr"
  },
  {
    "path": ".config/kanshi/config",
    "chars": 779,
    "preview": "# swaymsg -t get_outputs  →  check output names & modes\n# kanshictl switch <name>  →  switch to a profile by name\n\nprofi"
  },
  {
    "path": ".config/kitty/kitty.conf",
    "chars": 776,
    "preview": "# Fonts\nfont_family JetBrainsMono Nerd Font\nbold_italic_font auto\nfont_size 11\n\n# Window\nwindow_padding_width 0 5\n# back"
  },
  {
    "path": ".config/mako/colors",
    "chars": 67,
    "preview": "background-color=#0d0d0dee\ntext-color=#c1c1c1\nborder-color=#b3c7cc\n"
  },
  {
    "path": ".config/mako/config",
    "chars": 262,
    "preview": "include=~/.config/mako/colors\nsort=-time\nlayer=overlay\nwidth=320\nheight=100\nborder-size=0\nborder-radius=4\nmargin=10\npadd"
  },
  {
    "path": ".config/mpd/mpd.conf",
    "chars": 507,
    "preview": "# ~/.config/mpd/mpd.conf\n\nmusic_directory     \"~/Music/mpd\"\nplaylist_directory  \"~/Music/Playlists\"\n\nauto_update        "
  },
  {
    "path": ".config/mpdscribble/mpdscribble.conf",
    "chars": 113,
    "preview": "[last.fm]\nurl = https://post.audioscrobbler.com/\nusername = YOUR_LASTFM_USERNAME\npassword = YOUR_LASTFM_PASSWORD\n"
  },
  {
    "path": ".config/niri/config.kdl",
    "chars": 21451,
    "preview": "// Niri Configuration\n// https://github.com/YaLTeR/niri/wiki/Configuration\n\n// ╭────────────────────────────────────────"
  },
  {
    "path": ".config/nvim/.luarc.json",
    "chars": 37,
    "preview": "{\n  \"diagnostics.globals\": [\"vim\"]\n}\n"
  },
  {
    "path": ".config/nvim/after/ftplugin/css.lua",
    "chars": 116,
    "preview": "vim.opt_local.shiftwidth = 2\nvim.opt_local.tabstop = 2\nvim.opt_local.softtabstop = 2\nvim.opt_local.expandtab = true\n"
  },
  {
    "path": ".config/nvim/after/ftplugin/dart.lua",
    "chars": 116,
    "preview": "vim.opt_local.shiftwidth = 2\nvim.opt_local.tabstop = 2\nvim.opt_local.softtabstop = 2\nvim.opt_local.expandtab = true\n"
  },
  {
    "path": ".config/nvim/after/ftplugin/go.lua",
    "chars": 117,
    "preview": "vim.opt_local.shiftwidth = 4\nvim.opt_local.tabstop = 4\nvim.opt_local.softtabstop = 4\nvim.opt_local.expandtab = false\n"
  },
  {
    "path": ".config/nvim/after/ftplugin/html.lua",
    "chars": 116,
    "preview": "vim.opt_local.shiftwidth = 2\nvim.opt_local.tabstop = 2\nvim.opt_local.softtabstop = 2\nvim.opt_local.expandtab = true\n"
  },
  {
    "path": ".config/nvim/after/ftplugin/javascript.lua",
    "chars": 116,
    "preview": "vim.opt_local.shiftwidth = 2\nvim.opt_local.tabstop = 2\nvim.opt_local.softtabstop = 2\nvim.opt_local.expandtab = true\n"
  },
  {
    "path": ".config/nvim/after/ftplugin/lua.lua",
    "chars": 116,
    "preview": "vim.opt_local.shiftwidth = 2\nvim.opt_local.tabstop = 2\nvim.opt_local.softtabstop = 2\nvim.opt_local.expandtab = true\n"
  },
  {
    "path": ".config/nvim/after/ftplugin/python.lua",
    "chars": 116,
    "preview": "vim.opt_local.shiftwidth = 4\nvim.opt_local.tabstop = 4\nvim.opt_local.softtabstop = 4\nvim.opt_local.expandtab = true\n"
  },
  {
    "path": ".config/nvim/after/ftplugin/typescript.lua",
    "chars": 116,
    "preview": "vim.opt_local.shiftwidth = 2\nvim.opt_local.tabstop = 2\nvim.opt_local.softtabstop = 2\nvim.opt_local.expandtab = true\n"
  },
  {
    "path": ".config/nvim/init.lua",
    "chars": 54,
    "preview": "vim.opt.termguicolors = true\n\nrequire(\"config.lazy\")\n\n"
  },
  {
    "path": ".config/nvim/lua/config/autocmd.lua",
    "chars": 2241,
    "preview": "-- ================================================================================================\n-- TITLE : auto-comm"
  },
  {
    "path": ".config/nvim/lua/config/keymaps.lua",
    "chars": 3336,
    "preview": "-- Set leader key\nvim.g.mapleader = \" \"\nvim.g.maplocalleader = \" \"\n\n-- Keymap helper\nlocal set = vim.keymap.set\nlocal op"
  },
  {
    "path": ".config/nvim/lua/config/lazy.lua",
    "chars": 625,
    "preview": "-- Install lazy.nvim\nlocal lazypath = vim.fn.stdpath \"data\" .. \"/lazy/lazy.nvim\"\nif not vim.loop.fs_stat(lazypath) then\n"
  },
  {
    "path": ".config/nvim/lua/config/options.lua",
    "chars": 3206,
    "preview": "vim.opt.fillchars = { eob = \" \" }\nvim.opt.winbar = nil\nvim.o.hlsearch = false -- Set highlight on search\nvim.wo.number ="
  },
  {
    "path": ".config/nvim/lua/plugins/ai.lua",
    "chars": 3140,
    "preview": "return {\n  {\n    \"Exafunction/windsurf.nvim\",\n    dependencies = {\n      \"nvim-lua/plenary.nvim\",\n      \"hrsh7th/nvim-cm"
  },
  {
    "path": ".config/nvim/lua/plugins/alpha.lua",
    "chars": 15514,
    "preview": "-- Startup screen\nreturn {\n  \"goolord/alpha-nvim\",\n  dependencies = {\n    \"echasnovski/mini.icons\",\n  },\n\n  config = fun"
  },
  {
    "path": ".config/nvim/lua/plugins/cmp.lua",
    "chars": 2029,
    "preview": "-- Autocompletion\nreturn {\n  \"hrsh7th/nvim-cmp\",\n  dependencies = {\n    \"onsails/lspkind.nvim\", -- Adds VS Code-like pic"
  },
  {
    "path": ".config/nvim/lua/plugins/color-picker.lua",
    "chars": 723,
    "preview": "return {\n  {\n    \"eero-lehtinen/oklch-color-picker.nvim\",\n    event = \"VeryLazy\",\n    -- version = \"*\", -- Pinning versi"
  },
  {
    "path": ".config/nvim/lua/plugins/colorscheme.lua",
    "chars": 734,
    "preview": "return {\n  { \"ellisonleao/gruvbox.nvim\", lazy = true, opts = { transparent_mode = true } },\n  { \"folke/tokyonight.nvim\","
  },
  {
    "path": ".config/nvim/lua/plugins/dap.lua",
    "chars": 2000,
    "preview": "-- Debug Adapter Protocol (DAP) - Centralized debugging for all languages\n-- Supports: Flutter/Dart (via flutter-tools),"
  },
  {
    "path": ".config/nvim/lua/plugins/flutter.lua",
    "chars": 1878,
    "preview": "-- Flutter development tools\n-- NOTE: This plugin manages dartls LSP - do NOT configure dartls separately\n-- NOTE: Debug"
  },
  {
    "path": ".config/nvim/lua/plugins/fzf.lua",
    "chars": 1778,
    "preview": "-- Fuzzy finder (fzf gets the job done, never needed telescope)\nreturn {\n  \"ibhagwan/fzf-lua\",\n  cmd = \"FzfLua\",\n  depen"
  },
  {
    "path": ".config/nvim/lua/plugins/git.lua",
    "chars": 1967,
    "preview": "return {\n  -- git tui\n  {\n    \"kdheepak/lazygit.nvim\",\n    dependencies = { \"nvim-lua/plenary.nvim\" },\n    cmd = {\n     "
  },
  {
    "path": ".config/nvim/lua/plugins/lsp-config.lua",
    "chars": 2081,
    "preview": "return {\n  -- Auto-install LSPs, formatters, linters via Mason on startup\n  {\n    \"WhoIsSethDaniel/mason-tool-installer."
  },
  {
    "path": ".config/nvim/lua/plugins/mini.lua",
    "chars": 930,
    "preview": "return {\n  { \"echasnovski/mini.ai\", version = \"*\", opts = {} },\n  { \"echasnovski/mini.icons\", opts = {} },\n  { \"echasnov"
  },
  {
    "path": ".config/nvim/lua/plugins/navigation.lua",
    "chars": 1263,
    "preview": "return {\n  -- Tmux integration\n  {\n    \"christoomey/vim-tmux-navigator\",\n    cmd = {\n      \"TmuxNavigateLeft\",\n      \"Tm"
  },
  {
    "path": ".config/nvim/lua/plugins/nvim-tree.lua",
    "chars": 1088,
    "preview": "-- File explorer (rarely used, mainly for screensharing)\nreturn\n{\n  \"nvim-tree/nvim-tree.lua\",\n  cmd = { \"NvimTreeToggle"
  },
  {
    "path": ".config/nvim/lua/plugins/preview.lua",
    "chars": 1086,
    "preview": "-- Preview tools\nreturn {\n  -- HTML preview\n  {\n    \"barrett-ruth/live-server.nvim\",\n    build = \"npm install -g live-se"
  },
  {
    "path": ".config/nvim/lua/plugins/sloat.lua",
    "chars": 455,
    "preview": "return {\n  \"vyrx-dev/sloat\",\n  opts = {\n    float = {\n      width = 0.4, -- bigger float\n      height = 0.5,\n      borde"
  },
  {
    "path": ".config/nvim/lua/plugins/treesitter.lua",
    "chars": 912,
    "preview": "-- Syntax highlighting\nreturn {\n  \"nvim-treesitter/nvim-treesitter\",\n  branch = \"main\",\n  build = \":TSUpdate\",\n  event ="
  },
  {
    "path": ".config/nvim/lua/plugins/trouble.lua",
    "chars": 818,
    "preview": "-- Diagnostics viewer\nreturn {\n  \"folke/trouble.nvim\",\n  opts = {}, -- for default options, refer to the configuration s"
  },
  {
    "path": ".config/nvim/lua/plugins/ui.lua",
    "chars": 2774,
    "preview": "-- UI enhancements\nreturn {\n  -- focus mode (hide everything except the the file)\n  {\n    \"folke/zen-mode.nvim\",\n    cmd"
  },
  {
    "path": ".config/nvim/lua/plugins/yazi.lua",
    "chars": 477,
    "preview": "-- Yazi file manager\nreturn {\n  \"mikavilpas/yazi.nvim\",\n  event = \"VeryLazy\",\n  keys = {\n    { \"sf\", \"<cmd>Yazi<cr>\", de"
  },
  {
    "path": ".config/nvim/lua/servers/bashls.lua",
    "chars": 569,
    "preview": "-- ================================================================================================\n-- TITLE : bashls (B"
  },
  {
    "path": ".config/nvim/lua/servers/dockerls.lua",
    "chars": 580,
    "preview": "-- ================================================================================================\n-- TITLE : dockerls "
  },
  {
    "path": ".config/nvim/lua/servers/efm-langserver.lua",
    "chars": 2838,
    "preview": "-- ================================================================================================\n-- TITLE : efm-langs"
  },
  {
    "path": ".config/nvim/lua/servers/emmet_ls.lua",
    "chars": 781,
    "preview": "-- ================================================================================================\n-- TITLE : emmet_ls "
  },
  {
    "path": ".config/nvim/lua/servers/gopls.lua",
    "chars": 562,
    "preview": "-- ================================================================================================\n-- TITLE : gopls (Go"
  },
  {
    "path": ".config/nvim/lua/servers/init.lua",
    "chars": 740,
    "preview": "local capabilities = require(\"cmp_nvim_lsp\").default_capabilities()\n\n-- Language Server Protocol (LSP)\nrequire \"servers."
  },
  {
    "path": ".config/nvim/lua/servers/jsonls.lua",
    "chars": 574,
    "preview": "-- ================================================================================================\n-- TITLE : jsonls (J"
  },
  {
    "path": ".config/nvim/lua/servers/lua_ls.lua",
    "chars": 762,
    "preview": "-- ================================================================================================\n-- TITLE : lua_ls (L"
  },
  {
    "path": ".config/nvim/lua/servers/pyright.lua",
    "chars": 872,
    "preview": "-- ================================================================================================\n-- TITLE : pyright ("
  },
  {
    "path": ".config/nvim/lua/servers/tailwindcss.lua",
    "chars": 648,
    "preview": "-- ================================================================================================\n-- TITLE : tailwindc"
  },
  {
    "path": ".config/nvim/lua/servers/ts_ls.lua",
    "chars": 750,
    "preview": "-- ================================================================================================\n-- TITLE : ts_ls (Ty"
  },
  {
    "path": ".config/nvim/lua/servers/yamlls.lua",
    "chars": 844,
    "preview": "-- ================================================================================================\n-- TvITLE : yamlls ("
  },
  {
    "path": ".config/nvim/lua/utils/diagnostics.lua",
    "chars": 440,
    "preview": "local M = {}\n\nlocal diagnostic_signs = {\n\tError = \" \",\n\tWarn = \" \",\n\tHint = \"\",\n\tInfo = \"\",\n}\n\nM.setup = function()\n"
  },
  {
    "path": ".config/nvim/lua/utils/lsp.lua",
    "chars": 2633,
    "preview": "local M = {}\n\nM.on_attach = function(event)\n  local client = vim.lsp.get_client_by_id(event.data.client_id)\n  if not cli"
  },
  {
    "path": ".config/nvim/stylua.toml",
    "chars": 67,
    "preview": "indent_type = \"Spaces\"\nindent_width = 2\nno_call_parentheses = true\n"
  },
  {
    "path": ".config/rmpc/config.ron",
    "chars": 4756,
    "preview": "#![enable(implicit_some)]\n#![enable(unwrap_newtypes)]\n#![enable(unwrap_variant_newtypes)]\n(\n    address: \"127.0.0.1:6600"
  },
  {
    "path": ".config/rmpc/fetch-lyrics",
    "chars": 1933,
    "preview": "#!/bin/sh\n\n# ═══════════════════════════════════════════════════════════\n# rmpc on_song_change script\n# - Sends desktop "
  },
  {
    "path": ".config/rmpc/themes/theme.ron",
    "chars": 5200,
    "preview": "#![enable(implicit_some)]\n#![enable(unwrap_newtypes)]\n#![enable(unwrap_variant_newtypes)]\n(\n    default_album_art_path: "
  },
  {
    "path": ".config/starship.toml",
    "chars": 1175,
    "preview": "# Symphony by vyrx\n# Theme: Espresso Harmony\n\n\"$schema\" = 'https://starship.rs/config-schema.json'\n\nadd_newline = true\nc"
  },
  {
    "path": ".config/sway/config",
    "chars": 11610,
    "preview": "# Sway Configuration\n# man 5 sway\n\n\n# ╭───────────────────────────────────────────────────────────────────────╮\n# │ STAR"
  },
  {
    "path": ".config/swayidle/config",
    "chars": 340,
    "preview": "# swayidle configuration file\n# Idle timeout events for Sway\n\n# Lock screen after 5 minutes (300 seconds) of inactivity\n"
  },
  {
    "path": ".config/swaylock/config",
    "chars": 675,
    "preview": "# --- Appearance & Blur ---\n# image=~/Wallpapers/monochrome/mac__.jpg\nscreenshots\nclock\nindicator\nindicator-radius=100\ni"
  },
  {
    "path": ".config/waybar/config.jsonc",
    "chars": 2856,
    "preview": "{\n  \"reload_style_on_change\": true,\n  \"layer\": \"top\",\n  \"position\": \"bottom\",\n  \"spacing\": 0,\n  \"height\": 28,\n  \"modules"
  },
  {
    "path": ".config/waybar/style.css",
    "chars": 2230,
    "preview": "/* colors */\n@define-color waybar-bg #121212;\n@define-color waybar-fg #d0d0d0;\n\n@define-color waybar-warning #7a8b6e;\n@d"
  },
  {
    "path": ".config/yazi/theme.toml",
    "chars": 3160,
    "preview": "# Symphony by vyrx\n# Theme: Black Metal\n# https://github.com/vyrx-dev\n\n# : Manager [[[\n\n[mgr]\ncwd = { fg = \"#c1c1c1\" }\n\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 889,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".gitignore",
    "chars": 160,
    "preview": "# Fish shell auto-generated files\n.config/fish/fish_variables\n\n# Neovim plugin lock (auto-generated)\n.config/nvim/lazy-l"
  },
  {
    "path": ".tmux.conf",
    "chars": 3825,
    "preview": "set -g default-terminal \"tmux-256color\"\nset -ag terminal-overrides \",xterm-256color:RGB\"\n\n####  PREFIX KEY ####\nunbind C"
  },
  {
    "path": "LICENSE",
    "chars": 1061,
    "preview": "MIT License\n\nCopyright (c) 2026 Amit\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof th"
  },
  {
    "path": "README.md",
    "chars": 963,
    "preview": "# dotfiles\n\nThis is a fairly boring setup focused on development work. Feel free to use whatever you would like from it,"
  },
  {
    "path": "Scripts/add-audio",
    "chars": 1399,
    "preview": "#!/bin/bash\n\necho \"Usage: add-audio video.mp4 audio.flac name=\\\"output.mp4\\\"\"\necho \"Supports: mp4, mkv, avi, mov, webm ("
  },
  {
    "path": "Scripts/audio-switch",
    "chars": 1936,
    "preview": "#!/bin/bash\n\nfocused_monitor=\"$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')\"\n\nsinks=$(pactl -f js"
  },
  {
    "path": "Scripts/battery-monitor",
    "chars": 1528,
    "preview": "#!/bin/bash\n\nCHECK_INTERVAL=60\nNOTIFY_LEVELS=(20 15)\nLOCK_LEVEL=10\nLOCK_TIMEOUT=30\n\nget_battery_path() {\n\tfor bat in /sy"
  },
  {
    "path": "Scripts/beats",
    "chars": 2501,
    "preview": "#!/bin/bash\n\nFUZZEL_OPTS=\"--dmenu --index\"\n\ndeclare -A stations=(\n\t[\"Radio - Lofi Girl\"]=\"https://play.streamafrica.net/"
  },
  {
    "path": "Scripts/choose-shell",
    "chars": 730,
    "preview": "#!/usr/bin/env bash\n\nBOLD='\\e[1m'\nYELLOW='\\e[93m'\nGREEN='\\e[92m'\nRESET='\\e[0m'\n\ninfo()  { echo -e \"${BOLD}${YELLOW}$1${R"
  },
  {
    "path": "Scripts/clone",
    "chars": 317,
    "preview": "#!/bin/bash\n\ncd \"$HOME/Git/\" || exit\n\necho \"Enter git repository URL to clone:\"\nread repo_url\n\ngit clone \"$repo_url\"\n\nre"
  },
  {
    "path": "Scripts/code-in-tmux",
    "chars": 564,
    "preview": "#!/bin/bash\n\nPROJECT_DIR=\"$HOME/Projects/flutter_projects/cloud\"\nSESSION_NAME=$(basename \"$PROJECT_DIR\")\n\nif tmux has-se"
  },
  {
    "path": "Scripts/dual-dac",
    "chars": 11899,
    "preview": "#!/usr/bin/env bash\n#\n# ============================================================================\n# dual-dac - Mirror"
  },
  {
    "path": "Scripts/flutter-post-upgrade",
    "chars": 484,
    "preview": "#!/bin/bash\n\nflutter clean\necho\necho ✅ flutter clean → Wipes stale build files\necho\n\nflutter pub get\necho\necho ✅ flutter"
  },
  {
    "path": "Scripts/fuzzel-emoji",
    "chars": 81505,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nMODE=\"${1:-type}\"\n\nemoji=\"$(sed '1,/^### DATA ###$/d' \"$0\" | fuzzel --match-mode "
  },
  {
    "path": "Scripts/ide",
    "chars": 181,
    "preview": "#!/bin/bash\ntmux split-window -h -l 30%\n# tmux select-pane -L #focus the winidow to the left\n# tmux split-window -v -l 3"
  },
  {
    "path": "Scripts/ignore-power-button",
    "chars": 181,
    "preview": "#!/bin/bash\n\n# Disable shutting system down on power button to bind it to power menu afterwards\nsudo sed -i 's/.*HandleP"
  },
  {
    "path": "Scripts/indicator-record",
    "chars": 166,
    "preview": "#!/bin/bash\n\nif pgrep -f \"^gpu-screen-recorder\" >/dev/null; then\n  echo '{\"text\": \"󰻂\", \"tooltip\": \"Stop recording\", \"cla"
  },
  {
    "path": "Scripts/kanshi-switch",
    "chars": 448,
    "preview": "#!/bin/bash\n\npick=$(gum choose --no-show-help \\\n    \"← Laptop  → Monitor\" \\\n    \"↑ Monitor  ↓ Laptop\" \\\n    \"← Monitor  "
  },
  {
    "path": "Scripts/launch-webapp",
    "chars": 648,
    "preview": "#!/bin/bash\n\n# Auto-detect VA-API driver for hardware video acceleration\nif lspci | grep -qi \"VGA.*AMD\\|Radeon\"; then\n\te"
  },
  {
    "path": "Scripts/open_github",
    "chars": 545,
    "preview": "#!/usr/bin/env bash\n\n# Open the current repository in the browser\n\n# Get current tmux pane directory or fallback to pwd\n"
  },
  {
    "path": "Scripts/powermenu",
    "chars": 312,
    "preview": "#!/bin/bash\n\nscrDir=\"$HOME/.config/hypr/scripts\"\n\noptions=\"Shutdown\\nReboot\\nSuspend\\nLogout\"\n\nchoice=$(echo -e \"$option"
  },
  {
    "path": "Scripts/restart-app",
    "chars": 53,
    "preview": "#!/bin/bash\n\npkill -x $1\nsetsid $1 >/dev/null 2>&1 &\n"
  },
  {
    "path": "Scripts/run-scrcpy",
    "chars": 1001,
    "preview": "#!/bin/bash\n\n# Cleanup existing sessions\nif pgrep -x \"scrcpy\" > /dev/null; then\n    pkill -9 scrcpy\n    sleep 0.5\nfi\n\n# "
  },
  {
    "path": "Scripts/screenrecord",
    "chars": 3799,
    "preview": "#!/bin/bash\n\n[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs\nOUTPUT_DIR=\"${XDG_VIDEOS_DIR:-$HOME/Vi"
  },
  {
    "path": "Scripts/screenshot",
    "chars": 1621,
    "preview": "#!/bin/bash\n\nOUTPUT_DIR=\"$HOME/Pictures/Screenshots\"\nmkdir -p \"$OUTPUT_DIR\"\n\npkill -0 slurp 2>/dev/null && exit 0\n\n# Det"
  },
  {
    "path": "Scripts/sessionX",
    "chars": 1028,
    "preview": "#!/bin/bash\n# quick tmux session picker with fzf\n\ndirs=(\n\t\"$HOME/Downloads\"\n\t\"$HOME/Documents\"\n\t\"$HOME/Testing-repo\"\n\t\"$"
  },
  {
    "path": "Scripts/set-wallpaper",
    "chars": 801,
    "preview": "#!/bin/bash\n\nWALLPAPER_DIR=\"$HOME/Pictures/Wallpapers/\"\n\ncase \"${1:-}\" in\nrandom)\n\twallpaper=$(find \"$WALLPAPER_DIR\" -ty"
  },
  {
    "path": "Scripts/set-wallpaper-new",
    "chars": 813,
    "preview": "#!/bin/bash\n\nWALLPAPER_DIR=\"$HOME/Pictures/Wallpapers/\"\nWALLPAPER_VERTICAL=\"$WALLPAPER_DIR/Vertical-wallpapers/\"\n\nedp_wa"
  },
  {
    "path": "Scripts/setup-dns",
    "chars": 2446,
    "preview": "#!/bin/bash\n\nif [[ -z $1 ]]; then\n  dns=$(gum choose --height 5 --header \"Select DNS provider\" Cloudflare DHCP Custom)\ne"
  },
  {
    "path": "Scripts/setup-greetd",
    "chars": 1077,
    "preview": "#!/bin/bash\n\necho \"Installing greetd and tuigreet...\"\nsudo pacman -S --needed greetd greetd-tuigreet\n\necho \"Configuring "
  },
  {
    "path": "Scripts/toggle-output",
    "chars": 676,
    "preview": "#!/bin/bash\n# Toggle monitor on/off\n\nOUTPUT=\"$1\"\nSTATE_FILE=\"/tmp/output-${OUTPUT}.state\"\n\n# Only check actual composito"
  },
  {
    "path": "Scripts/toggle-terminal-transparency",
    "chars": 1052,
    "preview": "#!/bin/bash\n\n# Toggle terminal transparency between 1 and 0.8\n# Works for: Kitty, Ghostty, Alacritty\n\nKITTY=\"$HOME/.conf"
  },
  {
    "path": "Scripts/toggle-waybar",
    "chars": 100,
    "preview": "#!/bin/bash\n\nif pgrep -x waybar >/dev/null; then\n\tpkill -x waybar\nelse\n\twaybar >/dev/null 2>&1 &\nfi\n"
  },
  {
    "path": "Scripts/toggle-wlsunset",
    "chars": 223,
    "preview": "#!/bin/bash\n\n# Toggle wlsunset (nightlight)\nif pgrep -x \"wlsunset\" > /dev/null; then\n    pkill wlsunset\n    notify-send "
  },
  {
    "path": "Scripts/webapp-install",
    "chars": 1943,
    "preview": "#!/bin/bash\n# launch_webapp=\"$HOME/dotfiles/scripts/launch-webapp\"\nif [ \"$#\" -lt 3 ]; then\n  echo -e \"\\e[32mLet's create"
  },
  {
    "path": "Scripts/webapp-remove",
    "chars": 963,
    "preview": "#!/bin/bash\n\nAPPS_DIR=\"$HOME/.local/share/applications\"\nICON_DIR=\"$APPS_DIR/icons\"\n\n# Find only webapps (desktop files w"
  },
  {
    "path": "Scripts/webapps",
    "chars": 5955,
    "preview": "#!/bin/bash\n#|---/ /+---------------------+---/ /|#\n#|--/ /-| Symphony Dotfiles   |--/ /-|#\n#|-/ /--| Web Apps Installer"
  }
]

About this extraction

This page contains the full source code of the vyrx-dev/dotfiles GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 113 files (259.9 KB), approximately 79.4k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!