diff --git a/.gitignore b/.gitignore index bc5cf973..bd61f9b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,4 @@ -nvim/.config/nvm/ -nvim/.config/gh/ -nvim/.config/devcert/ -nvim/.config/zsh/ -nvim/.config/github-copilot/ -nvim/.config/nextjs-nodejs/ -nvim/.config/wslu/ -nvim/.config/nvim/plugin/ -shell/.local/share -shell/.local/state -shell/.local/bin +config/nvim/plugin/ .private.sh diff --git a/README.md b/README.md index 69e5c2ab..0a100a16 100644 --- a/README.md +++ b/README.md @@ -1,103 +1,300 @@ -# dotfiles +# Kojarchy -Personal configuration for a productive and aesthetic development environment, focused on Linux (Hyprland) and macOS. +Personal Hyprland desktop environment for Arch Linux, automated from a fresh `archinstall` to a fully configured system in one command. ![demo_1](.github/assets/demo_1.png) ![demo_2](.github/assets/demo_2.png) ![demo_3](.github/assets/demo_3.png) -## ✨ Highlights +## Arch Linux Installation -### 🖥️ Desktop (Linux) +Boot from the Arch ISO and run `archinstall`. Configure these settings (leave anything not mentioned as-is): -- **Window Manager**: [Hyprland](https://hyprland.org/) - A dynamic tiling Wayland compositor. -- **Status Bar**: [Waybar](https://github.com/Alexays/Waybar) with custom modules for Spotify, Tailscale, and Tunnelbear. -- **Widgets**: [Eww](https://github.com/elkowar/eww) for interactive desktop elements like calendars. -- **Launcher**: [Wofi](https://hg.sr.ht/~scoopta/wofi) with a collection of custom utility scripts. -- **Notifications**: [Dunst](https://dunst-project.org/) for lightweight system alerts. +| Section | Option | +|:--------|:-------| +| Mirrors and repositories | Select regions > Your country | +| Disk configuration | Partitioning > Default partitioning layout > Select disk (with space + return) | +| Disk > File system | btrfs (default structure: yes + use compression) | +| Disk > Disk encryption | Encryption type: LUKS + Encryption password + Partitions (select the one) | +| Hostname | Give your computer a name | +| Bootloader | Limine | +| Authentication > Root password | Set yours | +| Authentication > User account | Add a user > Superuser: Yes > Confirm and exit | +| Applications > Audio | pipewire | +| Network configuration | Copy ISO network config | +| Timezone | Set yours | -### ⌨️ Editor +Once done, let `archinstall` finish and reboot into your new system. -- **Neovim**: A modern Lua-based configuration using [lazy.nvim](https://github.com/folke/lazy.nvim). - - Built-in LSP, Treesitter, and snacks.nvim integration. - - Optimized for performance and a seamless coding experience. - - Custom UI components and statuslines. +## Install -### 🛠️ Shell & Tools +After rebooting into your fresh Arch Linux install, run: -- **Terminal**: [Kitty](https://sw.kovidgoyal.net/kitty/) and [Alacritty](https://alacritty.org/) support. -- **Shell**: Zsh with [Starship](https://starship.rs/) prompt. -- **File Manager**: [yazi](https://github.com/sxyazi/yazi) - Blazing fast terminal file manager. -- **Multiplexer**: [Tmux](https://github.com/tmux/tmux) for robust session management. -- **Productivity**: Raycast scripts for macOS automation. +```bash +curl -fsSL https://raw.githubusercontent.com/princejoogie/dotfiles/refs/heads/main/boot.sh | bash +``` -## 📂 Structure +The installer handles everything: packages, configs, services, shell setup, and post-install. -| Folder | Description | -| :------------ | :-------------------------------------------------- | -| `hyprland/` | Hyprland, Waybar, Wofi, and Eww configurations | -| `nvim/` | Neovim configuration (Lua) | -| `shell/` | Shell environment (Zsh, Starship, Tmux, Git) | -| `sddm/` | macOS-inspired login theme | -| `wallpapers/` | A collection of curated high-resolution backgrounds | +## What's Included -## 🚀 Setup +| Component | Tool | +|:----------|:-----| +| Window Manager | [Hyprland](https://hyprland.org/) | +| Status Bar | [Waybar](https://github.com/Alexays/Waybar) with Spotify, Tailscale, Tunnelbear modules | +| Launcher | [Wofi](https://hg.sr.ht/~scoopta/wofi) with custom utility scripts | +| Notifications | [Dunst](https://dunst-project.org/) | +| Wallpaper | [swaybg](https://github.com/swaywm/swaybg) | +| Terminal | [Kitty](https://sw.kovidgoyal.net/kitty/) | +| Shell | Zsh + [oh-my-zsh](https://ohmyz.sh/) + [Starship](https://starship.rs/) | +| Editor | [Neovim](https://neovim.io/) (Lua config, lazy.nvim) | +| File Manager | [yazi](https://github.com/sxyazi/yazi) / [Dolphin](https://apps.kde.org/dolphin/) | +| Multiplexer | [Tmux](https://github.com/tmux/tmux) | +| Version Manager | [mise](https://mise.jdx.dev/) (node, go, python) | +| Display Manager | [SDDM](https://github.com/sddm/sddm) with macOS theme + autologin | +| Theme | Adwaita-dark via gsettings, Catppuccin Mocha accents | -### 1. Clone the repository +## Project Structure -```bash -git clone https://github.com/princejoogie/dotfiles.git ~/dotfiles -cd ~/dotfiles +``` +~/dotfiles/ +├── boot.sh # Bootstrap (curl-pipe-bash entry point) +├── install.sh # Main orchestrator +├── version # Version file (semver) +├── lib/ # Helpers (presentation, logging, errors, packages) +├── install/ +│ ├── preflight/ # Guard checks, mkinitcpio disable, install log setup +│ ├── packaging/ # AUR helper, base/optional packages, fonts +│ ├── config/ # Config deploy, shell, tmux, cargo, neovim, mise, git, +│ │ │ # docker, gtk, gpg, firewall, dns, hardware detection +│ │ └── hardware/ # Network, bluetooth, Intel GPU, wireless regdom, F-keys, +│ │ # touchpad, power profiles +│ ├── services/ # systemd, SDDM, udev +│ ├── post-install/ # Re-enable mkinitcpio, summary, reboot prompt +│ ├── kojarchy-base.packages +│ ├── kojarchy-optional.packages +│ └── kojarchy-cargo.packages +├── config/ # Copied to ~/.config/ on install (user-editable) +│ ├── hypr/ # hyprland.conf, hypridle.conf, hyprlock.conf, hyprsunset.conf +│ ├── waybar/ # Waybar + custom modules +│ ├── wofi/ # Wofi + dmenu scripts +│ ├── dunst/ # Notification config +│ ├── kitty/ # Terminal config +│ ├── nvim/ # Neovim (lazy.nvim, LSP, treesitter) +│ ├── tmux/ # Tmux config +│ ├── yazi/ # File manager theme +│ ├── opencode/ # OpenCode AI config + skills +│ ├── btop/ # System monitor config +│ ├── fontconfig/ # Font rendering (Liberation Sans, JetBrainsMono NF) +│ ├── kojarchy/hooks/ # User-extensible hooks (post-update, font-set) +│ ├── starship.toml # Prompt config +│ ├── chromium-flags.conf # Wayland flags for Chromium +│ ├── brave-flags.conf # Wayland flags for Brave +│ ├── helium-flags.conf # Wayland flags for Helium +│ └── xdg-desktop-portal/ # Portal configs +├── default/ # Stays in repo, sourced at runtime (updated via git pull) +│ ├── hypr/ # autostart, bindings, envs, looknfeel, input, windows +│ │ └── apps/ # App-specific window rules (browser, PiP, Steam, etc.) +│ ├── zsh/ # aliases, envs, init, functions, shell, rc +│ ├── gpg/ # GPG keyserver config (multiple fallbacks) +│ └── systemd/ # Faster shutdown timeout +├── bin/ # CLI utilities -> ~/.local/custom/bin/ +│ ├── kojarchy-menu # Unified gum-based launcher (ALT+SHIFT+SPACE) +│ ├── kojarchy-power-menu # Power menu (lock/reboot/shutdown) +│ ├── kojarchy-update # Update system (git pull + packages + migrations) +│ ├── kojarchy-migrate # Run pending migrations +│ ├── kojarchy-pkg-* # Package management helpers (add, drop, install TUI) +│ ├── kojarchy-cmd-* # Commands (screenshot, screenrecord, audio-switch, reboot, shutdown) +│ ├── kojarchy-restart-* # Restart individual services (waybar, pipewire, bluetooth, etc.) +│ ├── kojarchy-refresh-* # Reset individual configs to defaults +│ ├── kojarchy-font-* # Font management (set, list, current) +│ ├── kojarchy-toggle-* # Toggles (waybar, nightlight, focusmode, RGB) +│ ├── kojarchy-kill-* # Kill process or port (via wofi) +│ ├── kojarchy-open-file # Browse and open files (via wofi) +│ ├── kojarchy-calculator # Wofi calculator +│ ├── kojarchy-camera # Camera viewer +│ ├── kojarchy-lock-screen # Lock screen via hyprlock +│ ├── kojarchy-debug # System debug info dump +│ ├── kojarchy-version # Show version, branch, last package update +│ ├── kojarchy-hook # Run user hooks +│ ├── kojarchy-state # Persistent state management for toggles +│ └── kojarchy-menu-keybindings # Interactive keybinding search (wofi) +├── migrations/ # Timestamped incremental update scripts +├── applications/hidden/ # .desktop files to hide unwanted app launcher entries +├── sddm/macos/ # SDDM macOS theme +├── wallpapers/ # Wallpaper collection +├── system/udev/ # udev rules +└── logo.txt # ASCII art for installer TUI ``` -### 2. Install GNU Stow +## Two-Layer Config System -Ensure `stow` is installed on your system: +Configs are split into two layers: -- **Arch Linux**: `sudo pacman -S stow` -- **macOS**: `brew install stow` +1. **`config/`** -- Copied to `~/.config/` on fresh install. These are your files to customize. They are never overwritten on updates. -### 3. Symlink configurations +2. **`default/`** -- Stays in `~/dotfiles/default/` and is `source`d from the config files at runtime. Updated automatically when you `git pull`. -Use `stow` to link the configurations to your home directory: +This means defaults can be improved upstream without overwriting your personal tweaks. -```bash -# Link core configurations -stow hyprland -stow nvim -stow shell +### Example: Hyprland + +```conf +# ~/.config/hypr/hyprland.conf + +# Source defaults (updated via git pull) +source = ~/dotfiles/default/hypr/autostart.conf +source = ~/dotfiles/default/hypr/bindings.conf +source = ~/dotfiles/default/hypr/envs.conf + +# Your overrides below: +monitor=,2560x1440@240,auto,1 ``` -> [!NOTE] -> For SDDM theme installation, refer to the scripts within the `sddm/` directory. +### Example: Zsh -## 🖱️ Scyrox Mouse Battery (Waybar) +```bash +# ~/.zshrc sources ~/dotfiles/default/zsh/rc +# which loads: aliases, envs, init, functions, shell -This Waybar module reads the Scyrox mouse battery via HID and displays it with a custom icon. +# Add your own customizations at the bottom of ~/.zshrc +``` -### 1. Install dependencies +## Updating -- `bun` (runtime for the script) -- `node-hid` (HID access) +Kojarchy uses a multi-step update system inspired by omarchy: ```bash -bun add -g node-hid +# Full update: pull repo, update packages, run migrations +kojarchy-update + +# Skip confirmation prompt +kojarchy-update -y ``` -### 2. Allow user access to the HID device +The update process runs these steps in order: + +1. **`kojarchy-update-git`** -- Pull latest changes from the repo +2. **`kojarchy-update-time`** -- Sync system clock +3. **`kojarchy-update-system-pkgs`** -- Update official packages (`pacman -Syyu`) +4. **`kojarchy-migrate`** -- Run any pending migrations (incremental system changes) +5. **`kojarchy-update-aur-pkgs`** -- Update AUR packages (via yay) +6. **`kojarchy-update-orphan-pkgs`** -- Remove orphaned packages +7. **`kojarchy-hook post-update`** -- Run user post-update hook +8. **`kojarchy-update-restart`** -- Offer reboot if kernel updated + +For most day-to-day changes, `git pull` is enough. The two-layer system means `default/` changes (keybindings, autostart, shell aliases, etc.) take effect immediately since they're sourced at runtime. + +### Migrations + +Migrations are timestamped shell scripts in `migrations/` that apply one-time system changes during updates. They ensure users who installed earlier get new fixes/features automatically. Each migration runs once and is tracked in `~/.local/state/kojarchy/migrations/`. + +### Refreshing Configs + +If you break a config, reset it to the Kojarchy default: ```bash -sudo cp ~/dotfiles/system/udev/99-scyrox-hidraw.rules /etc/udev/rules.d/ -sudo udevadm control --reload-rules && sudo udevadm trigger -sudo usermod -aG input $USER +kojarchy-refresh-hyprland # Reset all Hyprland configs +kojarchy-refresh-waybar # Reset Waybar config + restart +kojarchy-refresh-hyprlock # Reset lock screen config +kojarchy-refresh-hypridle # Reset idle config + restart +kojarchy-refresh-hyprsunset # Reset night light config + restart +kojarchy-refresh-config waybar/style.css # Reset any specific config file ``` -Log out and back in (or reboot) so the group change takes effect. +A timestamped backup is created before overwriting. -### 3. Verify +## Package Management ```bash -scyrox-battery --device=scyrox --json --no-sudo +kojarchy-pkg-add # Install if missing (pacman) +kojarchy-pkg-drop # Remove if installed +kojarchy-pkg-aur-add # Install from AUR (yay) +kojarchy-pkg-install # Interactive TUI for browsing/installing packages +kojarchy-pkg-remove # Interactive TUI for removing packages +kojarchy-pkg-missing # Check: exit 0 if any are missing +kojarchy-pkg-present # Check: exit 0 if all installed ``` -If that returns JSON, restart Waybar and the module will appear between the mic input and Tailscale. +## Customization + +1. **Edit configs**: Modify files in `~/.config/` directly. They're yours. +2. **Update defaults**: `cd ~/dotfiles && git pull` -- changes propagate automatically since configs source the defaults. +3. **Add overrides**: Uncomment or create override files referenced in the configs (e.g., `~/.config/hypr/overrides.conf`). +4. **Private config**: Add secrets/tokens to `~/.private.sh` (sourced by `~/.zshrc`, gitignored). +5. **Hooks**: Add custom scripts to `~/.config/kojarchy/hooks/` (see `.sample` files). +6. **Font**: Change system-wide monospace font with `kojarchy-font-set ` (list available: `kojarchy-font-list`). + +## Key Bindings + +All bindings use `ALT` as the main modifier. Press `ALT + /` to search all keybindings interactively. + +| Binding | Action | +|:--------|:-------| +| `ALT + Return` | Open terminal | +| `ALT + Space` | App launcher (wofi drun) | +| `ALT + SHIFT + Space` | Kojarchy menu (unified launcher) | +| `ALT + CTRL + Space` | Wofi command launcher | +| `ALT + Q` | Kill active window | +| `ALT + F` | Fullscreen | +| `ALT + V` | Toggle floating | +| `ALT + H/J/K/L` | Focus left/down/up/right | +| `ALT + CTRL + H/J/K/L` | Move window | +| `ALT + CTRL + SHIFT + H/J/K/L` | Resize window | +| `ALT + 1-0` | Switch workspace | +| `ALT + SHIFT + 1-0` | Move to workspace | +| `ALT + S` | Toggle scratchpad | +| `ALT + W` | Toggle waybar | +| `ALT + E` | File manager | +| `ALT + SHIFT + C` | Color picker | +| `ALT + CTRL + L` | Lock screen | +| `ALT + ESCAPE` | Power menu (lock/reboot/shutdown) | +| `ALT + /` | Search keybindings | +| `ALT + ,` | Dismiss notification | +| `ALT + SHIFT + ,` | Dismiss all notifications | +| `ALT + SHIFT + N` | Notification history | +| `Print` | Screenshot (region, edit with satty) | +| `SHIFT + Print` | Screenshot to clipboard | +| `ALT + Print` | Screen recording toggle | +| `ALT + SHIFT + D` | Speech-to-text (hyprwhspr) | + +## Utility Commands + +| Command | Description | +|:--------|:------------| +| `kojarchy-menu` | Unified gum-based launcher for all commands | +| `kojarchy-power-menu` | Power menu (lock/reboot/shutdown) | +| `kojarchy-update` | Full system update | +| `kojarchy-version` | Show version | +| `kojarchy-debug` | System debug info dump | +| `kojarchy-cmd-screenshot` | Take screenshot (region/window/fullscreen) | +| `kojarchy-cmd-screenrecord` | Start/stop screen recording | +| `kojarchy-cmd-audio-switch` | Cycle audio outputs | +| `kojarchy-cmd-reboot` | Graceful reboot (closes windows first) | +| `kojarchy-cmd-shutdown` | Graceful shutdown (closes windows first) | +| `kojarchy-lock-screen` | Lock screen via hyprlock | +| `kojarchy-font-set` | Change system monospace font | +| `kojarchy-menu-keybindings` | Interactive keybinding search | +| `kojarchy-pkg-install` | TUI package browser | +| `kojarchy-toggle-waybar` | Toggle waybar with gaps/rounding | +| `kojarchy-toggle-nightlight` | Toggle hyprsunset nightlight | +| `kojarchy-toggle-focusmode` | Focus mode (black wallpaper, hide UI) | +| `kojarchy-toggle-rgb` | Toggle RGB lights via OpenRGB | +| `kojarchy-kill-process` | Kill a process (via wofi) | +| `kojarchy-kill-port` | Kill a process by port (via wofi) | +| `kojarchy-open-file` | Browse and open files (via wofi) | +| `kojarchy-calculator` | Wofi calculator | +| `kojarchy-camera` | Camera viewer | + +## Optional Packages + +During install, you're prompted to install optional packages including: + +- Gaming (Steam, Prismlauncher, Proton) +- Communication (Discord, Slack, Telegram) +- Productivity (OBS, Blender, Audacity) +- And more + +## Credits + +Installer architecture inspired by [omarchy](https://github.com/basecamp/omarchy). diff --git a/applications/hidden/avahi-discover.desktop b/applications/hidden/avahi-discover.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/avahi-discover.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/bssh.desktop b/applications/hidden/bssh.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/bssh.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/btop.desktop b/applications/hidden/btop.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/btop.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/bvnc.desktop b/applications/hidden/bvnc.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/bvnc.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/cmake-gui.desktop b/applications/hidden/cmake-gui.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/cmake-gui.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/cups.desktop b/applications/hidden/cups.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/cups.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/electron34.desktop b/applications/hidden/electron34.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/electron34.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/electron36.desktop b/applications/hidden/electron36.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/electron36.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/electron37.desktop b/applications/hidden/electron37.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/electron37.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/fcitx5-configtool.desktop b/applications/hidden/fcitx5-configtool.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/fcitx5-configtool.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/fcitx5-wayland-launcher.desktop b/applications/hidden/fcitx5-wayland-launcher.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/fcitx5-wayland-launcher.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/java-java-openjdk.desktop b/applications/hidden/java-java-openjdk.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/java-java-openjdk.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/jconsole-java-openjdk.desktop b/applications/hidden/jconsole-java-openjdk.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/jconsole-java-openjdk.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/jshell-java-openjdk.desktop b/applications/hidden/jshell-java-openjdk.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/jshell-java-openjdk.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/kbd-layout-viewer5.desktop b/applications/hidden/kbd-layout-viewer5.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/kbd-layout-viewer5.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/kcm_fcitx5.desktop b/applications/hidden/kcm_fcitx5.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/kcm_fcitx5.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/kcm_kaccounts.desktop b/applications/hidden/kcm_kaccounts.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/kcm_kaccounts.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/kvantummanager.desktop b/applications/hidden/kvantummanager.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/kvantummanager.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/org.fcitx.Fcitx5.desktop b/applications/hidden/org.fcitx.Fcitx5.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/org.fcitx.Fcitx5.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/org.fcitx.fcitx5-config-qt.desktop b/applications/hidden/org.fcitx.fcitx5-config-qt.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/org.fcitx.fcitx5-config-qt.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/org.fcitx.fcitx5-migrator.desktop b/applications/hidden/org.fcitx.fcitx5-migrator.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/org.fcitx.fcitx5-migrator.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/org.fcitx.fcitx5-qt5-gui-wrapper.desktop b/applications/hidden/org.fcitx.fcitx5-qt5-gui-wrapper.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/org.fcitx.fcitx5-qt5-gui-wrapper.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/org.fcitx.fcitx5-qt6-gui-wrapper.desktop b/applications/hidden/org.fcitx.fcitx5-qt6-gui-wrapper.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/org.fcitx.fcitx5-qt6-gui-wrapper.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/qv4l2.desktop b/applications/hidden/qv4l2.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/qv4l2.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/qvidcap.desktop b/applications/hidden/qvidcap.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/qvidcap.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/uuctl.desktop b/applications/hidden/uuctl.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/uuctl.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/xgps.desktop b/applications/hidden/xgps.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/xgps.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/xgpsspeed.desktop b/applications/hidden/xgpsspeed.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/xgpsspeed.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/arch-post.sh b/arch-post.sh deleted file mode 100755 index be8230f7..00000000 --- a/arch-post.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -install_git() { - echo "" - if [[ -x "$(command -v git)" ]]; then - echo "'git' is already installed" - else - echo "Installing 'git'" - pacman -S --noconfirm git - fi -} - -install_yay() { - echo "" - if [[ -x "$(command -v yay)" ]]; then - echo "'yay' is already installed" - else - echo "Installing 'yay'" - git clone https://aur.archlinux.org/yay-bin.git - cd yay-bin || exit - makepkg -si - cd .. || exit - rm -rf yay-bin - fi - - declare -A packages=( - ["stow"]=stow - ["tmux"]=tmux - ["git-delta"]=delta - ["ripgrep"]=rg - ) - - for pkg in "${!packages[@]}"; do - bin="${packages[$pkg]}" - if [[ -x "$(command -v "$bin")" ]]; then - echo "$pkg (binary: $bin) is already installed" - else - echo "Installing $pkg" - yay -S --noconfirm "$pkg" - fi - done -} - -install_cargo() { - echo "" - if [[ -x "$(command -v cargo)" ]]; then - echo "'cargo' is already installed" - else - echo "Installing cargo" - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - fi - - declare -A packages=( - ["bob-nvim"]=bob - ["tmux-sessionizer"]=tms - ["fnm"]=fnm - ["tree-sitter-cli"]=tree-sitter - ) - - for pkg in "${!packages[@]}"; do - bin="${packages[$pkg]}" - if [[ -x "$(command -v "$bin")" ]]; then - echo "$pkg (binary: $bin) is already installed" - else - echo "Installing $pkg" - cargo install "$pkg" - fi - done -} - -install_git -install_yay -install_cargo diff --git a/shell/.local/custom/bin/_wt b/bin/_wt similarity index 100% rename from shell/.local/custom/bin/_wt rename to bin/_wt diff --git a/bin/claude-usage b/bin/claude-usage new file mode 100755 index 00000000..65ba781b --- /dev/null +++ b/bin/claude-usage @@ -0,0 +1,228 @@ +#!/bin/bash + +source ~/.private.sh + +BASE="https://claude.ai/api/organizations/$CLAUDE_ORG" +UA="User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0" + +INTERVAL=10 + +while [[ $# -gt 0 ]]; do + case "$1" in + --refetch) + INTERVAL="$2" + shift 2 + ;; + *) + shift + ;; + esac +done + +fetch() { + curl -s "$BASE/$1" -H "$UA" -H "$CLAUDE_COOKIE" +} + +# Format reset times +format_reset() { + local reset_at="$1" + if [ -z "$reset_at" ] || [ "$reset_at" = "null" ]; then + echo "N/A" + return + fi + local reset_epoch=$(date -d "$reset_at" +%s 2>/dev/null) + local now_epoch=$(date +%s) + local diff=$((reset_epoch - now_epoch)) + + if [ "$diff" -le 0 ]; then + echo "now" + return + fi + + local days=$((diff / 86400)) + local hours=$(( (diff % 86400) / 3600 )) + local mins=$(( (diff % 3600) / 60 )) + + local relative="" + if [ "$days" -gt 0 ]; then + local day_label="day"; [ "$days" -gt 1 ] && day_label="days" + relative="${days} ${day_label} ${hours}h ${mins}m" + elif [ "$hours" -gt 0 ]; then + relative="${hours}h ${mins}m" + else + relative="${mins}m" + fi + + local absolute + local today=$(date +%Y-%m-%d) + local tomorrow=$(date -d "+1 day" +%Y-%m-%d) + local reset_date=$(date -d "$reset_at" +%Y-%m-%d) + local reset_time=$(date -d "$reset_at" '+%-I:%M %p') + + if [ "$reset_date" = "$today" ]; then + absolute="today $reset_time" + elif [ "$reset_date" = "$tomorrow" ]; then + absolute="tomorrow $reset_time" + else + absolute="$(date -d "$reset_at" '+%a %-I:%M %p')" + fi + + echo "$absolute (in $relative)" +} + +# Progress bar generator +bar() { + local pct=$1 + local width=${2:-40} + local filled=$(awk "BEGIN { printf \"%d\", ($pct / 100) * $width }") + local empty=$((width - filled)) + local bar="" + for ((i = 0; i < filled; i++)); do bar+="█"; done + for ((i = 0; i < empty; i++)); do bar+="░"; done + echo "$bar" +} + +# Colors +BOLD="\033[1m" +DIM="\033[2m" +BLUE="\033[34m" +GREEN="\033[32m" +YELLOW="\033[33m" +RED="\033[31m" +CYAN="\033[36m" +RESET="\033[0m" + +# Color based on percentage +pct_color() { + local pct=$1 + if [ "$pct" -ge 80 ] 2>/dev/null; then echo -e "$RED" + elif [ "$pct" -ge 50 ] 2>/dev/null; then echo -e "$YELLOW" + else echo -e "$BLUE" + fi +} + +USAGE_FILE=$(mktemp) +OVERAGE_FILE=$(mktemp) +PREPAID_FILE=$(mktemp) +trap 'rm -f "$USAGE_FILE" "$OVERAGE_FILE" "$PREPAID_FILE"; exit 0' EXIT INT TERM + +while true; do + # Fetch all endpoints in parallel + fetch "usage" > "$USAGE_FILE" & + fetch "overage_spend_limit" > "$OVERAGE_FILE" & + fetch "prepaid/credits" > "$PREPAID_FILE" & + wait + + USAGE=$(cat "$USAGE_FILE") + OVERAGE_SPEND=$(cat "$OVERAGE_FILE") + PREPAID=$(cat "$PREPAID_FILE") + + # Only update values if API responses are valid + if ! echo "$USAGE" | jq -e '.error' &>/dev/null; then + SESSION_PCT=$(echo "$USAGE" | jq -r '.five_hour.utilization // 0') + SESSION_RESET=$(echo "$USAGE" | jq -r '.five_hour.resets_at // empty') + WEEKLY_ALL_PCT=$(echo "$USAGE" | jq -r '.seven_day.utilization // 0') + WEEKLY_ALL_RESET=$(echo "$USAGE" | jq -r '.seven_day.resets_at // empty') + WEEKLY_SONNET_PCT=$(echo "$USAGE" | jq -r '.seven_day_sonnet.utilization // 0') + WEEKLY_SONNET_RESET=$(echo "$USAGE" | jq -r '.seven_day_sonnet.resets_at // empty') + fi + + if ! echo "$OVERAGE_SPEND" | jq -e '.error' &>/dev/null; then + EXTRA_ENABLED=$(echo "$OVERAGE_SPEND" | jq -r '.is_enabled // false') + USED_CENTS=$(echo "$OVERAGE_SPEND" | jq -r '.used_credits // 0') + LIMIT_CENTS=$(echo "$OVERAGE_SPEND" | jq -r '.monthly_credit_limit // 0') + fi + + if ! echo "$PREPAID" | jq -e '.error' &>/dev/null; then + BALANCE_CENTS=$(echo "$PREPAID" | jq -r '.amount // 0') + AUTO_RELOAD=$(echo "$PREPAID" | jq -r '.auto_reload_settings.enabled // false') + fi + + # Defaults for first run + SESSION_PCT=${SESSION_PCT:-0} + WEEKLY_ALL_PCT=${WEEKLY_ALL_PCT:-0} + WEEKLY_SONNET_PCT=${WEEKLY_SONNET_PCT:-0} + USED_CENTS=${USED_CENTS:-0} + LIMIT_CENTS=${LIMIT_CENTS:-0} + BALANCE_CENTS=${BALANCE_CENTS:-0} + EXTRA_ENABLED=${EXTRA_ENABLED:-false} + AUTO_RELOAD=${AUTO_RELOAD:-false} + + # Convert cents to dollars + USED_DOLLARS=$(awk "BEGIN { printf \"%.2f\", $USED_CENTS / 100 }") + LIMIT_DOLLARS=$(awk "BEGIN { printf \"%.2f\", $LIMIT_CENTS / 100 }") + BALANCE_DOLLARS=$(awk "BEGIN { printf \"%.2f\", $BALANCE_CENTS / 100 }") + EXTRA_PCT=0 + if [ "$LIMIT_CENTS" -gt 0 ] 2>/dev/null; then + EXTRA_PCT=$(awk "BEGIN { printf \"%.0f\", ($USED_CENTS / $LIMIT_CENTS) * 100 }") + fi + + SESSION_RESET_FMT=$(format_reset "$SESSION_RESET") + WEEKLY_RESET_FMT=$(format_reset "$WEEKLY_ALL_RESET") + + # Display + clear + echo "" + echo -e "${BOLD} Plan usage limits${RESET}" + echo -e " ─────────────────────────────────────────────────────────" + echo "" + + C=$(pct_color "${SESSION_PCT%.*}") + echo -e " ${BOLD}Current session${RESET}" + echo -e " ${DIM}Resets ${SESSION_RESET_FMT}${RESET}" + echo -e " ${C}$(bar "${SESSION_PCT%.*}")${RESET} ${SESSION_PCT%.*}% used" + echo "" + + echo -e " ${BOLD}Weekly limits${RESET}" + echo "" + + C=$(pct_color "${WEEKLY_ALL_PCT%.*}") + echo -e " ${BOLD}All models${RESET}" + echo -e " ${DIM}Resets ${WEEKLY_RESET_FMT}${RESET}" + echo -e " ${C}$(bar "${WEEKLY_ALL_PCT%.*}")${RESET} ${WEEKLY_ALL_PCT%.*}% used" + echo "" + + C=$(pct_color "${WEEKLY_SONNET_PCT%.*}") + echo -e " ${BOLD}Sonnet only${RESET}" + if [ "${WEEKLY_SONNET_PCT%.*}" = "0" ]; then + echo -e " ${DIM}You haven't used Sonnet yet${RESET}" + else + echo -e " ${DIM}Resets $(format_reset "$WEEKLY_SONNET_RESET")${RESET}" + fi + echo -e " ${C}$(bar "${WEEKLY_SONNET_PCT%.*}")${RESET} ${WEEKLY_SONNET_PCT%.*}% used" + echo "" + + echo -e " ─────────────────────────────────────────────────────────" + echo "" + + echo -e "${BOLD} Extra usage${RESET}" + if [ "$EXTRA_ENABLED" = "true" ]; then + echo -e " ${GREEN}ON${RESET} ${DIM}Extra usage enabled${RESET}" + else + echo -e " ${RED}OFF${RESET} ${DIM}Extra usage disabled${RESET}" + fi + echo "" + + C=$(pct_color "${EXTRA_PCT}") + echo -e " ${BOLD}\$${USED_DOLLARS} spent${RESET}" + echo -e " ${DIM}Resets $(date -d "$(date +%Y-%m-01) +1 month" '+%b %-d')${RESET}" + echo -e " ${C}$(bar "$EXTRA_PCT")${RESET} ${EXTRA_PCT}% used" + echo "" + + echo -e " ${BOLD}\$${LIMIT_DOLLARS}${RESET}" + echo -e " ${DIM}Monthly spending limit${RESET}" + echo "" + + echo -e " ${BOLD}${CYAN}\$${BALANCE_DOLLARS}${RESET}" + if [ "$AUTO_RELOAD" = "true" ]; then + echo -e " ${DIM}Current balance - auto-reload on${RESET}" + else + echo -e " ${DIM}Current balance${RESET}" + fi + echo "" + + for ((i = INTERVAL; i > 0; i--)); do + printf "\r ${DIM}Refreshing in ${i}s - press Ctrl+C to exit${RESET} " + sleep 1 + done +done diff --git a/shell/.local/custom/bin/clone b/bin/clone similarity index 100% rename from shell/.local/custom/bin/clone rename to bin/clone diff --git a/shell/.local/custom/bin/commit b/bin/commit similarity index 100% rename from shell/.local/custom/bin/commit rename to bin/commit diff --git a/shell/.local/custom/bin/gh-comments b/bin/gh-comments similarity index 100% rename from shell/.local/custom/bin/gh-comments rename to bin/gh-comments diff --git a/bin/kojarchy-calculator b/bin/kojarchy-calculator new file mode 100755 index 00000000..d83ff414 --- /dev/null +++ b/bin/kojarchy-calculator @@ -0,0 +1,4 @@ +#!/bin/bash + +# Launch wofi calculator +wofi-calc diff --git a/hyprland/.config/wofi/dmenu/scripts/camera b/bin/kojarchy-camera similarity index 93% rename from hyprland/.config/wofi/dmenu/scripts/camera rename to bin/kojarchy-camera index 04b29f6a..58f55054 100755 --- a/hyprland/.config/wofi/dmenu/scripts/camera +++ b/bin/kojarchy-camera @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/bin/bash + +# Open camera feed or show which app is using it device=$(v4l2-ctl --list-devices | grep -E '/dev/video[0-9]+' | head -n1 | xargs) @@ -22,7 +24,7 @@ if [ -n "$pids" ]; then fi fi done - + if [ -n "$apps" ]; then notify-send "Camera" "Camera is in use by:\n$apps" exit 1 diff --git a/bin/kojarchy-cmd-audio-switch b/bin/kojarchy-cmd-audio-switch new file mode 100755 index 00000000..5fbe0283 --- /dev/null +++ b/bin/kojarchy-cmd-audio-switch @@ -0,0 +1,67 @@ +#!/bin/bash + +# Switch between audio outputs while preserving the mute status. +# Shows volume/mute icon feedback via swayosd. + +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 + if command -v swayosd-client &>/dev/null; then + swayosd-client \ + --monitor "$focused_monitor" \ + --custom-message "No audio devices found" + else + notify-send "No audio devices found" -u critical -t 3000 + fi + 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 + +if command -v swayosd-client &>/dev/null; then + swayosd-client \ + --monitor "$focused_monitor" \ + --custom-message "$next_sink_description" \ + --custom-icon "$next_sink_volume_icon" +else + notify-send "Audio Output" "$next_sink_description" -t 2000 +fi diff --git a/bin/kojarchy-cmd-reboot b/bin/kojarchy-cmd-reboot new file mode 100755 index 00000000..910ecee3 --- /dev/null +++ b/bin/kojarchy-cmd-reboot @@ -0,0 +1,13 @@ +#!/bin/bash + +# Gracefully close all Hyprland windows before rebooting. +# Schedules reboot, then closes windows to give apps time to save state. + +kojarchy-state clear re*-required + +# Schedule the reboot to happen after closing windows (detached from terminal) +nohup bash -c "sleep 2 && systemctl reboot --no-wall" >/dev/null 2>&1 & + +# Now close all windows +kojarchy-hyprland-window-close-all +sleep 1 # Allow apps like Chrome to shutdown correctly diff --git a/bin/kojarchy-cmd-screenrecord b/bin/kojarchy-cmd-screenrecord new file mode 100755 index 00000000..2185a153 --- /dev/null +++ b/bin/kojarchy-cmd-screenrecord @@ -0,0 +1,89 @@ +#!/bin/bash + +# Start and stop a screen recording, saved to ~/Videos by default. +# Alternative location can be set via KOJARCHY_SCREENRECORD_DIR or XDG_VIDEOS_DIR. + +[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs +OUTPUT_DIR="${KOJARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}" + +if [[ ! -d "$OUTPUT_DIR" ]]; then + mkdir -p "$OUTPUT_DIR" || { + notify-send "Screen recording directory does not exist: $OUTPUT_DIR" -u critical -t 3000 + exit 1 + } +fi + +DESKTOP_AUDIO="false" +MICROPHONE_AUDIO="false" +STOP_RECORDING="false" + +for arg in "$@"; do + case "$arg" in + --with-desktop-audio) DESKTOP_AUDIO="true" ;; + --with-microphone-audio) MICROPHONE_AUDIO="true" ;; + --stop-recording) STOP_RECORDING="true" ;; + esac +done + +start_screenrecording() { + local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4" + local audio_args="" + + if [[ "$DESKTOP_AUDIO" == "true" ]] || [[ "$MICROPHONE_AUDIO" == "true" ]]; then + local audio_devices="" + [[ "$DESKTOP_AUDIO" == "true" ]] && audio_devices+="default_output" + if [[ "$MICROPHONE_AUDIO" == "true" ]]; then + [[ -n "$audio_devices" ]] && audio_devices+="|" + audio_devices+="default_input" + fi + audio_args="-a $audio_devices" + fi + + if command -v gpu-screen-recorder &>/dev/null; then + gpu-screen-recorder -w portal -f 60 -fallback-cpu-encoding yes -o "$filename" $audio_args -ac aac & + elif command -v wf-recorder &>/dev/null; then + local wf_audio="" + [[ "$DESKTOP_AUDIO" == "true" ]] && wf_audio="--audio" + wf-recorder $wf_audio -f "$filename" & + else + notify-send "No screen recorder found" "Install gpu-screen-recorder or wf-recorder" -u critical -t 3000 + exit 1 + fi + + notify-send "Screen recording started" -t 2000 +} + +stop_screenrecording() { + if pgrep -f "^gpu-screen-recorder" >/dev/null; then + pkill -SIGINT -f "^gpu-screen-recorder" + elif pgrep -f "^wf-recorder" >/dev/null; then + pkill -SIGINT -f "^wf-recorder" + fi + + # Wait up to 5 seconds for clean exit + local count=0 + while (pgrep -f "^gpu-screen-recorder" >/dev/null || pgrep -f "^wf-recorder" >/dev/null) && [ $count -lt 50 ]; do + sleep 0.1 + count=$((count + 1)) + done + + if pgrep -f "^gpu-screen-recorder" >/dev/null || pgrep -f "^wf-recorder" >/dev/null; then + pkill -9 -f "^gpu-screen-recorder" 2>/dev/null + pkill -9 -f "^wf-recorder" 2>/dev/null + notify-send "Screen recording error" "Recording had to be force-killed. Video may be corrupted." -u critical -t 5000 + else + notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000 + fi +} + +screenrecording_active() { + pgrep -f "^gpu-screen-recorder" >/dev/null || pgrep -f "^wf-recorder" >/dev/null +} + +if screenrecording_active; then + stop_screenrecording +elif [[ "$STOP_RECORDING" == "false" ]]; then + start_screenrecording +else + exit 1 +fi diff --git a/bin/kojarchy-cmd-screenshot b/bin/kojarchy-cmd-screenshot new file mode 100755 index 00000000..feaa3ae6 --- /dev/null +++ b/bin/kojarchy-cmd-screenshot @@ -0,0 +1,63 @@ +#!/bin/bash + +# Take a screenshot of the whole screen, a specific window, or a user-drawn region. +# Saves to ~/Pictures by default. Change via KOJARCHY_SCREENSHOT_DIR or XDG_PICTURES_DIR. + +[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs +OUTPUT_DIR="${KOJARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}" + +if [[ ! -d "$OUTPUT_DIR" ]]; then + mkdir -p "$OUTPUT_DIR" || { + notify-send "Screenshot directory does not exist: $OUTPUT_DIR" -u critical -t 3000 + exit 1 + } +fi + +pkill slurp && exit 0 + +MODE="${1:-region}" +PROCESSING="${2:-edit}" + +get_rectangles() { + local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id') + hyprctl monitors -j | jq -r --arg ws "$active_workspace" '.[] | select(.activeWorkspace.id == ($ws | tonumber)) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"' + hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' +} + +case "$MODE" in + region) + wayfreeze & PID=$! + sleep 0.1 + SELECTION=$(slurp 2>/dev/null) + kill $PID 2>/dev/null + ;; + window) + wayfreeze & PID=$! + sleep 0.1 + SELECTION=$(get_rectangles | slurp -r 2>/dev/null) + kill $PID 2>/dev/null + ;; + fullscreen) + SELECTION=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"') + ;; +esac + +[ -z "$SELECTION" ] && exit 0 + +FILENAME="$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" + +if [[ "$PROCESSING" == "edit" ]] && command -v satty &>/dev/null; then + grim -g "$SELECTION" - | + satty --filename - \ + --output-filename "$FILENAME" \ + --early-exit \ + --actions-on-enter save-to-clipboard \ + --save-after-copy \ + --copy-command 'wl-copy' +elif [[ "$PROCESSING" == "clipboard" ]]; then + grim -g "$SELECTION" - | wl-copy + notify-send "Screenshot copied to clipboard" -t 2000 +else + grim -g "$SELECTION" "$FILENAME" + notify-send "Screenshot saved to $FILENAME" -t 2000 +fi diff --git a/bin/kojarchy-cmd-shutdown b/bin/kojarchy-cmd-shutdown new file mode 100755 index 00000000..169a4929 --- /dev/null +++ b/bin/kojarchy-cmd-shutdown @@ -0,0 +1,13 @@ +#!/bin/bash + +# Gracefully close all Hyprland windows before shutting down. +# Schedules poweroff, then closes windows to give apps time to save state. + +kojarchy-state clear re*-required + +# Schedule the shutdown to happen after closing windows (detached from terminal) +nohup bash -c "sleep 2 && systemctl poweroff --no-wall" >/dev/null 2>&1 & + +# Now close all windows +kojarchy-hyprland-window-close-all +sleep 1 # Allow apps like Chrome to shutdown correctly diff --git a/bin/kojarchy-debug b/bin/kojarchy-debug new file mode 100755 index 00000000..daa503e8 --- /dev/null +++ b/bin/kojarchy-debug @@ -0,0 +1,96 @@ +#!/bin/bash + +# Return exhaustive debugging information about the system to help diagnose problems. + +NO_SUDO=false +PRINT_ONLY=false + +while [[ $# -gt 0 ]]; do + case "$1" in + --no-sudo) + NO_SUDO=true + shift + ;; + --print) + PRINT_ONLY=true + shift + ;; + *) + echo "Unknown option: $1" + echo "Usage: kojarchy-debug [--no-sudo] [--print]" + exit 1 + ;; + esac +done + +KOJARCHY_PATH="${KOJARCHY_PATH:-$HOME/dotfiles}" +LOG_FILE="/tmp/kojarchy-debug.log" + +if [ "$NO_SUDO" = true ]; then + DMESG_OUTPUT="(skipped - --no-sudo flag used)" +else + DMESG_OUTPUT="$(sudo dmesg)" +fi + +cat > "$LOG_FILE" </dev/null || echo "unknown") + +========================================= +SYSTEM INFORMATION +========================================= +$(inxi -Farz 2>/dev/null || echo "inxi not installed") + +========================================= +DMESG +========================================= +$DMESG_OUTPUT + +========================================= +JOURNALCTL (CURRENT BOOT, ERRORS ONLY) +========================================= +$(journalctl -b -p 4..1 2>/dev/null || echo "journalctl unavailable") + +========================================= +INSTALLED PACKAGES +========================================= +$({ expac -S '%n %v (%r)' $(pacman -Qqe) 2>/dev/null; comm -13 <(pacman -Sql | sort) <(pacman -Qqe | sort) | xargs -r expac -Q '%n %v (AUR)'; } | sort 2>/dev/null || echo "package list unavailable") +EOF + +if [ "$PRINT_ONLY" = true ]; then + cat "$LOG_FILE" + exit 0 +fi + +OPTIONS=("View log" "Save in current directory") +if ping -c 1 -W 2 8.8.8.8 >/dev/null 2>&1; then + OPTIONS=("Upload log" "${OPTIONS[@]}") +fi + +ACTION=$(gum choose "${OPTIONS[@]}") + +case "$ACTION" in + "Upload log") + echo "Uploading debug log to 0x0.st..." + URL=$(curl -sF "file=@$LOG_FILE" -Fexpires=24 https://0x0.st) + if [ $? -eq 0 ] && [ -n "$URL" ]; then + echo "Log uploaded successfully!" + echo "Share this URL:" + echo "" + echo " $URL" + echo "" + echo "This link will expire in 24 hours." + else + echo "Error: Failed to upload log file" + exit 1 + fi + ;; + "View log") + less "$LOG_FILE" + ;; + "Save in current directory") + cp "$LOG_FILE" "./kojarchy-debug.log" + echo "Log saved to $(pwd)/kojarchy-debug.log" + ;; +esac diff --git a/bin/kojarchy-font-current b/bin/kojarchy-font-current new file mode 100755 index 00000000..d1b3918c --- /dev/null +++ b/bin/kojarchy-font-current @@ -0,0 +1,5 @@ +#!/bin/bash + +# Returns the current monospace font from the Waybar stylesheet. + +grep -oP 'font-family:\s*["'\''"]?\K[^;"'\'']+' ~/.config/waybar/style.css | head -n1 diff --git a/bin/kojarchy-font-list b/bin/kojarchy-font-list new file mode 100755 index 00000000..bbbe4931 --- /dev/null +++ b/bin/kojarchy-font-list @@ -0,0 +1,5 @@ +#!/bin/bash + +# List all monospace fonts available on the system. + +fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting' | sort -u diff --git a/bin/kojarchy-font-set b/bin/kojarchy-font-set new file mode 100755 index 00000000..8a93ae86 --- /dev/null +++ b/bin/kojarchy-font-set @@ -0,0 +1,41 @@ +#!/bin/bash + +# Set the system-wide monospace font (terminal, hyprlock, waybar, fontconfig). + +font_name="$1" + +if [[ -z "$font_name" ]]; then + echo "Usage: kojarchy-font-set " + echo "Available fonts: kojarchy-font-list" + exit 1 +fi + +if ! fc-list | grep -iq "$font_name"; then + echo "Font '$font_name' not found." + exit 1 +fi + +if [[ -f ~/.config/kitty/kitty.conf ]]; then + sed -i "s/^font_family .*/font_family $font_name/g" ~/.config/kitty/kitty.conf + pkill -USR1 kitty 2>/dev/null || true +fi + +if [[ -f ~/.config/hypr/hyprlock.conf ]]; then + sed -i "s/font_family = .*/font_family = $font_name/g" ~/.config/hypr/hyprlock.conf +fi + +if [[ -f ~/.config/waybar/style.css ]]; then + sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css + kojarchy-restart-waybar 2>/dev/null || true +fi + +if [[ -f ~/.config/fontconfig/fonts.conf ]] && command -v xmlstarlet &>/dev/null; then + xmlstarlet ed -L \ + -u '//match[@target="pattern"][test/string="monospace"]/edit[@name="family"]/string' \ + -v "$font_name" \ + ~/.config/fontconfig/fonts.conf +fi + +kojarchy-hook font-set "$font_name" 2>/dev/null || true + +echo "Font set to: $font_name" diff --git a/bin/kojarchy-hook b/bin/kojarchy-hook new file mode 100755 index 00000000..0bc8f30e --- /dev/null +++ b/bin/kojarchy-hook @@ -0,0 +1,18 @@ +#!/bin/bash + +# Run a named hook (e.g. post-update, font-set). +# Hooks live in ~/.config/kojarchy/hooks/ + +set -e + +if [[ $# -lt 1 ]]; then + echo "Usage: kojarchy-hook [name] [args...]" + exit 1 +fi + +HOOK_PATH="$HOME/.config/kojarchy/hooks/$1" +shift + +if [[ -f "$HOOK_PATH" ]]; then + bash "$HOOK_PATH" "$@" +fi diff --git a/bin/kojarchy-hyprland-window-close-all b/bin/kojarchy-hyprland-window-close-all new file mode 100755 index 00000000..abe9c03a --- /dev/null +++ b/bin/kojarchy-hyprland-window-close-all @@ -0,0 +1,9 @@ +#!/bin/bash + +# Close all open Hyprland windows gracefully +hyprctl clients -j | \ + jq -r ".[].address" | \ + xargs -I{} hyprctl dispatch closewindow address:{} + +# Move to first workspace +hyprctl dispatch workspace 1 diff --git a/hyprland/.config/wofi/dmenu/scripts/kill-port b/bin/kojarchy-kill-port similarity index 95% rename from hyprland/.config/wofi/dmenu/scripts/kill-port rename to bin/kojarchy-kill-port index 550f9bbc..10d392c1 100755 --- a/hyprland/.config/wofi/dmenu/scripts/kill-port +++ b/bin/kojarchy-kill-port @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/bin/bash + +# Kill a process listening on a port selected via wofi dmenu set -euo pipefail diff --git a/hyprland/.config/wofi/dmenu/scripts/kill-process b/bin/kojarchy-kill-process similarity index 95% rename from hyprland/.config/wofi/dmenu/scripts/kill-process rename to bin/kojarchy-kill-process index 0b214d28..6357e74e 100755 --- a/hyprland/.config/wofi/dmenu/scripts/kill-process +++ b/bin/kojarchy-kill-process @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/bin/bash + +# Kill a running process selected via wofi dmenu set -euo pipefail diff --git a/bin/kojarchy-lock-screen b/bin/kojarchy-lock-screen new file mode 100755 index 00000000..7413a3aa --- /dev/null +++ b/bin/kojarchy-lock-screen @@ -0,0 +1,8 @@ +#!/bin/bash + +# Lock the screen using hyprlock. + +pidof hyprlock || hyprlock & + +# Reset keyboard layout to default +hyprctl switchxkblayout all 0 > /dev/null 2>&1 diff --git a/bin/kojarchy-menu b/bin/kojarchy-menu new file mode 100755 index 00000000..e45e91b9 --- /dev/null +++ b/bin/kojarchy-menu @@ -0,0 +1,64 @@ +#!/bin/bash + +# Kojarchy menu — unified launcher for all commands and scripts. +# Bound to ALT+SHIFT+SPACE. Uses walker in dmenu mode. + +OPTIONS="Screenshot +Screenshot (clipboard) +Screen record +Color picker +Lock screen +Kill process +Kill port +Open file +Calculator +Camera +Toggle waybar +Toggle nightlight +Toggle focus mode +Toggle RGB +Audio switch +Keybindings +Font set +Package install +Package remove +Update system +Refresh hyprland +Refresh waybar +Debug info +Close all windows +Reboot +Shutdown" + +choice=$(echo "$OPTIONS" | walker --dmenu --width 295 --minheight 1 --maxheight 630 -p "Kojarchy…" 2>/dev/null) + +[ -z "$choice" ] && exit 0 + +case "$choice" in + "Screenshot") kojarchy-cmd-screenshot region edit ;; + "Screenshot (clipboard)") kojarchy-cmd-screenshot region clipboard ;; + "Screen record") kojarchy-cmd-screenrecord ;; + "Color picker") hyprpicker | { read color; trimmed=$(printf "%s" "$color"); printf "%s" "$trimmed" | wl-copy; notify-send "Copied $color to clipboard"; } ;; + "Lock screen") kojarchy-lock-screen ;; + "Kill process") kojarchy-kill-process ;; + "Kill port") kojarchy-kill-port ;; + "Open file") kojarchy-open-file ;; + "Calculator") kojarchy-calculator ;; + "Camera") kojarchy-camera ;; + "Toggle waybar") kojarchy-toggle-waybar ;; + "Toggle nightlight") kojarchy-toggle-nightlight ;; + "Toggle focus mode") kojarchy-toggle-focusmode ;; + "Toggle RGB") kojarchy-toggle-rgb ;; + "Audio switch") kojarchy-cmd-audio-switch ;; + "Keybindings") kojarchy-menu-keybindings ;; + "Font set") font=$(kojarchy-font-list | walker --dmenu -p "Pick a font…" 2>/dev/null) && kojarchy-font-set "$font" ;; + "Package install") kojarchy-pkg-install ;; + "Package remove") kojarchy-pkg-remove ;; + "Update system") kojarchy-update ;; + "Refresh hyprland") kojarchy-refresh-hyprland ;; + "Refresh waybar") kojarchy-refresh-waybar ;; + "Debug info") kojarchy-debug ;; + "Close all windows") kojarchy-hyprland-window-close-all ;; + "Reboot") kojarchy-cmd-reboot ;; + "Shutdown") kojarchy-cmd-shutdown ;; +esac diff --git a/bin/kojarchy-menu-keybindings b/bin/kojarchy-menu-keybindings new file mode 100755 index 00000000..0308be7f --- /dev/null +++ b/bin/kojarchy-menu-keybindings @@ -0,0 +1,51 @@ +#!/bin/bash + +# Display Hyprland keybindings in an interactive search using walker. + +output_keybindings() { + hyprctl -j binds | + jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' | + sed -r \ + -e 's/null//' \ + -e 's/@0//' \ + -e 's/,@/,code:/' \ + -e 's/^0,/,/' \ + -e 's/^1,/SHIFT,/' \ + -e 's/^4,/CTRL,/' \ + -e 's/^5,/SHIFT CTRL,/' \ + -e 's/^8,/ALT,/' \ + -e 's/^9,/SHIFT ALT,/' \ + -e 's/^12,/CTRL ALT,/' \ + -e 's/^13,/SHIFT CTRL ALT,/' \ + -e 's/^64,/SUPER,/' \ + -e 's/^65,/SUPER SHIFT,/' \ + -e 's/^68,/SUPER CTRL,/' \ + -e 's/^69,/SUPER SHIFT CTRL,/' \ + -e 's/^72,/SUPER ALT,/' \ + -e 's/^73,/SUPER SHIFT ALT,/' \ + -e 's/^76,/SUPER CTRL ALT,/' \ + -e 's/^77,/SUPER SHIFT CTRL ALT,/' | + awk -F, '{ + key_combo = $1 " + " $2; + gsub(/^[ \t]*\+?[ \t]*/, "", key_combo); + gsub(/[ \t]+$/, "", key_combo); + action = $3; + if (action == "") { + for (i = 4; i <= NF; i++) { + action = action $i (i < NF ? "," : ""); + } + sub(/,$/, "", action); + gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action); + gsub(/^[ \t]+|[ \t]+$/, "", action); + } + if (action != "") { + printf "%-35s %s\n", key_combo, action; + } + }' +} + +if [[ "$1" == "--print" || "$1" == "-p" ]]; then + output_keybindings +else + output_keybindings | walker --dmenu --width 600 --maxheight 630 -p "Keybindings…" 2>/dev/null +fi diff --git a/bin/kojarchy-migrate b/bin/kojarchy-migrate new file mode 100755 index 00000000..1b541a10 --- /dev/null +++ b/bin/kojarchy-migrate @@ -0,0 +1,27 @@ +#!/bin/bash + +# Run all pending migrations to bring the system in line with the installed version. + +KOJARCHY_PATH="${KOJARCHY_PATH:-$HOME/dotfiles}" +STATE_DIR="$HOME/.local/state/kojarchy/migrations" +mkdir -p "$STATE_DIR" +mkdir -p "$STATE_DIR/skipped" + +for file in "$KOJARCHY_PATH"/migrations/*.sh; do + [[ -f "$file" ]] || continue + filename=$(basename "$file") + + if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then + echo -e "\e[32m\nRunning migration (${filename%.sh})\e[0m" + + if bash "$file"; then + touch "$STATE_DIR/$filename" + else + if command -v gum &>/dev/null && gum confirm "Migration ${filename%.sh} failed. Skip and continue?"; then + touch "$STATE_DIR/skipped/$filename" + else + exit 1 + fi + fi + fi +done diff --git a/hyprland/.config/wofi/dmenu/scripts/open-file b/bin/kojarchy-open-file similarity index 93% rename from hyprland/.config/wofi/dmenu/scripts/open-file rename to bin/kojarchy-open-file index 6b26cd6a..8299096c 100755 --- a/hyprland/.config/wofi/dmenu/scripts/open-file +++ b/bin/kojarchy-open-file @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/bin/bash + +# Browse and open a file via wofi dmenu root_path="$HOME" diff --git a/bin/kojarchy-pkg-add b/bin/kojarchy-pkg-add new file mode 100755 index 00000000..b1a4e774 --- /dev/null +++ b/bin/kojarchy-pkg-add @@ -0,0 +1,16 @@ +#!/bin/bash + +# Add named packages if missing. Returns false if it couldn't be done. + +if kojarchy-pkg-missing "$@"; then + sudo pacman -S --noconfirm --needed "$@" || exit 1 +fi + +for pkg in "$@"; do + if ! pacman -Q "$pkg" &>/dev/null; then + echo -e "\033[31mError: Package '$pkg' did not install\033[0m" >&2 + exit 1 + fi +done + +exit 0 diff --git a/bin/kojarchy-pkg-aur-accessible b/bin/kojarchy-pkg-aur-accessible new file mode 100755 index 00000000..e4f08e1f --- /dev/null +++ b/bin/kojarchy-pkg-aur-accessible @@ -0,0 +1,6 @@ +#!/bin/bash + +# Returns true if the AUR is up and available. + +curl -sf --connect-timeout 30 --retry 3 --retry-delay 3 -A "kojarchy-update" \ + "https://aur.archlinux.org/rpc/?v=5&type=info&arg=base" >/dev/null diff --git a/bin/kojarchy-pkg-aur-add b/bin/kojarchy-pkg-aur-add new file mode 100755 index 00000000..54349365 --- /dev/null +++ b/bin/kojarchy-pkg-aur-add @@ -0,0 +1,16 @@ +#!/bin/bash + +# Add named AUR packages if missing. + +if kojarchy-pkg-missing "$@"; then + yay -S --noconfirm --needed "$@" || exit 1 +fi + +for pkg in "$@"; do + if ! pacman -Q "$pkg" &>/dev/null; then + echo -e "\033[31mError: Package '$pkg' did not install\033[0m" >&2 + exit 1 + fi +done + +exit 0 diff --git a/bin/kojarchy-pkg-drop b/bin/kojarchy-pkg-drop new file mode 100755 index 00000000..a33a02f7 --- /dev/null +++ b/bin/kojarchy-pkg-drop @@ -0,0 +1,9 @@ +#!/bin/bash + +# Remove named packages if installed (otherwise ignore). + +for pkg in "$@"; do + if pacman -Q "$pkg" &>/dev/null; then + sudo pacman -Rns --noconfirm "$pkg" + fi +done diff --git a/bin/kojarchy-pkg-install b/bin/kojarchy-pkg-install new file mode 100755 index 00000000..c2f70da2 --- /dev/null +++ b/bin/kojarchy-pkg-install @@ -0,0 +1,21 @@ +#!/bin/bash + +# Interactive fuzzy-finder TUI for picking new packages to install. + +fzf_args=( + --multi + --preview 'pacman -Sii {1}' + --preview-label='alt-p: toggle preview, alt-j/k: scroll, tab: multi-select' + --preview-label-pos='bottom' + --preview-window 'down:65%:wrap' + --bind 'alt-p:toggle-preview' + --bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up' + --bind 'alt-k:preview-up,alt-j:preview-down' + --color 'pointer:green,marker:green' +) + +pkg_names=$(pacman -Slq | fzf "${fzf_args[@]}") + +if [[ -n "$pkg_names" ]]; then + echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -S --noconfirm +fi diff --git a/bin/kojarchy-pkg-missing b/bin/kojarchy-pkg-missing new file mode 100755 index 00000000..62e4bd00 --- /dev/null +++ b/bin/kojarchy-pkg-missing @@ -0,0 +1,11 @@ +#!/bin/bash + +# Returns true (exit 0) if any named packages are missing. + +for pkg in "$@"; do + if ! pacman -Q "$pkg" &>/dev/null; then + exit 0 + fi +done + +exit 1 diff --git a/bin/kojarchy-pkg-present b/bin/kojarchy-pkg-present new file mode 100755 index 00000000..8bebc077 --- /dev/null +++ b/bin/kojarchy-pkg-present @@ -0,0 +1,9 @@ +#!/bin/bash + +# Returns true (exit 0) if all named packages are installed. + +for pkg in "$@"; do + pacman -Q "$pkg" &>/dev/null || exit 1 +done + +exit 0 diff --git a/bin/kojarchy-pkg-remove b/bin/kojarchy-pkg-remove new file mode 100755 index 00000000..43375903 --- /dev/null +++ b/bin/kojarchy-pkg-remove @@ -0,0 +1,21 @@ +#!/bin/bash + +# Interactive fuzzy-finder TUI for removing installed packages. + +fzf_args=( + --multi + --preview 'yay -Qi {1}' + --preview-label='alt-p: toggle preview, alt-j/k: scroll, tab: multi-select' + --preview-label-pos='bottom' + --preview-window 'down:65%:wrap' + --bind 'alt-p:toggle-preview' + --bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up' + --bind 'alt-k:preview-up,alt-j:preview-down' + --color 'pointer:red,marker:red' +) + +pkg_names=$(yay -Qqe | fzf "${fzf_args[@]}") + +if [[ -n "$pkg_names" ]]; then + echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -Rns --noconfirm +fi diff --git a/bin/kojarchy-power-menu b/bin/kojarchy-power-menu new file mode 100755 index 00000000..9c2f8fde --- /dev/null +++ b/bin/kojarchy-power-menu @@ -0,0 +1,18 @@ +#!/bin/bash + +# Power menu — lock, reboot, or shutdown via walker dmenu. +# Bound to ALT+ESCAPE. + +OPTIONS="Lock +Reboot +Shutdown" + +choice=$(echo "$OPTIONS" | walker --dmenu --width 200 --minheight 1 --maxheight 150 -p "Power…" 2>/dev/null) + +[ -z "$choice" ] && exit 0 + +case "$choice" in + "Lock") kojarchy-lock-screen ;; + "Reboot") kojarchy-cmd-reboot ;; + "Shutdown") kojarchy-cmd-shutdown ;; +esac diff --git a/bin/kojarchy-powerprofiles-list b/bin/kojarchy-powerprofiles-list new file mode 100755 index 00000000..eb7ca11d --- /dev/null +++ b/bin/kojarchy-powerprofiles-list @@ -0,0 +1,7 @@ +#!/bin/bash + +# List available power profiles on the system. + +powerprofilesctl list | + awk '/^\s*[* ]\s*[a-zA-Z0-9\-]+:$/ { gsub(/^[*[:space:]]+|:$/,""); print }' | + tac diff --git a/bin/kojarchy-refresh-config b/bin/kojarchy-refresh-config new file mode 100755 index 00000000..f195b69b --- /dev/null +++ b/bin/kojarchy-refresh-config @@ -0,0 +1,39 @@ +#!/bin/bash + +# Refresh a config file from defaults. Takes a backup if file exists and differs. +# Usage: kojarchy-refresh-config +# Example: kojarchy-refresh-config hypr/hyprlock.conf + +KOJARCHY_PATH="${KOJARCHY_PATH:-$HOME/dotfiles}" + +config_file=$1 + +if [[ -z "$config_file" ]]; then + echo "Usage: $0 " + echo "Example: $0 hypr/hyprlock.conf" + exit 1 +fi + +user_config_file="${HOME}/.config/$config_file" +default_config_file="${KOJARCHY_PATH}/config/$config_file" +backup_config_file="$user_config_file.bak.$(date +%s)" + +if [[ ! -f "$default_config_file" ]]; then + echo "Default config not found: $default_config_file" + exit 1 +fi + +if [[ -f "$user_config_file" ]]; then + cp -f "$user_config_file" "$backup_config_file" 2>/dev/null + cp -f "$default_config_file" "$user_config_file" 2>/dev/null + + if cmp -s "$user_config_file" "$backup_config_file"; then + rm "$backup_config_file" + else + echo -e "\e[31mReplaced $user_config_file with Kojarchy default.\nBackup saved as ${backup_config_file}.\n\n\e[32mChanges:\e[0m" + diff "$user_config_file" "$backup_config_file" || true + fi +else + mkdir -p "$(dirname "$user_config_file")" + cp -f "$default_config_file" "$user_config_file" 2>/dev/null +fi diff --git a/bin/kojarchy-refresh-hypridle b/bin/kojarchy-refresh-hypridle new file mode 100755 index 00000000..630b1cb7 --- /dev/null +++ b/bin/kojarchy-refresh-hypridle @@ -0,0 +1,3 @@ +#!/bin/bash +kojarchy-refresh-config hypr/hypridle.conf +kojarchy-restart-hypridle diff --git a/bin/kojarchy-refresh-hyprland b/bin/kojarchy-refresh-hyprland new file mode 100755 index 00000000..4188532f --- /dev/null +++ b/bin/kojarchy-refresh-hyprland @@ -0,0 +1,7 @@ +#!/bin/bash +# Reset all Hyprland user configs to Kojarchy defaults. +kojarchy-refresh-config hypr/hyprland.conf +kojarchy-refresh-config hypr/hyprlock.conf +kojarchy-refresh-config hypr/hypridle.conf +kojarchy-refresh-config hypr/hyprsunset.conf +hyprctl reload >/dev/null diff --git a/bin/kojarchy-refresh-hyprlock b/bin/kojarchy-refresh-hyprlock new file mode 100755 index 00000000..c9b6d07c --- /dev/null +++ b/bin/kojarchy-refresh-hyprlock @@ -0,0 +1,2 @@ +#!/bin/bash +kojarchy-refresh-config hypr/hyprlock.conf diff --git a/bin/kojarchy-refresh-hyprsunset b/bin/kojarchy-refresh-hyprsunset new file mode 100755 index 00000000..b9703f65 --- /dev/null +++ b/bin/kojarchy-refresh-hyprsunset @@ -0,0 +1,3 @@ +#!/bin/bash +kojarchy-refresh-config hypr/hyprsunset.conf +kojarchy-restart-hyprsunset diff --git a/bin/kojarchy-refresh-waybar b/bin/kojarchy-refresh-waybar new file mode 100755 index 00000000..4530e0f5 --- /dev/null +++ b/bin/kojarchy-refresh-waybar @@ -0,0 +1,6 @@ +#!/bin/bash +# Reset Waybar config to Kojarchy defaults and restart. +kojarchy-refresh-config waybar/config.jsonc +kojarchy-refresh-config waybar/style.css +kojarchy-refresh-config waybar/mocha.css +kojarchy-restart-waybar diff --git a/bin/kojarchy-restart-app b/bin/kojarchy-restart-app new file mode 100755 index 00000000..f3aea655 --- /dev/null +++ b/bin/kojarchy-restart-app @@ -0,0 +1,8 @@ +#!/bin/bash + +# Restart an application by killing it and relaunching. +# Usage: kojarchy-restart-app + +pkill -x "$1" 2>/dev/null +sleep 0.5 +setsid "$1" >/dev/null 2>&1 & diff --git a/bin/kojarchy-restart-bluetooth b/bin/kojarchy-restart-bluetooth new file mode 100755 index 00000000..fe33707d --- /dev/null +++ b/bin/kojarchy-restart-bluetooth @@ -0,0 +1,4 @@ +#!/bin/bash +echo "Unblocking bluetooth..." +rfkill unblock bluetooth +rfkill list bluetooth diff --git a/bin/kojarchy-restart-btop b/bin/kojarchy-restart-btop new file mode 100755 index 00000000..f3023b43 --- /dev/null +++ b/bin/kojarchy-restart-btop @@ -0,0 +1,2 @@ +#!/bin/bash +pkill -SIGUSR2 btop diff --git a/bin/kojarchy-restart-hypridle b/bin/kojarchy-restart-hypridle new file mode 100755 index 00000000..a5e8682a --- /dev/null +++ b/bin/kojarchy-restart-hypridle @@ -0,0 +1,2 @@ +#!/bin/bash +kojarchy-restart-app hypridle diff --git a/bin/kojarchy-restart-hyprsunset b/bin/kojarchy-restart-hyprsunset new file mode 100755 index 00000000..7b1ddb21 --- /dev/null +++ b/bin/kojarchy-restart-hyprsunset @@ -0,0 +1,2 @@ +#!/bin/bash +kojarchy-restart-app hyprsunset diff --git a/bin/kojarchy-restart-pipewire b/bin/kojarchy-restart-pipewire new file mode 100755 index 00000000..1385ebe9 --- /dev/null +++ b/bin/kojarchy-restart-pipewire @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Restarting pipewire audio service..." +systemctl --user restart pipewire.service diff --git a/bin/kojarchy-restart-waybar b/bin/kojarchy-restart-waybar new file mode 100755 index 00000000..76e7ed14 --- /dev/null +++ b/bin/kojarchy-restart-waybar @@ -0,0 +1,2 @@ +#!/bin/bash +kojarchy-restart-app waybar diff --git a/bin/kojarchy-restart-wifi b/bin/kojarchy-restart-wifi new file mode 100755 index 00000000..6119725d --- /dev/null +++ b/bin/kojarchy-restart-wifi @@ -0,0 +1,4 @@ +#!/bin/bash +echo "Unblocking wifi..." +rfkill unblock wifi +rfkill list wifi diff --git a/bin/kojarchy-state b/bin/kojarchy-state new file mode 100755 index 00000000..fcb6bde8 --- /dev/null +++ b/bin/kojarchy-state @@ -0,0 +1,20 @@ +#!/bin/bash + +# Manage persistent state files for toggles and settings. +# Usage: kojarchy-state + +STATE_DIR="$HOME/.local/state/kojarchy" +mkdir -p "$STATE_DIR" + +COMMAND="$1" +STATE_NAME="$2" + +if [[ -z "$COMMAND" || -z "$STATE_NAME" ]]; then + echo "Usage: kojarchy-state " + exit 1 +fi + +case "$COMMAND" in + set) touch "$STATE_DIR/$STATE_NAME" ;; + clear) find "$STATE_DIR" -maxdepth 1 -type f -name "$STATE_NAME" -delete ;; +esac diff --git a/hyprland/.config/wofi/dmenu/scripts/toggle-black b/bin/kojarchy-toggle-focusmode similarity index 77% rename from hyprland/.config/wofi/dmenu/scripts/toggle-black rename to bin/kojarchy-toggle-focusmode index d12a42a7..c4491ee5 100755 --- a/hyprland/.config/wofi/dmenu/scripts/toggle-black +++ b/bin/kojarchy-toggle-focusmode @@ -1,9 +1,12 @@ -#!/usr/bin/env bash +#!/bin/bash + +# Toggle focus mode: black wallpaper, hide waybar, move to workspace 10, hide cursor set -euo pipefail STATE_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/toggle-black" -HYPRPAPER_CONFIG="$HOME/dotfiles/hyprland/.config/hypr/_black.conf" +BLACK_WALLPAPER="$HOME/dotfiles/wallpapers/black.png" +DEFAULT_WALLPAPER="$HOME/dotfiles/wallpapers/pallete.png" CACHE_SEPARATOR=$'\t' DEFAULT_CURSOR_TIMEOUT=10 @@ -12,21 +15,12 @@ get_option() { hyprctl -j getoption "$option" | jq -r '(.custom // .int)' } -stop_process() { - local name="$1" - local pid - pid=$(pgrep -x "$name" || true) - if [ -n "$pid" ]; then - kill "$pid" - fi -} - if [ -f "$STATE_FILE" ]; then IFS=$'\t' read -r waybar_was_running cursor_timeout previous_workspace < "$STATE_FILE" rm -f "$STATE_FILE" - stop_process hyprpaper - hyprpaper & + pkill -x swaybg || true + swaybg -i "$DEFAULT_WALLPAPER" -m fill & if [ -z "$cursor_timeout" ] || [ "$cursor_timeout" = "null" ]; then cursor_timeout=$DEFAULT_CURSOR_TIMEOUT @@ -52,9 +46,9 @@ else previous_workspace=$(hyprctl -j activeworkspace | jq -r '.id') printf "%s%s%s%s%s\n" "$waybar_was_running" "$CACHE_SEPARATOR" "$cursor_timeout" "$CACHE_SEPARATOR" "$previous_workspace" > "$STATE_FILE" - stop_process waybar - stop_process hyprpaper - hyprpaper -c "$HYPRPAPER_CONFIG" & + pkill -x waybar || true + pkill -x swaybg || true + swaybg -i "$BLACK_WALLPAPER" -m fill & hyprctl dispatch workspace 10 hyprctl keyword cursor:inactive_timeout 1 diff --git a/bin/kojarchy-toggle-nightlight b/bin/kojarchy-toggle-nightlight new file mode 100755 index 00000000..4981838c --- /dev/null +++ b/bin/kojarchy-toggle-nightlight @@ -0,0 +1,24 @@ +#!/bin/bash + +# Toggle hyprsunset nightlight filter between warm (4000K) and neutral (6000K). +# Uses hyprctl to set temperature instead of killing the process. + +ON_TEMP=4000 +OFF_TEMP=6000 + +# Ensure hyprsunset is running +if ! pgrep -x hyprsunset > /dev/null; then + setsid hyprsunset & + sleep 1 +fi + +# Query current temperature +CURRENT_TEMP=$(hyprctl hyprsunset temperature 2>/dev/null | grep -oE '[0-9]+') + +if [[ "$CURRENT_TEMP" == "$OFF_TEMP" ]]; then + hyprctl hyprsunset temperature $ON_TEMP + notify-send "Nightlight on" "Temperature set to ${ON_TEMP}K" +else + hyprctl hyprsunset temperature $OFF_TEMP + notify-send "Nightlight off" "Temperature set to ${OFF_TEMP}K" +fi diff --git a/hyprland/.config/wofi/dmenu/scripts/toggle-rgb b/bin/kojarchy-toggle-rgb similarity index 83% rename from hyprland/.config/wofi/dmenu/scripts/toggle-rgb rename to bin/kojarchy-toggle-rgb index 64fabd10..a7a591cb 100755 --- a/hyprland/.config/wofi/dmenu/scripts/toggle-rgb +++ b/bin/kojarchy-toggle-rgb @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/bin/bash + +# Toggle RGB lights between green and off via OpenRGB STATE_FILE="$HOME/.rgb_state" @@ -11,4 +13,3 @@ else echo "white" > "$STATE_FILE" notify-send "RGB lights set to white" fi - diff --git a/hyprland/.config/wofi/dmenu/scripts/toggle-waybar b/bin/kojarchy-toggle-waybar similarity index 93% rename from hyprland/.config/wofi/dmenu/scripts/toggle-waybar rename to bin/kojarchy-toggle-waybar index 16b0ce2f..abc3dbd1 100755 --- a/hyprland/.config/wofi/dmenu/scripts/toggle-waybar +++ b/bin/kojarchy-toggle-waybar @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/bin/bash + +# Toggle waybar visibility and adjust gaps/rounding accordingly WAYBAR_PID=$(pgrep -x waybar) GAPS_STATE_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/waybar-gaps" diff --git a/bin/kojarchy-update b/bin/kojarchy-update new file mode 100755 index 00000000..4ef9271d --- /dev/null +++ b/bin/kojarchy-update @@ -0,0 +1,12 @@ +#!/bin/bash + +set -e + +KOJARCHY_PATH="${KOJARCHY_PATH:-$HOME/dotfiles}" + +trap 'echo ""; echo -e "\033[0;31mSomething went wrong during the update!\n\nPlease review the output above carefully, correct the error, and retry the update.\n\nIf you need help, open an issue at:\nhttps://github.com/princejoogie/dotfiles/issues\033[0m"' ERR + +if [[ $1 == "-y" ]] || kojarchy-update-confirm; then + kojarchy-update-git + kojarchy-update-perform +fi diff --git a/bin/kojarchy-update-aur-pkgs b/bin/kojarchy-update-aur-pkgs new file mode 100755 index 00000000..ec892a9c --- /dev/null +++ b/bin/kojarchy-update-aur-pkgs @@ -0,0 +1,13 @@ +#!/bin/bash + +# Update AUR packages if any are installed +if pacman -Qem >/dev/null 2>&1; then + if kojarchy-pkg-aur-accessible; then + echo -e "\e[32m\nUpdate AUR packages\e[0m" + yay -Sua --noconfirm --cleanafter + echo + else + echo -e "\e[31m\nAUR is unavailable (skipping updates)\e[0m" + echo + fi +fi diff --git a/bin/kojarchy-update-confirm b/bin/kojarchy-update-confirm new file mode 100755 index 00000000..a17d3540 --- /dev/null +++ b/bin/kojarchy-update-confirm @@ -0,0 +1,14 @@ +#!/bin/bash + +gum style --border normal --border-foreground 6 --padding "1 2" \ + "Ready to update?" \ + "" \ + " You cannot stop the update once you start!" \ + " Make sure you're connected to power or have a full battery" + +echo + +if ! gum confirm "Continue with update?"; then + echo "Update cancelled" + exit 1 +fi diff --git a/bin/kojarchy-update-git b/bin/kojarchy-update-git new file mode 100755 index 00000000..f44b8e38 --- /dev/null +++ b/bin/kojarchy-update-git @@ -0,0 +1,9 @@ +#!/bin/bash + +set -e + +KOJARCHY_PATH="${KOJARCHY_PATH:-$HOME/dotfiles}" + +echo -e "\e[32mUpdate Kojarchy\e[0m" +git -C "$KOJARCHY_PATH" pull --autostash +git -C "$KOJARCHY_PATH" --no-pager diff --check || git -C "$KOJARCHY_PATH" reset --merge diff --git a/bin/kojarchy-update-orphan-pkgs b/bin/kojarchy-update-orphan-pkgs new file mode 100755 index 00000000..c1754c90 --- /dev/null +++ b/bin/kojarchy-update-orphan-pkgs @@ -0,0 +1,10 @@ +#!/bin/bash + +orphans=$(pacman -Qtdq 2>/dev/null || true) +if [[ -n $orphans ]]; then + echo -e "\e[32m\nRemove orphan system packages\e[0m" + for pkg in $orphans; do + sudo pacman -Rs --noconfirm "$pkg" || true + done + echo +fi diff --git a/bin/kojarchy-update-perform b/bin/kojarchy-update-perform new file mode 100755 index 00000000..66555377 --- /dev/null +++ b/bin/kojarchy-update-perform @@ -0,0 +1,21 @@ +#!/bin/bash + +set -e + +# Ensure screensaver/sleep doesn't set in during updates +hyprctl dispatch tagwindow +noidle &>/dev/null || true + +# Capture update logs +exec > >(tee "/tmp/kojarchy-update.log") 2>&1 + +# Perform all update steps +kojarchy-update-time +kojarchy-update-system-pkgs +kojarchy-migrate +kojarchy-update-aur-pkgs +kojarchy-update-orphan-pkgs +kojarchy-hook post-update +kojarchy-update-restart + +# Re-enable screensaver/sleep after updates +hyprctl dispatch tagwindow -- -noidle &>/dev/null || true diff --git a/bin/kojarchy-update-restart b/bin/kojarchy-update-restart new file mode 100755 index 00000000..f905e3c7 --- /dev/null +++ b/bin/kojarchy-update-restart @@ -0,0 +1,19 @@ +#!/bin/bash + +# Check if kernel was updated and offer reboot +if [ "$(uname -r | sed 's/-arch/\.arch/')" != "$(pacman -Q linux | awk '{print $2}')" ]; then + gum confirm "Linux kernel has been updated. Reboot?" && kojarchy-cmd-reboot +elif [ -f "$HOME/.local/state/kojarchy/reboot-required" ]; then + gum confirm "Updates require reboot. Ready?" && kojarchy-cmd-reboot +fi + +# Restart any services that flagged themselves +for file in "$HOME"/.local/state/kojarchy/restart-*-required; do + if [ -f "$file" ]; then + filename=$(basename "$file") + service=$(echo "$filename" | sed 's/restart-\(.*\)-required/\1/') + echo "Restarting $service" + kojarchy-state clear "$filename" + kojarchy-restart-"$service" 2>/dev/null || true + fi +done diff --git a/bin/kojarchy-update-system-pkgs b/bin/kojarchy-update-system-pkgs new file mode 100755 index 00000000..36a78418 --- /dev/null +++ b/bin/kojarchy-update-system-pkgs @@ -0,0 +1,6 @@ +#!/bin/bash + +set -e + +echo -e "\e[32m\nUpdate system packages\e[0m" +sudo pacman -Syyu --noconfirm diff --git a/bin/kojarchy-update-time b/bin/kojarchy-update-time new file mode 100755 index 00000000..4c08caf4 --- /dev/null +++ b/bin/kojarchy-update-time @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Updating time..." +sudo systemctl restart systemd-timesyncd diff --git a/bin/kojarchy-version b/bin/kojarchy-version new file mode 100755 index 00000000..c8f7f821 --- /dev/null +++ b/bin/kojarchy-version @@ -0,0 +1,2 @@ +#!/bin/bash +cat "${KOJARCHY_PATH:-$HOME/dotfiles}/version" diff --git a/bin/kojarchy-version-branch b/bin/kojarchy-version-branch new file mode 100755 index 00000000..60cd2028 --- /dev/null +++ b/bin/kojarchy-version-branch @@ -0,0 +1,2 @@ +#!/bin/bash +git -C "${KOJARCHY_PATH:-$HOME/dotfiles}" rev-parse --abbrev-ref HEAD diff --git a/bin/kojarchy-version-pkgs b/bin/kojarchy-version-pkgs new file mode 100755 index 00000000..e4d6b427 --- /dev/null +++ b/bin/kojarchy-version-pkgs @@ -0,0 +1,2 @@ +#!/bin/bash +date -d "$(grep upgraded /var/log/pacman.log | tail -1 | sed -E 's/\[([^]]+)\].*/\1/')" "+%A, %B %d %Y at %H:%M" 2>/dev/null || echo "unknown" diff --git a/shell/.local/custom/bin/lsort b/bin/lsort similarity index 100% rename from shell/.local/custom/bin/lsort rename to bin/lsort diff --git a/shell/.local/custom/bin/scyrox-battery b/bin/scyrox-battery similarity index 100% rename from shell/.local/custom/bin/scyrox-battery rename to bin/scyrox-battery diff --git a/shell/.local/custom/bin/summarize b/bin/summarize similarity index 100% rename from shell/.local/custom/bin/summarize rename to bin/summarize diff --git a/boot.sh b/boot.sh new file mode 100755 index 00000000..7befe90a --- /dev/null +++ b/boot.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# Kojarchy bootstrap - curl-pipe-bash entry point +# Usage: curl -fsSL https://raw.githubusercontent.com/princejoogie/dotfiles/refs/heads/automated-installer/boot.sh | bash + +sudo pacman -Syu --noconfirm --needed git + +KOJARCHY_REPO="${KOJARCHY_REPO:-princejoogie/dotfiles}" +KOJARCHY_DIR="$HOME/dotfiles" + +if [[ -d "$KOJARCHY_DIR/.git" ]]; then + echo "Updating existing dotfiles..." + git -C "$KOJARCHY_DIR" pull +else + echo "Cloning dotfiles from: https://github.com/${KOJARCHY_REPO}.git" + rm -rf "$KOJARCHY_DIR" + git clone "https://github.com/${KOJARCHY_REPO}.git" "$KOJARCHY_DIR" +fi + +KOJARCHY_REF="${KOJARCHY_REF:-automated-installer}" +echo -e "\e[32mUsing branch: $KOJARCHY_REF\e[0m" +cd "$KOJARCHY_DIR" +git fetch origin "$KOJARCHY_REF" && git checkout "$KOJARCHY_REF" +cd - + +echo -e "\nInstallation starting..." +source "$KOJARCHY_DIR/install.sh" diff --git a/check-upstream.sh b/check-upstream.sh new file mode 100755 index 00000000..7a412b70 --- /dev/null +++ b/check-upstream.sh @@ -0,0 +1,92 @@ +#!/bin/bash +set -euo pipefail + +# Kojarchy upstream sync checker +# Compares omarchy changes since our last-known commit and uses opencode +# to interactively walk through each change with the user. + +KOJARCHY_DIR="$(cd "$(dirname "$0")" && pwd)" +OMARCHY_REPO="https://github.com/basecamp/omarchy.git" +OMARCHY_LOCAL="/tmp/kojarchy-omarchy-upstream" +DIFF_FILE="/tmp/kojarchy-omarchy-diff.patch" + +# Last omarchy commit hash we synced against +OMARCHY_BASELINE="ffafe1727e32c38ba5a291bf3a12d5995a01fda0" + +echo "=== Kojarchy Upstream Sync Check ===" +echo "Baseline: $OMARCHY_BASELINE" +echo "" + +# Clone or update omarchy +if [[ -d "$OMARCHY_LOCAL/.git" ]]; then + echo "Updating omarchy clone..." + git -C "$OMARCHY_LOCAL" fetch origin dev + git -C "$OMARCHY_LOCAL" reset --hard origin/dev +else + echo "Cloning omarchy..." + git clone --single-branch --branch dev "$OMARCHY_REPO" "$OMARCHY_LOCAL" +fi + +OMARCHY_LATEST=$(git -C "$OMARCHY_LOCAL" rev-parse HEAD) + +if [[ "$OMARCHY_BASELINE" == "$OMARCHY_LATEST" ]]; then + echo "" + echo "No new changes in omarchy since baseline." + echo "Baseline: $OMARCHY_BASELINE" + exit 0 +fi + +echo "" +echo "Latest: $OMARCHY_LATEST" +echo "" + +# Get the commit log and diff +COMMIT_LOG=$(git -C "$OMARCHY_LOCAL" log --oneline "$OMARCHY_BASELINE..$OMARCHY_LATEST") +DIFF_STAT=$(git -C "$OMARCHY_LOCAL" diff --stat "$OMARCHY_BASELINE..$OMARCHY_LATEST") +git -C "$OMARCHY_LOCAL" diff "$OMARCHY_BASELINE..$OMARCHY_LATEST" > "$DIFF_FILE" + +echo "=== New commits ===" +echo "$COMMIT_LOG" +echo "" +echo "=== Changed files ===" +echo "$DIFF_STAT" +echo "" +echo "Handing off to opencode..." +echo "" + +# Single interactive opencode session that analyzes, asks, and applies +opencode run "You are reviewing upstream changes from omarchy to sync into our kojarchy dotfiles repo. + +## Context +- Our kojarchy repo: $KOJARCHY_DIR +- Omarchy repo clone: $OMARCHY_LOCAL +- Full diff file: $DIFF_FILE +- Baseline commit: $OMARCHY_BASELINE +- Latest commit: $OMARCHY_LATEST + +## Commits since baseline: +$COMMIT_LOG + +## Changed files: +$DIFF_STAT + +## Your workflow + +1. Read the full diff at $DIFF_FILE +2. Read our repo files at $KOJARCHY_DIR as needed for comparison +3. Group related changes together into discrete sync items +4. For each item, **ask me** whether to sync it or skip it. Present each item like this: + + **[1/N] ** + Omarchy changed: + What changed: <1-2 sentence summary of what the change does> + Our equivalent: + Recommendation: SYNC / SKIP / REVIEW (with brief reason) + + Then wait for my response before moving to the next item. + +5. After going through all items, apply ONLY the changes I confirmed +6. Adapt all changes to kojarchy naming/structure — do not copy omarchy references verbatim +7. Do NOT commit — just make the file changes +8. After applying, print a summary of what was changed and remind me to review with git diff and commit when ready +9. Then update the OMARCHY_BASELINE variable in $KOJARCHY_DIR/check-upstream.sh from \"$OMARCHY_BASELINE\" to \"$OMARCHY_LATEST\" by editing the file directly" diff --git a/config.rayconfig b/config.rayconfig deleted file mode 100644 index 761e21bd..00000000 Binary files a/config.rayconfig and /dev/null differ diff --git a/config/Kvantum/kvantum.kvconfig b/config/Kvantum/kvantum.kvconfig new file mode 100644 index 00000000..1e4a4869 --- /dev/null +++ b/config/Kvantum/kvantum.kvconfig @@ -0,0 +1,2 @@ +[General] +theme=Catppuccin-Mocha-Blue diff --git a/config/brave-flags.conf b/config/brave-flags.conf new file mode 100644 index 00000000..c009930b --- /dev/null +++ b/config/brave-flags.conf @@ -0,0 +1,3 @@ +--ozone-platform-hint=auto +--enable-features=WaylandWindowDecorations +--enable-gpu-rasterization diff --git a/config/btop/btop.conf b/config/btop/btop.conf new file mode 100644 index 00000000..8e560fd4 --- /dev/null +++ b/config/btop/btop.conf @@ -0,0 +1,272 @@ +#? Config file for btop v.1.4.6 + +#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. +#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" +color_theme = "catppuccin_mocha" + +#* If the theme set background should be shown, set to False if you want terminal background transparency. +theme_background = true + +#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. +truecolor = true + +#* Set to true to force tty mode regardless if a real tty has been detected or not. +#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. +force_tty = false + +#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. +#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. +#* Use whitespace " " as separator between different presets. +#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" +presets = "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" + +#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. +#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. +vim_keys = true + +#* Rounded corners on boxes, is ignored if TTY mode is ON. +rounded_corners = true + +#* Use terminal synchronized output sequences to reduce flickering on supported terminals. +terminal_sync = true + +#* Default symbols to use for graph creation, "braille", "block" or "tty". +#* "braille" offers the highest resolution but might not be included in all fonts. +#* "block" has half the resolution of braille but uses more common characters. +#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. +#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. +graph_symbol = "braille" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_cpu = "default" + +# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty". +graph_symbol_gpu = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_mem = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_net = "default" + +# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". +graph_symbol_proc = "default" + +#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace. +shown_boxes = "cpu mem net proc" + +#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. +update_ms = 200 + +#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", +#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. +proc_sorting = "memory" + +#* Reverse sorting order, True or False. +proc_reversed = false + +#* Show processes as a tree. +proc_tree = true + +#* Use the cpu graph colors in the process list. +proc_colors = true + +#* Use a darkening gradient in the process list. +proc_gradient = true + +#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. +proc_per_core = true + +#* Show process memory as bytes instead of percent. +proc_mem_bytes = true + +#* Show cpu graph for each process. +proc_cpu_graphs = true + +#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) +proc_info_smaps = false + +#* Show proc box on left side of screen instead of right. +proc_left = false + +#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). +proc_filter_kernel = false + +#* In tree-view, always accumulate child process resources in the parent process. +proc_aggregate = false + +#* Should cpu and memory usage display be preserved for dead processes when paused. +keep_dead_proc_usage = false + +#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_upper = "Auto" + +#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. +#* Select from a list of detected attributes from the options menu. +cpu_graph_lower = "Auto" + +#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off". +show_gpu_info = "Auto" + +#* Toggles if the lower CPU graph should be inverted. +cpu_invert_lower = true + +#* Set to True to completely disable the lower CPU graph. +cpu_single_graph = false + +#* Show cpu box at bottom of screen instead of top. +cpu_bottom = false + +#* Shows the system uptime in the CPU box. +show_uptime = true + +#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo. +show_cpu_watts = true + +#* Show cpu temperature. +check_temp = true + +#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. +cpu_sensor = "Auto" + +#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. +show_coretemp = true + +#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. +#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. +#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. +#* Example: "4:0 5:1 6:3" +cpu_core_map = "" + +#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". +temp_scale = "celsius" + +#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. +base_10_sizes = false + +#* Show CPU frequency. +show_cpu_freq = true + +#* How to calculate CPU frequency, available values: "first", "range", "lowest", "highest" and "average". +freq_mode = "first" + +#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. +#* Special formatting: /host = hostname | /user = username | /uptime = system uptime +clock_format = "%X" + +#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. +background_update = true + +#* Custom cpu model name, empty string to disable. +custom_cpu_name = "" + +#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". +#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user" +disks_filter = "" + +#* Show graphs instead of meters for memory values. +mem_graphs = true + +#* Show mem box below net box instead of above. +mem_below_net = false + +#* Count ZFS ARC in cached and available memory. +zfs_arc_cached = true + +#* If swap memory should be shown in memory box. +show_swap = true + +#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. +swap_disk = true + +#* If mem box should be split to also show disks info. +show_disks = true + +#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. +only_physical = true + +#* Read disks list from /etc/fstab. This also disables only_physical. +use_fstab = true + +#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) +zfs_hide_datasets = false + +#* Set to true to show available disk space for privileged users. +disk_free_priv = false + +#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. +show_io_stat = true + +#* Toggles io mode for disks, showing big graphs for disk read/write speeds. +io_mode = false + +#* Set to True to show combined read/write io graphs in io mode. +io_graph_combined = false + +#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". +#* Example: "/mnt/media:100 /:20 /boot:1". +io_graph_speeds = "" + +#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. +net_download = 100 + +net_upload = 100 + +#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. +net_auto = true + +#* Sync the auto scaling for download and upload to whichever currently has the highest scale. +net_sync = true + +#* Starts with the Network Interface specified here. +net_iface = "" + +#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes. +base_10_bitrate = "Auto" + +#* Show battery stats in top right if battery is present. +show_battery = true + +#* Which battery to use if multiple are present. "Auto" for auto detection. +selected_battery = "Auto" + +#* Show power stats of battery next to charge indicator. +show_battery_watts = true + +#* Set loglevel for "~/.local/state/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". +#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. +log_level = "WARNING" + +#* Automatically save current settings to config file on exit. +save_config_on_exit = true + +#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards. +nvml_measure_pcie_speeds = true + +#* Measure PCIe throughput on AMD cards, may impact performance on certain cards. +rsmi_measure_pcie_speeds = true + +#* Horizontally mirror the GPU graph. +gpu_mirror_graph = true + +#* Set which GPU vendors to show. Available values are "nvidia amd intel" +shown_gpus = "nvidia amd intel" + +#* Custom gpu0 model name, empty string to disable. +custom_gpu_name0 = "" + +#* Custom gpu1 model name, empty string to disable. +custom_gpu_name1 = "" + +#* Custom gpu2 model name, empty string to disable. +custom_gpu_name2 = "" + +#* Custom gpu3 model name, empty string to disable. +custom_gpu_name3 = "" + +#* Custom gpu4 model name, empty string to disable. +custom_gpu_name4 = "" + +#* Custom gpu5 model name, empty string to disable. +custom_gpu_name5 = "" diff --git a/config/btop/themes/catppuccin_mocha.theme b/config/btop/themes/catppuccin_mocha.theme new file mode 100644 index 00000000..99afde07 --- /dev/null +++ b/config/btop/themes/catppuccin_mocha.theme @@ -0,0 +1,92 @@ +# Catppuccin Mocha theme for btop +# https://github.com/catppuccin/btop + +# Main background +theme[main_bg]="#000000" + +# Main text color +theme[main_fg]="#cdd6f4" + +# Title color for boxes +theme[title]="#cdd6f4" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#89b4fa" + +# Background color of selected item in processes box +theme[selected_bg]="#45475a" + +# Foreground color of selected item in processes box +theme[selected_fg]="#cdd6f4" + +# Color of inactive/disabled text +theme[inactive_fg]="#6c7086" + +# Color of text appearing on top of graphs +theme[graph_text]="#a6adc8" + +# Background color of the percentage meters +theme[meter_bg]="#45475a" + +# Misc colors for processes box including mini cpu graphs, ## ## details, binary, and details highlight color +theme[proc_misc]="#89b4fa" + +# CPU box outline color +theme[cpu_box]="#45475a" + +# Memory/disks box outline color +theme[mem_box]="#45475a" + +# Net box outline color +theme[net_box]="#45475a" + +# Processes box outline color +theme[proc_box]="#45475a" + +# Box divider line and target selector line color +theme[div_line]="#45475a" + +# Temperature graph colors +theme[temp_start]="#a6e3a1" +theme[temp_mid]="#f9e2af" +theme[temp_end]="#f38ba8" + +# CPU graph colors +theme[cpu_start]="#a6e3a1" +theme[cpu_mid]="#f9e2af" +theme[cpu_end]="#f38ba8" + +# Mem/Disk free meter +theme[free_start]="#a6e3a1" +theme[free_mid]="#a6e3a1" +theme[free_end]="#a6e3a1" + +# Mem/Disk cached meter +theme[cached_start]="#f9e2af" +theme[cached_mid]="#f9e2af" +theme[cached_end]="#f9e2af" + +# Mem/Disk available meter +theme[available_start]="#89b4fa" +theme[available_mid]="#89b4fa" +theme[available_end]="#89b4fa" + +# Mem/Disk used meter +theme[used_start]="#f38ba8" +theme[used_mid]="#fab387" +theme[used_end]="#f38ba8" + +# Download graph colors +theme[download_start]="#89b4fa" +theme[download_mid]="#74c7ec" +theme[download_end]="#94e2d5" + +# Upload graph colors +theme[upload_start]="#cba6f7" +theme[upload_mid]="#f5c2e7" +theme[upload_end]="#f5e0dc" + +# Process box color gradient for threads, mem and cpu usage +theme[process_start]="#89b4fa" +theme[process_mid]="#cba6f7" +theme[process_end]="#f38ba8" diff --git a/config/chromium-flags.conf b/config/chromium-flags.conf new file mode 100644 index 00000000..c009930b --- /dev/null +++ b/config/chromium-flags.conf @@ -0,0 +1,3 @@ +--ozone-platform-hint=auto +--enable-features=WaylandWindowDecorations +--enable-gpu-rasterization diff --git a/hyprland/.config/dunst/dunstrc b/config/dunst/dunstrc similarity index 100% rename from hyprland/.config/dunst/dunstrc rename to config/dunst/dunstrc diff --git a/config/fontconfig/fonts.conf b/config/fontconfig/fonts.conf new file mode 100644 index 00000000..e6869fe9 --- /dev/null +++ b/config/fontconfig/fonts.conf @@ -0,0 +1,58 @@ + + + + + + sans-serif + + + Liberation Sans + + + + + + serif + + + Liberation Serif + + + + + + monospace + + + FiraCode Nerd Font Mono + + + + + system-ui + + Liberation Sans + + + + + ui-monospace + + monospace + + + + + -apple-system + + Liberation Sans + + + + + BlinkMacSystemFont + + Liberation Sans + + + diff --git a/config/helium-flags.conf b/config/helium-flags.conf new file mode 100644 index 00000000..c009930b --- /dev/null +++ b/config/helium-flags.conf @@ -0,0 +1,3 @@ +--ozone-platform-hint=auto +--enable-features=WaylandWindowDecorations +--enable-gpu-rasterization diff --git a/config/hypr/hypridle.conf b/config/hypr/hypridle.conf new file mode 100644 index 00000000..1926319d --- /dev/null +++ b/config/hypr/hypridle.conf @@ -0,0 +1,16 @@ +general { + lock_cmd = kojarchy-lock-screen + before_sleep_cmd = loginctl lock-session + after_sleep_cmd = hyprctl dispatch dpms on +} + +listener { + timeout = 300 # 5min + on-timeout = loginctl lock-session # lock screen +} + +listener { + timeout = 600 # 10min + on-timeout = hyprctl dispatch dpms off # screen off + on-resume = hyprctl dispatch dpms on # screen on when activity detected +} diff --git a/config/hypr/hyprland.conf b/config/hypr/hyprland.conf new file mode 100644 index 00000000..93a32730 --- /dev/null +++ b/config/hypr/hyprland.conf @@ -0,0 +1,17 @@ +monitor=,2560x1440@240,auto,1 + +$terminal = kitty +$fileManager = nautilus +$menu = wofi --show drun --matching startswith + +# Source defaults (updated via git pull, don't edit these) +source = ~/dotfiles/default/hypr/autostart.conf +source = ~/dotfiles/default/hypr/envs.conf +source = ~/dotfiles/default/hypr/looknfeel.conf +source = ~/dotfiles/default/hypr/input.conf +source = ~/dotfiles/default/hypr/bindings.conf +source = ~/dotfiles/default/hypr/windows.conf + +# User overrides (edit these files in ~/.config/hypr/) +# source = ~/.config/hypr/monitors.conf +# source = ~/.config/hypr/overrides.conf diff --git a/config/hypr/hyprlock.conf b/config/hypr/hyprlock.conf new file mode 100644 index 00000000..f3b7fa8e --- /dev/null +++ b/config/hypr/hyprlock.conf @@ -0,0 +1,37 @@ +general { + ignore_empty_input = true +} + +background { + monitor = + color = rgb(000000) + path = ~/dotfiles/wallpapers/pallete.png + blur_passes = 3 +} + +animations { + enabled = false +} + +input-field { + monitor = + size = 650, 100 + position = 0, 0 + halign = center + valign = center + + inner_color = rgb(000000) + outer_color = rgb(89b4fa) + outline_thickness = 4 + + font_family = FiraCode Nerd Font Mono + font_color = rgb(cdd6f4) + + placeholder_text = Enter Password + check_color = rgb(a6e3a1) + fail_text = $FAIL ($ATTEMPTS) + + rounding = 0 + shadow_passes = 0 + fade_on_empty = false +} diff --git a/config/hypr/hyprsunset.conf b/config/hypr/hyprsunset.conf new file mode 100644 index 00000000..9617c754 --- /dev/null +++ b/config/hypr/hyprsunset.conf @@ -0,0 +1,14 @@ +# Default: no color temperature change +# To enable auto night light, add to your autostart.conf: +# exec-once = hyprsunset +# and uncomment the profile below: + +profile { + time = 07:00 + identity = true +} + +# profile { +# time = 20:00 +# temperature = 4000 +# } diff --git a/shell/.config/kitty/current-theme.conf b/config/kitty/current-theme.conf similarity index 100% rename from shell/.config/kitty/current-theme.conf rename to config/kitty/current-theme.conf diff --git a/shell/.config/kitty/kitty.conf b/config/kitty/kitty.conf similarity index 100% rename from shell/.config/kitty/kitty.conf rename to config/kitty/kitty.conf diff --git a/config/kojarchy/hooks/font-set.sample b/config/kojarchy/hooks/font-set.sample new file mode 100644 index 00000000..b0f2dcaf --- /dev/null +++ b/config/kojarchy/hooks/font-set.sample @@ -0,0 +1,7 @@ +#!/bin/bash +# This hook runs after kojarchy-font-set changes the font. +# The new font name is passed as $1. +# Rename this file to 'font-set' (remove .sample) to activate. +# +# Example: notify about font change +# notify-send "Font changed to $1" diff --git a/config/kojarchy/hooks/post-update.sample b/config/kojarchy/hooks/post-update.sample new file mode 100644 index 00000000..14dce3ba --- /dev/null +++ b/config/kojarchy/hooks/post-update.sample @@ -0,0 +1,6 @@ +#!/bin/bash +# This hook runs after kojarchy-update completes. +# Rename this file to 'post-update' (remove .sample) to activate. +# +# Example: restart waybar after update +# kojarchy-restart-waybar diff --git a/.luarc.json b/config/nvim/.luarc.json similarity index 100% rename from .luarc.json rename to config/nvim/.luarc.json diff --git a/.stylua.toml b/config/nvim/.stylua.toml similarity index 100% rename from .stylua.toml rename to config/nvim/.stylua.toml diff --git a/nvim/.config/nvim/after/ftplugin/oil.lua b/config/nvim/after/ftplugin/oil.lua similarity index 100% rename from nvim/.config/nvim/after/ftplugin/oil.lua rename to config/nvim/after/ftplugin/oil.lua diff --git a/nvim/.config/nvim/after/ftplugin/qf.lua b/config/nvim/after/ftplugin/qf.lua similarity index 100% rename from nvim/.config/nvim/after/ftplugin/qf.lua rename to config/nvim/after/ftplugin/qf.lua diff --git a/nvim/.config/nvim/after/lsp/.gitkeep b/config/nvim/after/lsp/.gitkeep similarity index 100% rename from nvim/.config/nvim/after/lsp/.gitkeep rename to config/nvim/after/lsp/.gitkeep diff --git a/nvim/.config/nvim/after/queries/javascript/injections.scm b/config/nvim/after/queries/javascript/injections.scm similarity index 100% rename from nvim/.config/nvim/after/queries/javascript/injections.scm rename to config/nvim/after/queries/javascript/injections.scm diff --git a/nvim/.config/nvim/after/queries/javascriptreact/injections.scm b/config/nvim/after/queries/javascriptreact/injections.scm similarity index 100% rename from nvim/.config/nvim/after/queries/javascriptreact/injections.scm rename to config/nvim/after/queries/javascriptreact/injections.scm diff --git a/nvim/.config/nvim/after/queries/typescript/injections.scm b/config/nvim/after/queries/typescript/injections.scm similarity index 100% rename from nvim/.config/nvim/after/queries/typescript/injections.scm rename to config/nvim/after/queries/typescript/injections.scm diff --git a/nvim/.config/nvim/after/queries/typescriptreact/injections.scm b/config/nvim/after/queries/typescriptreact/injections.scm similarity index 100% rename from nvim/.config/nvim/after/queries/typescriptreact/injections.scm rename to config/nvim/after/queries/typescriptreact/injections.scm diff --git a/nvim/.config/nvim/init.lua b/config/nvim/init.lua similarity index 100% rename from nvim/.config/nvim/init.lua rename to config/nvim/init.lua diff --git a/nvim/.config/nvim/lazy-lock.json b/config/nvim/lazy-lock.json similarity index 100% rename from nvim/.config/nvim/lazy-lock.json rename to config/nvim/lazy-lock.json diff --git a/nvim/.config/nvim/lua/joogie/autocmds/init.lua b/config/nvim/lua/joogie/autocmds/init.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/autocmds/init.lua rename to config/nvim/lua/joogie/autocmds/init.lua diff --git a/nvim/.config/nvim/lua/joogie/autocmds/node-exec.lua b/config/nvim/lua/joogie/autocmds/node-exec.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/autocmds/node-exec.lua rename to config/nvim/lua/joogie/autocmds/node-exec.lua diff --git a/nvim/.config/nvim/lua/joogie/autocmds/opencode.lua b/config/nvim/lua/joogie/autocmds/opencode.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/autocmds/opencode.lua rename to config/nvim/lua/joogie/autocmds/opencode.lua diff --git a/nvim/.config/nvim/lua/joogie/autocmds/super-zen.lua b/config/nvim/lua/joogie/autocmds/super-zen.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/autocmds/super-zen.lua rename to config/nvim/lua/joogie/autocmds/super-zen.lua diff --git a/nvim/.config/nvim/lua/joogie/init.lua b/config/nvim/lua/joogie/init.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/init.lua rename to config/nvim/lua/joogie/init.lua diff --git a/nvim/.config/nvim/lua/joogie/keymaps/init.lua b/config/nvim/lua/joogie/keymaps/init.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/keymaps/init.lua rename to config/nvim/lua/joogie/keymaps/init.lua diff --git a/nvim/.config/nvim/lua/joogie/options/init.lua b/config/nvim/lua/joogie/options/init.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/options/init.lua rename to config/nvim/lua/joogie/options/init.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/diffview.lua b/config/nvim/lua/joogie/plugins/diffview.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/diffview.lua rename to config/nvim/lua/joogie/plugins/diffview.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/formatter.lua b/config/nvim/lua/joogie/plugins/formatter.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/formatter.lua rename to config/nvim/lua/joogie/plugins/formatter.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/gitsigns.lua b/config/nvim/lua/joogie/plugins/gitsigns.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/gitsigns.lua rename to config/nvim/lua/joogie/plugins/gitsigns.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/init.lua b/config/nvim/lua/joogie/plugins/init.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/init.lua rename to config/nvim/lua/joogie/plugins/init.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/local.lua b/config/nvim/lua/joogie/plugins/local.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/local.lua rename to config/nvim/lua/joogie/plugins/local.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/lsp.lua b/config/nvim/lua/joogie/plugins/lsp.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/lsp.lua rename to config/nvim/lua/joogie/plugins/lsp.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/neo-test.lua b/config/nvim/lua/joogie/plugins/neo-test.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/neo-test.lua rename to config/nvim/lua/joogie/plugins/neo-test.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/nvim-cmp.lua b/config/nvim/lua/joogie/plugins/nvim-cmp.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/nvim-cmp.lua rename to config/nvim/lua/joogie/plugins/nvim-cmp.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/snacks.lua b/config/nvim/lua/joogie/plugins/snacks.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/snacks.lua rename to config/nvim/lua/joogie/plugins/snacks.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/theme.lua b/config/nvim/lua/joogie/plugins/theme.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/theme.lua rename to config/nvim/lua/joogie/plugins/theme.lua diff --git a/nvim/.config/nvim/lua/joogie/plugins/treesitter.lua b/config/nvim/lua/joogie/plugins/treesitter.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/plugins/treesitter.lua rename to config/nvim/lua/joogie/plugins/treesitter.lua diff --git a/nvim/.config/nvim/lua/joogie/utils/init.lua b/config/nvim/lua/joogie/utils/init.lua similarity index 100% rename from nvim/.config/nvim/lua/joogie/utils/init.lua rename to config/nvim/lua/joogie/utils/init.lua diff --git a/opencode/.config/opencode/opencode.json b/config/opencode/opencode.json similarity index 100% rename from opencode/.config/opencode/opencode.json rename to config/opencode/opencode.json diff --git a/opencode/.config/opencode/skills/frontend-design/LICENSE.txt b/config/opencode/skills/frontend-design/LICENSE.txt similarity index 100% rename from opencode/.config/opencode/skills/frontend-design/LICENSE.txt rename to config/opencode/skills/frontend-design/LICENSE.txt diff --git a/opencode/.config/opencode/skills/frontend-design/SKILL.md b/config/opencode/skills/frontend-design/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/frontend-design/SKILL.md rename to config/opencode/skills/frontend-design/SKILL.md diff --git a/opencode/.config/opencode/skills/overseer-plan/SKILL.md b/config/opencode/skills/overseer-plan/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/overseer-plan/SKILL.md rename to config/opencode/skills/overseer-plan/SKILL.md diff --git a/opencode/.config/opencode/skills/overseer-plan/references/api.md b/config/opencode/skills/overseer-plan/references/api.md similarity index 100% rename from opencode/.config/opencode/skills/overseer-plan/references/api.md rename to config/opencode/skills/overseer-plan/references/api.md diff --git a/opencode/.config/opencode/skills/overseer-plan/references/examples.md b/config/opencode/skills/overseer-plan/references/examples.md similarity index 100% rename from opencode/.config/opencode/skills/overseer-plan/references/examples.md rename to config/opencode/skills/overseer-plan/references/examples.md diff --git a/opencode/.config/opencode/skills/overseer-plan/references/implementation.md b/config/opencode/skills/overseer-plan/references/implementation.md similarity index 100% rename from opencode/.config/opencode/skills/overseer-plan/references/implementation.md rename to config/opencode/skills/overseer-plan/references/implementation.md diff --git a/opencode/.config/opencode/skills/overseer/SKILL.md b/config/opencode/skills/overseer/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/overseer/SKILL.md rename to config/opencode/skills/overseer/SKILL.md diff --git a/opencode/.config/opencode/skills/overseer/references/api.md b/config/opencode/skills/overseer/references/api.md similarity index 100% rename from opencode/.config/opencode/skills/overseer/references/api.md rename to config/opencode/skills/overseer/references/api.md diff --git a/opencode/.config/opencode/skills/overseer/references/examples.md b/config/opencode/skills/overseer/references/examples.md similarity index 100% rename from opencode/.config/opencode/skills/overseer/references/examples.md rename to config/opencode/skills/overseer/references/examples.md diff --git a/opencode/.config/opencode/skills/overseer/references/hierarchies.md b/config/opencode/skills/overseer/references/hierarchies.md similarity index 100% rename from opencode/.config/opencode/skills/overseer/references/hierarchies.md rename to config/opencode/skills/overseer/references/hierarchies.md diff --git a/opencode/.config/opencode/skills/overseer/references/verification.md b/config/opencode/skills/overseer/references/verification.md similarity index 100% rename from opencode/.config/opencode/skills/overseer/references/verification.md rename to config/opencode/skills/overseer/references/verification.md diff --git a/opencode/.config/opencode/skills/overseer/references/workflow.md b/config/opencode/skills/overseer/references/workflow.md similarity index 100% rename from opencode/.config/opencode/skills/overseer/references/workflow.md rename to config/opencode/skills/overseer/references/workflow.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/SKILL.md b/config/opencode/skills/remotion-best-practices/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/SKILL.md rename to config/opencode/skills/remotion-best-practices/SKILL.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/3d.md b/config/opencode/skills/remotion-best-practices/rules/3d.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/3d.md rename to config/opencode/skills/remotion-best-practices/rules/3d.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/animations.md b/config/opencode/skills/remotion-best-practices/rules/animations.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/animations.md rename to config/opencode/skills/remotion-best-practices/rules/animations.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/assets.md b/config/opencode/skills/remotion-best-practices/rules/assets.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/assets.md rename to config/opencode/skills/remotion-best-practices/rules/assets.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx b/config/opencode/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx rename to config/opencode/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx b/config/opencode/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx rename to config/opencode/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx b/config/opencode/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx rename to config/opencode/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/audio.md b/config/opencode/skills/remotion-best-practices/rules/audio.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/audio.md rename to config/opencode/skills/remotion-best-practices/rules/audio.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/calculate-metadata.md b/config/opencode/skills/remotion-best-practices/rules/calculate-metadata.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/calculate-metadata.md rename to config/opencode/skills/remotion-best-practices/rules/calculate-metadata.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/can-decode.md b/config/opencode/skills/remotion-best-practices/rules/can-decode.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/can-decode.md rename to config/opencode/skills/remotion-best-practices/rules/can-decode.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/charts.md b/config/opencode/skills/remotion-best-practices/rules/charts.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/charts.md rename to config/opencode/skills/remotion-best-practices/rules/charts.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/compositions.md b/config/opencode/skills/remotion-best-practices/rules/compositions.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/compositions.md rename to config/opencode/skills/remotion-best-practices/rules/compositions.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/display-captions.md b/config/opencode/skills/remotion-best-practices/rules/display-captions.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/display-captions.md rename to config/opencode/skills/remotion-best-practices/rules/display-captions.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/extract-frames.md b/config/opencode/skills/remotion-best-practices/rules/extract-frames.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/extract-frames.md rename to config/opencode/skills/remotion-best-practices/rules/extract-frames.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/fonts.md b/config/opencode/skills/remotion-best-practices/rules/fonts.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/fonts.md rename to config/opencode/skills/remotion-best-practices/rules/fonts.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/get-audio-duration.md b/config/opencode/skills/remotion-best-practices/rules/get-audio-duration.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/get-audio-duration.md rename to config/opencode/skills/remotion-best-practices/rules/get-audio-duration.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/get-video-dimensions.md b/config/opencode/skills/remotion-best-practices/rules/get-video-dimensions.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/get-video-dimensions.md rename to config/opencode/skills/remotion-best-practices/rules/get-video-dimensions.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/get-video-duration.md b/config/opencode/skills/remotion-best-practices/rules/get-video-duration.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/get-video-duration.md rename to config/opencode/skills/remotion-best-practices/rules/get-video-duration.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/gifs.md b/config/opencode/skills/remotion-best-practices/rules/gifs.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/gifs.md rename to config/opencode/skills/remotion-best-practices/rules/gifs.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/images.md b/config/opencode/skills/remotion-best-practices/rules/images.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/images.md rename to config/opencode/skills/remotion-best-practices/rules/images.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/import-srt-captions.md b/config/opencode/skills/remotion-best-practices/rules/import-srt-captions.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/import-srt-captions.md rename to config/opencode/skills/remotion-best-practices/rules/import-srt-captions.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/lottie.md b/config/opencode/skills/remotion-best-practices/rules/lottie.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/lottie.md rename to config/opencode/skills/remotion-best-practices/rules/lottie.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/maps.md b/config/opencode/skills/remotion-best-practices/rules/maps.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/maps.md rename to config/opencode/skills/remotion-best-practices/rules/maps.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/measuring-dom-nodes.md b/config/opencode/skills/remotion-best-practices/rules/measuring-dom-nodes.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/measuring-dom-nodes.md rename to config/opencode/skills/remotion-best-practices/rules/measuring-dom-nodes.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/measuring-text.md b/config/opencode/skills/remotion-best-practices/rules/measuring-text.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/measuring-text.md rename to config/opencode/skills/remotion-best-practices/rules/measuring-text.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/parameters.md b/config/opencode/skills/remotion-best-practices/rules/parameters.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/parameters.md rename to config/opencode/skills/remotion-best-practices/rules/parameters.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/sequencing.md b/config/opencode/skills/remotion-best-practices/rules/sequencing.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/sequencing.md rename to config/opencode/skills/remotion-best-practices/rules/sequencing.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/tailwind.md b/config/opencode/skills/remotion-best-practices/rules/tailwind.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/tailwind.md rename to config/opencode/skills/remotion-best-practices/rules/tailwind.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/text-animations.md b/config/opencode/skills/remotion-best-practices/rules/text-animations.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/text-animations.md rename to config/opencode/skills/remotion-best-practices/rules/text-animations.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/timing.md b/config/opencode/skills/remotion-best-practices/rules/timing.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/timing.md rename to config/opencode/skills/remotion-best-practices/rules/timing.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/transcribe-captions.md b/config/opencode/skills/remotion-best-practices/rules/transcribe-captions.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/transcribe-captions.md rename to config/opencode/skills/remotion-best-practices/rules/transcribe-captions.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/transitions.md b/config/opencode/skills/remotion-best-practices/rules/transitions.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/transitions.md rename to config/opencode/skills/remotion-best-practices/rules/transitions.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/trimming.md b/config/opencode/skills/remotion-best-practices/rules/trimming.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/trimming.md rename to config/opencode/skills/remotion-best-practices/rules/trimming.md diff --git a/opencode/.config/opencode/skills/remotion-best-practices/rules/videos.md b/config/opencode/skills/remotion-best-practices/rules/videos.md similarity index 100% rename from opencode/.config/opencode/skills/remotion-best-practices/rules/videos.md rename to config/opencode/skills/remotion-best-practices/rules/videos.md diff --git a/opencode/.config/opencode/skills/turborepo/SKILL.md b/config/opencode/skills/turborepo/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/SKILL.md rename to config/opencode/skills/turborepo/SKILL.md diff --git a/opencode/.config/opencode/skills/turborepo/command/turborepo.md b/config/opencode/skills/turborepo/command/turborepo.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/command/turborepo.md rename to config/opencode/skills/turborepo/command/turborepo.md diff --git a/opencode/.config/opencode/skills/turborepo/references/best-practices/dependencies.md b/config/opencode/skills/turborepo/references/best-practices/dependencies.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/best-practices/dependencies.md rename to config/opencode/skills/turborepo/references/best-practices/dependencies.md diff --git a/opencode/.config/opencode/skills/turborepo/references/best-practices/packages.md b/config/opencode/skills/turborepo/references/best-practices/packages.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/best-practices/packages.md rename to config/opencode/skills/turborepo/references/best-practices/packages.md diff --git a/opencode/.config/opencode/skills/turborepo/references/best-practices/structure.md b/config/opencode/skills/turborepo/references/best-practices/structure.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/best-practices/structure.md rename to config/opencode/skills/turborepo/references/best-practices/structure.md diff --git a/opencode/.config/opencode/skills/turborepo/references/caching/gotchas.md b/config/opencode/skills/turborepo/references/caching/gotchas.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/caching/gotchas.md rename to config/opencode/skills/turborepo/references/caching/gotchas.md diff --git a/opencode/.config/opencode/skills/turborepo/references/caching/remote-cache.md b/config/opencode/skills/turborepo/references/caching/remote-cache.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/caching/remote-cache.md rename to config/opencode/skills/turborepo/references/caching/remote-cache.md diff --git a/opencode/.config/opencode/skills/turborepo/references/ci/github-actions.md b/config/opencode/skills/turborepo/references/ci/github-actions.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/ci/github-actions.md rename to config/opencode/skills/turborepo/references/ci/github-actions.md diff --git a/opencode/.config/opencode/skills/turborepo/references/ci/patterns.md b/config/opencode/skills/turborepo/references/ci/patterns.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/ci/patterns.md rename to config/opencode/skills/turborepo/references/ci/patterns.md diff --git a/opencode/.config/opencode/skills/turborepo/references/ci/vercel.md b/config/opencode/skills/turborepo/references/ci/vercel.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/ci/vercel.md rename to config/opencode/skills/turborepo/references/ci/vercel.md diff --git a/opencode/.config/opencode/skills/turborepo/references/cli/commands.md b/config/opencode/skills/turborepo/references/cli/commands.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/cli/commands.md rename to config/opencode/skills/turborepo/references/cli/commands.md diff --git a/opencode/.config/opencode/skills/turborepo/references/configuration/global-options.md b/config/opencode/skills/turborepo/references/configuration/global-options.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/configuration/global-options.md rename to config/opencode/skills/turborepo/references/configuration/global-options.md diff --git a/opencode/.config/opencode/skills/turborepo/references/configuration/gotchas.md b/config/opencode/skills/turborepo/references/configuration/gotchas.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/configuration/gotchas.md rename to config/opencode/skills/turborepo/references/configuration/gotchas.md diff --git a/opencode/.config/opencode/skills/turborepo/references/configuration/tasks.md b/config/opencode/skills/turborepo/references/configuration/tasks.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/configuration/tasks.md rename to config/opencode/skills/turborepo/references/configuration/tasks.md diff --git a/opencode/.config/opencode/skills/turborepo/references/environment/gotchas.md b/config/opencode/skills/turborepo/references/environment/gotchas.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/environment/gotchas.md rename to config/opencode/skills/turborepo/references/environment/gotchas.md diff --git a/opencode/.config/opencode/skills/turborepo/references/environment/modes.md b/config/opencode/skills/turborepo/references/environment/modes.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/environment/modes.md rename to config/opencode/skills/turborepo/references/environment/modes.md diff --git a/opencode/.config/opencode/skills/turborepo/references/filtering/patterns.md b/config/opencode/skills/turborepo/references/filtering/patterns.md similarity index 100% rename from opencode/.config/opencode/skills/turborepo/references/filtering/patterns.md rename to config/opencode/skills/turborepo/references/filtering/patterns.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/AGENTS.md b/config/opencode/skills/vercel-composition-patterns/AGENTS.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/AGENTS.md rename to config/opencode/skills/vercel-composition-patterns/AGENTS.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/SKILL.md b/config/opencode/skills/vercel-composition-patterns/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/SKILL.md rename to config/opencode/skills/vercel-composition-patterns/SKILL.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md b/config/opencode/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md rename to config/opencode/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/rules/architecture-compound-components.md b/config/opencode/skills/vercel-composition-patterns/rules/architecture-compound-components.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/rules/architecture-compound-components.md rename to config/opencode/skills/vercel-composition-patterns/rules/architecture-compound-components.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md b/config/opencode/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md rename to config/opencode/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md b/config/opencode/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md rename to config/opencode/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/rules/react19-no-forwardref.md b/config/opencode/skills/vercel-composition-patterns/rules/react19-no-forwardref.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/rules/react19-no-forwardref.md rename to config/opencode/skills/vercel-composition-patterns/rules/react19-no-forwardref.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/rules/state-context-interface.md b/config/opencode/skills/vercel-composition-patterns/rules/state-context-interface.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/rules/state-context-interface.md rename to config/opencode/skills/vercel-composition-patterns/rules/state-context-interface.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/rules/state-decouple-implementation.md b/config/opencode/skills/vercel-composition-patterns/rules/state-decouple-implementation.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/rules/state-decouple-implementation.md rename to config/opencode/skills/vercel-composition-patterns/rules/state-decouple-implementation.md diff --git a/opencode/.config/opencode/skills/vercel-composition-patterns/rules/state-lift-state.md b/config/opencode/skills/vercel-composition-patterns/rules/state-lift-state.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-composition-patterns/rules/state-lift-state.md rename to config/opencode/skills/vercel-composition-patterns/rules/state-lift-state.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/AGENTS.md b/config/opencode/skills/vercel-react-best-practices/AGENTS.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/AGENTS.md rename to config/opencode/skills/vercel-react-best-practices/AGENTS.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/SKILL.md b/config/opencode/skills/vercel-react-best-practices/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/SKILL.md rename to config/opencode/skills/vercel-react-best-practices/SKILL.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md b/config/opencode/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md rename to config/opencode/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/advanced-init-once.md b/config/opencode/skills/vercel-react-best-practices/rules/advanced-init-once.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/advanced-init-once.md rename to config/opencode/skills/vercel-react-best-practices/rules/advanced-init-once.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/advanced-use-latest.md b/config/opencode/skills/vercel-react-best-practices/rules/advanced-use-latest.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/advanced-use-latest.md rename to config/opencode/skills/vercel-react-best-practices/rules/advanced-use-latest.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-api-routes.md b/config/opencode/skills/vercel-react-best-practices/rules/async-api-routes.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-api-routes.md rename to config/opencode/skills/vercel-react-best-practices/rules/async-api-routes.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-defer-await.md b/config/opencode/skills/vercel-react-best-practices/rules/async-defer-await.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-defer-await.md rename to config/opencode/skills/vercel-react-best-practices/rules/async-defer-await.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-dependencies.md b/config/opencode/skills/vercel-react-best-practices/rules/async-dependencies.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-dependencies.md rename to config/opencode/skills/vercel-react-best-practices/rules/async-dependencies.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-parallel.md b/config/opencode/skills/vercel-react-best-practices/rules/async-parallel.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-parallel.md rename to config/opencode/skills/vercel-react-best-practices/rules/async-parallel.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md b/config/opencode/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md rename to config/opencode/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md b/config/opencode/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md rename to config/opencode/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-conditional.md b/config/opencode/skills/vercel-react-best-practices/rules/bundle-conditional.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-conditional.md rename to config/opencode/skills/vercel-react-best-practices/rules/bundle-conditional.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md b/config/opencode/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md rename to config/opencode/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md b/config/opencode/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md rename to config/opencode/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-preload.md b/config/opencode/skills/vercel-react-best-practices/rules/bundle-preload.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/bundle-preload.md rename to config/opencode/skills/vercel-react-best-practices/rules/bundle-preload.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/client-event-listeners.md b/config/opencode/skills/vercel-react-best-practices/rules/client-event-listeners.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/client-event-listeners.md rename to config/opencode/skills/vercel-react-best-practices/rules/client-event-listeners.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/client-localstorage-schema.md b/config/opencode/skills/vercel-react-best-practices/rules/client-localstorage-schema.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/client-localstorage-schema.md rename to config/opencode/skills/vercel-react-best-practices/rules/client-localstorage-schema.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md b/config/opencode/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md rename to config/opencode/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/client-swr-dedup.md b/config/opencode/skills/vercel-react-best-practices/rules/client-swr-dedup.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/client-swr-dedup.md rename to config/opencode/skills/vercel-react-best-practices/rules/client-swr-dedup.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-batch-dom-css.md b/config/opencode/skills/vercel-react-best-practices/rules/js-batch-dom-css.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-batch-dom-css.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-batch-dom-css.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md b/config/opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-cache-property-access.md b/config/opencode/skills/vercel-react-best-practices/rules/js-cache-property-access.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-cache-property-access.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-cache-property-access.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-cache-storage.md b/config/opencode/skills/vercel-react-best-practices/rules/js-cache-storage.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-cache-storage.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-cache-storage.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-combine-iterations.md b/config/opencode/skills/vercel-react-best-practices/rules/js-combine-iterations.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-combine-iterations.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-combine-iterations.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-early-exit.md b/config/opencode/skills/vercel-react-best-practices/rules/js-early-exit.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-early-exit.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-early-exit.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-hoist-regexp.md b/config/opencode/skills/vercel-react-best-practices/rules/js-hoist-regexp.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-hoist-regexp.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-hoist-regexp.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-index-maps.md b/config/opencode/skills/vercel-react-best-practices/rules/js-index-maps.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-index-maps.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-index-maps.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-length-check-first.md b/config/opencode/skills/vercel-react-best-practices/rules/js-length-check-first.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-length-check-first.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-length-check-first.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-min-max-loop.md b/config/opencode/skills/vercel-react-best-practices/rules/js-min-max-loop.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-min-max-loop.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-min-max-loop.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-set-map-lookups.md b/config/opencode/skills/vercel-react-best-practices/rules/js-set-map-lookups.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-set-map-lookups.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-set-map-lookups.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md b/config/opencode/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md rename to config/opencode/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-activity.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-activity.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-activity.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-activity.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-conditional-render.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-conditional-render.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-conditional-render.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-conditional-render.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-content-visibility.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-content-visibility.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-content-visibility.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-content-visibility.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-svg-precision.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-svg-precision.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-svg-precision.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-svg-precision.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md b/config/opencode/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md rename to config/opencode/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-defer-reads.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-defer-reads.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-defer-reads.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-defer-reads.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-dependencies.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-dependencies.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-dependencies.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-dependencies.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-derived-state.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-derived-state.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-derived-state.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-derived-state.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-memo.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-memo.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-memo.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-memo.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-transitions.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-transitions.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-transitions.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-transitions.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md b/config/opencode/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md rename to config/opencode/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-after-nonblocking.md b/config/opencode/skills/vercel-react-best-practices/rules/server-after-nonblocking.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-after-nonblocking.md rename to config/opencode/skills/vercel-react-best-practices/rules/server-after-nonblocking.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-auth-actions.md b/config/opencode/skills/vercel-react-best-practices/rules/server-auth-actions.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-auth-actions.md rename to config/opencode/skills/vercel-react-best-practices/rules/server-auth-actions.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-cache-lru.md b/config/opencode/skills/vercel-react-best-practices/rules/server-cache-lru.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-cache-lru.md rename to config/opencode/skills/vercel-react-best-practices/rules/server-cache-lru.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-cache-react.md b/config/opencode/skills/vercel-react-best-practices/rules/server-cache-react.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-cache-react.md rename to config/opencode/skills/vercel-react-best-practices/rules/server-cache-react.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-dedup-props.md b/config/opencode/skills/vercel-react-best-practices/rules/server-dedup-props.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-dedup-props.md rename to config/opencode/skills/vercel-react-best-practices/rules/server-dedup-props.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-parallel-fetching.md b/config/opencode/skills/vercel-react-best-practices/rules/server-parallel-fetching.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-parallel-fetching.md rename to config/opencode/skills/vercel-react-best-practices/rules/server-parallel-fetching.md diff --git a/opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-serialization.md b/config/opencode/skills/vercel-react-best-practices/rules/server-serialization.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-best-practices/rules/server-serialization.md rename to config/opencode/skills/vercel-react-best-practices/rules/server-serialization.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/AGENTS.md b/config/opencode/skills/vercel-react-native-skills/AGENTS.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/AGENTS.md rename to config/opencode/skills/vercel-react-native-skills/AGENTS.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/SKILL.md b/config/opencode/skills/vercel-react-native-skills/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/SKILL.md rename to config/opencode/skills/vercel-react-native-skills/SKILL.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/animation-derived-value.md b/config/opencode/skills/vercel-react-native-skills/rules/animation-derived-value.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/animation-derived-value.md rename to config/opencode/skills/vercel-react-native-skills/rules/animation-derived-value.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md b/config/opencode/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md rename to config/opencode/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/animation-gpu-properties.md b/config/opencode/skills/vercel-react-native-skills/rules/animation-gpu-properties.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/animation-gpu-properties.md rename to config/opencode/skills/vercel-react-native-skills/rules/animation-gpu-properties.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/design-system-compound-components.md b/config/opencode/skills/vercel-react-native-skills/rules/design-system-compound-components.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/design-system-compound-components.md rename to config/opencode/skills/vercel-react-native-skills/rules/design-system-compound-components.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/fonts-config-plugin.md b/config/opencode/skills/vercel-react-native-skills/rules/fonts-config-plugin.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/fonts-config-plugin.md rename to config/opencode/skills/vercel-react-native-skills/rules/fonts-config-plugin.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/imports-design-system-folder.md b/config/opencode/skills/vercel-react-native-skills/rules/imports-design-system-folder.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/imports-design-system-folder.md rename to config/opencode/skills/vercel-react-native-skills/rules/imports-design-system-folder.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/js-hoist-intl.md b/config/opencode/skills/vercel-react-native-skills/rules/js-hoist-intl.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/js-hoist-intl.md rename to config/opencode/skills/vercel-react-native-skills/rules/js-hoist-intl.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-callbacks.md b/config/opencode/skills/vercel-react-native-skills/rules/list-performance-callbacks.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-callbacks.md rename to config/opencode/skills/vercel-react-native-skills/rules/list-performance-callbacks.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-function-references.md b/config/opencode/skills/vercel-react-native-skills/rules/list-performance-function-references.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-function-references.md rename to config/opencode/skills/vercel-react-native-skills/rules/list-performance-function-references.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-images.md b/config/opencode/skills/vercel-react-native-skills/rules/list-performance-images.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-images.md rename to config/opencode/skills/vercel-react-native-skills/rules/list-performance-images.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md b/config/opencode/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md rename to config/opencode/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md b/config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md rename to config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-memo.md b/config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-memo.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-memo.md rename to config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-memo.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-types.md b/config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-types.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-types.md rename to config/opencode/skills/vercel-react-native-skills/rules/list-performance-item-types.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-virtualize.md b/config/opencode/skills/vercel-react-native-skills/rules/list-performance-virtualize.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/list-performance-virtualize.md rename to config/opencode/skills/vercel-react-native-skills/rules/list-performance-virtualize.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md b/config/opencode/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md rename to config/opencode/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md b/config/opencode/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md rename to config/opencode/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/navigation-native-navigators.md b/config/opencode/skills/vercel-react-native-skills/rules/navigation-native-navigators.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/navigation-native-navigators.md rename to config/opencode/skills/vercel-react-native-skills/rules/navigation-native-navigators.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md b/config/opencode/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md rename to config/opencode/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md b/config/opencode/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md rename to config/opencode/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-state-dispatcher.md b/config/opencode/skills/vercel-react-native-skills/rules/react-state-dispatcher.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-state-dispatcher.md rename to config/opencode/skills/vercel-react-native-skills/rules/react-state-dispatcher.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-state-fallback.md b/config/opencode/skills/vercel-react-native-skills/rules/react-state-fallback.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-state-fallback.md rename to config/opencode/skills/vercel-react-native-skills/rules/react-state-fallback.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-state-minimize.md b/config/opencode/skills/vercel-react-native-skills/rules/react-state-minimize.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/react-state-minimize.md rename to config/opencode/skills/vercel-react-native-skills/rules/react-state-minimize.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md b/config/opencode/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md rename to config/opencode/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md b/config/opencode/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md rename to config/opencode/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/scroll-position-no-state.md b/config/opencode/skills/vercel-react-native-skills/rules/scroll-position-no-state.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/scroll-position-no-state.md rename to config/opencode/skills/vercel-react-native-skills/rules/scroll-position-no-state.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/state-ground-truth.md b/config/opencode/skills/vercel-react-native-skills/rules/state-ground-truth.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/state-ground-truth.md rename to config/opencode/skills/vercel-react-native-skills/rules/state-ground-truth.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-expo-image.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-expo-image.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-expo-image.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-expo-image.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-image-gallery.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-image-gallery.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-image-gallery.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-image-gallery.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-measure-views.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-measure-views.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-measure-views.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-measure-views.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-menus.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-menus.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-menus.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-menus.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-native-modals.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-native-modals.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-native-modals.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-native-modals.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-pressable.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-pressable.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-pressable.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-pressable.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md diff --git a/opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-styling.md b/config/opencode/skills/vercel-react-native-skills/rules/ui-styling.md similarity index 100% rename from opencode/.config/opencode/skills/vercel-react-native-skills/rules/ui-styling.md rename to config/opencode/skills/vercel-react-native-skills/rules/ui-styling.md diff --git a/opencode/.config/opencode/skills/web-animation-design/PRACTICAL-TIPS.md b/config/opencode/skills/web-animation-design/PRACTICAL-TIPS.md similarity index 100% rename from opencode/.config/opencode/skills/web-animation-design/PRACTICAL-TIPS.md rename to config/opencode/skills/web-animation-design/PRACTICAL-TIPS.md diff --git a/opencode/.config/opencode/skills/web-animation-design/SKILL.md b/config/opencode/skills/web-animation-design/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/web-animation-design/SKILL.md rename to config/opencode/skills/web-animation-design/SKILL.md diff --git a/opencode/.config/opencode/skills/web-design-guidelines/SKILL.md b/config/opencode/skills/web-design-guidelines/SKILL.md similarity index 100% rename from opencode/.config/opencode/skills/web-design-guidelines/SKILL.md rename to config/opencode/skills/web-design-guidelines/SKILL.md diff --git a/opencode/.config/opencode/themes/opencode-black.json b/config/opencode/themes/opencode-black.json similarity index 100% rename from opencode/.config/opencode/themes/opencode-black.json rename to config/opencode/themes/opencode-black.json diff --git a/shell/.config/starship.toml b/config/starship.toml similarity index 100% rename from shell/.config/starship.toml rename to config/starship.toml diff --git a/shell/.tmux.conf b/config/tmux/tmux.conf similarity index 100% rename from shell/.tmux.conf rename to config/tmux/tmux.conf diff --git a/config/walker/config.toml b/config/walker/config.toml new file mode 100644 index 00000000..084b6e81 --- /dev/null +++ b/config/walker/config.toml @@ -0,0 +1,24 @@ +force_keyboard_focus = true +selection_wrap = true +theme = "kojarchy" +hide_action_hints = true + +[placeholders] +"default" = { input = " Search...", list = "No Results" } + +[keybinds] +quick_activate = [] + +[providers] +max_results = 256 +default = [ + "desktopapplications", +] + +[[providers.prefixes]] +prefix = "=" +provider = "calc" + +[[providers.prefixes]] +prefix = "$" +provider = "clipboard" diff --git a/config/walker/themes/kojarchy/layout.xml b/config/walker/themes/kojarchy/layout.xml new file mode 100644 index 00000000..5316081b --- /dev/null +++ b/config/walker/themes/kojarchy/layout.xml @@ -0,0 +1,119 @@ + + + + + + true + Walker + + + + 500 + hidden + horizontal + center + center + + + + vertical + true + true + 8 + + + + hidden + horizontal + fill + true + true + + + + fill + true + true + + + + + + + + horizontal + 8 + true + true + + + + No Results + 0.0 + true + + + + + + true + false + true + 480 + 400 + 0 + true + true + automatic + automatic + + + + 1 + false + + + + + + + + + + + + + + + 0 + false + + + + + + + + diff --git a/config/walker/themes/kojarchy/style.css b/config/walker/themes/kojarchy/style.css new file mode 100644 index 00000000..6bef150b --- /dev/null +++ b/config/walker/themes/kojarchy/style.css @@ -0,0 +1,81 @@ +@define-color selected-text #89b4fa; +@define-color text #cdd6f4; +@define-color base #000000; +@define-color border #45475a; +@define-color foreground #cdd6f4; +@define-color background #000000; + +* { + all: unset; +} + +* { + font-family: "FiraCode Nerd Font"; + font-size: 16px; + color: @text; +} + +scrollbar { + opacity: 0; +} + +.normal-icons { + -gtk-icon-size: 16px; +} + +.large-icons { + -gtk-icon-size: 32px; +} + +.box-wrapper { + background: alpha(@base, 0.95); + padding: 16px; + border: 1px solid @border; + border-radius: 8px; +} + +.search-container { + background: @base; + padding: 8px; +} + +.input placeholder { + opacity: 0.5; +} + +.input:focus, +.input:active { + box-shadow: none; + outline: none; +} + +child:selected .item-box * { + color: @selected-text; +} + +.item-box { + padding-left: 12px; +} + +.item-text-box { + all: unset; + padding: 10px 0; +} + +.item-subtext { + font-size: 0px; + min-height: 0px; + margin: 0px; + padding: 0px; +} + +.item-image { + margin-right: 12px; + -gtk-icon-transform: scale(0.9); +} + +.keybind-hints { + background: @background; + padding: 8px; + margin-top: 8px; +} diff --git a/hyprland/.config/waybar/config.jsonc b/config/waybar/config.jsonc similarity index 81% rename from hyprland/.config/waybar/config.jsonc rename to config/waybar/config.jsonc index f1ce83b0..85b0a234 100644 --- a/hyprland/.config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -113,50 +113,50 @@ "on-scroll-down": "wpctl set-volume -l 1.0 @DEFAULT_SOURCE@ 1%-" }, "custom/spotify": { - "exec": "python3 ~/dotfiles/hyprland/.config/waybar/custom/spotify/mediaplayer.py --player spotify", + "exec": "python3 ~/.config/waybar/custom/spotify/mediaplayer.py --player spotify", "format": "{text:.50}  ", "tooltip-format": "{text}", "return-type": "json", "on-click": "playerctl --player=spotify play-pause", - "on-click-right": "~/dotfiles/hyprland/.config/waybar/custom/focus_class.sh 'Spotify'", + "on-click-right": "~/.config/waybar/custom/focus_class.sh 'Spotify'", "on-scroll-up": "playerctl --player=spotify next", "on-scroll-down": "playerctl --player=spotify previous" }, "custom/mouse-battery": { - "exec": "~/dotfiles/hyprland/.config/waybar/custom/mouse-battery.sh", + "exec": "~/.config/waybar/custom/mouse-battery.sh", "interval": 60, "return-type": "json", "tooltip": true }, "image#tailscale": { - "exec": "~/dotfiles/hyprland/.config/waybar/custom/tailscale/tailscale-icon.sh", + "exec": "~/.config/waybar/custom/tailscale/tailscale-icon.sh", "size": 16, - "on-click": "~/dotfiles/hyprland/.config/waybar/custom/tailscale/toggle.sh", + "on-click": "~/.config/waybar/custom/tailscale/toggle.sh", "interval": 1 }, "custom/tailscale": { - "exec": "~/dotfiles/hyprland/.config/waybar/custom/tailscale/check_status.sh", + "exec": "~/.config/waybar/custom/tailscale/check_status.sh", "interval": 1, "format": "{text}", "tooltip": true, "return-type": "json", - "on-click": "~/dotfiles/hyprland/.config/waybar/custom/tailscale/toggle.sh" + "on-click": "~/.config/waybar/custom/tailscale/toggle.sh" }, "image#tunnelbear": { - "exec": "~/dotfiles/hyprland/.config/waybar/custom/tunnelbear/tunnelbear-icon.sh", + "exec": "~/.config/waybar/custom/tunnelbear/tunnelbear-icon.sh", "size": 16, - "on-click": "~/dotfiles/hyprland/.config/waybar/custom/tunnelbear/toggle.sh", + "on-click": "~/.config/waybar/custom/tunnelbear/toggle.sh", "interval": 1 }, "custom/tunnelbear": { - "exec": "~/dotfiles/hyprland/.config/waybar/custom/tunnelbear/check_status.sh", + "exec": "~/.config/waybar/custom/tunnelbear/check_status.sh", "interval": 1, "format": "{text}", "tooltip": true, "return-type": "json", - "on-click": "~/dotfiles/hyprland/.config/waybar/custom/tunnelbear/toggle.sh" + "on-click": "~/.config/waybar/custom/tunnelbear/toggle.sh" }, "include": [ - "/home/joogie/.config/waybar/hyprwhspr-module.jsonc" + "~/.config/waybar/hyprwhspr-module.jsonc" ] } diff --git a/hyprland/.config/waybar/custom/focus_class.sh b/config/waybar/custom/focus_class.sh similarity index 100% rename from hyprland/.config/waybar/custom/focus_class.sh rename to config/waybar/custom/focus_class.sh diff --git a/hyprland/.config/waybar/custom/mouse-battery.sh b/config/waybar/custom/mouse-battery.sh similarity index 93% rename from hyprland/.config/waybar/custom/mouse-battery.sh rename to config/waybar/custom/mouse-battery.sh index fd76436b..9476f664 100755 --- a/hyprland/.config/waybar/custom/mouse-battery.sh +++ b/config/waybar/custom/mouse-battery.sh @@ -6,7 +6,7 @@ if ! command -v jq >/dev/null 2>&1; then exit 0 fi -raw=$(/home/joogie/dotfiles/shell/.local/custom/bin/scyrox-battery --device=scyrox --json --no-sudo 2>&1 || true) +raw=$("$HOME/.local/custom/bin/scyrox-battery" --device=scyrox --json --no-sudo 2>&1 || true) if [[ -z "$raw" ]]; then printf '{"text":"mouse --","tooltip":"Mouse battery unavailable"}\n' diff --git a/hyprland/.config/waybar/custom/spotify/mediaplayer.py b/config/waybar/custom/spotify/mediaplayer.py similarity index 100% rename from hyprland/.config/waybar/custom/spotify/mediaplayer.py rename to config/waybar/custom/spotify/mediaplayer.py diff --git a/hyprland/.config/waybar/custom/tailscale/check_status.sh b/config/waybar/custom/tailscale/check_status.sh similarity index 100% rename from hyprland/.config/waybar/custom/tailscale/check_status.sh rename to config/waybar/custom/tailscale/check_status.sh diff --git a/hyprland/.config/waybar/custom/tailscale/inverted-tailscale-icon.png b/config/waybar/custom/tailscale/inverted-tailscale-icon.png similarity index 100% rename from hyprland/.config/waybar/custom/tailscale/inverted-tailscale-icon.png rename to config/waybar/custom/tailscale/inverted-tailscale-icon.png diff --git a/hyprland/.config/waybar/custom/tailscale/tailscale-icon.png b/config/waybar/custom/tailscale/tailscale-icon.png similarity index 100% rename from hyprland/.config/waybar/custom/tailscale/tailscale-icon.png rename to config/waybar/custom/tailscale/tailscale-icon.png diff --git a/config/waybar/custom/tailscale/tailscale-icon.sh b/config/waybar/custom/tailscale/tailscale-icon.sh new file mode 100755 index 00000000..86bb607c --- /dev/null +++ b/config/waybar/custom/tailscale/tailscale-icon.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +STATE=$(tailscale status --json | jq -r '.BackendState') + +if [[ "$STATE" == "Running" ]]; then + echo "$HOME/.config/waybar/custom/tailscale/inverted-tailscale-icon.png" + exit 0 +fi + +echo "$HOME/.config/waybar/custom/tailscale/tailscale-icon.png" diff --git a/hyprland/.config/waybar/custom/tailscale/toggle.sh b/config/waybar/custom/tailscale/toggle.sh similarity index 100% rename from hyprland/.config/waybar/custom/tailscale/toggle.sh rename to config/waybar/custom/tailscale/toggle.sh diff --git a/hyprland/.config/waybar/custom/tunnelbear/check_status.sh b/config/waybar/custom/tunnelbear/check_status.sh similarity index 100% rename from hyprland/.config/waybar/custom/tunnelbear/check_status.sh rename to config/waybar/custom/tunnelbear/check_status.sh diff --git a/hyprland/.config/waybar/custom/tunnelbear/toggle.sh b/config/waybar/custom/tunnelbear/toggle.sh similarity index 100% rename from hyprland/.config/waybar/custom/tunnelbear/toggle.sh rename to config/waybar/custom/tunnelbear/toggle.sh diff --git a/config/waybar/custom/tunnelbear/tunnelbear-icon.sh b/config/waybar/custom/tunnelbear/tunnelbear-icon.sh new file mode 100755 index 00000000..f468f88d --- /dev/null +++ b/config/waybar/custom/tunnelbear/tunnelbear-icon.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# Check if TunnelBear Japan connection is active +if nmcli connection show --active | grep -q "TunnelBear Japan"; then + echo "$HOME/.config/waybar/custom/tunnelbear/tunnelbear-logo.png" + exit 0 +fi + +echo "$HOME/.config/waybar/custom/tunnelbear/tunnelbear-logo-off.png" \ No newline at end of file diff --git a/hyprland/.config/waybar/custom/tunnelbear/tunnelbear-logo-off.png b/config/waybar/custom/tunnelbear/tunnelbear-logo-off.png similarity index 100% rename from hyprland/.config/waybar/custom/tunnelbear/tunnelbear-logo-off.png rename to config/waybar/custom/tunnelbear/tunnelbear-logo-off.png diff --git a/hyprland/.config/waybar/custom/tunnelbear/tunnelbear-logo.png b/config/waybar/custom/tunnelbear/tunnelbear-logo.png similarity index 100% rename from hyprland/.config/waybar/custom/tunnelbear/tunnelbear-logo.png rename to config/waybar/custom/tunnelbear/tunnelbear-logo.png diff --git a/hyprland/.config/waybar/hyprwhspr-module.jsonc b/config/waybar/hyprwhspr-module.jsonc similarity index 100% rename from hyprland/.config/waybar/hyprwhspr-module.jsonc rename to config/waybar/hyprwhspr-module.jsonc diff --git a/hyprland/.config/waybar/mocha.css b/config/waybar/mocha.css similarity index 100% rename from hyprland/.config/waybar/mocha.css rename to config/waybar/mocha.css diff --git a/hyprland/.config/waybar/style.css b/config/waybar/style.css similarity index 94% rename from hyprland/.config/waybar/style.css rename to config/waybar/style.css index 50eda037..40398c69 100644 --- a/hyprland/.config/waybar/style.css +++ b/config/waybar/style.css @@ -14,6 +14,7 @@ window#waybar { background: transparent; border-radius: 0px; + color: @text; } tooltip { @@ -28,6 +29,7 @@ tooltip { #battery, #network, #pulseaudio { + color: @text; margin: 6px 6px 2px 0px; padding: 2px 8px; } @@ -81,22 +83,26 @@ tooltip { } .custom-spotify { + color: @text; padding-left: 6px; padding-right: 6px; padding-top: 4px; } #custom-tailscale { + color: @text; padding-right: 6px; margin: 6px 6px 2px 0px; } #custom-tunnelbear { + color: @text; padding-right: 6px; margin: 6px 6px 2px 0px; } #custom-mouse-battery { + color: @text; margin: 6px 6px 2px 0px; padding: 2px 8px; } @@ -104,6 +110,7 @@ tooltip { #custom-hyprwhspr { background-color: @base; border: 1px solid @surface1; + color: @text; border-radius: 6px; margin: 6px 6px 2px 2px; padding: 2px 8px; diff --git a/hyprland/.config/wofi/config b/config/wofi/config similarity index 100% rename from hyprland/.config/wofi/config rename to config/wofi/config diff --git a/config/wofi/dmenu/launcher.sh b/config/wofi/dmenu/launcher.sh new file mode 100755 index 00000000..8bf1da63 --- /dev/null +++ b/config/wofi/dmenu/launcher.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Wofi dmenu launcher — lists all kojarchy commands, with web search fallback. +# Bound to ALT+CTRL+SPACE. + +SCRIPTS=$(compgen -c kojarchy- | sort -u) + +selected=$(printf "%s\n" "$SCRIPTS" | wofi --dmenu -p "Run command or search web" --matching fuzzy) + +# Exit if user presses Escape (no input at all) +[ -z "$selected" ] && exit + +if printf "%s\n" "$SCRIPTS" | grep -Fxq "$selected"; then + exec "$selected" +else + printf "%s" "$selected" | jq -sRr @uri | xargs -r -I{} xdg-open "https://www.google.com/search?q={}" +fi diff --git a/hyprland/.config/wofi/style.css b/config/wofi/style.css similarity index 100% rename from hyprland/.config/wofi/style.css rename to config/wofi/style.css diff --git a/hyprland/.config/xdg-desktop-portal/hyprland-portals.conf b/config/xdg-desktop-portal/hyprland-portals.conf similarity index 100% rename from hyprland/.config/xdg-desktop-portal/hyprland-portals.conf rename to config/xdg-desktop-portal/hyprland-portals.conf diff --git a/hyprland/.config/xdg-desktop-portal/portals.conf b/config/xdg-desktop-portal/portals.conf similarity index 100% rename from hyprland/.config/xdg-desktop-portal/portals.conf rename to config/xdg-desktop-portal/portals.conf diff --git a/hyprland/.config/yazi/theme.toml b/config/yazi/theme.toml similarity index 99% rename from hyprland/.config/yazi/theme.toml rename to config/yazi/theme.toml index 55622092..a3c5e594 100644 --- a/hyprland/.config/yazi/theme.toml +++ b/config/yazi/theme.toml @@ -137,7 +137,7 @@ files = [ { name = "dockerfile", text = "󰡨", fg = "#89b4fa" }, { name = ".git-blame-ignore-revs", text = "", fg = "#fab387" }, { name = ".nvmrc", text = "", fg = "#a6e3a1" }, - { name = "hyprpaper.conf", text = "", fg = "#74c7ec" }, + { name = "hyprland.conf", text = "", fg = "#74c7ec" }, { name = ".prettierignore", text = "", fg = "#89b4fa" }, { name = "rakefile", text = "", fg = "#313244" }, { name = "code_of_conduct", text = "", fg = "#f38ba8" }, diff --git a/default/gpg/dirmngr.conf b/default/gpg/dirmngr.conf new file mode 100644 index 00000000..8d327907 --- /dev/null +++ b/default/gpg/dirmngr.conf @@ -0,0 +1,7 @@ +keyserver hkps://keyserver.ubuntu.com +keyserver hkps://pgp.surfnet.nl +keyserver hkps://keys.mailvelope.com +keyserver hkps://keyring.debian.org +keyserver hkps://pgp.mit.edu + +connect-quick-timeout 4 diff --git a/default/hypr/apps.conf b/default/hypr/apps.conf new file mode 100644 index 00000000..1b718a41 --- /dev/null +++ b/default/hypr/apps.conf @@ -0,0 +1,7 @@ +# App-specific window tweaks +source = ~/dotfiles/default/hypr/apps/browser.conf +source = ~/dotfiles/default/hypr/apps/terminals.conf +source = ~/dotfiles/default/hypr/apps/system.conf +source = ~/dotfiles/default/hypr/apps/pip.conf +source = ~/dotfiles/default/hypr/apps/bitwarden.conf +source = ~/dotfiles/default/hypr/apps/steam.conf diff --git a/default/hypr/apps/bitwarden.conf b/default/hypr/apps/bitwarden.conf new file mode 100644 index 00000000..97772d31 --- /dev/null +++ b/default/hypr/apps/bitwarden.conf @@ -0,0 +1,7 @@ +# Bitwarden: floating + no screen share +windowrule = no_screen_share on, match:class ^(Bitwarden)$ +windowrule = tag +floating-window, match:class ^(Bitwarden)$ + +# Bitwarden Chrome Extension +windowrule = no_screen_share on, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default +windowrule = tag +floating-window, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default diff --git a/default/hypr/apps/browser.conf b/default/hypr/apps/browser.conf new file mode 100644 index 00000000..e536bed4 --- /dev/null +++ b/default/hypr/apps/browser.conf @@ -0,0 +1,10 @@ +# Browser window rules +windowrule = tag +chromium-based-browser, match:class ((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium) +windowrule = tag +firefox-based-browser, match:class ([fF]irefox|zen|librewolf) + +# Force chromium-based browsers into a tile (--app bug workaround) +windowrule = tile on, match:tag chromium-based-browser + +# Subtle opacity when unfocused +windowrule = opacity 1.0 0.97, match:tag chromium-based-browser +windowrule = opacity 1.0 0.97, match:tag firefox-based-browser diff --git a/default/hypr/apps/pip.conf b/default/hypr/apps/pip.conf new file mode 100644 index 00000000..e5b45d56 --- /dev/null +++ b/default/hypr/apps/pip.conf @@ -0,0 +1,9 @@ +# Picture-in-picture overlays +windowrule = tag +pip, match:title (Picture.?in.?[Pp]icture) +windowrule = float on, match:tag pip +windowrule = pin on, match:tag pip +windowrule = size 600 338, match:tag pip +windowrule = keep_aspect_ratio on, match:tag pip +windowrule = border_size 0, match:tag pip +windowrule = opacity 1 1, match:tag pip +windowrule = move (monitor_w-window_w-40) (monitor_h*0.04), match:tag pip diff --git a/default/hypr/apps/steam.conf b/default/hypr/apps/steam.conf new file mode 100644 index 00000000..f1693f9d --- /dev/null +++ b/default/hypr/apps/steam.conf @@ -0,0 +1,7 @@ +# Steam: float all windows, no transparency +windowrule = float on, match:class steam +windowrule = center on, match:class steam, match:title Steam +windowrule = opacity 1 1, match:class steam.* +windowrule = size 1100 700, match:class steam, match:title Steam +windowrule = size 460 800, match:class steam, match:title Friends List +windowrule = idle_inhibit fullscreen, match:class steam diff --git a/default/hypr/apps/system.conf b/default/hypr/apps/system.conf new file mode 100644 index 00000000..2ae894f0 --- /dev/null +++ b/default/hypr/apps/system.conf @@ -0,0 +1,14 @@ +# System dialog floating rules +windowrule = float on, match:tag floating-window +windowrule = center on, match:tag floating-window +windowrule = size 875 600, match:tag floating-window + +windowrule = tag +floating-window, match:class (com.gabm.satty|imv|mpv) +windowrule = tag +floating-window, match:class (xdg-desktop-portal-gtk|org.kde.dolphin), match:title ^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|[C|c]hoose.*) +windowrule = float on, match:class org.gnome.Calculator + +# No transparency on media windows +windowrule = opacity 1 1, match:class ^(vlc|mpv|imv|qview)$ + +# Prevent idle while media is open +windowrule = idle_inhibit always, match:tag noidle diff --git a/default/hypr/apps/terminals.conf b/default/hypr/apps/terminals.conf new file mode 100644 index 00000000..61bb0141 --- /dev/null +++ b/default/hypr/apps/terminals.conf @@ -0,0 +1,3 @@ +# Terminal window rules +windowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty) +windowrule = opacity 0.97 0.9, match:tag terminal diff --git a/default/hypr/autostart.conf b/default/hypr/autostart.conf new file mode 100644 index 00000000..68f35194 --- /dev/null +++ b/default/hypr/autostart.conf @@ -0,0 +1,6 @@ +exec-once = systemctl --user start hyprpolkitagent +exec-once = waybar & dunst +exec-once = swayosd-server +exec-once = swaybg -i ~/dotfiles/wallpapers/pallete.png -m fill +exec-once = [workspace 1 silent] kitty +exec-once = [workspace 2 silent] flatpak run app.zen_browser.zen diff --git a/default/hypr/bindings.conf b/default/hypr/bindings.conf new file mode 100644 index 00000000..67f8de3a --- /dev/null +++ b/default/hypr/bindings.conf @@ -0,0 +1,103 @@ +$mainMod = ALT + +# App launchers +bind = $mainMod, RETURN, exec, $terminal +bind = $mainMod, Q, killactive, +bind = $mainMod, F, fullscreen, +bind = $mainMod, M, exit, +bind = $mainMod, E, exec, $fileManager +bind = $mainMod, W, exec, kojarchy-toggle-waybar +bind = $mainMod, V, togglefloating, +bind = $mainMod, SPACE, exec, $menu +bind = $mainMod, P, pseudo, +bind = $mainMod SHIFT, J, togglesplit, +bind = $mainMod SHIFT, C, exec, hyprpicker | { read color; trimmed=$(printf "%s" "$color"); printf "%s" "$trimmed" | wl-copy; notify-send "Copied $color to clipboard"; } + +# Focus movement (vim-style) +bind = $mainMod, H, movefocus, l +bind = $mainMod, L, movefocus, r +bind = $mainMod, K, movefocus, u +bind = $mainMod, J, movefocus, d + +# Window movement +bind = $mainMod CTRL, H, movewindow, l +bind = $mainMod CTRL, J, movewindow, d +bind = $mainMod CTRL, K, movewindow, u +bind = $mainMod CTRL, L, movewindow, r + +# Window resize +bind = $mainMod CTRL SHIFT, H, resizeactive, -40 0 +bind = $mainMod CTRL SHIFT, L, resizeactive, 40 0 +bind = $mainMod CTRL SHIFT, K, resizeactive, 0 -40 +bind = $mainMod CTRL SHIFT, J, resizeactive, 0 40 + +# Workspaces +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Move to workspace +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + +# Notifications +bind = $mainMod Shift, N, exec, dunstctl history-pop +bind = $mainMod, COMMA, exec, dunstctl close +bind = $mainMod SHIFT, COMMA, exec, dunstctl close-all + +# Special workspace +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Mouse bindings +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Screenshots & screen recording +bind = , PRINT, exec, kojarchy-cmd-screenshot region edit +bind = SHIFT, PRINT, exec, kojarchy-cmd-screenshot region clipboard +bind = $mainMod, PRINT, exec, kojarchy-cmd-screenrecord + +# Media keys +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%- + +# Player controls +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +# Lock screen +bind = $mainMod CTRL, L, exec, kojarchy-lock-screen + +# Power menu +bind = $mainMod, ESCAPE, exec, kojarchy-power-menu + +# Kojarchy menu (unified launcher) +bind = $mainMod SHIFT, SPACE, exec, kojarchy-menu + +# Keybindings viewer +bind = $mainMod, SLASH, exec, kojarchy-menu-keybindings + +# hyprwhspr +bindd = $mainMod SHIFT, D, Speech-to-text, exec, /usr/lib/hyprwhspr/config/hyprland/hyprwhspr-tray.sh record diff --git a/default/hypr/envs.conf b/default/hypr/envs.conf new file mode 100644 index 00000000..b83966fc --- /dev/null +++ b/default/hypr/envs.conf @@ -0,0 +1,26 @@ +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 +env = XDG_MENU_PREFIX,arch- + +# Wayland backends +env = GDK_BACKEND,wayland,x11,* +env = QT_QPA_PLATFORM,wayland;xcb +env = SDL_VIDEODRIVER,wayland,x11 +env = MOZ_ENABLE_WAYLAND,1 +env = ELECTRON_OZONE_PLATFORM_HINT,wayland +env = OZONE_PLATFORM,wayland + +# Qt theming via Kvantum +env = QT_STYLE_OVERRIDE,kvantum + +# PATH — Hyprland is started by SDDM, not from a shell, +# so child processes need PATH set here for keybindings and menus. +env = PATH,$HOME/.local/custom/bin:$HOME/.cargo/bin:$HOME/.local/bin:$HOME/.local/share/bob/nvim-bin:$HOME/.duckdb/cli/latest:$HOME/.opencode/bin:$HOME/.lmstudio/bin:$HOME/.bun/bin:$HOME/go/bin:$PATH + +# Editor +env = EDITOR,nvim + +# Session +env = XDG_SESSION_TYPE,wayland +env = XDG_CURRENT_DESKTOP,Hyprland +env = XDG_SESSION_DESKTOP,Hyprland diff --git a/default/hypr/input.conf b/default/hypr/input.conf new file mode 100644 index 00000000..57f9e675 --- /dev/null +++ b/default/hypr/input.conf @@ -0,0 +1,27 @@ +input { + kb_layout = us + kb_variant = + kb_model = + kb_options = + kb_rules = + + repeat_delay = 300 + repeat_rate = 50 + + follow_mouse = 1 + + sensitivity = -0.7 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = false + } +} + +cursor { + inactive_timeout = 10 +} + +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf new file mode 100644 index 00000000..c60d7b72 --- /dev/null +++ b/default/hypr/looknfeel.conf @@ -0,0 +1,72 @@ +general { + gaps_in = 2 + gaps_out = 4 + + border_size = 1 + + col.active_border = rgba(b4befeFF) rgba(89b4faFF) 45deg + col.inactive_border = rgba(45475aAA) + + resize_on_border = false + allow_tearing = false + layout = dwindle +} + +decoration { + rounding = 10 + rounding_power = 2 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(11111bAA) + } + + blur { + enabled = true + size = 4 + passes = 4 + vibrancy = 0.1696 + } +} + +animations { + enabled = yes, please :) + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + + animation = global, 1, 5, default + animation = border, 1, 2.5, easeOutQuint + animation = windows, 1, 2.5, easeOutQuint + animation = windowsIn, 1, 2, easeOutQuint, popin 87% + animation = windowsOut, 1, 1, linear, popin 87% + animation = fadeIn, 1, 1, almostLinear + animation = fadeOut, 1, 1, almostLinear + animation = fade, 1, 1.5, quick + animation = layersOut, 1, 1, linear, fade + animation = fadeLayersIn, 1, 1, almostLinear + animation = fadeLayersOut, 1, 1, almostLinear + animation = workspaces, 1, 1.5, almostLinear, fade + animation = workspacesIn, 1, 3, easeOutQuint, slide + animation = workspacesOut, 1, 3, easeOutQuint, slide +} + +dwindle { + pseudotile = true + preserve_split = true +} + +master { + new_status = master +} + +misc { + focus_on_activate = true + force_default_wallpaper = -1 + disable_hyprland_logo = false +} diff --git a/default/hypr/windows.conf b/default/hypr/windows.conf new file mode 100644 index 00000000..54bdffa9 --- /dev/null +++ b/default/hypr/windows.conf @@ -0,0 +1,20 @@ +windowrule = match:class .*, suppress_event maximize + +windowrule = match:class ^$, match:title ^$, match:xwayland 1, match:float on, match:fullscreen 0, match:pin 0, stay_focused on + +# xwaylandvideobridge +windowrule = match:class ^(xwaylandvideobridge)$, opacity 0.0 override +windowrule = match:class ^(xwaylandvideobridge)$, no_anim on +windowrule = match:class ^(xwaylandvideobridge)$, stay_focused on +windowrule = match:class ^(xwaylandvideobridge)$, no_max_size on +windowrule = match:class ^(xwaylandvideobridge)$, no_blur on + +windowrule = match:workspace w[t1], border_size 0 + +windowrule = match:class ^(org\.freedesktop\.impl\.portal\.desktop\.kde)$, float on +windowrule = match:class ^(org\.freedesktop\.impl\.portal\.desktop\.kde)$, size 900 600 + + + +# App-specific rules +source = ~/dotfiles/default/hypr/apps.conf diff --git a/default/systemd/faster-shutdown.conf b/default/systemd/faster-shutdown.conf new file mode 100644 index 00000000..90dce4f6 --- /dev/null +++ b/default/systemd/faster-shutdown.conf @@ -0,0 +1,2 @@ +[Manager] +DefaultTimeoutStopSec=5s diff --git a/default/zsh/aliases b/default/zsh/aliases new file mode 100644 index 00000000..51a70287 --- /dev/null +++ b/default/zsh/aliases @@ -0,0 +1,11 @@ +alias cls=clear +alias sl="eza --group-directories-first --icons --time-style=long-iso -la" +alias so=source +alias x=exit +alias G=git +alias t=tmux +alias lta="ls -ltar --human-readable | grep -vE '^\.| \.$| \.\.$'" +alias pip=pip3 +alias wt=". _wt" +alias ai="noglob opencode run --model \"opencode/gemini-3-flash\"" +alias open=xdg-open diff --git a/default/zsh/envs b/default/zsh/envs new file mode 100644 index 00000000..432c4b66 --- /dev/null +++ b/default/zsh/envs @@ -0,0 +1,12 @@ +export EDITOR=nvim +export MANPAGER='nvim +Man!' +export PATH=$PATH:$HOME/.cargo/bin +export PATH=$PATH:$HOME/.local/bin +export PATH=$PATH:$HOME/.local/custom/bin +export PATH=$PATH:$HOME/.local/share/bob/nvim-bin +export PATH=$PATH:$HOME/.duckdb/cli/latest +export PATH=$PATH:$HOME/.opencode/bin +export PATH=$PATH:$HOME/.lmstudio/bin +export PATH=$PATH:$HOME/go/bin +export BUN_INSTALL="$HOME/.bun" +export PATH=$PATH:$BUN_INSTALL/bin diff --git a/default/zsh/functions b/default/zsh/functions new file mode 100644 index 00000000..ee11f849 --- /dev/null +++ b/default/zsh/functions @@ -0,0 +1 @@ +# Add custom shell functions here diff --git a/default/zsh/init b/default/zsh/init new file mode 100644 index 00000000..8ebf16f0 --- /dev/null +++ b/default/zsh/init @@ -0,0 +1,25 @@ +# starship +if [[ -x "$(command -v starship)" ]]; then + eval "$(starship init zsh)" +fi + +# mise (replaces fnm) +if command -v mise &>/dev/null; then + eval "$(mise activate zsh)" +fi + +# uv +if [[ -x "$(command -v uv)" ]]; then + eval "$(uv generate-shell-completion zsh)" +fi +if [[ -x "$(command -v uvx)" ]]; then + eval "$(uvx --generate-shell-completion zsh)" +fi + +# direnv +if [[ -x "$(command -v direnv)" ]]; then + eval "$(direnv hook zsh)" +fi + +# bun +[ -s "$HOME/.bun/_bun" ] && source "$HOME/.bun/_bun" diff --git a/default/zsh/rc b/default/zsh/rc new file mode 100644 index 00000000..65ac45a2 --- /dev/null +++ b/default/zsh/rc @@ -0,0 +1,5 @@ +source ~/dotfiles/default/zsh/shell +source ~/dotfiles/default/zsh/aliases +source ~/dotfiles/default/zsh/functions +source ~/dotfiles/default/zsh/init +source ~/dotfiles/default/zsh/envs diff --git a/default/zsh/shell b/default/zsh/shell new file mode 100644 index 00000000..17fce882 --- /dev/null +++ b/default/zsh/shell @@ -0,0 +1,30 @@ +autoload -U compinit +compinit + +export DISABLE_AUTO_UPDATE="true" +export ZSH="$HOME/.oh-my-zsh" + +plugins=( + z + gh + aws + git + tmux + docker + vi-mode + zsh-autosuggestions + zsh-syntax-highlighting + fast-syntax-highlighting +) + +bindkey -M viins jj vi-cmd-mode +export VI_MODE_SET_CURSOR=true + +# History options +setopt HIST_IGNORE_ALL_DUPS +setopt HIST_FIND_NO_DUPS +setopt HIST_SAVE_NO_DUPS +setopt SHARE_HISTORY +setopt INC_APPEND_HISTORY + +source $ZSH/oh-my-zsh.sh diff --git a/default/zshrc b/default/zshrc new file mode 100644 index 00000000..c0eca6da --- /dev/null +++ b/default/zshrc @@ -0,0 +1,7 @@ +# Source defaults from dotfiles (updated via git pull) +source ~/dotfiles/default/zsh/rc + +# Add your own customizations below: +if [[ -f "$HOME/.private.sh" ]]; then + source "$HOME/.private.sh" +fi diff --git a/hyprland/.config/dolphinrc b/hyprland/.config/dolphinrc deleted file mode 100644 index 59b9f950..00000000 --- a/hyprland/.config/dolphinrc +++ /dev/null @@ -1,28 +0,0 @@ -[CompactMode] -PreviewSize=96 - -[DetailsMode] -PreviewSize=112 - -[General] -Version=202 -ViewPropsTimestamp=2025,5,3,1,9,35.934 - -[IconsMode] -PreviewSize=256 - -[KFileDialog Settings] -Places Icons Auto-resize=false -Places Icons Static Size=48 - -[MainWindow] -MenuBar=Disabled - -[PlacesPanel] -IconSize=48 - -[PreviewSettings] -Plugins=appimagethumbnail,audiothumbnail,comicbookthumbnail,cursorthumbnail,djvuthumbnail,ebookthumbnail,exrthumbnail,directorythumbnail,imagethumbnail,jpegthumbnail,kraorathumbnail,windowsexethumbnail,windowsimagethumbnail,opendocumentthumbnail,svgthumbnail,ffmpegthumbs,gdk-pixbuf-thumbnailer - -[UiSettings] -ColorScheme=catpuccin-mocha-blue diff --git a/hyprland/.config/eww/eww.yuck b/hyprland/.config/eww/eww.yuck deleted file mode 100644 index 63ff0cfb..00000000 --- a/hyprland/.config/eww/eww.yuck +++ /dev/null @@ -1 +0,0 @@ -(include "widgets/calendar.yuck") diff --git a/hyprland/.config/eww/widgets/calendar.yuck b/hyprland/.config/eww/widgets/calendar.yuck deleted file mode 100644 index fad10443..00000000 --- a/hyprland/.config/eww/widgets/calendar.yuck +++ /dev/null @@ -1,14 +0,0 @@ -(defwindow calendar - :monitor 0 - :geometry (geometry :x 1160 :y 0 :width 240 :height 200) - :stacking "fg" - :focusable true - :on-lost-focus "eww close calendar" - :visible false - (calendar - :show-heading true - :show-day-names true - :show-week-numbers false - ) -) - diff --git a/hyprland/.config/hypr/_black.conf b/hyprland/.config/hypr/_black.conf deleted file mode 100644 index ffa972df..00000000 --- a/hyprland/.config/hypr/_black.conf +++ /dev/null @@ -1,10 +0,0 @@ -# preload = ~/dotfiles/wallpapers/macos11-night.jpg -# wallpaper = ,~/dotfiles/wallpapers/macos11-night.jpg - -splash = false - -wallpaper { - monitor = DP-1 - path = ~/dotfiles/wallpapers/black.png - fit_mode = cover -} diff --git a/hyprland/.config/hypr/hyprland.conf b/hyprland/.config/hypr/hyprland.conf deleted file mode 100644 index 651eeb76..00000000 --- a/hyprland/.config/hypr/hyprland.conf +++ /dev/null @@ -1,223 +0,0 @@ -monitor=,2560x1440@240,auto,1 - -$terminal = kitty -$fileManager = dolphin -$menu = wofi --show drun --matching startswith -$toggleWaybar = ~/dotfiles/hyprland/.config/wofi/dmenu/scripts/toggle-waybar -$menuScripts = ~/dotfiles/hyprland/.config/wofi/dmenu/launcher.sh - -exec-once = systemctl --user start hyprpolkitagent -exec-once = waybar & hyprpaper & eww daemon & dunst -exec-once = [workspace 1 silent] kitty -exec-once = [workspace 2 silent] flatpak run app.zen_browser.zen - -env = XCURSOR_SIZE,24 -env = HYPRCURSOR_SIZE,24 -env = QT_QPA_PLATFORMTHEME,qt5ct -env = QT_QPA_PLATFORMTHEME,qt6ct -env = XDG_MENU_PREFIX,arch- - -general { - gaps_in = 2 - gaps_out = 4 - - border_size = 1 - - col.active_border = rgba(b4befeFF) rgba(89b4faFF) 45deg - col.inactive_border = rgba(45475aAA) - - resize_on_border = false - allow_tearing = false - layout = dwindle -} - -decoration { - rounding = 10 - rounding_power = 2 - - shadow { - enabled = true - range = 4 - render_power = 3 - color = rgba(11111bAA) - } - - blur { - enabled = true - size = 4 - passes = 4 - vibrancy = 0.1696 - } -} - -animations { - enabled = yes, please :) - - bezier = easeOutQuint,0.23,1,0.32,1 - bezier = easeInOutCubic,0.65,0.05,0.36,1 - bezier = linear,0,0,1,1 - bezier = almostLinear,0.5,0.5,0.75,1.0 - bezier = quick,0.15,0,0.1,1 - - animation = global, 1, 5, default - animation = border, 1, 2.5, easeOutQuint - animation = windows, 1, 2.5, easeOutQuint - animation = windowsIn, 1, 2, easeOutQuint, popin 87% - animation = windowsOut, 1, 1, linear, popin 87% - animation = fadeIn, 1, 1, almostLinear - animation = fadeOut, 1, 1, almostLinear - animation = fade, 1, 1.5, quick - animation = layersOut, 1, 1, linear, fade - animation = fadeLayersIn, 1, 1, almostLinear - animation = fadeLayersOut, 1, 1, almostLinear - animation = workspaces, 1, 1.5, almostLinear, fade - animation = workspacesIn, 1, 3, easeOutQuint, slide - animation = workspacesOut, 1, 3, easeOutQuint, slide -} - -dwindle { - pseudotile = true - preserve_split = true -} - -master { - new_status = master -} - -misc { - focus_on_activate = true - force_default_wallpaper = -1 - disable_hyprland_logo = false -} - -input { - kb_layout = us - kb_variant = - kb_model = - kb_options = - kb_rules = - - repeat_delay = 300 - repeat_rate = 50 - - follow_mouse = 1 - - sensitivity = -0.7 # -1.0 - 1.0, 0 means no modification. - - touchpad { - natural_scroll = false - } -} - -cursor { - inactive_timeout = 10 -} - -device { - name = epic-mouse-v1 - sensitivity = -0.5 -} - - -$mainMod = ALT - -bind = $mainMod, RETURN, exec, $terminal -bind = $mainMod, Q, killactive, -bind = $mainMod, F, fullscreen, -bind = $mainMod, M, exit, -bind = $mainMod, E, exec, $fileManager -bind = $mainMod, W, exec, $toggleWaybar -bind = $mainMod, V, togglefloating, -bind = $mainMod, SPACE, exec, $menu -bind = $mainMod CTRL, SPACE, exec, $menuScripts -bind = $mainMod, P, pseudo, # dwindle -bind = $mainMod SHIFT, J, togglesplit, # dwindle -bind = $mainMod SHIFT, C, exec, hyprpicker | { read color; trimmed=$(printf "%s" "$color"); printf "%s" "$trimmed" | wl-copy; notify-send "Copied $color to clipboard"; } - -bind = $mainMod, H, movefocus, l -bind = $mainMod, L, movefocus, r -bind = $mainMod, K, movefocus, u -bind = $mainMod, J, movefocus, d - -bind = $mainMod CTRL, H, movewindow, l -bind = $mainMod CTRL, J, movewindow, d -bind = $mainMod CTRL, K, movewindow, u -bind = $mainMod CTRL, L, movewindow, r - -bind = $mainMod CTRL SHIFT, H, resizeactive, -40 0 -bind = $mainMod CTRL SHIFT, L, resizeactive, 40 0 -bind = $mainMod CTRL SHIFT, K, resizeactive, 0 -40 -bind = $mainMod CTRL SHIFT, J, resizeactive, 0 40 - -bind = $mainMod, 1, workspace, 1 -bind = $mainMod, 2, workspace, 2 -bind = $mainMod, 3, workspace, 3 -bind = $mainMod, 4, workspace, 4 -bind = $mainMod, 5, workspace, 5 -bind = $mainMod, 6, workspace, 6 -bind = $mainMod, 7, workspace, 7 -bind = $mainMod, 8, workspace, 8 -bind = $mainMod, 9, workspace, 9 -bind = $mainMod, 0, workspace, 10 - -bind = $mainMod SHIFT, 1, movetoworkspace, 1 -bind = $mainMod SHIFT, 2, movetoworkspace, 2 -bind = $mainMod SHIFT, 3, movetoworkspace, 3 -bind = $mainMod SHIFT, 4, movetoworkspace, 4 -bind = $mainMod SHIFT, 5, movetoworkspace, 5 -bind = $mainMod SHIFT, 6, movetoworkspace, 6 -bind = $mainMod SHIFT, 7, movetoworkspace, 7 -bind = $mainMod SHIFT, 8, movetoworkspace, 8 -bind = $mainMod SHIFT, 9, movetoworkspace, 9 -bind = $mainMod SHIFT, 0, movetoworkspace, 10 - -bind = $mainMod Shift, N, exec, dunstctl history-pop - -bind = $mainMod, S, togglespecialworkspace, magic -bind = $mainMod SHIFT, S, movetoworkspace, special:magic - -# bind = $mainMod, mouse_down, workspace, e+1 -# bind = $mainMod, mouse_up, workspace, e-1 - -bindm = $mainMod, mouse:272, movewindow -bindm = $mainMod, mouse:273, resizewindow - -bind = $mainMod, PRINT, exec, hyprshot -m window -bind = , PRINT, exec, hyprshot -m region - -bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ -bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- -bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle -bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle -bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+ -bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%- - -bindl = , XF86AudioNext, exec, playerctl next -bindl = , XF86AudioPause, exec, playerctl play-pause -bindl = , XF86AudioPlay, exec, playerctl play-pause -bindl = , XF86AudioPrev, exec, playerctl previous - -windowrule = match:class .*, suppress_event maximize - -windowrule = match:class ^$, match:title ^$, match:xwayland 1, match:float on, match:fullscreen 0, match:pin 0, stay_focused on - -windowrule = match:class ^(xwaylandvideobridge)$, opacity 0.0 override -windowrule = match:class ^(xwaylandvideobridge)$, no_anim on -windowrule = match:class ^(xwaylandvideobridge)$, stay_focused on -windowrule = match:class ^(xwaylandvideobridge)$, no_max_size on -windowrule = match:class ^(xwaylandvideobridge)$, no_blur on -windowrule = match:class ^(xwaylandvideobridge)$, stay_focused on - -windowrule = match:class ^(eww)$, float on -windowrule = match:class ^(eww)$, stay_focused on -windowrule = match:class ^(eww)$, border_size 0 -windowrule = match:class ^(eww)$, stay_focused on -windowrule = match:class ^(eww)$, workspace special silent -windowrule = match:workspace w[t1], border_size 0 - -windowrule = match:class ^(org\.freedesktop\.impl\.portal\.desktop\.kde)$, float on -windowrule = match:class ^(org\.freedesktop\.impl\.portal\.desktop\.kde)$, size 900 600 - -# hyprwhspr - Toggle mode (added by hyprwhspr setup) -# Press once to start, press again to stop -bindd = $mainMod SHIFT, D, Speech-to-text, exec, /usr/lib/hyprwhspr/config/hyprland/hyprwhspr-tray.sh record diff --git a/hyprland/.config/hypr/hyprpaper.conf b/hyprland/.config/hypr/hyprpaper.conf deleted file mode 100644 index f46b3e21..00000000 --- a/hyprland/.config/hypr/hyprpaper.conf +++ /dev/null @@ -1,10 +0,0 @@ -# preload = ~/dotfiles/wallpapers/macos11-night.jpg -# wallpaper = ,~/dotfiles/wallpapers/macos11-night.jpg - -splash = false - -wallpaper { - monitor = DP-1 - path = ~/dotfiles/wallpapers/pallete.png - fit_mode = cover -} diff --git a/hyprland/.config/ncspot/config.toml b/hyprland/.config/ncspot/config.toml deleted file mode 100644 index c83fe268..00000000 --- a/hyprland/.config/ncspot/config.toml +++ /dev/null @@ -1,21 +0,0 @@ -[bindings] -"g" = "move_top" -"G" = "move_bottom" - -[theme] -background = "#1e1e2e" -primary = "#cdd6f4" -secondary = "#94e2d5" -title = "#89b4fa" -playing = "#a6e3a1" -playing_bg = "#1e1e2e" -highlight = "#cdd6f4" -highlight_bg = "#536994" -playing_selected = "#a6e3a1" -error = "#1e1e2e" -error_bg = "#f38ba8" -statusbar = "#89b4fa" -statusbar_bg = "#313244" -statusbar_progress = "#89b4fa" -cmdline = "#89b4fa" -cmdline_bg = "#181825" diff --git a/hyprland/.config/waybar/custom/tailscale/tailscale-icon.sh b/hyprland/.config/waybar/custom/tailscale/tailscale-icon.sh deleted file mode 100755 index af9319e9..00000000 --- a/hyprland/.config/waybar/custom/tailscale/tailscale-icon.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -STATE=$(tailscale status --json | jq -r '.BackendState') - -if [[ "$STATE" == "Running" ]]; then - echo "/home/joogie/dotfiles/hyprland/.config/waybar/custom/tailscale/inverted-tailscale-icon.png" - exit 0 -fi - -echo "/home/joogie/dotfiles/hyprland/.config/waybar/custom/tailscale/tailscale-icon.png" diff --git a/hyprland/.config/waybar/custom/tunnelbear/tunnelbear-icon.sh b/hyprland/.config/waybar/custom/tunnelbear/tunnelbear-icon.sh deleted file mode 100755 index 2450b019..00000000 --- a/hyprland/.config/waybar/custom/tunnelbear/tunnelbear-icon.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# Check if TunnelBear Japan connection is active -if nmcli connection show --active | grep -q "TunnelBear Japan"; then - echo "/home/joogie/dotfiles/hyprland/.config/waybar/custom/tunnelbear/tunnelbear-logo.png" - exit 0 -fi - -echo "/home/joogie/dotfiles/hyprland/.config/waybar/custom/tunnelbear/tunnelbear-logo-off.png" \ No newline at end of file diff --git a/hyprland/.config/wofi/dmenu/launcher.sh b/hyprland/.config/wofi/dmenu/launcher.sh deleted file mode 100755 index 9091fa87..00000000 --- a/hyprland/.config/wofi/dmenu/launcher.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -SCRIPT_DIR="$HOME/dotfiles/hyprland/.config/wofi/dmenu/scripts" -SCRIPTS=$(ls "$SCRIPT_DIR") - -selected=$(printf "%s\n" "$SCRIPTS" | wofi --dmenu -p "Run script or Search web" --matching fuzzy) - -# Exit if user presses Escape (no input at all) -[ -z "$selected" ] && exit - -if printf "%s\n" "$SCRIPTS" | grep -Fxq "$selected"; then - exec "$SCRIPT_DIR/$selected" -else - printf "%s" "$selected" | jq -sRr @uri | xargs -r -I{} xdg-open "https://www.google.com/search?q={}" -fi diff --git a/hyprland/.config/wofi/dmenu/scripts/calculator b/hyprland/.config/wofi/dmenu/scripts/calculator deleted file mode 100755 index 384a4e9d..00000000 --- a/hyprland/.config/wofi/dmenu/scripts/calculator +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -wofi-calc diff --git a/hyprland/.config/wofi/dmenu/scripts/close-all b/hyprland/.config/wofi/dmenu/scripts/close-all deleted file mode 100755 index 03d449db..00000000 --- a/hyprland/.config/wofi/dmenu/scripts/close-all +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -for pid in $(hyprctl --instance 0 clients -j | jq -r '.[] | .pid'); do - kill -9 "$pid" -done diff --git a/hyprland/.config/wofi/dmenu/scripts/reboot b/hyprland/.config/wofi/dmenu/scripts/reboot deleted file mode 100755 index d3fc2a7c..00000000 --- a/hyprland/.config/wofi/dmenu/scripts/reboot +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -systemctl reboot diff --git a/hyprland/.config/wofi/dmenu/scripts/shutdown b/hyprland/.config/wofi/dmenu/scripts/shutdown deleted file mode 100755 index ca2769d8..00000000 --- a/hyprland/.config/wofi/dmenu/scripts/shutdown +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -systemctl poweroff diff --git a/hyprland/.config/wofi/dmenu/scripts/toggle-hyprsunset b/hyprland/.config/wofi/dmenu/scripts/toggle-hyprsunset deleted file mode 100755 index 330d15f0..00000000 --- a/hyprland/.config/wofi/dmenu/scripts/toggle-hyprsunset +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -if pgrep -x hyprsunset > /dev/null; then - pkill -x hyprsunset - notify-send "'hyprsunset' stopped" -else - hyprsunset --temperature 4000 & - notify-send "'hyprsunset' started" -fi diff --git a/install.sh b/install.sh new file mode 100755 index 00000000..efc5d933 --- /dev/null +++ b/install.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# Exit immediately if a command exits with a non-zero status +set -eEo pipefail + +# Define Kojarchy locations +export KOJARCHY_DIR="$HOME/dotfiles" +export KOJARCHY_INSTALL="$KOJARCHY_DIR/install" +export KOJARCHY_LOG="/var/log/kojarchy-install.log" +export PATH="$KOJARCHY_DIR/bin:$PATH" + +# Install +source "$KOJARCHY_DIR/lib/helpers.sh" +source "$KOJARCHY_INSTALL/preflight/all.sh" +source "$KOJARCHY_INSTALL/packaging/all.sh" +source "$KOJARCHY_INSTALL/config/all.sh" +source "$KOJARCHY_INSTALL/services/all.sh" +source "$KOJARCHY_INSTALL/post-install/all.sh" diff --git a/install/config/all.sh b/install/config/all.sh new file mode 100644 index 00000000..4c99ad23 --- /dev/null +++ b/install/config/all.sh @@ -0,0 +1,35 @@ +run_logged $KOJARCHY_INSTALL/config/config.sh +run_logged $KOJARCHY_INSTALL/config/bin.sh +run_logged $KOJARCHY_INSTALL/config/shell.sh +run_logged $KOJARCHY_INSTALL/config/tmux.sh +run_logged $KOJARCHY_INSTALL/config/cargo.sh +run_logged $KOJARCHY_INSTALL/config/neovim.sh +run_logged $KOJARCHY_INSTALL/config/mise.sh +# Pause log tail for interactive git prompt +stop_log_output +clear_logo +source $KOJARCHY_INSTALL/config/git.sh +clear_logo +start_log_output +run_logged $KOJARCHY_INSTALL/config/docker.sh +run_logged $KOJARCHY_INSTALL/config/gtk.sh +run_logged $KOJARCHY_INSTALL/config/gpg.sh +run_logged $KOJARCHY_INSTALL/config/mimetypes.sh +run_logged $KOJARCHY_INSTALL/config/ssh-flakiness.sh +run_logged $KOJARCHY_INSTALL/config/increase-sudo-tries.sh +run_logged $KOJARCHY_INSTALL/config/increase-lockout-limit.sh +run_logged $KOJARCHY_INSTALL/config/usb-autosuspend.sh +run_logged $KOJARCHY_INSTALL/config/systemd-tweaks.sh +run_logged $KOJARCHY_INSTALL/config/default-keyring.sh +run_logged $KOJARCHY_INSTALL/config/firewall.sh +run_logged $KOJARCHY_INSTALL/config/dns-resolver.sh +run_logged $KOJARCHY_INSTALL/config/input-group.sh +run_logged $KOJARCHY_INSTALL/config/detect-keyboard-layout.sh +run_logged $KOJARCHY_INSTALL/config/hardware/network.sh +run_logged $KOJARCHY_INSTALL/config/hardware/bluetooth.sh +run_logged $KOJARCHY_INSTALL/config/hardware/intel.sh +run_logged $KOJARCHY_INSTALL/config/hardware/set-wireless-regdom.sh +run_logged $KOJARCHY_INSTALL/config/hardware/fix-fkeys.sh +run_logged $KOJARCHY_INSTALL/config/hardware/fix-synaptic-touchpad.sh +run_logged $KOJARCHY_INSTALL/config/hardware/powerprofiles.sh +run_logged $KOJARCHY_INSTALL/config/hidden-apps.sh diff --git a/install/config/bin.sh b/install/config/bin.sh new file mode 100644 index 00000000..16c01f1f --- /dev/null +++ b/install/config/bin.sh @@ -0,0 +1,9 @@ +# Symlink bin scripts to ~/.local/custom/bin/ +mkdir -p ~/.local/custom/bin + +for script in "$KOJARCHY_DIR"/bin/*; do + local_name="$HOME/.local/custom/bin/$(basename "$script")" + ln -sf "$script" "$local_name" +done + +echo "Bin scripts linked to ~/.local/custom/bin/" diff --git a/install/config/cargo.sh b/install/config/cargo.sh new file mode 100644 index 00000000..c11952af --- /dev/null +++ b/install/config/cargo.sh @@ -0,0 +1,9 @@ +# Ensure rust toolchain is set up +if ! command -v cargo &>/dev/null; then + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + source "$HOME/.cargo/env" +fi + +rustup default stable + +echo "Cargo: OK" diff --git a/install/config/config.sh b/install/config/config.sh new file mode 100644 index 00000000..495c854b --- /dev/null +++ b/install/config/config.sh @@ -0,0 +1,8 @@ +# Copy over Kojarchy configs to ~/.config/ +mkdir -p ~/.config +cp -R "$KOJARCHY_DIR/config/"* ~/.config/ + +# Use default zshrc from Kojarchy +cp "$KOJARCHY_DIR/default/zshrc" ~/.zshrc + +echo "Configs deployed to ~/.config/" diff --git a/install/config/default-keyring.sh b/install/config/default-keyring.sh new file mode 100644 index 00000000..38140e4b --- /dev/null +++ b/install/config/default-keyring.sh @@ -0,0 +1,25 @@ +# Create default GNOME keyring that doesn't prompt on login +KEYRING_DIR="$HOME/.local/share/keyrings" +KEYRING_FILE="$KEYRING_DIR/Default_keyring.keyring" +DEFAULT_FILE="$KEYRING_DIR/default" + +mkdir -p "$KEYRING_DIR" + +cat << EOF | tee "$KEYRING_FILE" +[keyring] +display-name=Default keyring +ctime=$(date +%s) +mtime=0 +lock-on-idle=false +lock-after=false +EOF + +cat << EOF | tee "$DEFAULT_FILE" +Default_keyring +EOF + +chmod 700 "$KEYRING_DIR" +chmod 600 "$KEYRING_FILE" +chmod 644 "$DEFAULT_FILE" + +echo "Default keyring: OK" diff --git a/install/config/detect-keyboard-layout.sh b/install/config/detect-keyboard-layout.sh new file mode 100644 index 00000000..28a83d74 --- /dev/null +++ b/install/config/detect-keyboard-layout.sh @@ -0,0 +1,20 @@ +# Copy keyboard layout from /etc/vconsole.conf (set during archinstall) to Hyprland +conf="/etc/vconsole.conf" +hyprconf="$HOME/.config/hypr/input.conf" + +if [[ ! -f "$conf" ]] || [[ ! -f "$hyprconf" ]]; then + echo "Keyboard layout detection: skipped (missing files)" + exit 0 +fi + +if grep -q '^XKBLAYOUT=' "$conf"; then + layout=$(grep '^XKBLAYOUT=' "$conf" | cut -d= -f2 | tr -d '"') + sed -i "/^[[:space:]]*kb_options *=/i\ kb_layout = $layout" "$hyprconf" +fi + +if grep -q '^XKBVARIANT=' "$conf"; then + variant=$(grep '^XKBVARIANT=' "$conf" | cut -d= -f2 | tr -d '"') + sed -i "/^[[:space:]]*kb_options *=/i\ kb_variant = $variant" "$hyprconf" +fi + +echo "Keyboard layout detection: OK" diff --git a/install/config/dns-resolver.sh b/install/config/dns-resolver.sh new file mode 100644 index 00000000..67d1787d --- /dev/null +++ b/install/config/dns-resolver.sh @@ -0,0 +1,10 @@ +# Symlink systemd-resolved stub to /etc/resolv.conf +# This ensures DNS works reliably with NetworkManager + systemd-resolved +sudo systemctl enable --now systemd-resolved.service 2>/dev/null || true + +if [[ -L /etc/resolv.conf ]]; then + echo "DNS resolver: already symlinked" +else + sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf + echo "DNS resolver: OK" +fi diff --git a/install/config/docker.sh b/install/config/docker.sh new file mode 100644 index 00000000..27dc7acc --- /dev/null +++ b/install/config/docker.sh @@ -0,0 +1,16 @@ +# Configure Docker daemon +sudo mkdir -p /etc/docker +sudo tee /etc/docker/daemon.json >/dev/null <<'EOF' +{ + "log-driver": "json-file", + "log-opts": { "max-size": "10m", "max-file": "5" } +} +EOF + +# Start Docker automatically +sudo systemctl enable docker + +# Give this user privileged Docker access +sudo usermod -aG docker ${USER} + +echo "Docker: OK" diff --git a/install/config/firewall.sh b/install/config/firewall.sh new file mode 100644 index 00000000..884c2041 --- /dev/null +++ b/install/config/firewall.sh @@ -0,0 +1,15 @@ +# Configure UFW firewall +sudo ufw default deny incoming +sudo ufw default allow outgoing + +# Allow LocalSend file sharing +sudo ufw allow 53317/tcp comment 'LocalSend' +sudo ufw allow 53317/udp comment 'LocalSend' + +# Allow Docker DNS +sudo ufw allow in on docker0 to any port 53 proto udp comment 'Docker DNS' + +sudo ufw --force enable +sudo systemctl enable --now ufw.service + +echo "Firewall: OK" diff --git a/install/config/git.sh b/install/config/git.sh new file mode 100644 index 00000000..58b0f842 --- /dev/null +++ b/install/config/git.sh @@ -0,0 +1,16 @@ +# Prompt for git identity if not already set (runs via source, not run_logged) +if [[ -z "$(git config --global user.name)" ]]; then + name=$(gum input --placeholder "Your full name" --header "Git user.name:" >"$KOJARCHY_LOG" diff --git a/install/config/gpg.sh b/install/config/gpg.sh new file mode 100644 index 00000000..7f80c64a --- /dev/null +++ b/install/config/gpg.sh @@ -0,0 +1,7 @@ +# Deploy GPG keyserver configuration with multiple fallbacks +mkdir -p "$HOME/.gnupg" +cp "$KOJARCHY_DIR/default/gpg/dirmngr.conf" "$HOME/.gnupg/dirmngr.conf" +chmod 700 "$HOME/.gnupg" +chmod 600 "$HOME/.gnupg/dirmngr.conf" + +echo "GPG keyserver config: OK" diff --git a/install/config/gtk.sh b/install/config/gtk.sh new file mode 100644 index 00000000..47a225e4 --- /dev/null +++ b/install/config/gtk.sh @@ -0,0 +1,17 @@ +# Set GTK dark theme and icon theme via gsettings +if command -v gsettings &>/dev/null; then + gsettings set org.gnome.desktop.interface gtk-theme "catppuccin-mocha-blue-standard+default" 2>/dev/null || true + gsettings set org.gnome.desktop.interface color-scheme "prefer-dark" 2>/dev/null || true + gsettings set org.gnome.desktop.interface icon-theme "Adwaita" 2>/dev/null || true +fi + +# Link GTK4/libadwaita theme (Nautilus, GNOME apps ignore gtk-theme gsetting) +THEME_DIR="/usr/share/themes/catppuccin-mocha-blue-standard+default/gtk-4.0" +if [[ -d "$THEME_DIR" ]]; then + mkdir -p ~/.config/gtk-4.0 + ln -snf "$THEME_DIR/assets" ~/.config/gtk-4.0/assets + ln -snf "$THEME_DIR/gtk.css" ~/.config/gtk-4.0/gtk.css + ln -snf "$THEME_DIR/gtk-dark.css" ~/.config/gtk-4.0/gtk-dark.css +fi + +echo "GTK theme: OK" diff --git a/install/config/hardware/bluetooth.sh b/install/config/hardware/bluetooth.sh new file mode 100644 index 00000000..71a63760 --- /dev/null +++ b/install/config/hardware/bluetooth.sh @@ -0,0 +1,4 @@ +# Turn on bluetooth by default +sudo systemctl enable bluetooth.service 2>/dev/null || true + +echo "Bluetooth: OK" diff --git a/install/config/hardware/fix-fkeys.sh b/install/config/hardware/fix-fkeys.sh new file mode 100644 index 00000000..5584c1bd --- /dev/null +++ b/install/config/hardware/fix-fkeys.sh @@ -0,0 +1,6 @@ +# Ensure F-keys on Apple-like keyboards (such as Lofree Flow84) are always F-keys +if [[ ! -f /etc/modprobe.d/hid_apple.conf ]]; then + echo "options hid_apple fnmode=2" | sudo tee /etc/modprobe.d/hid_apple.conf +fi + +echo "F-keys fix: OK" diff --git a/install/config/hardware/fix-synaptic-touchpad.sh b/install/config/hardware/fix-synaptic-touchpad.sh new file mode 100644 index 00000000..64e691fb --- /dev/null +++ b/install/config/hardware/fix-synaptic-touchpad.sh @@ -0,0 +1,7 @@ +# Enable Synaptics InterTouch for confirmed touchpads +if grep -qi synaptics /proc/bus/input/devices 2>/dev/null \ + && ! lsmod | grep -q '^psmouse'; then + modprobe psmouse synaptics_intertouch=1 2>/dev/null || true +fi + +echo "Synaptics touchpad: OK" diff --git a/install/config/hardware/intel.sh b/install/config/hardware/intel.sh new file mode 100644 index 00000000..46730859 --- /dev/null +++ b/install/config/hardware/intel.sh @@ -0,0 +1,11 @@ +# Install hardware video acceleration for Intel GPUs +if INTEL_GPU=$(lspci | grep -iE 'vga|3d|display' | grep -i 'intel'); then + if [[ "${INTEL_GPU,,}" =~ "hd graphics"|"xe"|"iris" ]]; then + sudo pacman -S --needed --noconfirm intel-media-driver + elif [[ "${INTEL_GPU,,}" =~ "gma" ]]; then + sudo pacman -S --needed --noconfirm libva-intel-driver + fi + echo "Intel GPU acceleration: OK" +else + echo "No Intel GPU detected, skipping" +fi diff --git a/install/config/hardware/network.sh b/install/config/hardware/network.sh new file mode 100644 index 00000000..af1cb419 --- /dev/null +++ b/install/config/hardware/network.sh @@ -0,0 +1,8 @@ +# Ensure iwd service will be started +sudo systemctl enable iwd.service 2>/dev/null || true + +# Prevent systemd-networkd-wait-online timeout on boot +sudo systemctl disable systemd-networkd-wait-online.service 2>/dev/null || true +sudo systemctl mask systemd-networkd-wait-online.service 2>/dev/null || true + +echo "Network config: OK" diff --git a/install/config/hardware/powerprofiles.sh b/install/config/hardware/powerprofiles.sh new file mode 100644 index 00000000..30f5db37 --- /dev/null +++ b/install/config/hardware/powerprofiles.sh @@ -0,0 +1,26 @@ +# Auto-switch power profiles on AC/battery via udev rules +# Only applies if a battery is present and powerprofilesctl is available + +if command -v powerprofilesctl &>/dev/null && [ -d /sys/class/power_supply/BAT0 ]; then + mapfile -t profiles < <(kojarchy-powerprofiles-list) + + if [[ ${#profiles[@]} -gt 1 ]]; then + # Default AC profile: performance if 3 profiles, balanced if 2 + ac_profile="${profiles[2]:-${profiles[1]}}" + # Default Battery profile: balanced + battery_profile="${profiles[1]}" + + cat </dev/null + if command -v iw &>/dev/null; then + sudo iw reg set ${COUNTRY} + fi + echo "Wireless regulatory domain set to: $COUNTRY" + fi + fi +else + echo "Wireless regulatory domain already set: $WIRELESS_REGDOM" +fi diff --git a/install/config/hidden-apps.sh b/install/config/hidden-apps.sh new file mode 100644 index 00000000..c3064ee1 --- /dev/null +++ b/install/config/hidden-apps.sh @@ -0,0 +1,8 @@ +# Deploy hidden .desktop files to suppress unwanted app launcher entries +APPS_DIR="$HOME/.local/share/applications" +mkdir -p "$APPS_DIR" + +cp "$KOJARCHY_DIR/applications/hidden/"*.desktop "$APPS_DIR/" 2>/dev/null || true +update-desktop-database "$APPS_DIR" 2>/dev/null || true + +echo "Hidden desktop entries: OK" diff --git a/install/config/increase-lockout-limit.sh b/install/config/increase-lockout-limit.sh new file mode 100644 index 00000000..db0f5926 --- /dev/null +++ b/install/config/increase-lockout-limit.sh @@ -0,0 +1,11 @@ +# Increase PAM faillock limit to 10 attempts with 2min unlock timeout +# This prevents permanent lockout from typos while still protecting against brute force + +FAILLOCK_CONF="/etc/security/faillock.conf" + +if [[ -f "$FAILLOCK_CONF" ]]; then + sudo sed -i 's/^#\?\s*deny\s*=.*/deny = 10/' "$FAILLOCK_CONF" + sudo sed -i 's/^#\?\s*unlock_time\s*=.*/unlock_time = 120/' "$FAILLOCK_CONF" +fi + +echo "PAM lockout limit: OK" diff --git a/install/config/increase-sudo-tries.sh b/install/config/increase-sudo-tries.sh new file mode 100644 index 00000000..f9a8b6c7 --- /dev/null +++ b/install/config/increase-sudo-tries.sh @@ -0,0 +1,8 @@ +# Increase sudo password attempts from default 3 to 10 +SUDOERS_FILE="/etc/sudoers.d/99-kojarchy-passwd-tries" +if [[ ! -f "$SUDOERS_FILE" ]]; then + echo 'Defaults passwd_tries=10' | sudo tee "$SUDOERS_FILE" + sudo chmod 440 "$SUDOERS_FILE" +fi + +echo "Sudo password tries: OK" diff --git a/install/config/input-group.sh b/install/config/input-group.sh new file mode 100644 index 00000000..79af4ac0 --- /dev/null +++ b/install/config/input-group.sh @@ -0,0 +1,4 @@ +# Give user privileged input access for game controllers, dictation tools, etc. +sudo usermod -aG input ${USER} + +echo "Input group: OK" diff --git a/install/config/mimetypes.sh b/install/config/mimetypes.sh new file mode 100644 index 00000000..ab25f7af --- /dev/null +++ b/install/config/mimetypes.sh @@ -0,0 +1,30 @@ +# Set default applications for common file types + +update-desktop-database ~/.local/share/applications 2>/dev/null || true + +# Open directories in file manager (dolphin) +xdg-mime default org.kde.dolphin.desktop inode/directory 2>/dev/null || true + +# Open images with qview +for mime in image/png image/jpeg image/gif image/webp image/bmp image/tiff; do + xdg-mime default com.interversehq.qView.desktop "$mime" 2>/dev/null || true +done + +# Open PDFs with zathura +xdg-mime default org.pwmt.zathura.desktop application/pdf 2>/dev/null || true + +# Open video files with mpv +for mime in video/mp4 video/x-msvideo video/x-matroska video/x-flv video/x-ms-wmv \ + video/mpeg video/ogg video/webm video/quicktime video/3gpp video/3gpp2 \ + video/x-ms-asf video/x-ogm+ogg video/x-theora+ogg application/ogg; do + xdg-mime default mpv.desktop "$mime" 2>/dev/null || true +done + +# Open text files with nvim +for mime in text/plain text/english text/x-makefile text/x-c++hdr text/x-c++src \ + text/x-chdr text/x-csrc text/x-java text/x-moc text/x-pascal text/x-tcl \ + text/x-tex application/x-shellscript text/x-c text/x-c++ application/xml text/xml; do + xdg-mime default nvim.desktop "$mime" 2>/dev/null || true +done + +echo "Default mimetypes: OK" diff --git a/install/config/mise.sh b/install/config/mise.sh new file mode 100644 index 00000000..febe175b --- /dev/null +++ b/install/config/mise.sh @@ -0,0 +1,6 @@ +# Set up mise global tools (replaces fnm) +if command -v mise &>/dev/null; then + mise use -g node@latest +fi + +echo "Mise: OK" diff --git a/install/config/neovim.sh b/install/config/neovim.sh new file mode 100644 index 00000000..acec4085 --- /dev/null +++ b/install/config/neovim.sh @@ -0,0 +1,11 @@ +# Install neovim via bob +if command -v bob &>/dev/null; then + bob use stable +fi + +# Run lazy.nvim sync headlessly +if command -v nvim &>/dev/null; then + nvim --headless "+Lazy! sync" +qa 2>/dev/null || true +fi + +echo "Neovim: OK" diff --git a/install/config/shell.sh b/install/config/shell.sh new file mode 100644 index 00000000..abbcaeb4 --- /dev/null +++ b/install/config/shell.sh @@ -0,0 +1,26 @@ +# Install oh-my-zsh (unattended) +if [[ ! -d "$HOME/.oh-my-zsh" ]]; then + RUNZSH=no KEEP_ZSHRC=yes sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" +fi + +# Install zsh plugins +ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}" + +if [[ ! -d "$ZSH_CUSTOM/plugins/zsh-autosuggestions" ]]; then + git clone https://github.com/zsh-users/zsh-autosuggestions "$ZSH_CUSTOM/plugins/zsh-autosuggestions" +fi + +if [[ ! -d "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" ]]; then + git clone https://github.com/zsh-users/zsh-syntax-highlighting "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" +fi + +if [[ ! -d "$ZSH_CUSTOM/plugins/fast-syntax-highlighting" ]]; then + git clone https://github.com/zdharma-continuum/fast-syntax-highlighting "$ZSH_CUSTOM/plugins/fast-syntax-highlighting" +fi + +# Set zsh as default shell +if [[ "$SHELL" != *"zsh"* ]]; then + sudo chsh -s /usr/bin/zsh "$USER" +fi + +echo "Shell: OK" diff --git a/install/config/ssh-flakiness.sh b/install/config/ssh-flakiness.sh new file mode 100644 index 00000000..e67d145e --- /dev/null +++ b/install/config/ssh-flakiness.sh @@ -0,0 +1,7 @@ +# Fix SSH connection flakiness by enabling MTU probing +if ! grep -q "tcp_mtu_probing" /etc/sysctl.d/99-sysctl.conf 2>/dev/null; then + echo "net.ipv4.tcp_mtu_probing=1" | sudo tee -a /etc/sysctl.d/99-sysctl.conf + sudo sysctl -p /etc/sysctl.d/99-sysctl.conf +fi + +echo "SSH MTU probing fix: OK" diff --git a/install/config/systemd-tweaks.sh b/install/config/systemd-tweaks.sh new file mode 100644 index 00000000..468a03db --- /dev/null +++ b/install/config/systemd-tweaks.sh @@ -0,0 +1,5 @@ +# Apply systemd tweaks (faster shutdown timeout) +sudo mkdir -p /etc/systemd/system.conf.d +sudo cp "$KOJARCHY_DIR/default/systemd/faster-shutdown.conf" /etc/systemd/system.conf.d/faster-shutdown.conf + +echo "Systemd tweaks: OK" diff --git a/install/config/tmux.sh b/install/config/tmux.sh new file mode 100644 index 00000000..25fcca84 --- /dev/null +++ b/install/config/tmux.sh @@ -0,0 +1,11 @@ +# Install TPM (Tmux Plugin Manager) +TPM_DIR="$HOME/.tmux/plugins/tpm" + +if [[ ! -d "$TPM_DIR" ]]; then + git clone https://github.com/tmux-plugins/tpm "$TPM_DIR" +fi + +# Install tmux plugins +"$TPM_DIR/bin/install_plugins" || true + +echo "Tmux: OK" diff --git a/install/config/usb-autosuspend.sh b/install/config/usb-autosuspend.sh new file mode 100644 index 00000000..03d7314c --- /dev/null +++ b/install/config/usb-autosuspend.sh @@ -0,0 +1,6 @@ +# Disable USB autosuspend to prevent peripheral disconnection issues +if [[ ! -f /etc/modprobe.d/disable-usb-autosuspend.conf ]]; then + echo "options usbcore autosuspend=-1" | sudo tee /etc/modprobe.d/disable-usb-autosuspend.conf +fi + +echo "USB autosuspend disabled: OK" diff --git a/install/kojarchy-base.packages b/install/kojarchy-base.packages new file mode 100644 index 00000000..fb212720 --- /dev/null +++ b/install/kojarchy-base.packages @@ -0,0 +1,183 @@ +# Kojarchy core package list installed via install/packaging/base.sh +# One per line, # for comments, blank lines ignored + +# === System (supplements archinstall base) === +base-devel +dkms +less +man-db +smartmontools +unzip +zip +7zip + +# === Networking === +avahi +nss-mdns +bind +net-tools +networkmanager +network-manager-applet +openvpn +sshfs +tailscale +traceroute +wget +wireguard-tools +wireless-regdb + +# === Graphics (generic) === +mesa-utils + +# === Hyprland & Desktop === +hyprland +hypridle +hyprlock +hyprpicker +hyprpolkitagent +hyprsunset +hyprshot +hyprmon-bin +hyprwhspr +swaybg +swayosd +waybar +wayfreeze +dunst +wofi +wofi-calc +xdg-desktop-portal-gtk +xdg-desktop-portal-hyprland +xdg-desktop-portal-kde +xdg-utils +xdg-terminal-exec +xorg-server +xorg-xhost +xorg-xinit +xwaylandvideobridge +sddm +uwsm +gnome-keyring +libsecret +bolt +playerctl +brightnessctl +bluetui + +# === Terminal & Shell === +kitty +tmux +zsh +zoxide +fzf +starship +btop +htop +fastfetch +direnv +yad + +# === Development === +git +git-delta +github-cli +docker +docker-compose +docker-buildx +mise +bun +uv +bob +tree-sitter-cli +cargo-update +tmux-sessionizer-bin +clang +llvm +rust +opencode +ripgrep +lazydocker +lazygit + +# === File Management === +nautilus +yazi +fd +gdu +ncdu +tree +gvfs-mtp +gvfs-nfs +gvfs-smb +exfatprogs + +# === Media & Graphics === +pipewire +pipewire-alsa +pipewire-jack +pipewire-pulse +gst-plugin-pipewire +libpulse +wireplumber +alsa-utils +wiremix +imagemagick +graphicsmagick +mpv +satty +grim +slurp +wl-clipboard +ffmpegthumbs +yt-dlp + +# === Fonts === +ttf-firacode-nerd +ttf-nerd-fonts-symbols +fontconfig +noto-fonts +noto-fonts-cjk +noto-fonts-emoji +noto-fonts-extra +woff2-font-awesome +font-manager + +# === Qt/GTK Theming === +qt5-wayland +qt6-wayland +kvantum +kvantum-qt5 +kvantum-theme-catppuccin-git +catppuccin-gtk-theme-mocha +walker-bin +nwg-look +gnome-themes-extra + +# === Firewall === +ufw +ufw-docker + +# === Misc Tools === +expac +flatpak +gum +jq +hyperfine +tesseract-data-eng +hunspell-en_us +bc +lshw +inxi +speedtest-cli +tzupdate + +# === Document & Image Viewing === +evince +imv + +# === Browsers === +helium-browser-bin + +# === System Utilities === +gnome-calculator +gnome-disk-utility diff --git a/install/kojarchy-cargo.packages b/install/kojarchy-cargo.packages new file mode 100644 index 00000000..b9d8834f --- /dev/null +++ b/install/kojarchy-cargo.packages @@ -0,0 +1,9 @@ +# Kojarchy cargo packages (format: crate=binary) +# If binary name matches crate name, just use the crate name +# Installed via install/config/cargo.sh +# +# All packages moved to kojarchy-base.packages as prebuilt binaries: +# bob-nvim -> bob (official repo) +# tree-sitter-cli -> tree-sitter-cli (official repo) +# cargo-update -> cargo-update (official repo) +# tmux-sessionizer -> tmux-sessionizer-bin (AUR) diff --git a/install/kojarchy-nvidia.packages b/install/kojarchy-nvidia.packages new file mode 100644 index 00000000..f90f0438 --- /dev/null +++ b/install/kojarchy-nvidia.packages @@ -0,0 +1,6 @@ +# Kojarchy NVIDIA GPU packages - prompted during install +# Only install these on systems with NVIDIA GPUs + +nvidia-open-dkms +lib32-nvidia-utils +libva-nvidia-driver diff --git a/install/kojarchy-optional.packages b/install/kojarchy-optional.packages new file mode 100644 index 00000000..1b922e61 --- /dev/null +++ b/install/kojarchy-optional.packages @@ -0,0 +1,72 @@ +# Kojarchy optional packages - prompted during install (gum confirm) +# One per line, # for comments, blank lines ignored + +# === Gaming === +steam +prismlauncher +protonup-qt +protontricks +goverlay +tetrio-desktop + +# === Communication === +discord +vesktop +legcord +slack-desktop +telegram-desktop + +# === Productivity === +notion-calendar-electron +obs-studio +obs-backgroundremoval +audacity +blender + +# === Video Calling === +zoom +uxplay + +# === Browsers === +chromium + +# === Remote === +rustdesk-bin +localsend-bin +ngrok +rcon-cli + +# === Torrents === +qbittorrent +qbittorrent-nox + +# === Music === +spotify + +# === RGB & Hardware === +openrgb + +# === Virtualization === +qemu-full +libvirt +virt-manager +virt-install +virt-viewer +libosinfo +guestfs-tools +swtpm +dnsmasq +v4l2loopback-dkms + +# === Other === +kdeconnect +video-trimmer +spacedrive-bin +cmatrix +pipes.sh +qalculate-qt +ollama +cuda +cudnn +onnxruntime-cuda +nvidia-container-toolkit diff --git a/install/packaging/all.sh b/install/packaging/all.sh new file mode 100644 index 00000000..64dc7298 --- /dev/null +++ b/install/packaging/all.sh @@ -0,0 +1,12 @@ +run_logged $KOJARCHY_INSTALL/packaging/aur-helper.sh +run_logged $KOJARCHY_INSTALL/packaging/base.sh + +# Pause log tail for interactive prompts (it overwrites the screen) +stop_log_output +clear_logo +source $KOJARCHY_INSTALL/packaging/nvidia.sh +source $KOJARCHY_INSTALL/packaging/optional.sh +clear_logo +start_log_output + +run_logged $KOJARCHY_INSTALL/packaging/fonts.sh diff --git a/install/packaging/aur-helper.sh b/install/packaging/aur-helper.sh new file mode 100644 index 00000000..6ce7f162 --- /dev/null +++ b/install/packaging/aur-helper.sh @@ -0,0 +1,24 @@ +# Enable multilib repo (needed for lib32-* packages like lib32-nvidia-utils) +if ! grep -q '^\[multilib\]' /etc/pacman.conf; then + echo "Enabling multilib repository..." + sudo tee -a /etc/pacman.conf >/dev/null <<'EOF' + +[multilib] +Include = /etc/pacman.d/mirrorlist +EOF + sudo pacman -Sy +fi + +# Install yay if not present +if ! command -v yay &>/dev/null; then + echo "Installing yay AUR helper..." + sudo pacman -S --needed --noconfirm git base-devel + tmpdir=$(mktemp -d) + git clone https://aur.archlinux.org/yay-bin.git "$tmpdir/yay-bin" + cd "$tmpdir/yay-bin" + makepkg -si --noconfirm + cd - + rm -rf "$tmpdir" +fi + +echo "yay: OK" diff --git a/install/packaging/base.sh b/install/packaging/base.sh new file mode 100644 index 00000000..d19eee97 --- /dev/null +++ b/install/packaging/base.sh @@ -0,0 +1,3 @@ +# Install all base packages (pacman + AUR via yay) +mapfile -t packages < <(grep -v '^#' "$KOJARCHY_INSTALL/kojarchy-base.packages" | grep -v '^$') +yay -S --noconfirm --needed "${packages[@]}" diff --git a/install/packaging/fonts.sh b/install/packaging/fonts.sh new file mode 100644 index 00000000..df872dc5 --- /dev/null +++ b/install/packaging/fonts.sh @@ -0,0 +1,2 @@ +# Rebuild font cache after package installation +fc-cache -fv diff --git a/install/packaging/nvidia-install.sh b/install/packaging/nvidia-install.sh new file mode 100644 index 00000000..8aabc4fe --- /dev/null +++ b/install/packaging/nvidia-install.sh @@ -0,0 +1,3 @@ +# Install NVIDIA packages +mapfile -t packages < <(grep -v '^#' "$KOJARCHY_INSTALL/kojarchy-nvidia.packages" | grep -v '^$') +yay -S --noconfirm --needed "${packages[@]}" diff --git a/install/packaging/nvidia.sh b/install/packaging/nvidia.sh new file mode 100644 index 00000000..12d9dfc1 --- /dev/null +++ b/install/packaging/nvidia.sh @@ -0,0 +1,6 @@ +# Detect NVIDIA GPU and prompt for driver installation +if lspci | grep -qi nvidia; then + if gum confirm "NVIDIA GPU detected. Install NVIDIA drivers?" /dev/tty 2>/dev/tty; then + run_logged $KOJARCHY_INSTALL/packaging/nvidia-install.sh + fi +fi diff --git a/install/packaging/optional-install.sh b/install/packaging/optional-install.sh new file mode 100644 index 00000000..ae57959b --- /dev/null +++ b/install/packaging/optional-install.sh @@ -0,0 +1,3 @@ +# Install optional packages (called from optional.sh after user confirms) +mapfile -t packages < <(grep -v '^#' "$KOJARCHY_INSTALL/kojarchy-optional.packages" | grep -v '^$') +yay -S --noconfirm --needed "${packages[@]}" diff --git a/install/packaging/optional.sh b/install/packaging/optional.sh new file mode 100644 index 00000000..d33a4138 --- /dev/null +++ b/install/packaging/optional.sh @@ -0,0 +1,4 @@ +# Prompt user for optional packages (runs in main shell for tty access) +if gum confirm "Install optional packages? (gaming, comms, productivity, etc.)" /dev/tty 2>/dev/tty; then + run_logged $KOJARCHY_INSTALL/packaging/optional-install.sh +fi diff --git a/install/post-install/all.sh b/install/post-install/all.sh new file mode 100644 index 00000000..0694d091 --- /dev/null +++ b/install/post-install/all.sh @@ -0,0 +1,2 @@ +run_logged $KOJARCHY_INSTALL/post-install/reenable-mkinitcpio.sh +source $KOJARCHY_INSTALL/post-install/finished.sh diff --git a/install/post-install/finished.sh b/install/post-install/finished.sh new file mode 100644 index 00000000..09f62584 --- /dev/null +++ b/install/post-install/finished.sh @@ -0,0 +1,31 @@ +# Installation complete! +stop_install_log + +# Remove temporary NOPASSWD sudoers (created in preflight/begin.sh) +if sudo test -f /etc/sudoers.d/99-kojarchy-installer; then + sudo rm -f /etc/sudoers.d/99-kojarchy-installer +fi + +clear_logo + +# Calculate elapsed time +if [ -n "${KOJARCHY_START_TIME:-}" ]; then + KOJARCHY_END_EPOCH=$(date +%s) + KOJARCHY_START_EPOCH=$(date -d "$KOJARCHY_START_TIME" +%s) + KOJARCHY_DURATION=$((KOJARCHY_END_EPOCH - KOJARCHY_START_EPOCH)) + KOJARCHY_MINS=$((KOJARCHY_DURATION / 60)) + KOJARCHY_SECS=$((KOJARCHY_DURATION % 60)) + + gum style --foreground 2 --padding "1 0 0 $PADDING_LEFT" "Kojarchy installed successfully in ${KOJARCHY_MINS}m ${KOJARCHY_SECS}s!" +else + gum style --foreground 2 --padding "1 0 0 $PADDING_LEFT" "Kojarchy installed successfully!" +fi + +echo +gum style --padding "0 0 0 $PADDING_LEFT" "Reboot to start using your new desktop." +echo + +if gum confirm --default --affirmative "Reboot now" --negative "Later" >"$KOJARCHY_LOG" + sudo reboot +fi diff --git a/install/post-install/reenable-mkinitcpio.sh b/install/post-install/reenable-mkinitcpio.sh new file mode 100644 index 00000000..0badf1d7 --- /dev/null +++ b/install/post-install/reenable-mkinitcpio.sh @@ -0,0 +1,15 @@ +# Re-enable mkinitcpio hooks and run once +echo "Re-enabling mkinitcpio hooks..." + +if [ -f /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled ]; then + sudo mv /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled /usr/share/libalpm/hooks/90-mkinitcpio-install.hook +fi + +if [ -f /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled ]; then + sudo mv /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook +fi + +# Run mkinitcpio once for all installed kernels +sudo mkinitcpio -P + +echo "mkinitcpio: OK" diff --git a/install/preflight/all.sh b/install/preflight/all.sh new file mode 100644 index 00000000..91c76bd9 --- /dev/null +++ b/install/preflight/all.sh @@ -0,0 +1,3 @@ +source $KOJARCHY_INSTALL/preflight/guard.sh +source $KOJARCHY_INSTALL/preflight/begin.sh +run_logged $KOJARCHY_INSTALL/preflight/disable-mkinitcpio.sh diff --git a/install/preflight/begin.sh b/install/preflight/begin.sh new file mode 100644 index 00000000..bdafe25f --- /dev/null +++ b/install/preflight/begin.sh @@ -0,0 +1,16 @@ +clear_logo +gum style --foreground 3 --padding "1 0 0 $PADDING_LEFT" "Installing..." +echo + +# Ensure sudo is cached before starting the log (needs tty for password prompt) +sudo -v /dev/null </dev/null && ! ping -c 1 -W 3 8.8.8.8 &>/dev/null; then + abort "Internet connection" +fi + +# Clear stale pacman lock from previous interrupted runs +if [[ -f /var/lib/pacman/db.lck ]]; then + sudo rm -f /var/lib/pacman/db.lck +fi + +echo "Guards: OK" diff --git a/install/services/all.sh b/install/services/all.sh new file mode 100644 index 00000000..9f27962a --- /dev/null +++ b/install/services/all.sh @@ -0,0 +1,3 @@ +run_logged $KOJARCHY_INSTALL/services/systemd.sh +run_logged $KOJARCHY_INSTALL/services/sddm.sh +run_logged $KOJARCHY_INSTALL/services/udev.sh diff --git a/install/services/sddm.sh b/install/services/sddm.sh new file mode 100644 index 00000000..be08eb91 --- /dev/null +++ b/install/services/sddm.sh @@ -0,0 +1,21 @@ +# Install SDDM with custom macOS theme + autologin + +# Copy macOS theme to SDDM themes directory +sudo mkdir -p /usr/share/sddm/themes/macos +sudo cp -R "$KOJARCHY_DIR/sddm/macos/"* /usr/share/sddm/themes/macos/ + +# Configure SDDM: macOS theme + autologin +sudo mkdir -p /etc/sddm.conf.d +sudo tee /etc/sddm.conf.d/kojarchy.conf >/dev/null </dev/null || true + sudo udevadm control --reload-rules + sudo udevadm trigger +fi + +echo "Udev: OK" diff --git a/lib/errors.sh b/lib/errors.sh new file mode 100644 index 00000000..effe48e4 --- /dev/null +++ b/lib/errors.sh @@ -0,0 +1,119 @@ +#!/bin/bash + +# Kojarchy error handling - traps, recovery menu + +# Track if we're already handling an error to prevent double-trapping +ERROR_HANDLING=false + +show_cursor() { + printf "\033[?25h" +} + +show_log_tail() { + if [[ -f $KOJARCHY_LOG ]]; then + local log_lines=$(($TERM_HEIGHT - $LOGO_HEIGHT - 20)) + local max_line_width=$((LOGO_WIDTH - 4)) + + tail -n $log_lines "$KOJARCHY_LOG" | while IFS= read -r line; do + if ((${#line} > max_line_width)); then + local truncated_line="${line:0:$max_line_width}..." + else + local truncated_line="$line" + fi + gum style "$truncated_line" + done + echo + fi +} + +show_failed_script_or_command() { + if [[ -n ${CURRENT_SCRIPT:-} ]]; then + gum style "Failed script: $CURRENT_SCRIPT" + else + local cmd="$BASH_COMMAND" + local max_cmd_width=$((LOGO_WIDTH - 4)) + if ((${#cmd} > max_cmd_width)); then + cmd="${cmd:0:$max_cmd_width}..." + fi + gum style "$cmd" + fi +} + +# Save original stdout and stderr for trap to use +save_original_outputs() { + exec 3>&1 4>&2 +} + +restore_outputs() { + if [ -e /proc/self/fd/3 ] && [ -e /proc/self/fd/4 ]; then + exec 1>&3 2>&4 + fi +} + +catch_errors() { + if [[ $ERROR_HANDLING == true ]]; then + return + else + ERROR_HANDLING=true + fi + + local exit_code=$? + + stop_log_output + restore_outputs + + clear_logo + show_cursor + + gum style --foreground 1 --padding "1 0 1 $PADDING_LEFT" "Kojarchy installation stopped!" + show_log_tail + + gum style "This command halted with exit code $exit_code:" + show_failed_script_or_command + + echo + gum style --foreground 245 "If you need help, open an issue at:" + gum style --foreground 4 "https://github.com/princejoogie/dotfiles/issues" + echo + + while true; do + local options=() + options+=("Retry installation") + options+=("View full log") + options+=("Exit") + + choice=$(gum choose "${options[@]}" --header "What would you like to do?" --height 5 --padding "1 $PADDING_LEFT") + + case "$choice" in + "Retry installation") + bash "$KOJARCHY_DIR/install.sh" + break + ;; + "View full log") + if command -v less &>/dev/null; then + less "$KOJARCHY_LOG" + else + tail "$KOJARCHY_LOG" + fi + ;; + "Exit" | "") + exit 1 + ;; + esac + done +} + +exit_handler() { + local exit_code=$? + if [[ $exit_code -ne 0 && $ERROR_HANDLING != true ]]; then + catch_errors + else + stop_log_output + show_cursor + fi +} + +trap catch_errors ERR INT TERM +trap exit_handler EXIT + +save_original_outputs diff --git a/lib/helpers.sh b/lib/helpers.sh new file mode 100644 index 00000000..4f7d6783 --- /dev/null +++ b/lib/helpers.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Kojarchy install helpers - sourced by install.sh + +source "$KOJARCHY_DIR/lib/presentation.sh" +source "$KOJARCHY_DIR/lib/errors.sh" +source "$KOJARCHY_DIR/lib/logging.sh" +source "$KOJARCHY_DIR/lib/packages.sh" diff --git a/lib/logging.sh b/lib/logging.sh new file mode 100644 index 00000000..e0698368 --- /dev/null +++ b/lib/logging.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# Kojarchy logging - install log, live tail display + +start_log_output() { + local ANSI_SAVE_CURSOR="\033[s" + local ANSI_RESTORE_CURSOR="\033[u" + local ANSI_CLEAR_LINE="\033[2K" + local ANSI_HIDE_CURSOR="\033[?25l" + local ANSI_RESET="\033[0m" + local ANSI_GRAY="\033[90m" + + printf $ANSI_SAVE_CURSOR + printf $ANSI_HIDE_CURSOR + + ( + local log_lines=20 + local max_line_width=$((LOGO_WIDTH - 4)) + + while true; do + mapfile -t current_lines < <(tail -n $log_lines "$KOJARCHY_LOG" 2>/dev/null) + + output="" + for ((i = 0; i < log_lines; i++)); do + line="${current_lines[i]:-}" + if [ ${#line} -gt $max_line_width ]; then + line="${line:0:$max_line_width}..." + fi + if [ -n "$line" ]; then + output+="${ANSI_CLEAR_LINE}${ANSI_GRAY}${PADDING_LEFT_SPACES} → ${line}${ANSI_RESET}\n" + else + output+="${ANSI_CLEAR_LINE}${PADDING_LEFT_SPACES}\n" + fi + done + + printf "${ANSI_RESTORE_CURSOR}%b" "$output" + sleep 0.1 + done + ) & + monitor_pid=$! +} + +stop_log_output() { + if [ -n "${monitor_pid:-}" ]; then + kill $monitor_pid 2>/dev/null || true + wait $monitor_pid 2>/dev/null || true + unset monitor_pid + fi +} + +start_install_log() { + sudo touch "$KOJARCHY_LOG" + sudo chmod 666 "$KOJARCHY_LOG" + + export KOJARCHY_START_TIME=$(date '+%Y-%m-%d %H:%M:%S') + echo "=== Kojarchy Installation Started: $KOJARCHY_START_TIME ===" >>"$KOJARCHY_LOG" + start_log_output +} + +stop_install_log() { + stop_log_output + show_cursor + + if [[ -n ${KOJARCHY_LOG:-} ]]; then + KOJARCHY_END_TIME=$(date '+%Y-%m-%d %H:%M:%S') + echo "=== Kojarchy Installation Completed: $KOJARCHY_END_TIME ===" >>"$KOJARCHY_LOG" + echo "" >>"$KOJARCHY_LOG" + + echo "=== Installation Time Summary ===" >>"$KOJARCHY_LOG" + + if [ -n "$KOJARCHY_START_TIME" ]; then + KOJARCHY_START_EPOCH=$(date -d "$KOJARCHY_START_TIME" +%s) + KOJARCHY_END_EPOCH=$(date -d "$KOJARCHY_END_TIME" +%s) + KOJARCHY_DURATION=$((KOJARCHY_END_EPOCH - KOJARCHY_START_EPOCH)) + + KOJARCHY_MINS=$((KOJARCHY_DURATION / 60)) + KOJARCHY_SECS=$((KOJARCHY_DURATION % 60)) + + echo "Kojarchy: ${KOJARCHY_MINS}m ${KOJARCHY_SECS}s" >>"$KOJARCHY_LOG" + fi + echo "=================================" >>"$KOJARCHY_LOG" + fi +} + +run_logged() { + local script="$1" + export CURRENT_SCRIPT="$script" + + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting: $script" >>"$KOJARCHY_LOG" + + bash -c " + export KOJARCHY_DIR='$KOJARCHY_DIR' + export KOJARCHY_INSTALL='$KOJARCHY_INSTALL' + export KOJARCHY_LOG='$KOJARCHY_LOG' + source '$script' + " >"$KOJARCHY_LOG" 2>&1 + + local exit_code=$? + + if [ $exit_code -eq 0 ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Completed: $script" >>"$KOJARCHY_LOG" + unset CURRENT_SCRIPT + else + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Failed: $script (exit code: $exit_code)" >>"$KOJARCHY_LOG" + fi + + return $exit_code +} diff --git a/lib/packages.sh b/lib/packages.sh new file mode 100644 index 00000000..8203fbb4 --- /dev/null +++ b/lib/packages.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# Kojarchy package install helpers +# (Currently empty — cargo packages moved to base packages as prebuilt binaries) diff --git a/lib/presentation.sh b/lib/presentation.sh new file mode 100644 index 00000000..fe832592 --- /dev/null +++ b/lib/presentation.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# Kojarchy presentation helpers - gum TUI, logo display + +# Ensure we have gum available +if ! command -v gum &>/dev/null; then + sudo pacman -S --needed --noconfirm gum +fi + +# Get terminal size from /dev/tty (works in all scenarios: direct, sourced, or piped) +if [ -e /dev/tty ]; then + TERM_SIZE=$(stty size 2>/dev/null max) max = length } END { print max+0 }' "$LOGO_PATH" 2>/dev/null || echo 0) +export LOGO_HEIGHT=$(wc -l <"$LOGO_PATH" 2>/dev/null || echo 0) + +export PADDING_LEFT=$((($TERM_WIDTH - $LOGO_WIDTH) / 2)) +export PADDING_LEFT_SPACES=$(printf "%*s" $PADDING_LEFT "") + +# Gum style padding +export PADDING="0 0 0 $PADDING_LEFT" +export GUM_CONFIRM_PROMPT_FOREGROUND="6" +export GUM_CONFIRM_SELECTED_FOREGROUND="0" +export GUM_CONFIRM_SELECTED_BACKGROUND="2" +export GUM_CONFIRM_UNSELECTED_FOREGROUND="7" +export GUM_CONFIRM_UNSELECTED_BACKGROUND="0" +export GUM_CHOOSE_PADDING="$PADDING" +export GUM_FILTER_PADDING="$PADDING" +export GUM_INPUT_PADDING="$PADDING" +export GUM_SPIN_PADDING="$PADDING" +export GUM_TABLE_PADDING="$PADDING" +export GUM_CONFIRM_PADDING="$PADDING" + +clear_logo() { + printf "\033[H\033[2J" + gum style --foreground 2 --padding "1 0 0 $PADDING_LEFT" "$(<"$LOGO_PATH")" +} diff --git a/logo.txt b/logo.txt new file mode 100644 index 00000000..2406159e --- /dev/null +++ b/logo.txt @@ -0,0 +1,9 @@ + + ▄█ ▄█▀ ▄██████▄ ▄█▄ ▄█████▄ ▄███████ ▄███████ ▄█ █▄ ▄█ █▄ + ██ ▄█▀ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ + ███▀ ███ ███ ███ ███ ███ ███ ███ ███ █▀ ███ ███ ███ ███ + ██▀ ███ ███ ███ ▄███▄▄▄███ ▄███▄▄▄██▀ ███ ▄███▄▄▄███▄ ███▄▄▄███ + ██▄ ███ ███ ███ ▀███▀▀▀███ ▀███▀▀▀▀ ███ ▀▀███▀▀▀███ ▀▀▀▀▀▀███ + ██ ▀█▄ ███ ███ ██ ███ ███ ███ ██████████ ███ █▄ ███ ███ ▄██ ███ + ██ ▀█▄ ███ ███ ██ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ + ██ ▀█ ▀██████▀ █████▀ ███ █▀ ███ ███ ███████▀ ███ █▀ ▀█████▀ diff --git a/mac/deps.sh b/mac/deps.sh new file mode 100755 index 00000000..15faa286 --- /dev/null +++ b/mac/deps.sh @@ -0,0 +1,77 @@ +#!/bin/bash +set -euo pipefail + +# Kojarchy macOS dependencies — installs shared tooling via Homebrew +# Usage: bash ~/dotfiles/mac/deps.sh + +if ! command -v brew &>/dev/null; then + echo "Installing Homebrew..." + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +fi + +echo "Installing packages..." + +brew install \ + neovim \ + tmux \ + starship \ + zoxide \ + fzf \ + fd \ + yazi \ + jq \ + git-delta \ + gh \ + direnv \ + mise \ + uv \ + bun \ + btop \ + gum \ + kitty + +# Oh-my-zsh +if [[ ! -d "$HOME/.oh-my-zsh" ]]; then + echo "Installing oh-my-zsh..." + RUNZSH=no KEEP_ZSHRC=yes sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" +fi + +# Zsh plugins +ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}" + +[[ ! -d "$ZSH_CUSTOM/plugins/zsh-autosuggestions" ]] && \ + git clone https://github.com/zsh-users/zsh-autosuggestions "$ZSH_CUSTOM/plugins/zsh-autosuggestions" + +[[ ! -d "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" ]] && \ + git clone https://github.com/zsh-users/zsh-syntax-highlighting "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" + +[[ ! -d "$ZSH_CUSTOM/plugins/fast-syntax-highlighting" ]] && \ + git clone https://github.com/zdharma-continuum/fast-syntax-highlighting "$ZSH_CUSTOM/plugins/fast-syntax-highlighting" + +# TPM +TPM_DIR="$HOME/.tmux/plugins/tpm" +if [[ ! -d "$TPM_DIR" ]]; then + echo "Installing TPM..." + git clone https://github.com/tmux-plugins/tpm "$TPM_DIR" +fi + +# Rust + cargo tools +if ! command -v cargo &>/dev/null; then + echo "Installing Rust..." + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + source "$HOME/.cargo/env" +fi + +# Bob (neovim version manager) +if ! command -v bob &>/dev/null; then + cargo install bob-nvim +fi +bob use stable + +# TMS +if ! command -v tms &>/dev/null; then + cargo install tmux-sessionizer +fi + +echo "" +echo "Done! Run 'mac/setup.sh' to deploy configs." diff --git a/mac/setup.sh b/mac/setup.sh new file mode 100755 index 00000000..a3240e83 --- /dev/null +++ b/mac/setup.sh @@ -0,0 +1,49 @@ +#!/bin/bash +set -euo pipefail + +# Kojarchy macOS setup — copies shared configs (nvim, opencode, shell, tmux, git) +# Usage: bash ~/dotfiles/mac/setup.sh + +DOTFILES_DIR="$(cd "$(dirname "$0")/.." && pwd)" + +echo "=== Kojarchy macOS Setup ===" +echo "Dotfiles: $DOTFILES_DIR" +echo "" + +# Nvim +echo "Deploying nvim config..." +mkdir -p ~/.config/nvim +cp -R "$DOTFILES_DIR/config/nvim/"* ~/.config/nvim/ + +# OpenCode +echo "Deploying opencode config..." +mkdir -p ~/.config/opencode +cp -R "$DOTFILES_DIR/config/opencode/"* ~/.config/opencode/ + +# Kitty +echo "Deploying kitty config..." +mkdir -p ~/.config/kitty +cp -R "$DOTFILES_DIR/config/kitty/"* ~/.config/kitty/ + +# Starship +echo "Deploying starship config..." +cp "$DOTFILES_DIR/config/starship.toml" ~/.config/starship.toml + +# Tmux +echo "Deploying tmux config..." +mkdir -p ~/.config/tmux +cp "$DOTFILES_DIR/config/tmux/tmux.conf" ~/.config/tmux/tmux.conf + +# Zsh +echo "Deploying zshrc..." +cp "$DOTFILES_DIR/default/zshrc" ~/.zshrc + +# Yazi +echo "Deploying yazi config..." +mkdir -p ~/.config/yazi +cp -R "$DOTFILES_DIR/config/yazi/"* ~/.config/yazi/ + +echo "" +echo "Done! You may need to:" +echo " - Restart your shell: source ~/.zshrc" +echo " - Install dependencies: see mac/deps.sh" diff --git a/mac/update.sh b/mac/update.sh new file mode 100755 index 00000000..9f3f174f --- /dev/null +++ b/mac/update.sh @@ -0,0 +1,79 @@ +#!/bin/bash +set -euo pipefail + +# Kojarchy macOS update — re-deploys configs from repo +# Usage: bash ~/dotfiles/mac/update.sh + +DOTFILES_DIR="$(cd "$(dirname "$0")/.." && pwd)" + +echo "Pulling latest..." +git -C "$DOTFILES_DIR" pull + +echo "" + +if command -v gum &>/dev/null; then + ACTIONS=$(gum choose --no-limit --header "What do you want to update?" \ + "Nvim" \ + "OpenCode" \ + "Kitty" \ + "Shell (zshrc)" \ + "Tmux" \ + "Starship" \ + "Yazi" \ + "Neovim plugins (lazy sync)" \ + "Everything") + + if echo "$ACTIONS" | grep -q "Everything"; then + ACTIONS="Nvim +OpenCode +Kitty +Shell (zshrc) +Tmux +Starship +Yazi +Neovim plugins (lazy sync)" + fi +else + ACTIONS="Everything" +fi + +while IFS= read -r action; do + case "$action" in + "Nvim"*|"Everything") + echo "Deploying nvim..." + cp -R "$DOTFILES_DIR/config/nvim/"* ~/.config/nvim/ + ;;& + "OpenCode"*|"Everything") + echo "Deploying opencode..." + cp -R "$DOTFILES_DIR/config/opencode/"* ~/.config/opencode/ + ;;& + "Kitty"*|"Everything") + echo "Deploying kitty..." + cp -R "$DOTFILES_DIR/config/kitty/"* ~/.config/kitty/ + ;;& + "Shell"*|"Everything") + echo "Deploying zshrc..." + cp "$DOTFILES_DIR/default/zshrc" ~/.zshrc + ;;& + "Tmux"*|"Everything") + echo "Deploying tmux..." + cp "$DOTFILES_DIR/config/tmux/tmux.conf" ~/.config/tmux/tmux.conf + ;;& + "Starship"*|"Everything") + echo "Deploying starship..." + cp "$DOTFILES_DIR/config/starship.toml" ~/.config/starship.toml + ;;& + "Yazi"*|"Everything") + echo "Deploying yazi..." + cp -R "$DOTFILES_DIR/config/yazi/"* ~/.config/yazi/ + ;;& + "Neovim plugins"*|"Everything") + echo "Syncing neovim plugins..." + nvim --headless "+Lazy! sync" +qa 2>/dev/null || true + ;;& + esac + break +done <<< "$ACTIONS" + +echo "" +echo "Update complete!" diff --git a/sddm/etc/sddm.conf b/sddm/etc/sddm.conf deleted file mode 100644 index 3686c096..00000000 --- a/sddm/etc/sddm.conf +++ /dev/null @@ -1,2 +0,0 @@ -[Theme] -Current=macos diff --git a/sddm/install-dependencies.sh b/sddm/install-dependencies.sh deleted file mode 100755 index 54542a98..00000000 --- a/sddm/install-dependencies.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -sudo pacman -Syu qt6-svg qt6-declarative qt5-quickcontrols2 diff --git a/sddm/link.sh b/sddm/link.sh deleted file mode 100755 index f7013765..00000000 --- a/sddm/link.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -sudo mkdir -p /usr/share/sddm/themes/macos -sudo cp -r sddm/macos/* /usr/share/sddm/themes/macos -sudo cp sddm/etc/sddm.conf /etc/sddm.conf diff --git a/shell/.gitconfig b/shell/.gitconfig deleted file mode 100644 index e6c7c52a..00000000 --- a/shell/.gitconfig +++ /dev/null @@ -1,64 +0,0 @@ -[credential] - helper = store -[alias] - co = "!f() { git branch -a | awk '{gsub(\"remotes/origin/\", \"\", $1); print $1}' | sort -u | fzf-tmux -p --reverse | xargs git checkout; }; f" - col = "!f() { git branch | awk '{gsub(\"remotes/origin/\", \"\", $1); print $1}' | sort -u | fzf-tmux -p --reverse | xargs git checkout; }; f" - squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; }; f" - gone = "!f() { git fetch --all --prune; git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -D; }; f" - ll = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)' - root = rev-parse --show-toplevel -[core] - pager = delta -[interactive] - diffFilter = delta --color-only -[add.interactive] - useBuiltin = false -[delta] - navigate = true - light = false - side-by-side = false - - blame-palette = "#1e1e2e #181825 #11111b #313244 #45475a" - commit-decoration-style = "#6c7086" bold box ul - dark = true - file-decoration-style = "#6c7086" - file-style = "#cdd6f4" - hunk-header-decoration-style = "#6c7086" box ul - hunk-header-file-style = bold - hunk-header-line-number-style = bold "#a6adc8" - hunk-header-style = file line-number syntax - line-numbers-left-style = "#6c7086" - line-numbers-minus-style = bold "#f38ba8" - line-numbers-plus-style = bold "#a6e3a1" - line-numbers-right-style = "#6c7086" - line-numbers-zero-style = "#6c7086" - minus-emph-style = bold syntax "#53394c" - minus-style = syntax "#34293a" - plus-emph-style = bold syntax "#404f4a" - plus-style = syntax "#2c3239" - map-styles = \ - bold purple => syntax "#494060", \ - bold blue => syntax "#384361", \ - bold cyan => syntax "#384d5d", \ - bold yellow => syntax "#544f4e" -[merge] - conflictstyle = diff3 -[diff] - colorMoved = default -[init] - defaultBranch = main -[push] - autoSetupRemote = true -[rerere] - enabled = true -[credential "https://github.com"] - helper = - helper = !/usr/bin/gh auth git-credential -[credential "https://gist.github.com"] - helper = - helper = !/usr/bin/gh auth git-credential -[user] - name = princejoogie - email = princejoogie@gmail.com -[pull] - rebase = true diff --git a/shell/.zshrc b/shell/.zshrc deleted file mode 100644 index dcb12d20..00000000 --- a/shell/.zshrc +++ /dev/null @@ -1,110 +0,0 @@ -# oh-my-zsh -autoload -U compinit -compinit - -export DISABLE_AUTO_UPDATE="true" - -export ZSH="$HOME/.oh-my-zsh" - -plugins=( - z - gh - aws - fnm - git - tmux - docker - vi-mode - zsh-autosuggestions - zsh-syntax-highlighting - fast-syntax-highlighting -) - -bindkey -M viins jj vi-cmd-mode -export VI_MODE_SET_CURSOR=true -# oh-my-zsh end - -# options -setopt HIST_IGNORE_ALL_DUPS -setopt HIST_FIND_NO_DUPS -setopt HIST_SAVE_NO_DUPS -setopt SHARE_HISTORY -setopt INC_APPEND_HISTORY -# options end - -# aliases -alias cls=clear -alias sl="exa --group-directories-first --icons --time-style=long-iso -la" -alias so=source -alias x=exit -alias G=git -alias t=tmux -alias lta="ls -ltar --human-readable | grep -vE '^\.| \.$| \.\.$'" -alias pip=pip3 -alias wt=". _wt" -alias ai="noglob opencode run --model \"opencode/gemini-3-flash\"" -alias open=xdg-open -# alises end - -# variables -export EDITOR=nvim -export MANPAGER='nvim +Man!' -export PATH=$PATH:/opt/homebrew/bin -export PATH=$PATH:$HOME/.cargo/bin -export PATH=$PATH:$HOME/.local/bin -export PATH=$PATH:$HOME/.local/share/fnm -export PATH=$PATH:$HOME/.local/custom/bin -export PATH=$PATH:$HOME/.local/share/bob/nvim-bin -export PATH=$PATH:$HOME/.duckdb/cli/latest -export PATH=$PATH:$HOME/.opencode/bin -export PATH=$PATH:$HOME/.lmstudio/bin -export PATH=$PATH:$HOME/go/bin - -if [[ -f "$HOME/.private.sh" ]]; then - source "$HOME/.private.sh" -fi -# variables end - -# starship -if [[ -x "$(command -v starship)" ]]; then - eval "$(starship init zsh)" -fi -# starship end - -# fnm -if [[ -x "$(command -v fnm)" ]]; then - eval "$(fnm env --use-on-cd --shell zsh)" -fi -# fnm end - -# uv -if [[ -x "$(command -v uv)" ]]; then - eval "$(uv generate-shell-completion zsh)" -fi - -if [[ -x "$(command -v uvx)" ]]; then - eval "$(uvx --generate-shell-completion zsh)" -fi -# uv end - -# direnv -if [[ -x "$(command -v direnv)" ]]; then - eval "$(direnv hook zsh)" -fi -# direnv end - -# bun -[ -s "$HOME/.bun/_bun" ] && source "$HOME/.bun/_bun" -export BUN_INSTALL="$HOME/.bun" -export PATH="$BUN_INSTALL/bin:$PATH" -# bun end - -source $ZSH/oh-my-zsh.sh -# The following lines have been added by Docker Desktop to enable Docker CLI completions. -fpath=(/Users/pjuguilon/.docker/completions $fpath) -autoload -Uz compinit -compinit -# End of Docker CLI completions - -# opencode -export PATH=/Users/pjuguilon/.opencode/bin:$PATH diff --git a/version b/version new file mode 100644 index 00000000..3eefcb9d --- /dev/null +++ b/version @@ -0,0 +1 @@ +1.0.0