[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nend_of_line = lf\ncharset = utf-8\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "content": "name: Bug\ndescription: Report a validated bug -- NOT FOR SUPPORT REQUESTS\nlabels: [bug]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Remember: Omarchy is an open source gift, not a product you bought from a vendor\n\n  - type: input\n    id: system-details\n    attributes:\n      label: System details\n      placeholder: e.g. AMD 9950X, NVIDIA 5090, Omarchy 2.1.0\n    validations:\n      required: true\n\n  - type: textarea\n    id: steps\n    attributes:\n      label: What's wrong?\n      description: Describe the issue, include steps to recreate it if possible, and attach the output of `omarchy-debug` if possible\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Suggestion\n    url: https://github.com/basecamp/omarchy/discussions/categories/suggestions\n    about: Suggest a new feature, change to existing feature, or other ideas in Discussions.\n  - name: Support\n    url: https://omarchy.org/discord\n    about: Need help? Join our Discord community for support with any issues. GitHub issues should be used for verified bugs only.\n"
  },
  {
    "path": "AGENTS.md",
    "content": "# Style\n\n- Two spaces for indentation, no tabs\n- Use bash 5 conditionals: use `[[ ]]` for string/file tests and `(( ))` for numeric tests\n- In `[[ ]]`, don't quote variables, but do quote string literals when comparing values (e.g., `[[ $branch == \"dev\" ]]`)\n- Prefer `(( ))` over numeric operators inside `[[ ]]` (e.g., `(( count < 50 ))`, not `[[ $count -lt 50 ]]`)\n- For strings/paths with spaces, quote them instead of escaping spaces with `\\ ` (e.g., `\"$APP_DIR/Disk Usage.desktop\"`, not `$APP_DIR/Disk\\ Usage.desktop`)\n- Shebangs must use `#!/bin/bash` consistently (never `#!/usr/bin/env bash`)\n\n# Command Naming\n\nAll commands start with `omarchy-`. Prefixes indicate purpose:\n\n- `cmd-` - check if commands exist, misc utility commands\n- `pkg-` - package management helpers\n- `hw-` - hardware detection (return exit codes for use in conditionals)\n- `refresh-` - copy default config to user's `~/.config/`\n- `restart-` - restart a component\n- `launch-` - open applications\n- `install-` - install optional software\n- `setup-` - interactive setup wizards\n- `toggle-` - toggle features on/off\n- `theme-` - theme management\n- `update-` - update components\n\n# Helper Commands\n\nUse these instead of raw shell commands:\n\n- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands\n- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages\n- `omarchy-pkg-add` - install packages (handles both pacman and AUR)\n- `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands)\n\n# Config Structure\n\n- `config/` - default configs copied to `~/.config/`\n- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors\n- `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15)\n\n# Refresh Pattern\n\nTo copy a default config to user config with automatic backup:\n\n```bash\nomarchy-refresh-config hypr/hyprlock.conf\n```\n\nThis copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hypr/hyprlock.conf`.\n\n# Migrations\n\nTo create a new migration, run `omarchy-dev-add-migration --no-edit`. This creates a migration file named after the unix timestamp of the last commit.\n\nMigration format:\n- No shebang line\n- Start with an `echo` describing what the migration does\n- Use `$OMARCHY_PATH` to reference the omarchy directory\n\nExample:\n```bash\necho \"Disable fingerprint in hyprlock if fingerprint auth is not configured\"\n\nif omarchy-cmd-missing fprintd-list || ! fprintd-list \"$USER\" 2>/dev/null | grep -q \"finger\"; then\n  sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf\nfi\n```\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) David Heinemeier Hansson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Omarchy\n\nOmarchy is a beautiful, modern & opinionated Linux distribution by DHH.\n\nRead more at [omarchy.org](https://omarchy.org).\n\n## License\n\nOmarchy is released under the [MIT License](https://opensource.org/licenses/MIT).\n"
  },
  {
    "path": "applications/Alacritty.desktop",
    "content": "[Desktop Entry]\nType=Application\nTryExec=alacritty\nExec=alacritty\nIcon=Alacritty\nTerminal=false\nCategories=System;TerminalEmulator;\nName=Alacritty\nGenericName=Terminal\nComment=A fast, cross-platform, OpenGL terminal emulator\nStartupNotify=true\nStartupWMClass=Alacritty\nActions=New;\nX-TerminalArgExec=-e\nX-TerminalArgAppId=--class=\nX-TerminalArgTitle=--title=\nX-TerminalArgDir=--working-directory=\n\n[Desktop Action New]\nName=New Terminal\nExec=alacritty\n"
  },
  {
    "path": "applications/hidden/avahi-discover.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/bssh.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/btop.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/bvnc.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/cmake-gui.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/cups.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/dropbox.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/electron34.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/electron36.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/electron37.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/fcitx5-configtool.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/fcitx5-wayland-launcher.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/java-java-openjdk.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/jconsole-java-openjdk.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/jshell-java-openjdk.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/kbd-layout-viewer5.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/kcm_fcitx5.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/kcm_kaccounts.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/kvantummanager.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/limine-snapper-restore.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/org.fcitx.Fcitx5.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/org.fcitx.fcitx5-config-qt.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/org.fcitx.fcitx5-migrator.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/org.fcitx.fcitx5-qt5-gui-wrapper.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/org.fcitx.fcitx5-qt6-gui-wrapper.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/qv4l2.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/qvidcap.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/uuctl.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/wiremix.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/xgps.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/hidden/xgpsspeed.desktop",
    "content": "[Desktop Entry]\nHidden=true\n"
  },
  {
    "path": "applications/imv.desktop",
    "content": "[Desktop Entry]\nName=Image Viewer\nExec=imv %F\nIcon=imv\nType=Application\nMimeType=image/png;image/jpeg;image/jpg;image/gif;image/bmp;image/webp;image/tiff;image/x-xcf;image/x-portable-pixmap;image/x-xbitmap;\nTerminal=false\nCategories=Graphics;Viewer;\n"
  },
  {
    "path": "applications/mpv.desktop",
    "content": "[Desktop Entry]\nType=Application\nName=Media Player\nName[ar]=مشغل وسائط mpv\nName[ca]=Reproductor multimèdia mpv\nName[cs]=mpv přehrávač\nName[da]=mpv-medieafspiller\nName[fr]=Lecteur multimédia mpv\nName[it]=Lettore multimediale mpv\nName[ja]=mpv メディアプレイヤー\nName[pl]=Odtwarzacz mpv\nName[ru]=Проигрыватель mpv\nName[tr]=mpv Ortam Oynatıcı\nName[zh_CN]=mpv 媒体播放器\nName[zh_TW]=mpv 媒體播放器\nGenericName=Multimedia player\nGenericName[ar]=مُشَغِّل وسائط متعددة\nGenericName[cs]=Multimediální přehrávač\nGenericName[da]=Multimedieafspiller\nGenericName[fr]=Lecteur multimédia\nGenericName[it]=Lettore multimediale\nGenericName[ja]=マルチメディアプレイヤー\nGenericName[ru]=Мультимедийный проигрыватель\nGenericName[tr]=Çoklu ortam oynatıcı\nGenericName[zh_CN]=多媒体播放器\nGenericName[zh_TW]=多媒體播放器\nComment=Play movies and songs\nComment[ar]=شَغِّل الأفلام والأغاني\nComment[ca]=Reproduïu vídeos i cançons\nComment[cs]=Přehrává filmy a hudbu\nComment[da]=Afspil film og sange\nComment[de]=Filme und Musik abspielen\nComment[es]=Reproduzca vídeos y canciones\nComment[fr]=Lire des vidéos et des musiques\nComment[ja]=映画や音楽を再生する\nComment[it]=Riproduci video e canzoni\nComment[pl]=Odtwarzaj filmy i muzykę\nComment[ru]=Воспроизведение фильмов и музыки\nComment[tr]=Filmleri ve şarkıları oynatın\nComment[zh_CN]=播放电影和歌曲\nComment[zh_TW]=播放電影和歌曲\nIcon=mpv\nTryExec=mpv\nExec=mpv --player-operation-mode=pseudo-gui -- %U\nTerminal=false\nCategories=AudioVideo;Audio;Video;Player;TV;\nMimeType=application/ogg;application/x-ogg;application/mxf;application/sdp;application/smil;application/x-smil;application/streamingmedia;application/x-streamingmedia;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/aac;audio/x-aac;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/aiff;audio/x-aiff;audio/m4a;audio/x-m4a;application/x-extension-m4a;audio/mp1;audio/x-mp1;audio/mp2;audio/x-mp2;audio/mp3;audio/x-mp3;audio/mpeg;audio/mpeg2;audio/mpeg3;audio/mpegurl;audio/x-mpegurl;audio/mpg;audio/x-mpg;audio/rn-mpeg;audio/musepack;audio/x-musepack;audio/ogg;audio/scpls;audio/x-scpls;audio/vnd.rn-realaudio;audio/wav;audio/x-pn-wav;audio/x-pn-windows-pcm;audio/x-realaudio;audio/x-pn-realaudio;audio/x-ms-wma;audio/x-pls;audio/x-wav;video/mpeg;video/x-mpeg2;video/x-mpeg3;video/mp4v-es;video/x-m4v;video/mp4;application/x-extension-mp4;video/divx;video/vnd.divx;video/msvideo;video/x-msvideo;video/ogg;video/quicktime;video/vnd.rn-realvideo;video/x-ms-afs;video/x-ms-asf;audio/x-ms-asf;application/vnd.ms-asf;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvxvideo;video/x-avi;video/avi;video/x-flic;video/fli;video/x-flc;video/flv;video/x-flv;video/x-theora;video/x-theora+ogg;video/x-matroska;video/mkv;audio/x-matroska;application/x-matroska;video/webm;audio/webm;audio/vorbis;audio/x-vorbis;audio/x-vorbis+ogg;video/x-ogm;video/x-ogm+ogg;application/x-ogm;application/x-ogm-audio;application/x-ogm-video;application/x-shorten;audio/x-shorten;audio/x-ape;audio/x-wavpack;audio/x-tta;audio/AMR;audio/ac3;audio/eac3;audio/amr-wb;video/mp2t;audio/flac;audio/mp4;application/x-mpegurl;video/vnd.mpegurl;application/vnd.apple.mpegurl;audio/x-pn-au;video/3gp;video/3gpp;video/3gpp2;audio/3gpp;audio/3gpp2;video/dv;audio/dv;audio/opus;audio/vnd.dts;audio/vnd.dts.hd;audio/x-adpcm;application/x-cue;audio/m3u;audio/vnd.wave;video/vnd.avi;\nX-KDE-Protocols=appending,file,ftp,hls,http,https,mms,mpv,rtmp,rtmps,rtmpt,rtmpts,rtp,rtsp,rtsps,sftp,srt,srtp,webdav,webdavs\nStartupWMClass=mpv\nKeywords=mpv;media;player;video;audio;tv;\nKeywords[ar]=mpv;إم بي في;ام بي في;وسائط;مشغل;فيديو;مرئية;صوتي;تلفاز;\n"
  },
  {
    "path": "applications/typora.desktop",
    "content": "[Desktop Entry]\nName=Typora\nGenericName=Markdown Editor\nExec=typora --enable-wayland-ime %U\nIcon=typora\nType=Application\nStartupNotify=true\nCategories=Office;WordProcessor;\nMimeType=text/markdown;text/x-markdown;\n\n"
  },
  {
    "path": "bin/omarchy-battery-capacity",
    "content": "#!/bin/bash\n\n# Returns the battery full capacity in Wh (rounded to whole number).\n# Used by omarchy-battery-status for displaying battery capacity.\n\nbattery_info=$(upower -i $(upower -e | grep BAT))\n\necho \"$battery_info\" | awk '/energy-full:/ {\n    printf \"%d\", $2\n    exit\n}'\n"
  },
  {
    "path": "bin/omarchy-battery-monitor",
    "content": "#!/bin/bash\n\n# Designed to be run by systemd timer every 30 seconds and alerts if battery is low\n\nBATTERY_THRESHOLD=10\nNOTIFICATION_FLAG=\"/run/user/$UID/omarchy_battery_notified\"\nBATTERY_LEVEL=$(omarchy-battery-remaining)\nBATTERY_STATE=$(upower -i $(upower -e | grep 'BAT') | grep -E \"state\" | awk '{print $2}')\n\nsend_notification() {\n  notify-send -u critical \"󱐋 Time to recharge!\" \"Battery is down to ${1}%\" -i battery-caution -t 30000\n  omarchy-hook battery-low \"$1\"\n}\n\nif [[ -n $BATTERY_LEVEL && $BATTERY_LEVEL =~ ^[0-9]+$ ]]; then\n  if [[ $BATTERY_STATE == \"discharging\" ]] && (( BATTERY_LEVEL <= BATTERY_THRESHOLD )); then\n    if [[ ! -f $NOTIFICATION_FLAG ]]; then\n      send_notification $BATTERY_LEVEL\n      touch $NOTIFICATION_FLAG\n    fi\n  else\n    rm -f $NOTIFICATION_FLAG\n  fi\nfi\n"
  },
  {
    "path": "bin/omarchy-battery-present",
    "content": "#!/bin/bash\n\n# Returns true if a battery is present on the system.\n# Used by the battery monitor and other battery-related checks.\n\nfor bat in /sys/class/power_supply/BAT*; do\n  [[ -r $bat/present ]] &&\n  [[ $(cat $bat/present) == \"1\" ]] &&\n  [[ $(cat $bat/type) == \"Battery\" ]] &&\n  exit 0\ndone\n\nexit 1\n"
  },
  {
    "path": "bin/omarchy-battery-remaining",
    "content": "#!/bin/bash\n\n# Returns the battery percentage remaining as an integer.\n# Used by the battery monitor and the Ctrl + Shift + Super + B hotkey.\n\nupower -i $(upower -e | grep BAT) | awk '/percentage/ { \n    print int($2)\n    exit\n}'\n"
  },
  {
    "path": "bin/omarchy-battery-remaining-time",
    "content": "#!/bin/bash\n\n# Returns the battery time remaining (to empty or full) in a compact format.\n\nbattery_info=$(upower -i $(upower -e | grep BAT))\n\necho \"$battery_info\" | awk '/time to (empty|full)/ {\n    value = $4\n    unit = $5\n    if (unit == \"minutes\") {\n        hours = int(value / 60)\n        minutes = int(value % 60)\n    } else {\n        hours = int(value)\n        minutes = int((value - hours) * 60)\n    }\n    if (hours > 0 && minutes > 0) {\n        printf \"%dh %dm\", hours, minutes\n    } else if (hours > 0) {\n        printf \"%dh\", hours\n    } else {\n        printf \"%dm\", minutes\n    }\n    exit\n}'\n"
  },
  {
    "path": "bin/omarchy-battery-status",
    "content": "#!/bin/bash\n\n# Returns a formatted battery status string with percentage and power draw/charge.\n# Used by the battery notification hotkey (Ctrl + Shift + Super + B).\n\nbattery_info=$(upower -i $(upower -e | grep BAT))\n\npercentage=$(echo \"$battery_info\" | awk '/percentage/ {\n    print int($2)\n    exit\n}')\n\npower_rate=$(echo \"$battery_info\" | awk '/energy-rate/ {\n    rounded = sprintf(\"%.1f\", $2)\n    sub(/\\.0$/, \"\", rounded)\n    print rounded\n    exit\n}')\n\nstate=$(echo \"$battery_info\" | awk '/state/ { print $2; exit }')\ntime_remaining=$(omarchy-battery-remaining-time)\ncapacity=$(omarchy-battery-capacity)\n\nif [[ $state == \"charging\" ]]; then\n    echo \"󰁹    Battery ${percentage}%  ·  ${time_remaining} to full  ·   ${power_rate}W / ${capacity}Wh\"\nelse\n    echo \"󰁹    Battery ${percentage}%  ·  ${time_remaining} left  ·   ${power_rate}W / ${capacity}Wh\"\nfi\n"
  },
  {
    "path": "bin/omarchy-branch-set",
    "content": "#!/bin/bash\n\n# Set the branch for Omarchy's git repository.\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-branch-set [master|rc|dev]\"\n  exit 1\nelse\n  branch=\"$1\"\nfi\n\nif [[ $branch != \"master\" && $branch != \"rc\" && $branch != \"dev\" ]]; then\n  echo \"Error: Invalid branch '$branch'. Must be one of: master, rc, dev\"\n  exit 1\nfi\n\ngit -C $OMARCHY_PATH switch $branch\n"
  },
  {
    "path": "bin/omarchy-brightness-display",
    "content": "#!/bin/bash\n\n# Adjust brightness on the most likely display device.\n# Usage: omarchy-brightness-display <step>\n\nstep=\"${1:-+5%}\"\n\n# Start with the first possible output, then refine to the most likely given an order heuristic.\ndevice=\"$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)\"\nfor candidate in amdgpu_bl* intel_backlight acpi_video*; do\n  if [[ -e /sys/class/backlight/$candidate ]]; then\n    device=\"$candidate\"\n    break\n  fi\ndone\n\n# Set the actual brightness of the display device.\nbrightnessctl -d \"$device\" set \"$step\" >/dev/null\n\n# Use SwayOSD to display the new brightness setting.\nomarchy-swayosd-brightness \"$(brightnessctl -d \"$device\" -m | cut -d',' -f4 | tr -d '%')\"\n"
  },
  {
    "path": "bin/omarchy-brightness-display-apple",
    "content": "#!/bin/bash\n\n# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.\n\nif (( $# == 0 )); then\n  echo \"Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)\"\nelse\n  device=\"$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)\"\n  sudo asdcontrol \"$device\" -- \"$1\" >/dev/null\n  value=\"$(sudo asdcontrol \"$device\" | awk -F= '/BRIGHTNESS=/{print $2+0}')\"\n  omarchy-swayosd-brightness \"$(( value * 100 / 60000 ))\"\nfi\n"
  },
  {
    "path": "bin/omarchy-brightness-keyboard",
    "content": "#!/bin/bash\n\n# Adjust keyboard backlight brightness using available steps.\n# Usage: omarchy-brightness-keyboard <up|down|cycle>\n\ndirection=\"${1:-up}\"\n\n# Find keyboard backlight device (look for *kbd_backlight* pattern in leds class).\ndevice=\"\"\nfor candidate in /sys/class/leds/*kbd_backlight*; do\n  if [[ -e $candidate ]]; then\n    device=\"$(basename \"$candidate\")\"\n    break\n  fi\ndone\n\nif [[ -z $device ]]; then\n  echo \"No keyboard backlight device found\" >&2\n  exit 1\nfi\n\n# Get current and max brightness to determine step size.\nmax_brightness=\"$(brightnessctl -d \"$device\" max)\"\ncurrent_brightness=\"$(brightnessctl -d \"$device\" get)\"\n\n# Calculate step as one unit (keyboards typically have discrete levels like 0-3).\nif [[ $direction == \"cycle\" ]]; then\n  new_brightness=$(( (current_brightness + 1) % (max_brightness + 1) ))\nelif [[ $direction == \"up\" ]]; then\n  new_brightness=$((current_brightness + 1))\n  (( new_brightness > max_brightness )) && new_brightness=$max_brightness\nelse\n  new_brightness=$((current_brightness - 1))\n  (( new_brightness < 0 )) && new_brightness=0\nfi\n\n# Set the new brightness.\nbrightnessctl -d \"$device\" set \"$new_brightness\" >/dev/null\n\n# Use SwayOSD to display the new brightness setting.\npercent=$((new_brightness * 100 / max_brightness))\nomarchy-swayosd-kbd-brightness \"$percent\"\n"
  },
  {
    "path": "bin/omarchy-channel-set",
    "content": "#!/bin/bash\n\n# Set the Omarchy channel, which dictates what git branch and package repository is used.\n#\n# Stable uses the master branch, which only sees updates on official releases, and\n# the stable package repository, which typically lags the edge by a month to ensure\n# better compatibility.\n#\n# Edge tracks the latest package repository, but still relies on the master branch,\n# so new packages which require config changes may cause conflicts or errors.\n#\n# Dev tracks the active development dev branch, which may include partial or broken updates,\n# as well as the latest package repository. This should only be used by Omarchy developers\n# and people with a lot of experience managing Linux systems.\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-channel-set [stable|rc|edge|dev]\"\n  exit 1\nelse\n  channel=\"$1\"\nfi\n\ncase \"$channel\" in\n\"stable\") omarchy-branch-set \"master\" && omarchy-refresh-pacman \"stable\" ;;\n\"rc\") omarchy-branch-set \"rc\" && omarchy-refresh-pacman \"rc\" ;;\n\"edge\") omarchy-branch-set \"master\" && omarchy-refresh-pacman \"edge\" ;;\n\"dev\") omarchy-branch-set \"dev\" && omarchy-refresh-pacman \"edge\" ;;\n*) echo \"Unknown channel: $channel\"; exit 1; ;;\nesac\n\nomarchy-update -y\n"
  },
  {
    "path": "bin/omarchy-cmd-audio-switch",
    "content": "#!/bin/bash\n\n# Switch between audio outputs while preserving the mute status. By default mapped to Super + Mute.\n\nfocused_monitor=\"$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')\"\n\nsinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != \"not available\"] | any))]')\nsinks_count=$(echo \"$sinks\" | jq '. | length')\n\nif (( sinks_count == 0 )); then\n  swayosd-client \\\n    --monitor \"$focused_monitor\" \\\n    --custom-message \"No audio devices found\"\n  exit 1\nfi\n\ncurrent_sink_name=$(pactl get-default-sink)\ncurrent_sink_index=$(echo \"$sinks\" | jq -r --arg name \"$current_sink_name\" 'map(.name) | index($name)')\n\nif [[ $current_sink_index != \"null\" ]]; then\n  next_sink_index=$(((current_sink_index + 1) % sinks_count))\nelse\n  next_sink_index=0\nfi\n\nnext_sink=$(echo \"$sinks\" | jq -r \".[$next_sink_index]\")\nnext_sink_name=$(echo \"$next_sink\" | jq -r '.name')\n\nnext_sink_description=$(echo \"$next_sink\" | jq -r '.description')\nif [[ $next_sink_description == \"(null)\" ]] || [[ $next_sink_description == \"null\" ]] || [[ -z $next_sink_description ]]; then\n  # For Bluetooth devices, the friendly name is on the Device entry (device.id), not the Sink entry (object.id)\n  device_id=$(echo \"$next_sink\" | jq -r '.properties.\"device.id\"')\n  if [[ $device_id != \"null\" ]] && [[ -n $device_id ]]; then\n    next_sink_description=$(wpctl status | grep -E \"^\\s*│?\\s+${device_id}\\.\" | sed -E 's/^.*[0-9]+\\.\\s+//' | sed -E 's/\\s+\\[.*$//')\n  fi\n  # Fall back to object.id lookup if device.id didn't yield a result\n  if [[ -z $next_sink_description ]]; then\n    sink_id=$(echo \"$next_sink\" | jq -r '.properties.\"object.id\"')\n    next_sink_description=$(wpctl status | grep -E \"\\s+\\*?\\s+${sink_id}\\.\" | sed -E 's/^.*[0-9]+\\.\\s+//' | sed -E 's/\\s+\\[.*$//')\n  fi\nfi\n\nnext_sink_volume=$(echo \"$next_sink\" | jq -r \\\n  '.volume | to_entries[0].value.value_percent | sub(\"%\"; \"\")')\nnext_sink_is_muted=$(echo \"$next_sink\" | jq -r '.mute')\n\nif [[ $next_sink_is_muted = \"true\" ]] || (( next_sink_volume == 0 )); then\n  icon_state=\"muted\"\nelif (( next_sink_volume <= 33 )); then\n  icon_state=\"low\"\nelif (( next_sink_volume <= 66 )); then\n  icon_state=\"medium\"\nelse\n  icon_state=\"high\"\nfi\n\nnext_sink_volume_icon=\"sink-volume-${icon_state}-symbolic\"\n\nif [[ $next_sink_name != $current_sink_name ]]; then\n  pactl set-default-sink \"$next_sink_name\"\nfi\n\nswayosd-client \\\n  --monitor \"$focused_monitor\" \\\n  --custom-message \"$next_sink_description\" \\\n  --custom-icon \"$next_sink_volume_icon\"\n"
  },
  {
    "path": "bin/omarchy-cmd-first-run",
    "content": "#!/bin/bash\n\n# Finish the installation of Omarchy with items that can only be done after logging in.\n\nset -e\n\nFIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode\n\nif [[ -f $FIRST_RUN_MODE ]]; then\n  rm -f \"$FIRST_RUN_MODE\"\n\n  bash \"$OMARCHY_PATH/install/first-run/battery-monitor.sh\"\n  bash \"$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh\"\n  bash \"$OMARCHY_PATH/install/first-run/firewall.sh\"\n  bash \"$OMARCHY_PATH/install/first-run/dns-resolver.sh\"\n  bash \"$OMARCHY_PATH/install/first-run/gnome-theme.sh\"\n  bash \"$OMARCHY_PATH/install/first-run/elephant.sh\"\n  sudo rm -f /etc/sudoers.d/first-run\n\n  bash \"$OMARCHY_PATH/install/first-run/welcome.sh\"\n  bash \"$OMARCHY_PATH/install/first-run/wifi.sh\"\nfi\n"
  },
  {
    "path": "bin/omarchy-cmd-missing",
    "content": "#!/bin/bash\n\n# Returns true if any of the commands passed in as arguments are missing on the system.\n\nfor cmd in \"$@\"; do\n  if ! command -v \"$cmd\" &>/dev/null; then\n    exit 0\n  fi\ndone\n\nexit 1\n"
  },
  {
    "path": "bin/omarchy-cmd-present",
    "content": "#!/bin/bash\n\n# Returns true if all the commands passed in as arguments exit on the system.\n\nfor cmd in \"$@\"; do\n  command -v \"$cmd\" &>/dev/null || exit 1\ndone\n\nexit 0\n"
  },
  {
    "path": "bin/omarchy-cmd-screenrecord",
    "content": "#!/bin/bash\n\n# Start and stop a screenrecording, which will be saved to ~/Videos by default.\n# Alternative location can be set via OMARCHY_SCREENRECORD_DIR or XDG_VIDEOS_DIR ENVs.\n# Resolution is capped to 4K for monitors above 4K, native otherwise.\n# Override via --resolution= (e.g. --resolution=1920x1080, --resolution=0x0 for native).\n\n[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs\nOUTPUT_DIR=\"${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}\"\n\nif [[ ! -d $OUTPUT_DIR ]]; then\n  notify-send \"Screen recording directory does not exist: $OUTPUT_DIR\" -u critical -t 3000\n  exit 1\nfi\n\nDESKTOP_AUDIO=\"false\"\nMICROPHONE_AUDIO=\"false\"\nWEBCAM=\"false\"\nWEBCAM_DEVICE=\"\"\nRESOLUTION=\"\"\nSTOP_RECORDING=\"false\"\nRECORDING_FILE=\"/tmp/omarchy-screenrecord-filename\"\n\nfor arg in \"$@\"; do\n  case \"$arg\" in\n  --with-desktop-audio) DESKTOP_AUDIO=\"true\" ;;\n  --with-microphone-audio) MICROPHONE_AUDIO=\"true\" ;;\n  --with-webcam) WEBCAM=\"true\" ;;\n  --webcam-device=*) WEBCAM_DEVICE=\"${arg#*=}\" ;;\n  --resolution=*) RESOLUTION=\"${arg#*=}\" ;;\n  --stop-recording) STOP_RECORDING=\"true\" ;;\n  esac\ndone\n\nstart_webcam_overlay() {\n  cleanup_webcam\n\n  # Auto-detect first available webcam if none specified\n  if [[ -z $WEBCAM_DEVICE ]]; then\n    WEBCAM_DEVICE=$(v4l2-ctl --list-devices 2>/dev/null | grep -m1 \"^[[:space:]]*/dev/video\" | tr -d '\\t')\n    if [[ -z $WEBCAM_DEVICE ]]; then\n      notify-send \"No webcam devices found\" -u critical -t 3000\n      return 1\n    fi\n  fi\n\n  # Get monitor scale\n  local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')\n\n  # Target width (base 360px, scaled to monitor)\n  local target_width=$(awk \"BEGIN {printf \\\"%.0f\\\", 360 * $scale}\")\n\n  # Try preferred 16:9 resolutions in order, use first available\n  local preferred_resolutions=(\"640x360\" \"1280x720\" \"1920x1080\")\n  local video_size_arg=\"\"\n  local available_formats=$(v4l2-ctl --list-formats-ext -d \"$WEBCAM_DEVICE\" 2>/dev/null)\n\n  for resolution in \"${preferred_resolutions[@]}\"; do\n    if echo \"$available_formats\" | grep -q \"$resolution\"; then\n      video_size_arg=\"-video_size $resolution\"\n      break\n    fi\n  done\n\n  ffplay -f v4l2 $video_size_arg -framerate 30 \"$WEBCAM_DEVICE\" \\\n    -vf \"crop=iw/2:ih,scale=${target_width}:-1\" \\\n    -window_title \"WebcamOverlay\" \\\n    -noborder \\\n    -fflags nobuffer -flags low_delay \\\n    -probesize 32 -analyzeduration 0 \\\n    -loglevel quiet &\n  sleep 1\n}\n\ncleanup_webcam() {\n  pkill -f \"WebcamOverlay\" 2>/dev/null\n}\n\ndefault_resolution() {\n  local width height\n  read -r width height < <(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | \"\\(.width) \\(.height)\"')\n  if ((width > 3840 || height > 2160)); then\n    echo \"3840x2160\"\n  else\n    echo \"0x0\"\n  fi\n}\n\nstart_screenrecording() {\n  local filename=\"$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4\"\n  local audio_devices=\"\"\n  local audio_args=()\n\n  [[ $DESKTOP_AUDIO == \"true\" ]] && audio_devices+=\"default_output\"\n\n  if [[ $MICROPHONE_AUDIO == \"true\" ]]; then\n    # Merge audio tracks into one - separate tracks only play one at a time in most players\n    [[ -n $audio_devices ]] && audio_devices+=\"|\"\n    audio_devices+=\"default_input\"\n  fi\n\n  [[ -n $audio_devices ]] && audio_args+=(-a \"$audio_devices\" -ac aac)\n\n  local resolution=\"${RESOLUTION:-$(default_resolution)}\"\n\n  gpu-screen-recorder -w portal -k auto -s \"$resolution\" -f 60 -fm cfr -fallback-cpu-encoding yes -o \"$filename\" \"${audio_args[@]}\" &\n  local pid=$!\n\n  # Wait for recording to actually start (file appears after portal selection)\n  while kill -0 $pid 2>/dev/null && [[ ! -f $filename ]]; do\n    sleep 0.2\n  done\n\n  if kill -0 $pid 2>/dev/null; then\n    echo \"$filename\" >\"$RECORDING_FILE\"\n    toggle_screenrecording_indicator\n  fi\n}\n\nstop_screenrecording() {\n  pkill -SIGINT -f \"^gpu-screen-recorder\" # SIGINT required to save video properly\n\n  # Wait a maximum of 5 seconds to finish before hard killing\n  local count=0\n  while pgrep -f \"^gpu-screen-recorder\" >/dev/null && ((count < 50)); do\n    sleep 0.1\n    count=$((count + 1))\n  done\n\n  toggle_screenrecording_indicator\n  cleanup_webcam\n\n  if pgrep -f \"^gpu-screen-recorder\" >/dev/null; then\n    pkill -9 -f \"^gpu-screen-recorder\"\n    notify-send \"Screen recording error\" \"Recording process had to be force-killed. Video may be corrupted.\" -u critical -t 5000\n  else\n    trim_first_frame\n    local filename=$(cat \"$RECORDING_FILE\" 2>/dev/null)\n    local preview=\"${filename%.mp4}-preview.png\"\n\n    # Generate a preview thumbnail from the first frame\n    ffmpeg -y -i \"$filename\" -ss 00:00:00.1 -vframes 1 -q:v 2 \"$preview\" -loglevel quiet 2>/dev/null\n\n    (\n      ACTION=$(notify-send \"Screen recording saved\" \"Open with Super + Alt + , (or click this)\" -t 10000 -i \"${preview:-$filename}\" -A \"default=open\")\n      [[ $ACTION == \"default\" ]] && mpv \"$filename\"\n      rm -f \"$preview\"\n    ) &\n  fi\n\n  rm -f \"$RECORDING_FILE\"\n}\n\ntoggle_screenrecording_indicator() {\n  pkill -RTMIN+8 waybar\n}\n\nscreenrecording_active() {\n  pgrep -f \"^gpu-screen-recorder\" >/dev/null\n}\n\ntrim_first_frame() {\n  local latest\n  latest=$(cat \"$RECORDING_FILE\" 2>/dev/null)\n\n  if [[ -n $latest && -f $latest ]]; then\n    local trimmed=\"${latest%.mp4}-trimmed.mp4\"\n    if ffmpeg -y -ss 0.1 -i \"$latest\" -c copy \"$trimmed\" -loglevel quiet 2>/dev/null; then\n      mv \"$trimmed\" \"$latest\"\n    else\n      rm -f \"$trimmed\"\n    fi\n  fi\n}\n\nif screenrecording_active; then\n  stop_screenrecording\nelif [[ $STOP_RECORDING == \"true\" ]]; then\n  exit 1\nelse\n  [[ $WEBCAM == \"true\" ]] && start_webcam_overlay\n\n  start_screenrecording || cleanup_webcam\nfi\n"
  },
  {
    "path": "bin/omarchy-cmd-screensaver",
    "content": "#!/bin/bash\n\n# Run the Omarchy screensaver using random effects from TTE.\n\nscreensaver_in_focus() {\n  hyprctl activewindow -j | jq -e '.class == \"org.omarchy.screensaver\"' >/dev/null 2>&1\n}\n\nexit_screensaver() {\n  hyprctl keyword cursor:invisible false &>/dev/null || true\n  pkill -x tte 2>/dev/null\n  pkill -f org.omarchy.screensaver 2>/dev/null\n  exit 0\n}\n\n# Exit the screensaver on signals and input from keyboard and mouse\ntrap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT\n\nprintf '\\033]11;rgb:00/00/00\\007'  # Set background color to black\n\nhyprctl keyword cursor:invisible true &>/dev/null\n\ntty=$(tty 2>/dev/null)\n\nwhile true; do\n  tte -i ~/.config/omarchy/branding/screensaver.txt \\\n    --frame-rate 120 --canvas-width 0 --canvas-height 0 --reuse-canvas --anchor-canvas c --anchor-text c\\\n    --random-effect --exclude-effects dev_worm \\\n    --no-eol --no-restore-cursor &\n\n  while pgrep -t \"${tty#/dev/}\" -x tte >/dev/null; do\n    if read -n1 -t 1 || ! screensaver_in_focus; then\n      exit_screensaver\n    fi\n  done\ndone\n"
  },
  {
    "path": "bin/omarchy-cmd-screenshot",
    "content": "#!/bin/bash\n\n# Take a screenshot of the whole screen, a specific window, or a user-drawn region.\n# Saves to ~/Pictures by default, but that can be changed via OMARCHY_SCREENSHOT_DIR or XDG_PICTURES_DIR ENVs.\n# Editor defaults to Satty but can be changed via --editor=<name> or OMARCHY_SCREENSHOT_EDITOR env\n\n[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs\nOUTPUT_DIR=\"${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}\"\n\nif [[ ! -d $OUTPUT_DIR ]]; then\n  notify-send \"Screenshot directory does not exist: $OUTPUT_DIR\" -u critical -t 3000\n  exit 1\nfi\n\npkill slurp && exit 0\n\nSCREENSHOT_EDITOR=\"${OMARCHY_SCREENSHOT_EDITOR:-satty}\"\n\n# Parse --editor flag from any position\nARGS=()\nfor arg in \"$@\"; do\n  if [[ $arg == --editor=* ]]; then\n    SCREENSHOT_EDITOR=\"${arg#--editor=}\"\n  else\n    ARGS+=(\"$arg\")\n  fi\ndone\nset -- \"${ARGS[@]}\"\n\nopen_editor() {\n  local filepath=\"$1\"\n  if [[ $SCREENSHOT_EDITOR == \"satty\" ]]; then\n    satty --filename \"$filepath\" \\\n      --output-filename \"$filepath\" \\\n      --actions-on-enter save-to-clipboard \\\n      --save-after-copy \\\n      --copy-command 'wl-copy'\n  else\n    $SCREENSHOT_EDITOR \"$filepath\"\n  fi\n}\n\nMODE=\"${1:-smart}\"\nPROCESSING=\"${2:-slurp}\"\n\n# accounting for portrait/transformed displays\nJQ_MONITOR_GEO='\n  def format_geo:\n    .x as $x | .y as $y |\n    (.width / .scale | floor) as $w |\n    (.height / .scale | floor) as $h |\n    .transform as $t |\n    if $t == 1 or $t == 3 then\n      \"\\($x),\\($y) \\($h)x\\($w)\"\n    else\n      \"\\($x),\\($y) \\($w)x\\($h)\"\n    end;\n'\n\nget_rectangles() {\n  local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')\n  hyprctl monitors -j | jq -r --arg ws \"$active_workspace\" \"${JQ_MONITOR_GEO} .[] | select(.activeWorkspace.id == (\\$ws | tonumber)) | format_geo\"\n  hyprctl clients -j | jq -r --arg ws \"$active_workspace\" '.[] | select(.workspace.id == ($ws | tonumber)) | \"\\(.at[0]),\\(.at[1]) \\(.size[0])x\\(.size[1])\"'\n}\n\n# Select based on mode\ncase \"$MODE\" in\nregion)\n  hyprpicker -r -z >/dev/null 2>&1 &\n  PID=$!\n  sleep .1\n  SELECTION=$(slurp 2>/dev/null)\n  kill $PID 2>/dev/null\n  ;;\nwindows)\n  hyprpicker -r -z >/dev/null 2>&1 &\n  PID=$!\n  sleep .1\n  SELECTION=$(get_rectangles | slurp -r 2>/dev/null)\n  kill $PID 2>/dev/null\n  ;;\nfullscreen)\n  SELECTION=$(hyprctl monitors -j | jq -r \"${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo\")\n  ;;\nsmart | *)\n  RECTS=$(get_rectangles)\n  hyprpicker -r -z >/dev/null 2>&1 &\n  PID=$!\n  sleep .1\n  SELECTION=$(echo \"$RECTS\" | slurp 2>/dev/null)\n  kill $PID 2>/dev/null\n\n  # If the selection area is L * W < 20, we'll assume you were trying to select whichever\n  # window or output it was inside of to prevent accidental 2px snapshots\n  if [[ $SELECTION =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then\n    if ((${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20)); then\n      click_x=\"${BASH_REMATCH[1]}\"\n      click_y=\"${BASH_REMATCH[2]}\"\n\n      while IFS= read -r rect; do\n        if [[ $rect =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then\n          rect_x=\"${BASH_REMATCH[1]}\"\n          rect_y=\"${BASH_REMATCH[2]}\"\n          rect_width=\"${BASH_REMATCH[3]}\"\n          rect_height=\"${BASH_REMATCH[4]}\"\n\n          if ((click_x >= rect_x && click_x < rect_x + rect_width && click_y >= rect_y && click_y < rect_y + rect_height)); then\n            SELECTION=\"${rect_x},${rect_y} ${rect_width}x${rect_height}\"\n            break\n          fi\n        fi\n      done <<<\"$RECTS\"\n    fi\n  fi\n  ;;\nesac\n\n[[ -z $SELECTION ]] && exit 0\n\nFILENAME=\"screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png\"\nFILEPATH=\"$OUTPUT_DIR/$FILENAME\"\n\nif [[ $PROCESSING == \"slurp\" ]]; then\n  grim -g \"$SELECTION\" \"$FILEPATH\" || exit 1\n  wl-copy <\"$FILEPATH\"\n\n  (\n    ACTION=$(notify-send \"Screenshot saved to clipboard and file\" \"Edit with Super + Alt + , (or click this)\" -t 10000 -i \"$FILEPATH\" -A \"default=edit\")\n    [[ $ACTION == \"default\" ]] && open_editor \"$FILEPATH\"\n  ) &\nelse\n  grim -g \"$SELECTION\" - | wl-copy\nfi\n"
  },
  {
    "path": "bin/omarchy-cmd-share",
    "content": "#!/bin/bash\n\n# Share clipboard, file, or folder using LocalSend. Bound to Super + Ctrl + S by default.\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-cmd-share [clipboard|file|folder]\"\n  exit 1\nfi\n\nMODE=\"$1\"\nshift\n\nif [[ $MODE == \"clipboard\" ]]; then\n  TEMP_FILE=$(mktemp --suffix=.txt)\n  wl-paste >\"$TEMP_FILE\"\n  FILES=\"$TEMP_FILE\"\nelse\n  if (($# > 0)); then\n    FILES=\"$*\"\n  else\n    if [[ $MODE == \"folder\" ]]; then\n      # Pick a single folder from home directory\n      FILES=$(find \"$HOME\" -type d 2>/dev/null | fzf)\n    else\n      # Pick one or more files from home directory\n      FILES=$(find \"$HOME\" -type f 2>/dev/null | fzf --multi)\n    fi\n    [[ -z $FILES ]] && exit 0\n  fi\nfi\n\n# Run LocalSend in its own systemd service (detached from terminal)\n# Convert newline-separated files to space-separated arguments\nif [[ $MODE != \"clipboard\" ]] && echo \"$FILES\" | grep -q $'\\n'; then\n  # Multiple files selected - convert newlines to array\n  readarray -t FILE_ARRAY <<<\"$FILES\"\n  systemd-run --user --quiet --collect localsend --headless send \"${FILE_ARRAY[@]}\"\nelse\n  # Single file or clipboard mode\n  systemd-run --user --quiet --collect localsend --headless send \"$FILES\"\nfi\n\n# Note: Temporary file will remain until system cleanup for clipboard mode\n# This ensures the file content is available for the LocalSend GUI\n\nexit 0\n"
  },
  {
    "path": "bin/omarchy-cmd-terminal-cwd",
    "content": "#!/bin/bash\n\n# Returns the current working directory of the active terminal window,\n# so a new terminal window can be started in the same directory.\n\n# Go from current active terminal to its child shell process and run cwd there\nterminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')\nshell_pid=$(pgrep -P \"$terminal_pid\" | tail -n1)\n\nif [[ -n $shell_pid ]]; then\n  cwd=$(readlink -f \"/proc/$shell_pid/cwd\" 2>/dev/null)\n  shell=$(readlink -f \"/proc/$shell_pid/exe\" 2>/dev/null)\n\n  # Check if $shell is a valid shell and $cwd is a directory.\n  if grep -qs \"$shell\" /etc/shells && [[ -d $cwd ]]; then\n    echo \"$cwd\"\n  else\n    echo \"$HOME\"\n  fi\nelse\n  echo \"$HOME\"\nfi\n"
  },
  {
    "path": "bin/omarchy-config-direct-boot",
    "content": "#!/bin/bash\n\n# Add an EFI boot entry for the Omarchy UKI, allowing the system to boot directly\n# without a bootloader like Limine. Requires UEFI firmware and a built UKI.\n\nif [[ ! -d /sys/firmware/efi ]]; then\n  echo \"Error: System is not booted in UEFI mode\" >&2\n  exit 1\nfi\n\nif ! efibootmgr &>/dev/null; then\n  echo \"Error: efibootmgr is not available or not functional\" >&2\n  exit 1\nfi\n\nif cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi \"American Megatrends\"; then\n  echo \"Error: American Megatrends firmware may not safely support custom EFI entries\" >&2\n  exit 1\nfi\n\nif cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi \"Apple\"; then\n  echo \"Error: Apple firmware uses its own boot manager\" >&2\n  exit 1\nfi\n\nuki_file=$(find /boot/EFI/Linux/ -name \"omarchy*.efi\" -printf \"%f\\n\" 2>/dev/null | head -1)\n\nif [[ -z $uki_file ]]; then\n  echo \"Error: No Omarchy UKI found in /boot/EFI/Linux/\" >&2\n  exit 1\nfi\n\nboot_source=$(findmnt -n -o SOURCE /boot)\ndisk=$(echo \"$boot_source\" | sed 's/p\\?[0-9]*$//')\npart=$(echo \"$boot_source\" | grep -o 'p\\?[0-9]*$' | sed 's/^p//')\n\nif gum confirm \"Setup direct boot (so snapshot booting must be done via bios)?\"; then\n  echo \"Creating EFI boot entry for $uki_file\"\n\n  sudo efibootmgr --create \\\n    --disk \"$disk\" \\\n    --part \"$part\" \\\n    --label \"Omarchy\" \\\n    --loader \"\\\\EFI\\\\Linux\\\\$uki_file\"\nfi\n"
  },
  {
    "path": "bin/omarchy-debug",
    "content": "#!/bin/bash\n\n# Return exhaustive debugging information about the system to help diagnose problems.\n\nNO_SUDO=false\nPRINT_ONLY=false\n\nwhile (( $# > 0 )); do\n  case \"$1\" in\n    --no-sudo)\n      NO_SUDO=true\n      shift\n      ;;\n    --print)\n      PRINT_ONLY=true\n      shift\n      ;;\n    *)\n      echo \"Unknown option: $1\"\n      echo \"Usage: omarchy-debug [--no-sudo] [--print]\"\n      exit 1\n      ;;\n  esac\ndone\n\nLOG_FILE=\"/tmp/omarchy-debug.log\"\n\nif [[ $NO_SUDO = \"true\" ]]; then\n  DMESG_OUTPUT=\"(skipped - --no-sudo flag used)\"\nelse\n  DMESG_OUTPUT=\"$(sudo dmesg)\"\nfi\n\ncat > \"$LOG_FILE\" <<EOF\nDate: $(date)\nHostname: $(hostname)\nOmarchy Branch: $(git -C \"$OMARCHY_PATH\" branch --show-current 2>/dev/null || echo \"unknown\")\n\n=========================================\nSYSTEM INFORMATION\n=========================================\n$(inxi -Farz)\n\n=========================================\nDMESG\n=========================================\n$DMESG_OUTPUT\n\n=========================================\nJOURNALCTL (CURRENT BOOT, WARNINGS+ERRORS)\n=========================================\n$(journalctl -b -p 4..1)\n\n=========================================\nINSTALLED PACKAGES\n=========================================\n$({ 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)\nEOF\n\nif [[ $PRINT_ONLY = \"true\" ]]; then\n  cat \"$LOG_FILE\"\n  exit 0\nfi\n\nOPTIONS=(\"View log\" \"Save in current directory\")\nif ping -c 1 8.8.8.8 >/dev/null 2>&1; then\n  OPTIONS=(\"Upload log\" \"${OPTIONS[@]}\")\nfi\n\nACTION=$(gum choose \"${OPTIONS[@]}\")\n\ncase \"$ACTION\" in\n  \"Upload log\")\n    echo \"Uploading debug log to 0x0.st...\"\n    URL=$(curl -sF \"file=@$LOG_FILE\" -Fexpires=24 https://0x0.st)\n    if (( $? == 0 )) && [[ -n $URL ]]; then\n      echo \"✓ Log uploaded successfully!\"\n      echo \"Share this URL:\"\n      echo \"\"\n      echo \"  $URL\"\n      echo \"\"\n      echo \"This link will expire in 24 hours.\"\n    else\n      echo \"Error: Failed to upload log file\"\n      exit 1\n    fi\n    ;;\n  \"View log\")\n    less \"$LOG_FILE\"\n    ;;\n  \"Save in current directory\")\n    cp \"$LOG_FILE\" \"./omarchy-debug.log\"\n    echo \"✓ Log saved to $(pwd)/omarchy-debug.log\"\n    ;;\nesac\n"
  },
  {
    "path": "bin/omarchy-dev-add-migration",
    "content": "#!/bin/bash\n\n# Creates a new Omarchy migration named after the unix timestamp of the last commit.\n# Only intended for Omarchy developers.\n\ncd ~/.local/share/omarchy\nmigration_file=\"$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh\"\ntouch $migration_file\n\nif [[ $1 != \"--no-edit\" ]]; then\n  nvim $migration_file\nfi\n\necho $migration_file\n"
  },
  {
    "path": "bin/omarchy-drive-info",
    "content": "#!/bin/bash\n\n# Returns drive information about a given volumne, like /dev/nvme0, which is used by omarchy-drive-select.\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-drive-info [/dev/drive]\"\n  exit 1\nelse\n  drive=\"$1\"\nfi\n\n# Find the root drive in case we are looking at partitions\nroot_drive=$(lsblk -no PKNAME \"$drive\" 2>/dev/null | tail -n1)\nif [[ -n $root_drive ]]; then\n  root_drive=\"/dev/$root_drive\"\nelse\n  root_drive=\"$drive\"\nfi\n\n# Get basic disk information\nsize=$(lsblk -dno SIZE \"$drive\" 2>/dev/null)\nvendor=$(lsblk -dno VENDOR \"$root_drive\" 2>/dev/null | sed 's/ *$//')\nmodel=$(lsblk -dno MODEL \"$root_drive\" 2>/dev/null | sed 's/ *$//')\n\n# Combine vendor and model, avoiding duplication\nlabel=\"\"\nif [[ -n $vendor && -n $model ]]; then\n  if [[ $model == *$vendor* ]]; then\n    label=\"$model\"\n  else\n    label=\"$vendor $model\"\n  fi\nelif [[ -n $model ]]; then\n  label=\"$model\"\nelif [[ -n $vendor ]]; then\n  label=\"$vendor\"\nfi\n\n# Format display string\ndisplay=\"$drive\"\n[[ -n $size ]] && display=\"$display ($size)\"\n[[ -n $label ]] && display=\"$display - $label\"\n\n# Append compact partition summary\npart_summary=$(lsblk -nro TYPE,NAME,FSTYPE,MOUNTPOINT \"$root_drive\" 2>/dev/null | \\\n  awk '$1==\"part\" { printf \"%s%s%s\", s, ($3==\"\"?\"unknown\":$3), ($4==\"\"?\"\":\"(\"$4\")\"); s=\", \" }')\n[[ -n $part_summary ]] && display+=\" [$part_summary]\"\n\necho \"$display\"\n"
  },
  {
    "path": "bin/omarchy-drive-select",
    "content": "#!/bin/bash\n\n# Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password.\n\nif (($# == 0)); then\n  drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')\nelse\n  drives=\"$@\"\nfi\n\ndrives_with_info=\"\"\nwhile IFS= read -r drive; do\n  [[ -n $drive ]] || continue\n  drives_with_info+=\"$(omarchy-drive-info \"$drive\")\"$'\\n'\ndone <<<\"$drives\"\n\nselected_drive=\"$(printf \"%s\" \"$drives_with_info\" | gum choose --header \"Select drive\")\" || exit 1\nprintf \"%s\\n\" \"$selected_drive\" | awk '{print $1}'\n"
  },
  {
    "path": "bin/omarchy-drive-set-password",
    "content": "#!/bin/bash\n\n# Set a new encryption password for a drive selected.\n\nencrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)\n\nif [[ -n $encrypted_drives ]]; then\n  if (( $(wc -l <<<encrypted_drives) == 1 )); then\n    drive_to_change=\"$encrypted_drives\"\n  else\n    drive_to_change=\"$(omarchy-drive-select \"$encrypted_drives\")\"\n  fi\n\n  if [[ -n $drive_to_change ]]; then\n    echo \"Changing full-disk encryption password for $drive_to_change\"\n    sudo cryptsetup luksChangeKey --pbkdf argon2id --iter-time 2000 \"$drive_to_change\"\n  else\n    echo \"No drive selected.\"\n  fi\nelse\n  echo \"No encrypted drives available.\"\n  exit 1\nfi\n"
  },
  {
    "path": "bin/omarchy-font-current",
    "content": "#!/bin/bash\n\n# Returns the name of the current monospace font being used by extracting it from the Waybar stylesheet.\n# This can be changed using omarchy-font-set.\n\ngrep -oP 'font-family:\\s*[\"'\\'']?\\K[^;\"'\\'']+' ~/.config/waybar/style.css | head -n1\n"
  },
  {
    "path": "bin/omarchy-font-list",
    "content": "#!/bin/bash\n\n# Returns a list of all the monospace fonts available on the system that can be set using omarchy-font-set.\n\nfc-list :spacing=100 -f \"%{family[0]}\\n\" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u\n"
  },
  {
    "path": "bin/omarchy-font-set",
    "content": "#!/bin/bash\n\n# Set the system-wide monospace font that should be used by the terminal, hyprlock, waybar, swayosd, etc.\n# The font name must be one of the ones returned by omarchy-font-list.\n\nfont_name=\"$1\"\n\nif [[ -n $font_name ]]; then\n  if fc-list | grep -iq \"$font_name\"; then\n    if [[ -f ~/.config/alacritty/alacritty.toml ]]; then\n      sed -i \"s/family = \\\".*\\\"/family = \\\"$font_name\\\"/g\" ~/.config/alacritty/alacritty.toml\n    fi\n\n    if [[ -f ~/.config/kitty/kitty.conf ]]; then\n      sed -i \"s/^font_family .*/font_family $font_name/g\" ~/.config/kitty/kitty.conf\n      pkill -USR1 kitty\n    fi\n\n    if [[ -f ~/.config/ghostty/config ]]; then\n      sed -i \"s/font-family = \\\".*\\\"/font-family = \\\"$font_name\\\"/g\" ~/.config/ghostty/config\n      pkill -SIGUSR2 ghostty\n    fi\n\n    sed -i \"s/font_family = .*/font_family = $font_name/g\" ~/.config/hypr/hyprlock.conf\n    sed -i \"s/font-family: .*/font-family: '$font_name';/g\" ~/.config/waybar/style.css\n    sed -i \"s/font-family: .*/font-family: '$font_name';/g\" ~/.config/swayosd/style.css\n    xmlstarlet ed -L \\\n      -u '//match[@target=\"pattern\"][test/string=\"monospace\"]/edit[@name=\"family\"]/string' \\\n      -v \"$font_name\" \\\n      ~/.config/fontconfig/fonts.conf\n\n    omarchy-restart-waybar\n    omarchy-restart-swayosd\n\n    if pgrep -x ghostty; then\n      notify-send \"    You must restart Ghostty to see font change\"\n    fi\n\n    omarchy-hook font-set \"$font_name\"\n  else\n    echo \"Font '$font_name' not found.\"\n    exit 1\n  fi\nelse\n  echo \"Usage: omarchy-font-set <font-name>\"\nfi\n"
  },
  {
    "path": "bin/omarchy-hibernation-available",
    "content": "#!/bin/bash\n\n# Check if hibernation is supported\nif [[ ! -f /sys/power/image_size ]]; then\n  exit 1\nfi\n\n# Sum all swap sizes (excluding zram)\nSWAPSIZE_KB=$(awk '!/Filename|zram/ {sum += $3} END {print sum+0}' /proc/swaps)\nSWAPSIZE=$(( 1024 * ${SWAPSIZE_KB:-0} ))\n\nHIBERNATION_IMAGE_SIZE=$(cat /sys/power/image_size)\n\nif (( SWAPSIZE > HIBERNATION_IMAGE_SIZE )) && [[ -f /etc/mkinitcpio.conf.d/omarchy_resume.conf ]]; then\n  exit 0\nelse\n  exit 1\nfi\n"
  },
  {
    "path": "bin/omarchy-hibernation-remove",
    "content": "#!/bin/bash\n\n# Removes hibernation setup: disables swap, removes swapfile, removes fstab entry,\n# removes resume hook, and removes suspend-then-hibernate configuration.\n\nMKINITCPIO_CONF=\"/etc/mkinitcpio.conf.d/omarchy_resume.conf\"\n\n# Check if hibernation is configured\nif [[ ! -f $MKINITCPIO_CONF ]] || ! grep -q \"^HOOKS+=(resume)$\" \"$MKINITCPIO_CONF\"; then\n  echo \"Hibernation is not set up\"\n  exit 0\nfi\n\nif ! gum confirm \"Remove hibernation setup?\"; then\n  exit 0\nfi\n\nSWAP_SUBVOLUME=\"/swap\"\nSWAP_FILE=\"$SWAP_SUBVOLUME/swapfile\"\n\n# Disable swap if active\nif swapon --show | grep -q \"$SWAP_FILE\"; then\n  echo \"Disabling swap on $SWAP_FILE\"\n  sudo swapoff \"$SWAP_FILE\"\nfi\n\n# Remove swapfile\nif [[ -f $SWAP_FILE ]]; then\n  echo \"Removing swapfile\"\n  sudo rm \"$SWAP_FILE\"\nfi\n\n# Remove swap subvolume\nif sudo btrfs subvolume show \"$SWAP_SUBVOLUME\" &>/dev/null; then\n  echo \"Removing Btrfs subvolume $SWAP_SUBVOLUME\"\n  sudo btrfs subvolume delete \"$SWAP_SUBVOLUME\"\nfi\n\n# Remove fstab entry\nif grep -Fq \"$SWAP_FILE\" /etc/fstab; then\n  echo \"Removing swapfile from /etc/fstab\"\n  sudo cp -a /etc/fstab \"/etc/fstab.$(date +%Y%m%d%H%M%S).back\"\n  sudo sed -i \"\\|$SWAP_FILE|d\" /etc/fstab\n  sudo sed -i '/^# Btrfs swapfile for system hibernation$/d' /etc/fstab\nfi\n\n# Remove suspend-then-hibernate configuration\necho \"Removing suspend-then-hibernate configuration\"\nsudo rm -f /etc/systemd/logind.conf.d/lid.conf\nsudo rm -f /etc/systemd/sleep.conf.d/hibernate.conf\n\n# Remove mkinitcpio resume hook\necho \"Removing resume hook\"\nsudo rm \"$MKINITCPIO_CONF\"\n\necho \"Regenerating initramfs...\"\nsudo limine-mkinitcpio\n\necho \"Hibernation removed\"\n"
  },
  {
    "path": "bin/omarchy-hibernation-setup",
    "content": "#!/bin/bash\n\n# Creates a swap file in the btrfs subvolume, adds the swap file to /etc/fstab,\n# adds a resume hook to mkinitcpio, and configures suspend-then-hibernate.\n\nif [[ ! -f /sys/power/image_size ]]; then\n  echo -e \"Hibernation is not supported on your system\" >&2\n  exit 0\nfi\n\nif ! command -v limine-mkinitcpio &>/dev/null; then\n  echo \"Skipping hibernation setup (requires Limine bootloader)\"\n  exit 0\nfi\n\nMKINITCPIO_CONF=\"/etc/mkinitcpio.conf.d/omarchy_resume.conf\"\n\n# Check if hibernation is already configured\nif [[ -f $MKINITCPIO_CONF ]] && grep -q \"^HOOKS+=(resume)$\" \"$MKINITCPIO_CONF\"; then\n  echo \"Hibernation is already set up\"\n  exit 0\nfi\n\nif [[ $1 != \"--force\" ]]; then\n  MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')\n  if ! gum confirm \"Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?\"; then\n    exit 0\n  fi\nfi\n\nSWAP_SUBVOLUME=\"/swap\"\nSWAP_FILE=\"$SWAP_SUBVOLUME/swapfile\"\n\n# Create btrfs subvolume for swap\nif ! sudo btrfs subvolume show \"$SWAP_SUBVOLUME\" &>/dev/null; then\n  echo \"Creating Btrfs subvolume\"\n  sudo btrfs subvolume create \"$SWAP_SUBVOLUME\"\n  sudo chattr +C \"$SWAP_SUBVOLUME\"\nfi\n\n# Create swapfile\nif ! sudo swaplabel \"$SWAP_FILE\" &>/dev/null; then\n  echo \"Creating swapfile in Btrfs subvolume\"\n  MEM_TOTAL_KB=\"$(awk '/MemTotal/ {print $2}' /proc/meminfo)k\"\n  sudo btrfs filesystem mkswapfile -s \"$MEM_TOTAL_KB\" \"$SWAP_FILE\"\nfi\n\n# Add swapfile to fstab\nif ! grep -Fq \"$SWAP_FILE\" /etc/fstab; then\n  echo \"Adding swapfile to /etc/fstab\"\n  sudo cp -a /etc/fstab \"/etc/fstab.$(date +%Y%m%d%H%M%S).back\"\n  printf \"\\n# Btrfs swapfile for system hibernation\\n%s none swap defaults,pri=0 0 0\\n\" \"$SWAP_FILE\" | sudo tee -a /etc/fstab >/dev/null\nfi\n\n# Enable swap\nif ! swapon --show | grep -q \"$SWAP_FILE\"; then\n  echo \"Enabling swap on $SWAP_FILE\"\n  sudo swapon -p 0 \"$SWAP_FILE\"\nfi\n\n# Add resume hook to mkinitcpio\nsudo mkdir -p /etc/mkinitcpio.conf.d\necho \"Adding resume hook to $MKINITCPIO_CONF\"\necho \"HOOKS+=(resume)\" | sudo tee \"$MKINITCPIO_CONF\" >/dev/null\n\n# Ensure keyboard backlight doesn't prevent sleep\nsudo cp -p \"$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight\" /usr/lib/systemd/system-sleep/\n\n# Add resume= kernel parameters so the initramfs resume hook knows where to find the\n# hibernation image. Without these, resume happens late (after GPU drivers load) and fails.\nRESUME_DROP_IN=\"/etc/limine-entry-tool.d/resume.conf\"\nif [[ ! -f $RESUME_DROP_IN ]]; then\n  echo \"Adding resume kernel parameters\"\n  sudo swapon -p 0 \"$SWAP_FILE\" 2>/dev/null\n  RESUME_DEVICE=$(findmnt -no SOURCE -T \"$SWAP_FILE\" | sed 's/\\[.*\\]//')\n  RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r \"$SWAP_FILE\")\n  sudo mkdir -p /etc/limine-entry-tool.d\n  echo \"KERNEL_CMDLINE[default]+=\\\" resume=$RESUME_DEVICE resume_offset=$RESUME_OFFSET\\\"\" | sudo tee \"$RESUME_DROP_IN\" >/dev/null\n  sudo tee -a /etc/default/limine < \"$RESUME_DROP_IN\" >/dev/null\nfi\n\n# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate)\nif grep -q \"\\[s2idle\\]\" /sys/power/mem_sleep 2>/dev/null; then\n  LIMINE_DROP_IN=\"/etc/limine-entry-tool.d/rtc-alarm.conf\"\n  if [[ ! -f $LIMINE_DROP_IN ]]; then\n    echo \"Enabling ACPI RTC alarm for s2idle suspend\"\n    sudo mkdir -p /etc/limine-entry-tool.d\n    echo 'KERNEL_CMDLINE[default]+=\" rtc_cmos.use_acpi_alarm=1\"' | sudo tee \"$LIMINE_DROP_IN\" >/dev/null\n    sudo tee -a /etc/default/limine < \"$LIMINE_DROP_IN\" >/dev/null\n  fi\nfi\n\n# Regenerate initramfs and boot entry\necho \"Regenerating initramfs...\"\nsudo limine-mkinitcpio\nsudo limine-update\n\necho\n\nif [[ $1 != \"--force\" ]] && gum confirm \"Reboot to enable hibernation?\"; then\n  omarchy-system-reboot\nfi\n"
  },
  {
    "path": "bin/omarchy-hook",
    "content": "#!/bin/bash\n\n# Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update).\n\nset -e\n\nif (( $# < 1 )); then\n  echo \"Usage: omarchy-hook [name] [args...]\"\n  exit 1\nfi\n\nHOOK=$1\nHOOK_PATH=\"$HOME/.config/omarchy/hooks/$1\"\nshift\n\nif [[ -f $HOOK_PATH ]]; then\n  bash \"$HOOK_PATH\" \"$@\"\nfi\n"
  },
  {
    "path": "bin/omarchy-hw-asus-rog",
    "content": "#!/bin/bash\n\n# Detect whether the computer is an Asus ROG machine.\n\n[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == \"ASUSTeK COMPUTER INC.\" ]] &&\n   grep -q \"ROG\" /sys/class/dmi/id/product_family 2>/dev/null\n"
  },
  {
    "path": "bin/omarchy-hw-framework16",
    "content": "#!/bin/bash\n\n# Detect whether the computer is a Framework Laptop 16.\n\n[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == \"Framework\" ]] &&\n  grep -q \"Laptop 16\" /sys/class/dmi/id/product_name 2>/dev/null\n"
  },
  {
    "path": "bin/omarchy-hw-intel",
    "content": "#!/bin/bash\n\n# Detect whether the computer has an Intel CPU.\n\n[[ $(grep -m1 \"vendor_id\" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | tr -d ' ') == \"GenuineIntel\" ]]\n"
  },
  {
    "path": "bin/omarchy-hw-surface",
    "content": "#!/bin/bash\n\n# Detect whether the computer is a Microsoft Surface device.\n\n[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == \"Microsoft Corporation\" ]] &&\n  grep -q \"Surface\" /sys/class/dmi/id/product_name 2>/dev/null\n"
  },
  {
    "path": "bin/omarchy-hyprland-monitor-scaling-cycle",
    "content": "#!/bin/bash\n\n# Get the active monitor (the one with the cursor)\nMONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')\nACTIVE_MONITOR=$(echo \"$MONITOR_INFO\" | jq -r '.name')\nCURRENT_SCALE=$(echo \"$MONITOR_INFO\" | jq -r '.scale')\nWIDTH=$(echo \"$MONITOR_INFO\" | jq -r '.width')\nHEIGHT=$(echo \"$MONITOR_INFO\" | jq -r '.height')\nREFRESH_RATE=$(echo \"$MONITOR_INFO\" | jq -r '.refreshRate')\n\n# Cycle through scales: 1 → 1.6 → 2 → 3 → 1\nCURRENT_INT=$(awk -v s=\"$CURRENT_SCALE\" 'BEGIN { printf \"%.0f\", s * 10 }')\n\ncase \"$CURRENT_INT\" in\n10) NEW_SCALE=1.6 ;;\n16) NEW_SCALE=2 ;;\n20) NEW_SCALE=3 ;;\n*) NEW_SCALE=1 ;;\nesac\n\nhyprctl keyword misc:disable_scale_notification true\nhyprctl keyword monitor \"$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE\"\nhyprctl keyword misc:disable_scale_notification false\nnotify-send \"󰍹    Display scaling set to ${NEW_SCALE}x\"\n"
  },
  {
    "path": "bin/omarchy-hyprland-window-close-all",
    "content": "#!/bin/bash\n\n# Close all open windows\nhyprctl clients -j | \\\n  jq -r \".[].address\" | \\\n  xargs -I{} hyprctl dispatch closewindow address:{}\n\n# Move to first workspace\nhyprctl dispatch workspace 1\n"
  },
  {
    "path": "bin/omarchy-hyprland-window-gaps-toggle",
    "content": "#!/bin/bash\n\n# Toggles the window gaps globally between no gaps and the default 10/5/2.\n\ngaps=$(hyprctl getoption general:gaps_out -j | jq -r '.custom' | awk '{print $1}')\n\nif [[ $gaps == \"0\" ]]; then\n  hyprctl keyword general:gaps_out 10\n  hyprctl keyword general:gaps_in 5\n  hyprctl keyword general:border_size 2\nelse\n  hyprctl keyword general:gaps_out 0\n  hyprctl keyword general:gaps_in 0\n  hyprctl keyword general:border_size 0\nfi\n"
  },
  {
    "path": "bin/omarchy-hyprland-window-pop",
    "content": "#!/bin/bash\n\n# Toggle to pop-out a tile to stay fixed on a display basis.\n\n# Usage:\n# omarchy-hyprland-window-pop [width height [x y]]\n#\n# Arguments:\n#   width   Optional. Width of the floating window. Default: 1300\n#   height  Optional. Height of the floating window. Default: 900\n#   x       Optional. X position of the window. Must provide both X and Y to take effect.\n#   y       Optional. Y position of the window. Must provide both X and Y to take effect.\n#\n# Behavior:\n#   - If the window is already pinned, it will be unpinned and removed from the pop layer.\n#   - If the window is not pinned, it will be floated, resized, moved/centered, pinned, brought to top, and popped.\n\nwidth=${1:-1300}\nheight=${2:-900}\nx=${3:-}\ny=${4:-}\n\nactive=$(hyprctl activewindow -j)\npinned=$(echo \"$active\" | jq \".pinned\")\naddr=$(echo \"$active\" | jq -r \".address\")\n\nif [[ $pinned == \"true\" ]]; then\n  hyprctl -q --batch \\\n    \"dispatch pin address:$addr;\" \\\n    \"dispatch togglefloating address:$addr;\" \\\n    \"dispatch tagwindow -pop address:$addr;\"\nelif [[ -n $addr ]]; then\n  hyprctl dispatch togglefloating address:$addr\n  hyprctl dispatch resizeactive exact $width $height address:$addr\n\n  if [[ -n $x && -n $y ]]; then\n    hyprctl dispatch moveactive $x $y address:$addr\n  else\n    hyprctl dispatch centerwindow address:$addr\n  fi\n\n  hyprctl -q --batch \\\n    \"dispatch pin address:$addr;\" \\\n    \"dispatch alterzorder top address:$addr;\" \\\n    \"dispatch tagwindow +pop address:$addr;\"\nfi\n"
  },
  {
    "path": "bin/omarchy-hyprland-window-single-square-aspect-toggle",
    "content": "#!/bin/bash\n\n# Check current single_window_aspect_ratio setting\nCURRENT_VALUE=$(hyprctl getoption \"layout:single_window_aspect_ratio\" 2>/dev/null | head -1)\n\n# Parse vec2 output: \"vec2: [1, 1]\" or \"vec2: [0, 0]\"\nif [[ $CURRENT_VALUE == *\"[1, 1]\"* ]]; then\n  hyprctl keyword layout:single_window_aspect_ratio \"0 0\"\n  notify-send \"    Disable single-window square aspect ratio\"\nelse\n  hyprctl keyword layout:single_window_aspect_ratio \"1 1\"\n  notify-send \"    Enable single-window square aspect\"\nfi\n"
  },
  {
    "path": "bin/omarchy-hyprland-workspace-layout-toggle",
    "content": "#!/bin/bash\n\n# Toggle the layout on the current active workspace between dwindle and scrolling\n\nACTIVE_WORKSPACE=$(hyprctl activeworkspace -j | jq -r '.id')\nCURRENT_LAYOUT=$(hyprctl activeworkspace -j | jq -r '.tiledLayout')\n\ncase \"$CURRENT_LAYOUT\" in\n  dwindle) NEW_LAYOUT=scrolling ;;\n  *) NEW_LAYOUT=dwindle ;;\nesac\n\nhyprctl keyword workspace $ACTIVE_WORKSPACE, layout:$NEW_LAYOUT\nnotify-send \"󱂬    Workspace layout set to $NEW_LAYOUT\"\n"
  },
  {
    "path": "bin/omarchy-install-chromium-google-account",
    "content": "#!/bin/bash\n\n# Allow Chromium to sign in to Google accounts by adding the correct\n# oauth client id and secret to ~/.config/chromium-flags.conf.\n\nif [[ -f ~/.config/chromium-flags.conf ]]; then\n  CONF=~/.config/chromium-flags.conf\n\n  grep -qxF -- \"--oauth2-client-id=77185425430.apps.googleusercontent.com\" \"$CONF\" ||\n    echo \"--oauth2-client-id=77185425430.apps.googleusercontent.com\" >>\"$CONF\"\n\n  grep -qxF -- \"--oauth2-client-secret=OTJgUOQcT7lO7GsGZq2G4IlT\" \"$CONF\" ||\n    echo \"--oauth2-client-secret=OTJgUOQcT7lO7GsGZq2G4IlT\" >>\"$CONF\"\n\n  echo \"Now you can login to your Google Account in Chromium.\"\nfi\n"
  },
  {
    "path": "bin/omarchy-install-dev-env",
    "content": "#!/bin/bash\n\n# Install one of the supported development environments. Usually called via Install > Development > * in the Omarchy Menu.\n\nif [[ -z $1 ]]; then\n  echo \"Usage: omarchy-install-dev-env <ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure|scala>\" >&2\n  exit 1\nfi\n\ninstall_php() {\n  omarchy-pkg-add php composer php-sqlite xdebug\n\n  # Install Path for Composer\n  if [[ :$PATH: != *:$HOME/.config/composer/vendor/bin:* ]]; then\n    echo 'export PATH=\"$HOME/.config/composer/vendor/bin:$PATH\"' >>\"$HOME/.bashrc\"\n    source \"$HOME/.bashrc\"\n    echo \"Added Composer global bin directory to PATH.\"\n  else\n    echo \"Composer global bin directory already in PATH.\"\n  fi\n\n  # Enable some extensions\n  local php_ini_path=\"/etc/php/php.ini\"\n  local extensions_to_enable=(\n    \"bcmath\"\n    \"intl\"\n    \"iconv\"\n    \"openssl\"\n    \"pdo_sqlite\"\n    \"pdo_mysql\"\n  )\n\n  # Enable Xdebug\n  sudo sed -i \\\n    -e 's/^;zend_extension=xdebug.so/zend_extension=xdebug.so/' \\\n    -e 's/^;xdebug.mode=debug/xdebug.mode=debug/' \\\n    /etc/php/conf.d/xdebug.ini\n\n  for ext in \"${extensions_to_enable[@]}\"; do\n    sudo sed -i \"s/^;extension=${ext}/extension=${ext}/\" \"$php_ini_path\"\n  done\n}\n\ninstall_node() {\n  echo -e \"Installing Node.js...\\n\"\n  mise use --global node\n}\n\ncase \"$1\" in\nruby)\n  echo -e \"Installing Ruby on Rails...\\n\"\n  omarchy-pkg-add libyaml\n  mise settings add ruby.compile false\n  mise settings add idiomatic_version_file_enable_tools ruby\n  mise use --global ruby@latest\n  echo \"gem: --no-document\" >~/.gemrc\n  mise x ruby -- gem install rails --no-document\n  echo -e \"\\nYou can now run: rails new myproject\"\n  ;;\nnode)\n  install_node\n  ;;\nbun)\n  echo -e \"Installing Bun...\\n\"\n  mise use -g bun@latest\n  ;;\ndeno)\n  echo -e \"Installing Deno...\\n\"\n  mise use -g deno@latest\n  ;;\ngo)\n  echo -e \"Installing Go...\\n\"\n  mise use --global go@latest\n  ;;\nphp)\n  echo -e \"Installing PHP...\\n\"\n  install_php\n  ;;\nlaravel)\n  echo -e \"Installing PHP and Laravel...\\n\"\n  install_php\n  install_node\n  composer global require laravel/installer\n  echo -e \"\\nYou can now run: laravel new myproject\"\n  ;;\nsymfony)\n  echo -e \"Installing PHP and Symfony...\\n\"\n  install_php\n  omarchy-pkg-add symfony-cli\n  echo -e \"\\nYou can now run: symfony new --webapp myproject\"\n  ;;\npython)\n  echo -e \"Installing Python...\\n\"\n  mise use --global python@latest\n  echo -e \"\\nInstalling uv...\\n\"\n  curl -fsSL https://astral.sh/uv/install.sh | sh\n  ;;\nelixir)\n  echo -e \"Installing Elixir...\\n\"\n  mise use --global erlang@latest\n  mise use --global elixir@latest\n  mise x elixir -- mix local.hex --force\n  ;;\nphoenix)\n  echo -e \"Installing Phoenix Framework...\\n\"\n  # Ensure Erlang/Elixir first\n  mise use --global erlang@latest\n  mise use --global elixir@latest\n  # Hex & Rebar\n  mise x elixir -- mix local.hex --force\n  mise x elixir -- mix local.rebar --force\n  # Phoenix project (phx_new)\n  mise x elixir -- mix archive.install hex phx_new --force\n  echo -e \"\\nYou can now run: mix phx.new my_app\"\n  ;;\nrust)\n  echo -e \"Installing Rust...\\n\"\n  bash -c \"$(curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs)\" -- -y\n  ;;\njava)\n  echo -e \"Installing Java...\\n\"\n  mise use --global java@latest\n  ;;\nzig)\n  echo -e \"Installing Zig...\\n\"\n  mise use --global zig@latest\n  mise use -g zls@latest\n  ;;\nocaml)\n  echo -e \"Installing OCaml...\\n\"\n  bash -c \"$(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)\"\n  opam init --yes\n  eval \"$(opam env)\"\n  opam install ocaml-lsp-server odoc ocamlformat utop --yes\n  ;;\ndotnet)\n  echo -e \"Installing .NET...\\n\"\n  mise use --global dotnet@latest\n  ;;\nclojure)\n  echo -e \"Installing Clojure...\\n\"\n  omarchy-pkg-add rlwrap\n  mise use --global clojure@latest\n  ;;\nscala)\n  echo -e \"Installing Scala...\\n\"\n  mise use --global java@latest\n  mise use --global scala@latest\n  mise use --global scala-cli@latest\n  ;;\nesac\n"
  },
  {
    "path": "bin/omarchy-install-docker-dbs",
    "content": "#!/bin/bash\n\n# Install one of the supported databases in a Docker container with the suitable development options.\n# Usually called via Install > Development > Docker DB from the Omarchy Menu.\n\noptions=(\"MySQL\" \"PostgreSQL\" \"Redis\" \"MongoDB\" \"MariaDB\" \"MSSQL\")\n\nif (( $# == 0 )); then\n  choices=$(printf \"%s\\n\" \"${options[@]}\" | gum choose --header \"Select database (return to install, esc to cancel)\") || main_menu\nelse\n  choices=\"$@\"\nfi\n\nif [[ -n $choices ]]; then\n  for db in $choices; do\n    case $db in\n    MySQL) sudo docker run -d --restart unless-stopped -p \"127.0.0.1:3306:3306\" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;;\n    PostgreSQL) sudo docker run -d --restart unless-stopped -p \"127.0.0.1:5432:5432\" --name=postgres18 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:18 ;;\n    MariaDB) sudo docker run -d --restart unless-stopped -p \"127.0.0.1:3306:3306\" --name=mariadb11 -e MARIADB_ROOT_PASSWORD= -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true mariadb:11.8 ;;\n    Redis) sudo docker run -d --restart unless-stopped -p \"127.0.0.1:6379:6379\" --name=redis redis:7 ;;\n    MongoDB) sudo docker run -d --restart unless-stopped -p \"127.0.0.1:27017:27017\" --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin123 mongo:noble ;;\n    MSSQL) sudo docker run -d --restart unless-stopped -p \"127.0.0.1:1433:1433\" --name mssql -e MSSQL_PID=Developer -e ACCEPT_EULA=Y -e \"MSSQL_SA_PASSWORD=@dmin123\" mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04 ;;\n    esac\n  done\nelse\n  echo \"No databases selected for installation.\"\nfi\n"
  },
  {
    "path": "bin/omarchy-install-dropbox",
    "content": "#!/bin/bash\n\n# Install and start the Dropbox service. Must then be authenticated via the web.\n\necho \"Installing all dependencies...\"\nomarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox\n\necho \"Starting Dropbox...\"\nuwsm-app -- dropbox-cli start &>/dev/null &\necho \"See Dropbox icon behind  hover tray in top right and right-click for setup.\"\n"
  },
  {
    "path": "bin/omarchy-install-geforce-now",
    "content": "#!/bin/bash\n\n# Install and launch Geforce Now.\n\nset -e\n\nomarchy-pkg-add flatpak\ncd /tmp\n\n# Download and run GeForce NOW\ncurl -LO https://international.download.nvidia.com/GFNLinux/GeForceNOWSetup.bin\nchmod +x GeForceNOWSetup.bin\n./GeForceNOWSetup.bin\n\n# Ensure a separate browser process not started by GFN is available.\n# If not, it seems like GFN has a tendency to hang on login.\nsetsid omarchy-launch-browser\n"
  },
  {
    "path": "bin/omarchy-install-nordvpn",
    "content": "#!/bin/bash\n\n# Install the NordVPN service with optional GUI.\n\necho \"Installing NordVPN...\"\nomarchy-pkg-aur-add nordvpn-bin\n\necho \"Enabling NordVPN daemon...\"\nsudo systemctl enable --now nordvpnd\n\necho \"Adding user to nordvpn group...\"\nsudo usermod -aG nordvpn \"$USER\"\n\necho -e \"\\nNordVPN installed! After reboot, run 'nordvpn login' to authenticate.\"\n\necho\ngum confirm \"Reboot now to make NordVPN usable?\" && omarchy-system-reboot\n"
  },
  {
    "path": "bin/omarchy-install-steam",
    "content": "#!/bin/bash\n\n# Install and launch Steam after first letting the user pick the correct grahics card drivers.\n\nset -e\n\necho \"Now pick dependencies matching your graphics card\"\nsudo pacman -S steam\nsetsid gtk-launch steam >/dev/null 2>&1 &\n"
  },
  {
    "path": "bin/omarchy-install-tailscale",
    "content": "#!/bin/bash\n\n# Install the Tailscale mesh VPN service and a web app for the Tailscale Admin Console.\n\ncurl -fsSL https://tailscale.com/install.sh | sh\n\necho -e \"\\nStarting Tailscale...\"\nsudo tailscale up --accept-routes\n\nomarchy-webapp-install \"Tailscale\" \"https://login.tailscale.com/admin/machines\" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png\n"
  },
  {
    "path": "bin/omarchy-install-terminal",
    "content": "#!/bin/bash\n\n# Install one of the approved terminals and set it as the default for Omarchy (Super + Return etc).\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-install-terminal [alacritty|ghostty|kitty]\"\n  exit 1\nfi\n\npackage=\"$1\"\n\n# Map package name to desktop entry ID\ncase \"$package\" in\nalacritty) desktop_id=\"Alacritty.desktop\" ;;\nghostty) desktop_id=\"com.mitchellh.ghostty.desktop\" ;;\nkitty) desktop_id=\"kitty.desktop\" ;;\n*)\n  echo \"Unknown terminal: $package\"\n  exit 1\n  ;;\nesac\n\n# Install package\nif omarchy-pkg-add $package; then\n  # Copy custom desktop entry for alacritty with X-TerminalArg* keys\n  if [[ $package == \"alacritty\" ]]; then\n    mkdir -p ~/.local/share/applications\n    cp $OMARCHY_PATH/applications/Alacritty.desktop ~/.local/share/applications/\n  fi\n\n  # Update xdg-terminals.list to prioritize the proper terminal\n  cat >~/.config/xdg-terminals.list <<EOF\n# Terminal emulator preference order for xdg-terminal-exec\n# The first found and valid terminal will be used\n$desktop_id\nEOF\nelse\n  echo \"Failed to install $package\"\nfi\n"
  },
  {
    "path": "bin/omarchy-install-vscode",
    "content": "#!/bin/bash\n\n# Install VSCode and configure it to use the gnome-libsecret password store, not to update automatically, and to use the current Omarchy theme.\n\necho \"Installing VSCode...\"\nomarchy-pkg-add visual-studio-code-bin\n\nmkdir -p ~/.vscode ~/.config/Code/User\n\ncat > ~/.vscode/argv.json << 'EOF'\n// This configuration file allows you to pass permanent command line arguments to VS Code.\n// Only a subset of arguments is currently supported to reduce the likelihood of breaking\n// the installation.\n//\n// PLEASE DO NOT CHANGE WITHOUT UNDERSTANDING THE IMPACT\n//\n// NOTE: Changing this file requires a restart of VS Code.\n{\n  \"password-store\":\"gnome-libsecret\"\n}\nEOF\n\n# Ensure VSC's own auto-update feature is turned off\nprintf '{\\n  \"update.mode\": \"none\"\\n}\\n' > ~/.config/Code/User/settings.json\n\n# Apply Omarchy theme to VSCode\nomarchy-theme-set-vscode\n\nsetsid gtk-launch code\n"
  },
  {
    "path": "bin/omarchy-install-xbox-controllers",
    "content": "#!/bin/bash\n\n# Install support for using Xbox controllers with Steam/RetroArch/etc.\n\nset -e\n\n# Install xpadneo to ensure controllers work out of the box\nomarchy-pkg-add linux-headers\nomarchy-pkg-aur-add xpadneo-dkms\n\n# Prevent xpad/xpadneo driver conflict\necho blacklist xpad | sudo tee /etc/modprobe.d/blacklist-xpad.conf >/dev/null\necho hid_xpadneo | sudo tee /etc/modules-load.d/xpadneo.conf >/dev/null\n\n# Give user access to game controllers\nsudo usermod -a -G input $USER\n\n# Modules need to be loaded\ngum confirm \"Install requires reboot. Ready?\" && sudo reboot now\n"
  },
  {
    "path": "bin/omarchy-launch-about",
    "content": "#!/bin/bash\n\n# Launch the fastfetch TUI that gives information about the current system.\n\nexec omarchy-launch-or-focus-tui \"bash -c 'fastfetch; read -n 1 -s'\"\n"
  },
  {
    "path": "bin/omarchy-launch-audio",
    "content": "#!/bin/bash\n\n# Launch the Omarchy audio controls TUI (provided by wiremix).\n\nomarchy-launch-or-focus-tui wiremix\n"
  },
  {
    "path": "bin/omarchy-launch-bluetooth",
    "content": "#!/bin/bash\n\n# Launch the Omarchy bluetooth controls TUI (provided by bluetui).\n# Also attempts to unblock bluetooth service if rfkill had blocked it.\n\nrfkill unblock bluetooth\nexec omarchy-launch-or-focus-tui bluetui\n"
  },
  {
    "path": "bin/omarchy-launch-browser",
    "content": "#!/bin/bash\n\n# Launch the default browser as determined by xdg-settings.\n# Automatically converts --private into the correct flag for the given browser.\n\ndefault_browser=$(xdg-settings get default-web-browser)\nbrowser_exec=$(sed -n 's/^Exec=\\([^ ]*\\).*/\\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)\n\nif $browser_exec --help | grep -q MOZ_LOG; then\n  private_flag=\"--private-window\"\nelif [[ $browser_exec =~ edge ]]; then\n  private_flag=\"--inprivate\"\nelse\n  private_flag=\"--incognito\"\nfi\n\nexec setsid uwsm-app -- \"$browser_exec\" \"${@/--private/$private_flag}\"\n"
  },
  {
    "path": "bin/omarchy-launch-editor",
    "content": "#!/bin/bash\n\n# Launch the default editor as determined by $EDITOR (set via ~/.config/uwsm/default) (or nvim if missing).\n# Starts suitable editors in a terminal window and otherwise as a regular application.\n\nomarchy-cmd-present \"$EDITOR\" || EDITOR=nvim\n\ncase \"$EDITOR\" in\nnvim | vim | nano | micro | hx | helix | fresh)\n  exec omarchy-launch-tui \"$EDITOR\" \"$@\"\n  ;;\n*)\n  exec setsid uwsm-app -- \"$EDITOR\" \"$@\"\n  ;;\nesac\n"
  },
  {
    "path": "bin/omarchy-launch-floating-terminal-with-presentation",
    "content": "#!/bin/bash\n\n# Launch a floating terminal with the Omarchy logo presentation, then execute the command passed in, and finally end with the omarchy-show-done presentation.\n# Used by actions such as Update System.\n\ncmd=\"$*\"\nexec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c \"omarchy-show-logo; $cmd; if (( \\$? != 130 )); then omarchy-show-done; fi\"\n"
  },
  {
    "path": "bin/omarchy-launch-or-focus",
    "content": "#!/bin/bash\n\n# Launch or focus on a given command identified by the passed in window-pattern.\n# Use by some default bindings, like the one for Spotify, to ensure there is only one instance of the application open.\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-launch-or-focus [window-pattern] [launch-command]\"\n  exit 1\nfi\n\nWINDOW_PATTERN=\"$1\"\nLAUNCH_COMMAND=\"${2:-\"uwsm-app -- $WINDOW_PATTERN\"}\"\nWINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p \"$WINDOW_PATTERN\" '.[]|select((.class|test(\"\\\\b\" + $p + \"\\\\b\";\"i\")) or (.title|test(\"\\\\b\" + $p + \"\\\\b\";\"i\")))|.address' | head -n1)\n\nif [[ -n $WINDOW_ADDRESS ]]; then\n  hyprctl dispatch focuswindow \"address:$WINDOW_ADDRESS\"\nelse\n  eval exec setsid $LAUNCH_COMMAND\nfi\n"
  },
  {
    "path": "bin/omarchy-launch-or-focus-tui",
    "content": "#!/bin/bash\n\n# Launch or focus on a given TUI identified by the passed in as the command.\n# Use by commands like omarchy-launch-wifi to ensure there is only one wifi configuration screen open.\n\nAPP_ID=\"org.omarchy.$(basename \"$1\")\"\nLAUNCH_COMMAND=\"omarchy-launch-tui $@\"\n\nexec omarchy-launch-or-focus \"$APP_ID\" \"$LAUNCH_COMMAND\"\n"
  },
  {
    "path": "bin/omarchy-launch-or-focus-webapp",
    "content": "#!/bin/bash\n\n# Launch or focus on a given web app identified by the window-pattern.\n# Use by some default bindings, like the one for WhatsApp, to ensure there is only one instance of the application open.\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-launch-or-focus-webapp [window-pattern] [url-and-flags...]\"\n  exit 1\nfi\n\nWINDOW_PATTERN=\"$1\"\nshift\nLAUNCH_COMMAND=\"omarchy-launch-webapp $@\"\n\nexec omarchy-launch-or-focus \"$WINDOW_PATTERN\" \"$LAUNCH_COMMAND\"\n"
  },
  {
    "path": "bin/omarchy-launch-screensaver",
    "content": "#!/bin/bash\n\n# Launch the Omarchy screensaver in the default terminal on the system with the correct font configuration.\n\n# Exit early if we don't have the tte show\nif ! command -v tte &>/dev/null; then\n  exit 1\nfi\n\n# Exit early if screensave is already running\npgrep -f org.omarchy.screensaver && exit 0\n\n# Allow screensaver to be turned off but also force started\nif [[ -f ~/.local/state/omarchy/toggles/screensaver-off ]] && [[ $1 != \"force\" ]]; then\n  exit 1\nfi\n\n# Silently quit Walker on overlay\nwalker -q\n\nfocused=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')\nterminal=$(xdg-terminal-exec --print-id)\n\nfor m in $(hyprctl monitors -j | jq -r '.[] | .name'); do\n  hyprctl dispatch focusmonitor $m\n\n  case $terminal in\n  *Alacritty*)\n    hyprctl dispatch exec -- \\\n      alacritty --class=org.omarchy.screensaver \\\n      --config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \\\n      -e omarchy-cmd-screensaver\n    ;;\n  *ghostty*)\n    hyprctl dispatch exec -- \\\n      ghostty --class=org.omarchy.screensaver \\\n      --config-file=~/.local/share/omarchy/default/ghostty/screensaver \\\n      --font-size=18 \\\n      -e omarchy-cmd-screensaver\n    ;;\n  *kitty*)\n    hyprctl dispatch exec -- \\\n      kitty --class=org.omarchy.screensaver \\\n      --override font_size=18 \\\n      --override window_padding_width=0 \\\n      -e omarchy-cmd-screensaver\n    ;;\n  *)\n    notify-send \"✋  Screensaver only runs in Alacritty, Ghostty, or Kitty\"\n    ;;\n  esac\ndone\n\nhyprctl dispatch focusmonitor $focused\n"
  },
  {
    "path": "bin/omarchy-launch-tui",
    "content": "#!/bin/bash\n\n# Launch the TUI command passed in as an argument in the default terminal with an org.omarchy.COMMAND app id for styling.\n\nexec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.$(basename $1) -e \"$1\" \"${@:2}\"\n"
  },
  {
    "path": "bin/omarchy-launch-walker",
    "content": "#!/bin/bash\n\n# Launch the Walker application launcher while ensuring that it's data provider (called elephant) is running first.\n\n# Ensure elephant is running before launching walker\nif ! pgrep -x elephant > /dev/null; then\n  setsid uwsm-app -- elephant &\nfi\n\n# Ensure walker service is running\nif ! pgrep -f \"walker --gapplication-service\" > /dev/null; then\n  setsid uwsm-app -- walker --gapplication-service &\nfi\n\nexec walker --width 644 --maxheight 300 --minheight 300 \"$@\"\n"
  },
  {
    "path": "bin/omarchy-launch-webapp",
    "content": "#!/bin/bash\n\n# Launch the passed in URL as a web app in the default browser (or chromium if the default doesn't support --app).\n\nbrowser=$(xdg-settings get default-web-browser)\n\ncase $browser in\ngoogle-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi* | helium*) ;;\n*) browser=\"chromium.desktop\" ;;\nesac\n\nexec setsid uwsm-app -- $(sed -n 's/^Exec=\\([^ ]*\\).*/\\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$browser 2>/dev/null | head -1) --app=\"$1\" \"${@:2}\"\n"
  },
  {
    "path": "bin/omarchy-launch-wifi",
    "content": "#!/bin/bash\n\n# Launch the Omarchy wifi controls (provided by the Impala TUI).\n# Attempts to unblock the wifi service first in case it should be been blocked.\n\nrfkill unblock wifi\nomarchy-launch-or-focus-tui impala\n"
  },
  {
    "path": "bin/omarchy-lock-screen",
    "content": "#!/bin/bash\n\n# Locks the system using hyprlock, but not before ensuring 1password has also been locked, and the screensaver stopped.\n\n# Lock the screen\npidof hyprlock || hyprlock &\n\n# Set keyboard layout to default (first layout)\nhyprctl switchxkblayout all 0 > /dev/null 2>&1\n\n# Ensure 1password is locked\nif pgrep -x \"1password\" >/dev/null; then\n  1password --lock &\nfi\n\n# Avoid running screensaver when locked\npkill -f org.omarchy.screensaver\n"
  },
  {
    "path": "bin/omarchy-menu",
    "content": "#!/bin/bash\n\n# Launch the Omarchy Menu or takes a parameter to jump straight to a submenu.\n\nexport PATH=\"$HOME/.local/share/omarchy/bin:$PATH\"\n\n# Set to true when going directly to a submenu, so we can exit directly\nBACK_TO_EXIT=false\n\nback_to() {\n  local parent_menu=\"$1\"\n\n  if [[ $BACK_TO_EXIT == \"true\" ]]; then\n    exit 0\n  elif [[ -n $parent_menu ]]; then\n    \"$parent_menu\"\n  else\n    show_main_menu\n  fi\n}\n\ntoggle_existing_menu() {\n  if pgrep -f \"walker.*--dmenu\" >/dev/null; then\n    walker --close >/dev/null 2>&1\n    exit 0\n  fi\n}\n\nmenu() {\n  local prompt=\"$1\"\n  local options=\"$2\"\n  local extra=\"$3\"\n  local preselect=\"$4\"\n\n  read -r -a args <<<\"$extra\"\n\n  if [[ -n $preselect ]]; then\n    local index\n    index=$(echo -e \"$options\" | grep -nxF \"$preselect\" | cut -d: -f1)\n    if [[ -n $index ]]; then\n      args+=(\"-c\" \"$index\")\n    fi\n  fi\n\n  echo -e \"$options\" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 630 -p \"$prompt…\" \"${args[@]}\" 2>/dev/null\n}\n\nterminal() {\n  xdg-terminal-exec --app-id=org.omarchy.terminal \"$@\"\n}\n\npresent_terminal() {\n  omarchy-launch-floating-terminal-with-presentation $1\n}\n\nopen_in_editor() {\n  notify-send \"Editing config file\" \"$1\"\n  omarchy-launch-editor \"$1\"\n}\n\ninstall() {\n  present_terminal \"echo 'Installing $1...'; omarchy-pkg-add $2\"\n}\n\ninstall_and_launch() {\n  present_terminal \"echo 'Installing $1...'; omarchy-pkg-add $2 && setsid gtk-launch $3\"\n}\n\ninstall_font() {\n  present_terminal \"echo 'Installing $1...'; omarchy-pkg-add $2 && sleep 2 && omarchy-font-set '$3'\"\n}\n\ninstall_terminal() {\n  present_terminal \"omarchy-install-terminal $1\"\n}\n\naur_install() {\n  present_terminal \"echo 'Installing $1 from AUR...'; omarchy-pkg-aur-add $2\"\n}\n\naur_install_and_launch() {\n  present_terminal \"echo 'Installing $1 from AUR...'; omarchy-pkg-aur-add $2 && setsid gtk-launch $3\"\n}\n\nshow_learn_menu() {\n  case $(menu \"Learn\" \"  Keybindings\\n  Omarchy\\n  Hyprland\\n󰣇  Arch\\n  Neovim\\n󱆃  Bash\") in\n  *Keybindings*) omarchy-menu-keybindings ;;\n  *Omarchy*) omarchy-launch-webapp \"https://learn.omacom.io/2/the-omarchy-manual\" ;;\n  *Hyprland*) omarchy-launch-webapp \"https://wiki.hypr.land/\" ;;\n  *Arch*) omarchy-launch-webapp \"https://wiki.archlinux.org/title/Main_page\" ;;\n  *Bash*) omarchy-launch-webapp \"https://devhints.io/bash\" ;;\n  *Neovim*) omarchy-launch-webapp \"https://www.lazyvim.org/keymaps\" ;;\n  *) show_main_menu ;;\n  esac\n}\n\nshow_trigger_menu() {\n  case $(menu \"Trigger\" \"  Capture\\n  Share\\n󰔎  Toggle\\n  Hardware\") in\n  *Capture*) show_capture_menu ;;\n  *Share*) show_share_menu ;;\n  *Toggle*) show_toggle_menu ;;\n  *Hardware*) show_hardware_menu ;;\n  *) show_main_menu ;;\n  esac\n}\n\nshow_capture_menu() {\n  case $(menu \"Capture\" \"  Screenshot\\n  Screenrecord\\n󰃉  Color\") in\n  *Screenshot*) omarchy-cmd-screenshot ;;\n  *Screenrecord*) show_screenrecord_menu ;;\n  *Color*) pkill hyprpicker || hyprpicker -a ;;\n  *) back_to show_trigger_menu ;;\n  esac\n}\n\nget_webcam_list() {\n  v4l2-ctl --list-devices 2>/dev/null | while IFS= read -r line; do\n    if [[ $line != $'\\t'* && -n $line ]]; then\n      local name=\"$line\"\n      IFS= read -r device || break\n      device=$(echo \"$device\" | tr -d '\\t' | head -1)\n      [[ -n $device ]] && echo \"$device  $name\"\n    fi\n  done\n}\n\nshow_webcam_select_menu() {\n  local devices=$(get_webcam_list)\n  local count=$(echo \"$devices\" | grep -c . 2>/dev/null || echo 0)\n\n  if [[ -z $devices ]] || ((count == 0)); then\n    notify-send \"No webcam devices found\" -u critical -t 3000\n    return 1\n  fi\n\n  if ((count == 1)); then\n    echo \"$devices\" | awk '{print $1}'\n  else\n    menu \"Select Webcam\" \"$devices\" | awk '{print $1}'\n  fi\n}\n\nshow_screenrecord_menu() {\n  omarchy-cmd-screenrecord --stop-recording && exit 0\n\n  case $(menu \"Screenrecord\" \"  With no audio\\n  With desktop audio\\n  With desktop + microphone audio\\n  With desktop + microphone audio + webcam\") in\n  *\"With no audio\") omarchy-cmd-screenrecord ;;\n  *\"With desktop audio\") omarchy-cmd-screenrecord --with-desktop-audio ;;\n  *\"With desktop + microphone audio\") omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio ;;\n  *\"With desktop + microphone audio + webcam\")\n    local device=$(show_webcam_select_menu) || {\n      back_to show_capture_menu\n      return\n    }\n    omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam --webcam-device=\"$device\"\n    ;;\n  *) back_to show_capture_menu ;;\n  esac\n}\n\nshow_share_menu() {\n  case $(menu \"Share\" \"  Clipboard\\n  File \\n  Folder\") in\n  *Clipboard*) omarchy-cmd-share clipboard ;;\n  *File*) terminal bash -c \"omarchy-cmd-share file\" ;;\n  *Folder*) terminal bash -c \"omarchy-cmd-share folder\" ;;\n  *) back_to show_trigger_menu ;;\n  esac\n}\n\nshow_toggle_menu() {\n  case $(menu \"Toggle\" \"󱄄  Screensaver\\n󰔎  Nightlight\\n󱫖  Idle Lock\\n󰍜  Top Bar\\n󱂬  Workspace Layout\\n  Window Gaps\\n  1-Window Ratio\\n󰍹  Display Scaling\") in\n\n  *Screensaver*) omarchy-toggle-screensaver ;;\n  *Nightlight*) omarchy-toggle-nightlight ;;\n  *Idle*) omarchy-toggle-idle ;;\n  *Bar*) omarchy-toggle-waybar ;;\n  *Layout*) omarchy-hyprland-workspace-layout-toggle ;;\n  *Ratio*) omarchy-hyprland-window-single-square-aspect-toggle ;;\n  *Gaps*) omarchy-hyprland-window-gaps-toggle ;;\n  *Scaling*) omarchy-hyprland-monitor-scaling-cycle ;;\n  *) back_to show_trigger_menu ;;\n  esac\n}\n\nshow_hardware_menu() {\n  case $(menu \"Toggle\" \"  Hybrid GPU\") in\n  *\"Hybrid GPU\"*) present_terminal omarchy-toggle-hybrid-gpu ;;\n  *) show_trigger_menu ;;\n  esac\n}\n\nshow_style_menu() {\n  case $(menu \"Style\" \"󰸌  Theme\\n  Font\\n  Background\\n  Hyprland\\n󱄄  Screensaver\\n  About\") in\n  *Theme*) show_theme_menu ;;\n  *Font*) show_font_menu ;;\n  *Background*) show_background_menu ;;\n  *Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;;\n  *Screensaver*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;;\n  *About*) open_in_editor ~/.config/omarchy/branding/about.txt ;;\n  *) show_main_menu ;;\n  esac\n}\n\nshow_theme_menu() {\n  omarchy-launch-walker -m menus:omarchythemes --width 800 --minheight 400\n}\n\nshow_background_menu() {\n  omarchy-launch-walker -m menus:omarchyBackgroundSelector --width 800 --minheight 400\n}\n\nshow_font_menu() {\n  theme=$(menu \"Font\" \"$(omarchy-font-list)\" \"--width 350\" \"$(omarchy-font-current)\")\n  if [[ $theme == \"CNCLD\" || -z $theme ]]; then\n    back_to show_style_menu\n  else\n    omarchy-font-set \"$theme\"\n  fi\n}\n\nshow_setup_menu() {\n  local options=\"  Audio\\n  Wifi\\n󰂯  Bluetooth\\n󱐋  Power Profile\\n  System Sleep\\n󰍹  Monitors\"\n  [[ -f ~/.config/hypr/bindings.conf ]] && options=\"$options\\n  Keybindings\"\n  options=\"$options\\n  Key Remapping\"\n  [[ -f ~/.config/hypr/input.conf ]] && options=\"$options\\n  Input\"\n  options=\"$options\\n󰱔  DNS\\n  Security\\n  Config\"\n\n  case $(menu \"Setup\" \"$options\") in\n  *Audio*) omarchy-launch-audio ;;\n  *Wifi*) omarchy-launch-wifi ;;\n  *Bluetooth*) omarchy-launch-bluetooth ;;\n  *Power*) show_setup_power_menu ;;\n  *System*) show_setup_system_menu ;;\n  *Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;;\n  *Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;;\n  *Input*) open_in_editor ~/.config/hypr/input.conf ;;\n  *Key\\ Remapping*) omarchy-setup-makima && open_in_editor \"$HOME/.config/makima/AT Translated Set 2 keyboard.toml\" && omarchy-restart-makima ;;\n  *DNS*) present_terminal omarchy-setup-dns ;;\n  *Security*) show_setup_security_menu ;;\n  *Config*) show_setup_config_menu ;;\n  *) show_main_menu ;;\n  esac\n}\n\nshow_setup_power_menu() {\n  profile=$(menu \"Power Profile\" \"$(omarchy-powerprofiles-list)\" \"\" \"$(powerprofilesctl get)\")\n\n  if [[ $profile == \"CNCLD\" || -z $profile ]]; then\n    back_to show_setup_menu\n  else\n    powerprofilesctl set \"$profile\"\n  fi\n}\n\nshow_setup_security_menu() {\n  case $(menu \"Setup\" \"󰈷  Fingerprint\\n  Fido2\") in\n  *Fingerprint*) present_terminal omarchy-setup-fingerprint ;;\n  *Fido2*) present_terminal omarchy-setup-fido2 ;;\n  *) show_setup_menu ;;\n  esac\n}\n\nshow_setup_config_menu() {\n  case $(menu \"Setup\" \"  Defaults\\n  Hyprland\\n  Hypridle\\n  Hyprlock\\n  Hyprsunset\\n  Swayosd\\n󰌧  Walker\\n󰍜  Waybar\\n󰞅  XCompose\") in\n  *Defaults*) open_in_editor ~/.config/uwsm/default ;;\n  *Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;;\n  *Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;;\n  *Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;;\n  *Hyprsunset*) open_in_editor ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;;\n  *Swayosd*) open_in_editor ~/.config/swayosd/config.toml && omarchy-restart-swayosd ;;\n  *Walker*) open_in_editor ~/.config/walker/config.toml && omarchy-restart-walker ;;\n  *Waybar*) open_in_editor ~/.config/waybar/config.jsonc && omarchy-restart-waybar ;;\n  *XCompose*) open_in_editor ~/.XCompose && omarchy-restart-xcompose ;;\n  *) show_setup_menu ;;\n  esac\n}\n\nshow_setup_system_menu() {\n  local options=\"\"\n\n  if [[ -f ~/.local/state/omarchy/toggles/suspend-off ]]; then\n    options=\"$options󰒲  Enable Suspend\"\n  else\n    options=\"$options󰒲  Disable Suspend\"\n  fi\n\n  if omarchy-hibernation-available; then\n    options=\"$options\\n󰤁  Disable Hibernate\"\n  else\n    options=\"$options\\n󰤁  Enable Hibernate\"\n  fi\n\n  case $(menu \"System\" \"$options\") in\n  *Suspend*) omarchy-toggle-suspend ;;\n  *\"Enable Hibernate\"*) present_terminal omarchy-hibernation-setup ;;\n  *\"Disable Hibernate\"*) present_terminal omarchy-hibernation-remove ;;\n  *) show_setup_menu ;;\n  esac\n}\n\nshow_install_menu() {\n  case $(menu \"Install\" \"󰣇  Package\\n󰣇  AUR\\n  Web App\\n  TUI\\n  Service\\n  Style\\n󰵮  Development\\n  Editor\\n  Terminal\\n󱚤  AI\\n󰍲  Windows\\n  Gaming\") in\n  *Package*) terminal omarchy-pkg-install ;;\n  *AUR*) terminal omarchy-pkg-aur-install ;;\n  *Web*) present_terminal omarchy-webapp-install ;;\n  *TUI*) present_terminal omarchy-tui-install ;;\n  *Service*) show_install_service_menu ;;\n  *Style*) show_install_style_menu ;;\n  *Development*) show_install_development_menu ;;\n  *Editor*) show_install_editor_menu ;;\n  *Terminal*) show_install_terminal_menu ;;\n  *AI*) show_install_ai_menu ;;\n  *Windows*) present_terminal \"omarchy-windows-vm install\" ;;\n  *Gaming*) show_install_gaming_menu ;;\n  *) show_main_menu ;;\n  esac\n}\n\nshow_install_service_menu() {\n  case $(menu \"Install\" \"  Dropbox\\n  Tailscale\\n󱇱  NordVPN [AUR]\\n󰟵  Bitwarden\\n  Chromium Account\") in\n  *Dropbox*) present_terminal omarchy-install-dropbox ;;\n  *Tailscale*) present_terminal omarchy-install-tailscale ;;\n  *NordVPN*) present_terminal omarchy-install-nordvpn ;;\n  *Bitwarden*) install_and_launch \"Bitwarden\" \"bitwarden bitwarden-cli\" \"bitwarden\" ;;\n  *Chromium*) present_terminal omarchy-install-chromium-google-account ;;\n  *) show_install_menu ;;\n  esac\n}\n\nshow_install_editor_menu() {\n  case $(menu \"Install\" \"  VSCode\\n  Cursor\\n  Zed\\n  Sublime Text\\n  Helix\\n  Emacs\") in\n  *VSCode*) present_terminal omarchy-install-vscode ;;\n  *Cursor*) install_and_launch \"Cursor\" \"cursor-bin\" \"cursor\" ;;\n  *Zed*) install_and_launch \"Zed\" \"zed\" \"dev.zed.Zed\" ;;\n  *Sublime*) install_and_launch \"Sublime Text\" \"sublime-text-4\" \"sublime_text\" ;;\n  *Helix*) install \"Helix\" \"helix\" ;;\n  *Emacs*) install \"Emacs\" \"emacs-wayland\" && systemctl --user enable --now emacs.service ;;\n  *) show_install_menu ;;\n  esac\n}\n\nshow_install_terminal_menu() {\n  case $(menu \"Install\" \"  Alacritty\\n  Ghostty\\n  Kitty\") in\n  *Alacritty*) install_terminal \"alacritty\" ;;\n  *Ghostty*) install_terminal \"ghostty\" ;;\n  *Kitty*) install_terminal \"kitty\" ;;\n  *) show_install_menu ;;\n  esac\n}\n\nshow_install_ai_menu() {\n  ollama_pkg=$(\n    (command -v nvidia-smi &>/dev/null && echo ollama-cuda) ||\n      (command -v rocminfo &>/dev/null && echo ollama-rocm) ||\n      echo ollama\n  )\n\n  case $(menu \"Install\" \"  Dictation\\n󱚤  LM Studio\\n󱚤  Ollama\\n󱚤  Crush\") in\n  *Dictation*) present_terminal omarchy-voxtype-install ;;\n  *Studio*) install \"LM Studio\" \"lmstudio-bin\" ;;\n  *Ollama*) install \"Ollama\" $ollama_pkg ;;\n  *Crush*) install \"Crush\" \"crush-bin\" ;;\n  *) show_install_menu ;;\n  esac\n}\n\nshow_install_gaming_menu() {\n  case $(menu \"Install\" \"  Steam\\n󰢹  NVIDIA GeForce NOW\\n  RetroArch [AUR]\\n󰍳  Minecraft\\n󰖺  Xbox Controller [AUR]\") in\n  *Steam*) present_terminal omarchy-install-steam ;;\n  *GeForce*) present_terminal omarchy-install-geforce-now ;;\n  *RetroArch*) aur_install_and_launch \"RetroArch\" \"retroarch retroarch-assets libretro libretro-fbneo\" \"com.libretro.RetroArch.desktop\" ;;\n  *Minecraft*) install_and_launch \"Minecraft\" \"minecraft-launcher\" \"minecraft-launcher\" ;;\n  *Xbox*) present_terminal omarchy-install-xbox-controllers ;;\n  *) show_install_menu ;;\n  esac\n}\n\nshow_install_style_menu() {\n  case $(menu \"Install\" \"󰸌  Theme\\n  Background\\n  Font\") in\n  *Theme*) present_terminal omarchy-theme-install ;;\n  *Background*) omarchy-theme-bg-install ;;\n  *Font*) show_install_font_menu ;;\n  *) show_install_menu ;;\n  esac\n}\n\nshow_install_font_menu() {\n  case $(menu \"Install\" \"  Cascadia Mono\\n  Meslo LG Mono\\n  Fira Code\\n  Victor Code\\n  Bistream Vera Mono\\n  Iosevka\" \"--width 350\") in\n  *Cascadia*) install_font \"Cascadia Mono\" \"ttf-cascadia-mono-nerd\" \"CaskaydiaMono Nerd Font\" ;;\n  *Meslo*) install_font \"Meslo LG Mono\" \"ttf-meslo-nerd\" \"MesloLGL Nerd Font\" ;;\n  *Fira*) install_font \"Fira Code\" \"ttf-firacode-nerd\" \"FiraCode Nerd Font\" ;;\n  *Victor*) install_font \"Victor Code\" \"ttf-victor-mono-nerd\" \"VictorMono Nerd Font\" ;;\n  *Bistream*) install_font \"Bistream Vera Code\" \"ttf-bitstream-vera-mono-nerd\" \"BitstromWera Nerd Font\" ;;\n  *Iosevka*) install_font \"Iosevka\" \"ttf-iosevka-nerd\" \"Iosevka Nerd Font Mono\" ;;\n  *) show_install_menu ;;\n  esac\n}\n\nshow_install_development_menu() {\n  case $(menu \"Install\" \"󰫏  Ruby on Rails\\n  Docker DB\\n  JavaScript\\n  Go\\n  PHP\\n  Python\\n  Elixir\\n  Zig\\n  Rust\\n  Java\\n  .NET\\n  OCaml\\n  Clojure\\n  Scala\") in\n  *Rails*) present_terminal \"omarchy-install-dev-env ruby\" ;;\n  *Docker*) present_terminal omarchy-install-docker-dbs ;;\n  *JavaScript*) show_install_javascript_menu ;;\n  *Go*) present_terminal \"omarchy-install-dev-env go\" ;;\n  *PHP*) show_install_php_menu ;;\n  *Python*) present_terminal \"omarchy-install-dev-env python\" ;;\n  *Elixir*) show_install_elixir_menu ;;\n  *Zig*) present_terminal \"omarchy-install-dev-env zig\" ;;\n  *Rust*) present_terminal \"omarchy-install-dev-env rust\" ;;\n  *Java*) present_terminal \"omarchy-install-dev-env java\" ;;\n  *NET*) present_terminal \"omarchy-install-dev-env dotnet\" ;;\n  *OCaml*) present_terminal \"omarchy-install-dev-env ocaml\" ;;\n  *Clojure*) present_terminal \"omarchy-install-dev-env clojure\" ;;\n  *Scala*) present_terminal \"omarchy-install-dev-env scala\" ;;\n  *) show_install_menu ;;\n  esac\n}\n\nshow_install_javascript_menu() {\n  case $(menu \"Install\" \"  Node.js\\n  Bun\\n  Deno\") in\n  *Node*) present_terminal \"omarchy-install-dev-env node\" ;;\n  *Bun*) present_terminal \"omarchy-install-dev-env bun\" ;;\n  *Deno*) present_terminal \"omarchy-install-dev-env deno\" ;;\n  *) show_install_development_menu ;;\n  esac\n}\n\nshow_install_php_menu() {\n  case $(menu \"Install\" \"  PHP\\n  Laravel\\n  Symfony\") in\n  *PHP*) present_terminal \"omarchy-install-dev-env php\" ;;\n  *Laravel*) present_terminal \"omarchy-install-dev-env laravel\" ;;\n  *Symfony*) present_terminal \"omarchy-install-dev-env symfony\" ;;\n  *) show_install_development_menu ;;\n  esac\n}\n\nshow_install_elixir_menu() {\n  case $(menu \"Install\" \"  Elixir\\n  Phoenix\") in\n  *Elixir*) present_terminal \"omarchy-install-dev-env elixir\" ;;\n  *Phoenix*) present_terminal \"omarchy-install-dev-env phoenix\" ;;\n  *) show_install_development_menu ;;\n  esac\n}\n\nshow_remove_menu() {\n  case $(menu \"Remove\" \"󰣇  Package\\n  Web App\\n  TUI\\n󰵮  Development\\n󰏓  Preinstalls\\n  Dictation\\n󰸌  Theme\\n󰍲  Windows\\n󰈷  Fingerprint\\n  Fido2\") in\n  *Package*) terminal omarchy-pkg-remove ;;\n  *Web*) present_terminal omarchy-webapp-remove ;;\n  *TUI*) present_terminal omarchy-tui-remove ;;\n  *Development*) show_remove_development_menu ;;\n  *Preinstalls*) present_terminal omarchy-remove-preinstalls ;;\n  *Dictation*) present_terminal omarchy-voxtype-remove ;;\n  *Theme*) present_terminal omarchy-theme-remove ;;\n  *Windows*) present_terminal \"omarchy-windows-vm remove\" ;;\n  *Fingerprint*) present_terminal \"omarchy-setup-fingerprint --remove\" ;;\n  *Fido2*) present_terminal \"omarchy-setup-fido2 --remove\" ;;\n  *) show_main_menu ;;\n  esac\n}\n\nshow_remove_development_menu() {\n  case $(menu \"Remove\" \"󰫏  Ruby on Rails\\n  JavaScript\\n  Go\\n  PHP\\n  Python\\n  Elixir\\n  Zig\\n  Rust\\n  Java\\n  .NET\\n  OCaml\\n  Clojure\\n  Scala\") in\n  *Rails*) present_terminal \"omarchy-remove-dev-env ruby\" ;;\n  *JavaScript*) show_remove_javascript_menu ;;\n  *Go*) present_terminal \"omarchy-remove-dev-env go\" ;;\n  *PHP*) show_remove_php_menu ;;\n  *Python*) present_terminal \"omarchy-remove-dev-env python\" ;;\n  *Elixir*) show_remove_elixir_menu ;;\n  *Zig*) present_terminal \"omarchy-remove-dev-env zig\" ;;\n  *Rust*) present_terminal \"omarchy-remove-dev-env rust\" ;;\n  *Java*) present_terminal \"omarchy-remove-dev-env java\" ;;\n  *NET*) present_terminal \"omarchy-remove-dev-env dotnet\" ;;\n  *OCaml*) present_terminal \"omarchy-remove-dev-env ocaml\" ;;\n  *Clojure*) present_terminal \"omarchy-remove-dev-env clojure\" ;;\n  *Scala*) present_terminal \"omarchy-remove-dev-env scala\" ;;\n  *) show_remove_menu ;;\n  esac\n}\n\nshow_remove_javascript_menu() {\n  case $(menu \"Remove\" \"  Node.js\\n  Bun\\n  Deno\") in\n  *Node*) present_terminal \"omarchy-remove-dev-env node\" ;;\n  *Bun*) present_terminal \"omarchy-remove-dev-env bun\" ;;\n  *Deno*) present_terminal \"omarchy-remove-dev-env deno\" ;;\n  *) show_remove_development_menu ;;\n  esac\n}\n\nshow_remove_php_menu() {\n  case $(menu \"Remove\" \"  PHP\\n  Laravel\\n  Symfony\") in\n  *PHP*) present_terminal \"omarchy-remove-dev-env php\" ;;\n  *Laravel*) present_terminal \"omarchy-remove-dev-env laravel\" ;;\n  *Symfony*) present_terminal \"omarchy-remove-dev-env symfony\" ;;\n  *) show_remove_development_menu ;;\n  esac\n}\n\nshow_remove_elixir_menu() {\n  case $(menu \"Remove\" \"  Elixir\\n  Phoenix\") in\n  *Elixir*) present_terminal \"omarchy-remove-dev-env elixir\" ;;\n  *Phoenix*) present_terminal \"omarchy-remove-dev-env phoenix\" ;;\n  *) show_remove_development_menu ;;\n  esac\n}\n\nshow_update_menu() {\n  case $(menu \"Update\" \"  Omarchy\\n󰔫  Channel\\n  Config\\n󰸌  Extra Themes\\n  Process\\n󰇅  Hardware\\n  Firmware\\n  Password\\n  Timezone\\n  Time\") in\n  *Omarchy*) present_terminal omarchy-update ;;\n  *Channel*) show_update_channel_menu ;;\n  *Config*) show_update_config_menu ;;\n  *Themes*) present_terminal omarchy-theme-update ;;\n  *Process*) show_update_process_menu ;;\n  *Hardware*) show_update_hardware_menu ;;\n  *Firmware*) present_terminal omarchy-update-firmware ;;\n  *Timezone*) present_terminal omarchy-tz-select ;;\n  *Time*) present_terminal omarchy-update-time ;;\n  *Password*) show_update_password_menu ;;\n  *) show_main_menu ;;\n  esac\n}\n\nshow_update_channel_menu() {\n  case $(menu \"Update channel\" \"🟢 Stable\\n🟡 RC\\n🟠 Edge\\n🔴 Dev\") in\n  *Stable*) present_terminal \"omarchy-channel-set stable\" ;;\n  *RC*) present_terminal \"omarchy-channel-set rc\" ;;\n  *Edge*) present_terminal \"omarchy-channel-set edge\" ;;\n  *Dev*) present_terminal \"omarchy-channel-set dev\" ;;\n  *) show_update_menu ;;\n  esac\n}\nshow_update_process_menu() {\n  case $(menu \"Restart\" \"  Hypridle\\n  Hyprsunset\\n  Swayosd\\n󰌧  Walker\\n󰍜  Waybar\") in\n  *Hypridle*) omarchy-restart-hypridle ;;\n  *Hyprsunset*) omarchy-restart-hyprsunset ;;\n  *Swayosd*) omarchy-restart-swayosd ;;\n  *Walker*) omarchy-restart-walker ;;\n  *Waybar*) omarchy-restart-waybar ;;\n  *) show_update_menu ;;\n  esac\n}\n\nshow_update_config_menu() {\n  case $(menu \"Use default config\" \"  Hyprland\\n  Hypridle\\n  Hyprlock\\n  Hyprsunset\\n󱣴  Plymouth\\n  Swayosd\\n  Tmux\\n󰌧  Walker\\n󰍜  Waybar\") in\n  *Hyprland*) present_terminal omarchy-refresh-hyprland ;;\n  *Hypridle*) present_terminal omarchy-refresh-hypridle ;;\n  *Hyprlock*) present_terminal omarchy-refresh-hyprlock ;;\n  *Hyprsunset*) present_terminal omarchy-refresh-hyprsunset ;;\n  *Plymouth*) present_terminal omarchy-refresh-plymouth ;;\n  *Swayosd*) present_terminal omarchy-refresh-swayosd ;;\n  *Tmux*) present_terminal omarchy-refresh-tmux ;;\n  *Walker*) present_terminal omarchy-refresh-walker ;;\n  *Waybar*) present_terminal omarchy-refresh-waybar ;;\n  *) show_update_menu ;;\n  esac\n}\n\nshow_update_hardware_menu() {\n  case $(menu \"Restart\" \"  Audio\\n󱚾  Wi-Fi\\n󰂯  Bluetooth\") in\n  *Audio*) present_terminal omarchy-restart-pipewire ;;\n  *Wi-Fi*) present_terminal omarchy-restart-wifi ;;\n  *Bluetooth*) present_terminal omarchy-restart-bluetooth ;;\n  *) show_update_menu ;;\n  esac\n}\n\nshow_update_password_menu() {\n  case $(menu \"Update Password\" \"  Drive Encryption\\n  User\") in\n  *Drive*) present_terminal omarchy-drive-set-password ;;\n  *User*) present_terminal passwd ;;\n  *) show_update_menu ;;\n  esac\n}\n\nshow_about() {\n  omarchy-launch-about\n}\n\nshow_system_menu() {\n  local options=\"󱄄  Screensaver\\n  Lock\"\n  [[ ! -f ~/.local/state/omarchy/toggles/suspend-off ]] && options=\"$options\\n󰒲  Suspend\"\n  omarchy-hibernation-available && options=\"$options\\n󰤁  Hibernate\"\n  options=\"$options\\n󰍃  Logout\\n󰜉  Restart\\n󰐥  Shutdown\"\n\n  case $(menu \"System\" \"$options\") in\n  *Screensaver*) omarchy-launch-screensaver force ;;\n  *Lock*) omarchy-lock-screen ;;\n  *Suspend*) systemctl suspend ;;\n  *Hibernate*) systemctl hibernate ;;\n  *Logout*) omarchy-system-logout ;;\n  *Restart*) omarchy-system-reboot ;;\n  *Shutdown*) omarchy-system-shutdown ;;\n  *) back_to show_main_menu ;;\n  esac\n}\n\nshow_main_menu() {\n  go_to_menu \"$(menu \"Go\" \"󰀻  Apps\\n󰧑  Learn\\n󱓞  Trigger\\n  Style\\n  Setup\\n󰉉  Install\\n󰭌  Remove\\n  Update\\n  About\\n  System\")\"\n}\n\ngo_to_menu() {\n  case \"${1,,}\" in\n  *apps*) walker -p \"Launch…\" ;;\n  *learn*) show_learn_menu ;;\n  *trigger*) show_trigger_menu ;;\n  *toggle*) show_toggle_menu ;;\n  *share*) show_share_menu ;;\n  *background*) show_background_menu ;;\n  *capture*) show_capture_menu ;;\n  *style*) show_style_menu ;;\n  *theme*) show_theme_menu ;;\n  *screenrecord*) show_screenrecord_menu ;;\n  *setup*) show_setup_menu ;;\n  *power*) show_setup_power_menu ;;\n  *install*) show_install_menu ;;\n  *remove*) show_remove_menu ;;\n  *update*) show_update_menu ;;\n  *about*) show_about ;;\n  *system*) show_system_menu ;;\n  esac\n}\n\n# Allow user extensions and overrides\nUSER_EXTENSIONS=\"$HOME/.config/omarchy/extensions/menu.sh\"\n[[ -f $USER_EXTENSIONS ]] && source \"$USER_EXTENSIONS\"\n\ntoggle_existing_menu\n\nif [[ -n $1 ]]; then\n  BACK_TO_EXIT=true\n  go_to_menu \"$1\"\nelse\n  show_main_menu\nfi\n"
  },
  {
    "path": "bin/omarchy-menu-keybindings",
    "content": "#!/bin/bash\n\n# Display Hyprland keybindings defined in your configuration using walker for an interactive search menu.\n\ndeclare -A KEYCODE_SYM_MAP\n\nbuild_keymap_cache() {\n  local keymap\n  keymap=\"$(xkbcli compile-keymap)\" || {\n    echo \"Failed to compile keymap\" >&2\n    return 1\n  }\n\n  while IFS=, read -r code sym; do\n    [[ -z $code || -z $sym ]] && continue\n    KEYCODE_SYM_MAP[\"$code\"]=\"$sym\"\n  done < <(\n    awk '\n      BEGIN { sec = \"\" }\n      /xkb_keycodes/ { sec = \"codes\"; next }\n      /xkb_symbols/  { sec = \"syms\";  next }\n      sec == \"codes\" {\n        if (match($0, /<([A-Za-z0-9_]+)>\\s*=\\s*([0-9]+)\\s*;/, m)) code_by_name[m[1]] = m[2]\n      }\n      sec == \"syms\" {\n        if (match($0, /key\\s*<([A-Za-z0-9_]+)>\\s*\\{\\s*\\[\\s*([^, \\]]+)/, m)) sym_by_name[m[1]] = m[2]\n      }\n      END {\n        for (k in code_by_name) {\n          c = code_by_name[k]\n          s = sym_by_name[k]\n          if (c != \"\" && s != \"\" && s != \"NoSymbol\") print c \",\" s\n        }\n      }\n    ' <<<\"$keymap\"\n  )\n}\n\nlookup_keycode_cached() {\n  printf '%s\\n' \"${KEYCODE_SYM_MAP[$1]}\"\n}\n\nparse_keycodes() {\n  local start end elapsed\n  [[ ${DEBUG:-0} == \"1\" ]] && start=$(date +%s.%N)\n  while IFS= read -r line; do\n    if [[ $line =~ code:([0-9]+) ]]; then\n      code=\"${BASH_REMATCH[1]}\"\n      symbol=$(lookup_keycode_cached \"$code\" \"$XKB_KEYMAP_CACHE\")\n      echo \"${line/code:${code}/$symbol}\"\n    elif [[ $line =~ mouse:([0-9]+) ]]; then\n      code=\"${BASH_REMATCH[1]}\"\n\n      case \"$code\" in\n        272) symbol=\"LEFT MOUSE BUTTON\" ;;\n        273) symbol=\"RIGHT MOUSE BUTTON\" ;;\n        274) symbol=\"MIDDLE MOUSE BUTTON\" ;;\n        *)   symbol=\"mouse:${code}\" ;;\n      esac\n\n      echo \"${line/mouse:${code}/$symbol}\"\n    else\n      echo \"$line\"\n    fi\n  done\n\n  if [[ $DEBUG == \"1\" ]]; then\n    end=$(date +%s.%N)\n    # fall back to awk if bc is missing\n    if command -v bc >/dev/null 2>&1; then\n      elapsed=$(echo \"$end - $start\" | bc)\n    else\n      elapsed=$(awk -v s=\"$start\" -v e=\"$end\" 'BEGIN{printf \"%.6f\", (e - s)}')\n    fi\n    echo \"[DEBUG] parse_keycodes elapsed: ${elapsed}s\" >&2\n  fi\n}\n\n# Fetch dynamic keybindings from Hyprland\n#\n# Also do some pre-processing:\n# - Remove standard Omarchy bin path prefix\n# - Remove uwsm prefix\n# - Map numeric modifier key mask to a textual rendition\n# - Output comma-separated values that the parser can understand\ndynamic_bindings() {\n  hyprctl -j binds |\n    jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | \"\\(.modmask),\\(.key)@\\(.keycode),\\(.description),\\(.dispatcher),\\(.arg)\"' |\n    sed -r \\\n      -e 's/null//' \\\n      -e 's,~/.local/share/omarchy/bin/,,' \\\n      -e 's,uwsm app -- ,,' \\\n      -e 's,uwsm-app -- ,,' \\\n      -e 's/@0//' \\\n      -e 's/,@/,code:/' \\\n      -e 's/^0,/,/' \\\n      -e 's/^1,/SHIFT,/' \\\n      -e 's/^4,/CTRL,/' \\\n      -e 's/^5,/SHIFT CTRL,/' \\\n      -e 's/^8,/ALT,/' \\\n      -e 's/^9,/SHIFT ALT,/' \\\n      -e 's/^12,/CTRL ALT,/' \\\n      -e 's/^13,/SHIFT CTRL ALT,/' \\\n      -e 's/^64,/SUPER,/' \\\n      -e 's/^65,/SUPER SHIFT,/' \\\n      -e 's/^68,/SUPER CTRL,/' \\\n      -e 's/^69,/SUPER SHIFT CTRL,/' \\\n      -e 's/^72,/SUPER ALT,/' \\\n      -e 's/^73,/SUPER SHIFT ALT,/' \\\n      -e 's/^76,/SUPER CTRL ALT,/' \\\n      -e 's/^77,/SUPER SHIFT CTRL ALT,/'\n}\n\n# Hardcoded bindings, like the copy-url extension and such\nstatic_bindings() {\n    echo \"SHIFT ALT,L,Copy URL from Web App,extension,copy-url\"\n}\n\n# Parse and format keybindings\n#\n# `awk` does the heavy lifting:\n# - Set the field separator to a comma ','.\n# - Joins the key combination (e.g., \"SUPER + Q\").\n# - Joins the command that the key executes.\n# - Prints everything in a nicely aligned format.\nparse_bindings() {\n  awk -F, '\n{\n    # Combine the modifier and key (first two fields)\n    key_combo = $1 \" + \" $2;\n\n    # Clean up: strip leading \"+\" if present, trim spaces\n    gsub(/^[ \\t]*\\+?[ \\t]*/, \"\", key_combo);\n    gsub(/[ \\t]+$/, \"\", key_combo);\n\n    # Use description, if set\n    action = $3;\n\n    if (action == \"\") {\n        # Reconstruct the command from the remaining fields\n        for (i = 4; i <= NF; i++) {\n            action = action $i (i < NF ? \",\" : \"\");\n        }\n\n        # Clean up trailing commas, remove leading \"exec, \", and trim\n        sub(/,$/, \"\", action);\n        gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, \"\", action);\n        gsub(/^[ \\t]+|[ \\t]+$/, \"\", action);\n        gsub(/[ \\t]+/, \" \", key_combo);  # Collapse multiple spaces to one\n\n        # Escape XML entities\n        gsub(/&/, \"\\\\&amp;\", action);\n        gsub(/</, \"\\\\&lt;\", action);\n        gsub(/>/, \"\\\\&gt;\", action);\n        gsub(/\"/, \"\\\\&quot;\", action);\n        gsub(/'\"'\"'/, \"\\\\&apos;\", action);\n    }\n\n    if (action != \"\") {\n        printf \"%-35s → %s\\n\", key_combo, action;\n    }\n}'\n}\n\nprioritize_entries() {\n  awk '\n  {\n    line = $0\n    prio = 50\n    if (match(line, /Terminal/)) prio = 0\n    if (match(line, /Tmux/)) prio = 1\n    if (match(line, /Browser/) && !match(line, /Browser[[:space:]]*\\(/) && !match(line, /SUPER SHIFT.*\\+.*B.*→.*Browser/)) prio = 2\n    if (match(line, /File manager/) && !match(line, /File manager \\(cwd\\)/))  prio = 3\n    if (match(line, /Launch apps/))  prio = 4\n    if (match(line, /Omarchy menu/))  prio = 5\n    if (match(line, /System menu/))  prio = 6\n    if (match(line, /Theme menu/))  prio = 7\n    if (match(line, /Full screen/))  prio = 8\n    if (match(line, /Full width/))  prio = 9\n    if (match(line, /Close window/))  prio = 10\n    if (match(line, /Close all windows/))  prio = 11\n    if (match(line, /Lock system/))  prio = 12\n    if (match(line, /Toggle window floating/))  prio = 13\n    if (match(line, /Toggle window split/))  prio = 14\n    if (match(line, /Pop window/))  prio = 15\n    if (match(line, /Universal/))  prio = 16\n    if (match(line, /Clipboard/))  prio = 17\n    if (match(line, /Audio controls/))  prio = 18\n    if (match(line, /Bluetooth controls/))  prio = 19\n    if (match(line, /Wifi controls/))  prio = 20\n    if (match(line, /Emoji picker/))  prio = 21\n    if (match(line, /Color picker/))  prio = 22\n    if (match(line, /Screenshot/))  prio = 23\n    if (match(line, /Screenrecording/))  prio = 24\n    if (match(line, /SUPER SHIFT.*\\+.*B.*→.*Browser/)) prio = 25\n    if (match(line, /File manager \\(cwd\\)/))  prio = 26\n    if (match(line, /(Switch|Next|Former|Previous).*workspace/))  prio = 27\n    if (match(line, /Move window to workspace/))  prio = 28\n    if (match(line, /Move window silently to workspace/))  prio = 29\n    if (match(line, /Swap window/))  prio = 30\n    if (match(line, /Move window focus/))  prio = 31\n    if (match(line, /Move window$/))  prio = 32\n    if (match(line, /Resize window/))  prio = 33\n    if (match(line, /Expand window/))  prio = 34\n    if (match(line, /Shrink window/))  prio = 35\n    if (match(line, /scratchpad/))  prio = 36\n    if (match(line, /notification/))  prio = 37\n    if (match(line, /Toggle window transparency/))  prio = 38\n    if (match(line, /Toggle workspace gaps/))  prio = 39\n    if (match(line, /Toggle nightlight/))  prio = 40\n    if (match(line, /Toggle locking/))  prio = 41\n    if (match(line, /group/))  prio = 94\n    if (match(line, /Scroll active workspace/))  prio = 95\n    if (match(line, /Cycle to/))  prio = 96\n    if (match(line, /Reveal active/))  prio = 97\n    if (match(line, /Apple Display/))  prio = 98\n    if (match(line, /XF86/))  prio = 99\n\n    # print \"priority<TAB>line\"\n    printf \"%d\\t%s\\n\", prio, line\n  }' |\n  sort -k1,1n -k2,2 |\n  cut -f2-\n}\n\noutput_keybindings() {\n  build_keymap_cache\n\n  {\n    dynamic_bindings\n    static_bindings\n  } |\n    sort -u |\n    parse_keycodes |\n    parse_bindings |\n    prioritize_entries\n}\n\nif [[ $1 == \"--print\" || $1 == \"-p\" ]]; then\n  output_keybindings\nelse\n  monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')\n  menu_height=$((monitor_height * 40 / 100))\n\n  output_keybindings |\n    walker --dmenu -p 'Keybindings' --width 800 --height \"$menu_height\"\nfi\n"
  },
  {
    "path": "bin/omarchy-migrate",
    "content": "#!/bin/bash\n\n# Run all pending migrations to bring the system in line with the installed version.\n\n# Where we store an empty file for each migration that has already been performed.\nSTATE_DIR=\"$HOME/.local/state/omarchy/migrations\"\nmkdir -p \"$STATE_DIR\"\n\n# Skipped migrations are tracked separately\nmkdir -p \"$STATE_DIR/skipped\"\n\n# Run any pending migrations\nfor file in ~/.local/share/omarchy/migrations/*.sh; do\n  filename=$(basename \"$file\")\n\n  if [[ ! -f $STATE_DIR/$filename && ! -f $STATE_DIR/skipped/$filename ]]; then\n    echo -e \"\\e[32m\\nRunning migration (${filename%.sh})\\e[0m\"\n\n    if bash $file; then\n      touch \"$STATE_DIR/$filename\"\n    else\n      if gum confirm \"Migration ${filename%.sh} failed. Skip and continue?\"; then\n        touch \"$STATE_DIR/skipped/$filename\"\n      else\n        exit 1\n      fi\n    fi\n  fi\ndone\n"
  },
  {
    "path": "bin/omarchy-notification-dismiss",
    "content": "#!/bin/bash\n\n# Dismiss a mako notification on the basis of its summary. Used by the first-run notifications to dismiss them after clicking for action.\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-notification-dismiss <summary>\"\n  exit 1\nfi\n\n# Find the first notification whose 'summary' matches the regex in $1\nnotification_id=$(makoctl list | grep -F \"$1\" | head -n1 | sed -E 's/^Notification ([0-9]+):.*/\\1/')\n\nif [[ -n $notification_id ]]; then\n  makoctl dismiss -n $notification_id\nfi\n"
  },
  {
    "path": "bin/omarchy-npx-install",
    "content": "#!/bin/bash\n\n# Install an npx wrapper for a given npm package.\n# Usage: omarchy-npx-install <package> [command-name]\n#\n# If command-name is omitted, it defaults to the package name.\n# Example: omarchy-npx-install opencode-ai opencode\n\nif [[ -z $1 ]]; then\n  echo \"Usage: omarchy-npx-install <package> [command-name]\"\n  exit 1\nfi\n\npackage=$1\ncommand=${2:-$1}\n\nmkdir -p \"$HOME/.local/bin\"\n\ncat > \"$HOME/.local/bin/$command\" <<EOF\n#!/bin/bash\nexec npx --yes $package \"\\$@\"\nEOF\n\nchmod +x \"$HOME/.local/bin/$command\"\n"
  },
  {
    "path": "bin/omarchy-pkg-add",
    "content": "#!/bin/bash\n\n# Add the named packages to the system if they're missing. Returns false if it couldn't be done.\n\nif omarchy-pkg-missing \"$@\"; then\n  sudo pacman -S --noconfirm --needed \"$@\" || exit 1\nfi\n\nfor pkg in \"$@\"; do\n  # Secondary check to handle states where pacman doesn't actually register an error\n  if ! pacman -Q \"$pkg\" &>/dev/null; then\n    echo -e \"\\033[31mError: Package '$pkg' did not install\\033[0m\" >&2\n    exit 1\n  fi\ndone\n\nexit 0\n"
  },
  {
    "path": "bin/omarchy-pkg-aur-accessible",
    "content": "#!/bin/bash\n\n# Returns true if the AUR is up and available.\n# Used by omarchy-update-system-pkgs to ensure the AUR is available before updating packages from it.\n\ncurl -sf --connect-timeout 30 --retry 3 --retry-delay 3 -A \"omarchy-update\" \\\n  \"https://aur.archlinux.org/rpc/?v=5&type=info&arg=base\" >/dev/null\n"
  },
  {
    "path": "bin/omarchy-pkg-aur-add",
    "content": "#!/bin/bash\n\n# Add the named packages to the system from the AUR if they're missing. Returns false if it couldn't be done.\n\nif omarchy-pkg-missing \"$@\"; then\n  yay -S --noconfirm --needed \"$@\" || exit 1\nfi\n\nfor pkg in \"$@\"; do\n  # Secondary check to handle states where pacman doesn't actually register an error\n  if ! pacman -Q \"$pkg\" &>/dev/null; then\n    echo -e \"\\033[31mError: Package '$pkg' did not install\\033[0m\" >&2\n    exit 1\n  fi\ndone\n\nexit 0\n"
  },
  {
    "path": "bin/omarchy-pkg-aur-install",
    "content": "#!/bin/bash\n\n# Show a fuzzy-finder TUI for picking new AUR packages to install.\n\nfzf_args=(\n  --multi\n  --preview 'yay -Siia {1}'\n  --preview-label='alt-p: toggle description, alt-b/B: toggle PKGBUILD, alt-j/k: scroll, tab: multi-select'\n  --preview-label-pos='bottom'\n  --preview-window 'down:65%:wrap'\n  --bind 'alt-p:toggle-preview'\n  --bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up'\n  --bind 'alt-k:preview-up,alt-j:preview-down'\n  --bind 'alt-b:change-preview:yay -Gpa {1} | tail -n +5'\n  --bind 'alt-B:change-preview:yay -Siia {1}'\n  --color 'pointer:green,marker:green'\n)\n\npkg_names=$(yay -Slqa | fzf \"${fzf_args[@]}\")\n\nif [[ -n $pkg_names ]]; then\n  # Add aur/ prefix to each package name and convert to space-separated for yay\n  source omarchy-sudo-keepalive\n\n  echo \"$pkg_names\" | sed 's/^/aur\\//' | tr '\\n' ' ' | xargs yay -S --noconfirm\n  sudo updatedb\n  omarchy-show-done\nfi\n"
  },
  {
    "path": "bin/omarchy-pkg-drop",
    "content": "#!/bin/bash\n\n# Remove all the named packages from the system if they're installed (otherwise ignore).\n\nfor pkg in \"$@\"; do\n  if pacman -Q \"$pkg\" &>/dev/null; then\n    sudo pacman -Rns --noconfirm \"$pkg\"\n  fi\ndone\n"
  },
  {
    "path": "bin/omarchy-pkg-install",
    "content": "#!/bin/bash\n\n# Show a fuzzy-finder TUI for picking new Arch and OPR packages to install.\n\nfzf_args=(\n  --multi\n  --preview 'pacman -Sii {1}'\n  --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select'\n  --preview-label-pos='bottom'\n  --preview-window 'down:65%:wrap'\n  --bind 'alt-p:toggle-preview'\n  --bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up'\n  --bind 'alt-k:preview-up,alt-j:preview-down'\n  --color 'pointer:green,marker:green'\n)\n\npkg_names=$(pacman -Slq | fzf \"${fzf_args[@]}\")\n\nif [[ -n $pkg_names ]]; then\n  source omarchy-sudo-keepalive\n\n  # Convert newline-separated selections to space-separated for pacman\n  echo \"$pkg_names\" | tr '\\n' ' ' | xargs sudo pacman -S --noconfirm\n  omarchy-show-done\nfi\n"
  },
  {
    "path": "bin/omarchy-pkg-missing",
    "content": "#!/bin/bash\n\n# Returns true if any of the named packages are missing from the system (or false if they're all there).\n\nfor pkg in \"$@\"; do\n  if ! pacman -Q \"$pkg\" &>/dev/null; then\n    exit 0\n  fi\ndone\n\nexit 1\n"
  },
  {
    "path": "bin/omarchy-pkg-present",
    "content": "#!/bin/bash\n\n# Returns true if all of the named packages are installed on the system (or false if any of them are missing).\n\nfor pkg in \"$@\"; do\n  pacman -Q \"$pkg\" &>/dev/null || exit 1\ndone\n\nexit 0\n"
  },
  {
    "path": "bin/omarchy-pkg-remove",
    "content": "#!/bin/bash\n\n# Show a fuzzy-finder TUI for picking packages installed on the system to be removed.\n\nfzf_args=(\n  --multi\n  --preview 'yay -Qi {1}'\n  --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select'\n  --preview-label-pos='bottom'\n  --preview-window 'down:65%:wrap'\n  --bind 'alt-p:toggle-preview'\n  --bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up'\n  --bind 'alt-k:preview-up,alt-j:preview-down'\n  --color 'pointer:red,marker:red'\n)\n\npkg_names=$(yay -Qqe | fzf \"${fzf_args[@]}\")\n\nif [[ -n $pkg_names ]]; then\n  # Convert newline-separated selections to space-separated for yay\n  echo \"$pkg_names\" | tr '\\n' ' ' | xargs sudo pacman -Rns --noconfirm\n  omarchy-show-done\nfi\n"
  },
  {
    "path": "bin/omarchy-powerprofiles-list",
    "content": "#!/bin/bash\n\n# Returns a list of all the available power profiles on the system.\n# Used by the Omarchy Menu under Setup > Power Profile.\n\npowerprofilesctl list |\n  awk '/^\\s*[* ]\\s*[a-zA-Z0-9\\-]+:$/ { gsub(/^[*[:space:]]+|:$/,\"\"); print }' |\n  tac\n"
  },
  {
    "path": "bin/omarchy-refresh-applications",
    "content": "#!/bin/bash\n\n# Ensure all default .desktop, web apps, and TUIs are installed.\n\n# Copy and sync icon files\nmkdir -p ~/.local/share/icons/hicolor/48x48/apps/\ncp ~/.local/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/\ngtk-update-icon-cache ~/.local/share/icons/hicolor &>/dev/null\n\n# Copy .desktop declarations\nmkdir -p ~/.local/share/applications\ncp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/\ncp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/\n\n# Refresh the webapps and TUIs\nbash $OMARCHY_PATH/install/packaging/icons.sh\nbash $OMARCHY_PATH/install/packaging/webapps.sh\nbash $OMARCHY_PATH/install/packaging/tuis.sh\n\nupdate-desktop-database ~/.local/share/applications\n"
  },
  {
    "path": "bin/omarchy-refresh-chromium",
    "content": "#!/bin/bash\n\n# Refresh the ~/.config/chromium-flags.conf file from the Omarchy defaults.\n\nCONFIG_FILE=\"$HOME/.config/chromium-flags.conf\"\nINSTALL_GOOGLE_ACCOUNTS=false\n\n# Check if google accounts were installed\nif [[ -f $CONFIG_FILE ]] && \\\n  grep -q -- \"--oauth2-client-id\" \"$CONFIG_FILE\" && \\\n  grep -q -- \"--oauth2-client-secret\" \"$CONFIG_FILE\"; then\n  INSTALL_GOOGLE_ACCOUNTS=true\nfi\n\n# Refresh the Chromium configuration\nomarchy-refresh-config chromium-flags.conf\n\n# Re-install Google accounts if previously configured\nif [[ $INSTALL_GOOGLE_ACCOUNTS == \"true\" ]]; then\n  omarchy-install-chromium-google-account\nfi\n"
  },
  {
    "path": "bin/omarchy-refresh-config",
    "content": "#!/bin/bash\n\n# Copies the named config from ~/.local/share/omarchy/config/X/Y/Z -> ~/.config/X/Y/Z.\n# If the config already exists, a backup of the existing will be taken as .bak.TIMESTAMP.\n\nconfig_file=$1\n\nif [[ -z $config_file ]]; then\n  cat <<USAGE\n  Usage: $0 [config_file]\n\n  Must provide a file path from the .config directory to be refreshed.\n  To copy ~/.local/share/omarchy/config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf\n\n    $0 hypr/hyprlock.conf\nUSAGE\n  exit 1\nfi\n\n# Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951)\nuser_config_file=\"${HOME}/.config/$config_file\"\ndefault_config_file=\"${HOME}/.local/share/omarchy/config/$config_file\"\nbackup_config_file=\"$user_config_file.bak.$(date +%s)\"\n\nif [[ -f $user_config_file ]]; then\n  # Create preliminary backup\n  cp -f \"$user_config_file\" \"$backup_config_file\" 2>/dev/null\n\n  # Replace config with new default\n  cp -f \"$default_config_file\" \"$user_config_file\" 2>/dev/null\n\n  # Compare and delete/inform accordingly\n  if cmp -s \"$user_config_file\" \"$backup_config_file\"; then\n    rm \"$backup_config_file\"\n  else\n    echo -e \"\\e[31mReplaced $user_config_file with new Omarchy default.\\nSaved backup as ${backup_config_file}.\\n\\n\\e[32mChanges:\\e[0m\"\n    diff \"$user_config_file\" \"$backup_config_file\" || true\n  fi\nelse\n  # Config file did not exist already\n  cp -f \"$default_config_file\" \"$user_config_file\" 2>/dev/null\nfi\n"
  },
  {
    "path": "bin/omarchy-refresh-fastfetch",
    "content": "#!/bin/bash\n\n# Overwrite the user config for fastfetch with the Omarchy default.\n\nomarchy-refresh-config fastfetch/config.jsonc\n"
  },
  {
    "path": "bin/omarchy-refresh-hypridle",
    "content": "#!/bin/bash\n\n# Overwrite the user config for hypridle with the Omarchy default and restart the service.\n\nomarchy-refresh-config hypr/hypridle.conf\nomarchy-restart-hypridle\n"
  },
  {
    "path": "bin/omarchy-refresh-hyprland",
    "content": "#!/bin/bash\n\n# Overwrite all the user configs in ~/.config/hypr with the Omarchy defaults.\n\nomarchy-refresh-config hypr/autostart.conf\nomarchy-refresh-config hypr/bindings.conf\nomarchy-refresh-config hypr/input.conf\nomarchy-refresh-config hypr/looknfeel.conf\nomarchy-refresh-config hypr/hyprland.conf\n"
  },
  {
    "path": "bin/omarchy-refresh-hyprlock",
    "content": "#!/bin/bash\n\n# Overwrite the user config for hyprlock with the Omarchy default.\n\nomarchy-refresh-config hypr/hyprlock.conf\n"
  },
  {
    "path": "bin/omarchy-refresh-hyprsunset",
    "content": "#!/bin/bash\n\n# Overwrite the user config for hyprsunset with the Omarchy default and restart the service.\n#\nomarchy-refresh-config hypr/hyprsunset.conf\nomarchy-restart-hyprsunset\n"
  },
  {
    "path": "bin/omarchy-refresh-limine",
    "content": "#!/bin/bash\n\n# Overwrite the user config for the Limine bootloader and rebuild it.\n\nif [[ -f /boot/EFI/Linux/omarchy_linux.efi ]] && [[ -f /boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi ]]; then\n  echo \"Cleanup extra UKI\"\n  sudo rm -f /boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi\nfi\necho \"Resetting limine config\"\n\nsudo mv /boot/limine.conf /boot/limine.conf.bak\n\nsudo cp ~/.local/share/omarchy/default/limine/limine.conf /boot/limine.conf\n\nsudo limine-update\nsudo limine-snapper-sync\n"
  },
  {
    "path": "bin/omarchy-refresh-pacman",
    "content": "#!/bin/bash\n\n# Overwrite the package configuration for /etc/pacman with the Omarchy default of using its dedicated mirrors and repositories, then update all packages.\n# This is used after switching between Omarchy release channels to ensure the right packages for the right channel are available.\n\n# Take backup of existing files\nsudo cp -f /etc/pacman.conf /etc/pacman.conf.bak\nsudo cp -f /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak\n\nchannel=\"${1:-stable}\"\n\nif [[ $channel != \"stable\" && $channel != \"rc\" && $channel != \"edge\" ]]; then\n  echo \"Error: Invalid channel '$channel'. Must be one of: stable, rc, edge\"\n  exit 1\nfi\n\necho \"Setting channel to $channel\"\necho\n\nsudo cp -f \"$OMARCHY_PATH/default/pacman/pacman-$channel.conf\" /etc/pacman.conf\nsudo cp -f \"$OMARCHY_PATH/default/pacman/mirrorlist-$channel\" /etc/pacman.d/mirrorlist\n\n# Reset all package DBs and then update\nsudo pacman -Syyuu --noconfirm\n"
  },
  {
    "path": "bin/omarchy-refresh-plymouth",
    "content": "#!/bin/bash\n\n# Overwrite the user config for the Plymouth drive decryption and boot sequence with the Omarchy default and rebuild it.\n\nsudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/\nsudo plymouth-set-default-theme omarchy\n\nif command -v limine-mkinitcpio &>/dev/null; then\n  sudo limine-mkinitcpio\nelse\n  sudo mkinitcpio -P\nfi\n"
  },
  {
    "path": "bin/omarchy-refresh-sddm",
    "content": "#!/bin/bash\n\n# Refresh the SDDM theme from default\n\nsudo rm -rf /usr/share/sddm/themes/omarchy\nsudo cp -r $OMARCHY_PATH/default/sddm/omarchy /usr/share/sddm/themes/omarchy\n"
  },
  {
    "path": "bin/omarchy-refresh-swayosd",
    "content": "#!/bin/bash\n\n# Overwrite the user configs for swayosd (controls on-screen feedback for changing volume/songs etc) with the Omarchy defaults and restart the service.\n\nomarchy-refresh-config swayosd/config.toml\nomarchy-refresh-config swayosd/style.css\nomarchy-restart-swayosd\n"
  },
  {
    "path": "bin/omarchy-refresh-tmux",
    "content": "#!/bin/bash\n\n# Overwrite the user tmux config with the Omarchy default and reload tmux.\n\nomarchy-refresh-config tmux/tmux.conf\nomarchy-restart-tmux\n"
  },
  {
    "path": "bin/omarchy-refresh-walker",
    "content": "#!/bin/bash\n\n# Overwrite the user configs for the Walker application launcher (which also powers the Omarchy Menu) and restart the services.\n\n# Ensure walker is set to autostart\nmkdir -p ~/.config/autostart/\ncp $OMARCHY_PATH/default/walker/walker.desktop ~/.config/autostart/\n\n# And restarts if it crashes or is killed\nmkdir -p ~/.config/systemd/user/app-walker@autostart.service.d/\ncp $OMARCHY_PATH/default/walker/restart.conf ~/.config/systemd/user/app-walker@autostart.service.d/restart.conf\n\nsystemctl --user daemon-reload\n\n# Refresh configs\nomarchy-refresh-config walker/config.toml\nomarchy-refresh-config elephant/calc.toml\nomarchy-refresh-config elephant/desktopapplications.toml\n\n# Restart service\nomarchy-restart-walker\n"
  },
  {
    "path": "bin/omarchy-refresh-waybar",
    "content": "#!/bin/bash\n\n# Overwrite the user configs for the Waybar menu bar with the Omarchy defaults and restart the service.\n\nomarchy-refresh-config waybar/config.jsonc\nomarchy-refresh-config waybar/style.css\nomarchy-restart-waybar\n"
  },
  {
    "path": "bin/omarchy-reinstall",
    "content": "#!/bin/bash\nset -e\n\n# Attempt to reinstall all default Omarchy packages and reset all the default configs.\n\necho -e \"This will reinstall all the default Omarchy packages and reset all default configs.\\nWarning: All user changes to configs will be lost.\\n\"\n\nif gum confirm \"Are you sure you want to reinstall and lose all config changes?\"; then\n  omarchy-reinstall-git\n  omarchy-reinstall-pkgs\n  omarchy-reinstall-configs\n\n  gum confirm \"System has been reinstalled. Reboot?\" && omarchy-system-reboot\nfi\n"
  },
  {
    "path": "bin/omarchy-reinstall-configs",
    "content": "#!/bin/bash\nset -e\n\n# Overwrite all user configs with the Omarchy defaults.\n\nif (( EUID == 0 )); then\n  echo \"Error: This script should not be run as root\"\n  exit 1\nfi\n\necho \"Resetting all Omarchy configs\"\ncp -R ~/.local/share/omarchy/config/* ~/.config/\ncp ~/.local/share/omarchy/default/bashrc ~/.bashrc\necho '[[ -f ~/.bashrc ]] && . ~/.bashrc' | tee ~/.bash_profile >/dev/null\n\n$(bash $OMARCHY_PATH/install/config/theme.sh)\n\nomarchy-refresh-limine\nomarchy-refresh-plymouth\nomarchy-nvim-setup\n"
  },
  {
    "path": "bin/omarchy-reinstall-git",
    "content": "#!/bin/bash\nset -e\n\n# Reinstall the Omarchy configuration directory from the git source.\n\ngit clone --depth=1 \"https://github.com/basecamp/omarchy.git\" ~/.local/share/omarchy-new >/dev/null\nmv $OMARCHY_PATH ~/.local/share/omarchy-old\nmv ~/.local/share/omarchy-new $OMARCHY_PATH\n"
  },
  {
    "path": "bin/omarchy-reinstall-pkgs",
    "content": "#!/bin/bash\nset -e\n\n# Reinstall all default Omarchy packages from the stable channel and downgrade any packages that are too new.\n\n# Set the package repository to the stable mirrors\nomarchy-refresh-pacman\n\n# Downgrade any packages to the stable setup\nsudo pacman -Suu --noconfirm\n\n# Ensure all packages are installed\nmapfile -t packages < <(grep -v '^#' \"$OMARCHY_PATH/install/omarchy-base.packages\" | grep -v '^$')\nsudo pacman -Syu --noconfirm --needed \"${packages[@]}\"\n"
  },
  {
    "path": "bin/omarchy-remove-dev-env",
    "content": "#!/bin/bash\n\n# Remove a development environment that was previously installed via omarchy-install-dev-env.\n# Usage: omarchy-remove-dev-env <ruby|node|bun|deno|go|php|laravel|symfony|python|elixir|phoenix|zig|rust|java|dotnet|ocaml|clojure|scala>\n\nif [[ -z $1 ]]; then\n  echo \"Usage: omarchy-remove-dev-env <ruby|node|bun|deno|go|php|laravel|symfony|python|elixir|phoenix|zig|rust|java|dotnet|ocaml|clojure|scala>\" >&2\n  exit 1\nfi\n\nremove_php() {\n  sudo pacman -Rns --noconfirm php composer php-sqlite xdebug 2>/dev/null || true\n}\n\ncase \"$1\" in\nruby)\n  echo -e \"Removing Ruby...\\n\"\n  mise uninstall ruby --all\n  mise rm -g ruby\n  rm -f ~/.gemrc\n  ;;\nnode)\n  echo -e \"Removing Node.js...\\n\"\n  mise uninstall node --all\n  mise rm -g node\n  ;;\nbun)\n  echo -e \"Removing Bun...\\n\"\n  mise uninstall bun --all\n  mise rm -g bun\n  ;;\ndeno)\n  echo -e \"Removing Deno...\\n\"\n  mise uninstall deno --all\n  mise rm -g deno\n  ;;\ngo)\n  echo -e \"Removing Go...\\n\"\n  mise uninstall go --all\n  mise rm -g go\n  ;;\nphp)\n  echo -e \"Removing PHP...\\n\"\n  remove_php\n  ;;\nlaravel)\n  echo -e \"Removing Laravel...\\n\"\n  composer global remove laravel/installer 2>/dev/null || true\n  ;;\nsymfony)\n  echo -e \"Removing Symfony CLI...\\n\"\n  sudo pacman -Rns --noconfirm symfony-cli 2>/dev/null || true\n  ;;\npython)\n  echo -e \"Removing Python...\\n\"\n  mise uninstall python --all\n  mise rm -g python\n  rm -rf ~/.local/bin/uv ~/.local/bin/uvx ~/.cargo/bin/uv 2>/dev/null || true\n  ;;\nelixir|phoenix)\n  echo -e \"Removing Elixir/Erlang...\\n\"\n  mise uninstall elixir --all\n  mise uninstall erlang --all\n  mise rm -g elixir\n  mise rm -g erlang\n  ;;\nzig)\n  echo -e \"Removing Zig...\\n\"\n  mise uninstall zig --all\n  mise uninstall zls --all\n  mise rm -g zig\n  mise rm -g zls\n  ;;\nrust)\n  echo -e \"Removing Rust...\\n\"\n  rustup self uninstall -y 2>/dev/null || true\n  ;;\njava)\n  echo -e \"Removing Java...\\n\"\n  mise uninstall java --all\n  mise rm -g java\n  ;;\ndotnet)\n  echo -e \"Removing .NET...\\n\"\n  mise uninstall dotnet --all\n  mise rm -g dotnet\n  ;;\nocaml)\n  echo -e \"Removing OCaml...\\n\"\n  opam switch remove default -y 2>/dev/null || true\n  rm -rf ~/.opam 2>/dev/null || true\n  sudo rm -f /usr/local/bin/opam 2>/dev/null || true\n  ;;\nclojure)\n  echo -e \"Removing Clojure...\\n\"\n  mise uninstall clojure --all\n  mise rm -g clojure\n  ;;\nscala)\n  echo -e \"Removing Scala...\\n\"\n  mise uninstall scala --all\n  mise uninstall scala-cli --all\n  mise rm -g scala\n  mise rm -g scala-cli\n  ;;\n*)\n  echo \"Unknown environment: $1\"\n  exit 1\n  ;;\nesac\n\necho -e \"\\nDone!\"\n"
  },
  {
    "path": "bin/omarchy-remove-preinstalls",
    "content": "#!/bin/bash\n\n# Remove preinstalled Omarchy applications (web apps, TUIs, and selected packages).\n# This removes all web apps, TUIs, plus specific desktop applications.\n\nif gum confirm \"Are you sure you want to remove all preinstalled web apps, TUI wrappers, and desktop applications?\"; then\n  echo -e \"Removing preinstalled Omarchy applications...\\n\"\n\n  omarchy-webapp-remove-all\n  omarchy-tui-remove-all\n\n  cp ~/.config/hypr/bindings.conf ~/.config/hypr/bindings.conf.bak\n  cp \"$OMARCHY_PATH/default/hypr/plain-bindings.conf\" ~/.config/hypr/bindings.conf\n  hyprctl reload\n\n  omarchy-pkg-drop \\\n    aether \\\n    typora \\\n    spotify \\\n    libreoffice-fresh \\\n    1password-beta \\\n    1password-cli \\\n    xournalpp \\\n    signal-desktop \\\n    pinta \\\n    obsidian \\\n    obs-studio \\\n    kdenlive \\\n    lazydocker \\\n    opencode \\\n    claude-code\nfi\n"
  },
  {
    "path": "bin/omarchy-restart-app",
    "content": "#!/bin/bash\n\n# Restart an application by killing it and relaunching via uwsm.\n# Usage: omarchy-restart-app <application-name> [application-args...]\n\npkill -x $1\nsetsid uwsm-app -- \"$@\" >/dev/null 2>&1 &\n"
  },
  {
    "path": "bin/omarchy-restart-bluetooth",
    "content": "#!/bin/bash\n\n# Unblock and restart the bluetooth service.\n\necho -e \"Unblocking bluetooth...\\n\"\nrfkill unblock bluetooth\nrfkill list bluetooth\n"
  },
  {
    "path": "bin/omarchy-restart-btop",
    "content": "#!/bin/bash\n\n# Reload btop configuration (used by the Omarchy theme switching).\n\npkill -SIGUSR2 btop\n"
  },
  {
    "path": "bin/omarchy-restart-hyprctl",
    "content": "#!/bin/bash\n\n# Reload hyprland configuration (used by the Omarchy theme switching).\n\nhyprctl reload >/dev/null\n"
  },
  {
    "path": "bin/omarchy-restart-hypridle",
    "content": "#!/bin/bash\n\n# Restart the hypridle service (used for idle detection and auto-lock).\n\nomarchy-restart-app hypridle\n"
  },
  {
    "path": "bin/omarchy-restart-hyprsunset",
    "content": "#!/bin/bash\n\n# Restart the hyprsunset service (used for blue light filtering/night light).\n\nomarchy-restart-app hyprsunset\n"
  },
  {
    "path": "bin/omarchy-restart-makima",
    "content": "#!/bin/bash\n\n# Restart makima - key remapping service for remapping Copilot key to Omarchy Menu\n\nsudo systemctl restart makima\n"
  },
  {
    "path": "bin/omarchy-restart-mako",
    "content": "#!/bin/bash\n\n# Reload mako configuration (used by the Omarchy theme switching).\n\nmakoctl reload\n"
  },
  {
    "path": "bin/omarchy-restart-opencode",
    "content": "#!/bin/bash\n\n# Reload opencode configuration (used by the Omarchy theme switching).\n\nif pgrep -x opencode >/dev/null; then\n  killall -SIGUSR2 opencode\nfi\n"
  },
  {
    "path": "bin/omarchy-restart-pipewire",
    "content": "#!/bin/bash\n\n# Restart the PipeWire audio service to fix audio issues or apply new configuration.\n\necho -e \"Restarting pipewire audio service...\\n\"\nsystemctl --user restart pipewire.service\n"
  },
  {
    "path": "bin/omarchy-restart-swayosd",
    "content": "#!/bin/bash\n\nomarchy-restart-app swayosd-server\n"
  },
  {
    "path": "bin/omarchy-restart-terminal",
    "content": "#!/bin/bash\n\nif [[ -f ~/.config/alacritty/alacritty.toml ]]; then\n  touch ~/.config/alacritty/alacritty.toml\nfi\n\nif pgrep -x kitty >/dev/null; then\n  killall -SIGUSR1 kitty >/dev/null\nfi\n\nif pgrep -x ghostty >/dev/null; then\n  killall -SIGUSR2 ghostty\nfi\n"
  },
  {
    "path": "bin/omarchy-restart-tmux",
    "content": "#!/bin/bash\n\n# Restart tmux if running with the latest configuration\n\nif pgrep -x tmux; then\n  tmux source-file ~/.config/tmux/tmux.conf\nfi\n"
  },
  {
    "path": "bin/omarchy-restart-walker",
    "content": "#!/bin/bash\n\nrestart_services() {\n  if systemctl --user is-enabled elephant.service &>/dev/null; then\n    systemctl --user restart elephant.service\n  fi\n\n  if systemctl --user is-enabled app-walker@autostart.service &>/dev/null; then\n    systemctl --user restart app-walker@autostart.service\n  else\n    echo -e \"\\e[31mUnable to restart Walker -- RESTART MANUALLY\\e[0m\"\n  fi\n}\n\nif (( EUID == 0 )); then\n  SCRIPT_OWNER=$(stat -c '%U' \"$0\")\n  USER_UID=$(id -u \"$SCRIPT_OWNER\")\n  systemd-run --uid=\"$SCRIPT_OWNER\" --setenv=XDG_RUNTIME_DIR=\"/run/user/$USER_UID\" \\\n    bash -c \"$(declare -f restart_services); restart_services\"\nelse\n  restart_services\nfi\n"
  },
  {
    "path": "bin/omarchy-restart-waybar",
    "content": "#!/bin/bash\n\nomarchy-restart-app waybar\n"
  },
  {
    "path": "bin/omarchy-restart-wifi",
    "content": "#!/bin/bash\n\n# Unblock and restart the Wi-Fi service.\n\necho -e \"Unblocking wifi...\\n\"\nrfkill unblock wifi\nrfkill list wifi\n"
  },
  {
    "path": "bin/omarchy-restart-xcompose",
    "content": "#!/bin/bash\n\n# Restart the XCompose input method service (fcitx5) to apply new compose key settings.\n\nomarchy-restart-app fcitx5 --disable notificationitem\n"
  },
  {
    "path": "bin/omarchy-setup-dns",
    "content": "#!/bin/bash\n\nlock_dns_to_resolved() {\n  for file in /etc/systemd/network/*.network; do\n    [[ -f $file ]] || continue\n    if ! grep -q \"^\\[DHCPv4\\]\" \"$file\"; then continue; fi\n\n    if ! sed -n '/^\\[DHCPv4\\]/,/^\\[/p' \"$file\" | grep -q \"^UseDNS=\"; then\n      sudo sed -i '/^\\[DHCPv4\\]/a UseDNS=no' \"$file\"\n    fi\n\n    if grep -q \"^\\[IPv6AcceptRA\\]\" \"$file\" && ! sed -n '/^\\[IPv6AcceptRA\\]/,/^\\[/p' \"$file\" | grep -q \"^UseDNS=\"; then\n      sudo sed -i '/^\\[IPv6AcceptRA\\]/a UseDNS=no' \"$file\"\n    fi\n  done\n}\n\nunlock_dns_to_dhcp() {\n  for file in /etc/systemd/network/*.network; do\n    [[ -f $file ]] || continue\n    sudo sed -i '/^\\[DHCPv4\\]/{n;/^UseDNS=no$/d}' \"$file\"\n    sudo sed -i '/^\\[IPv6AcceptRA\\]/{n;/^UseDNS=no$/d}' \"$file\"\n  done\n}\n\nif [[ -z $1 ]]; then\n  dns=$(gum choose --height 6 --header \"Select DNS provider\" Cloudflare Google DHCP Custom)\nelse\n  dns=$1\nfi\n\ncase \"$dns\" in\nCloudflare)\n  sudo tee /etc/systemd/resolved.conf >/dev/null <<'EOF'\n[Resolve]\nDNS=1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com\nFallbackDNS=9.9.9.9 149.112.112.112\nDNSOverTLS=opportunistic\nEOF\n  lock_dns_to_resolved\n  ;;\n\nGoogle)\n  sudo tee /etc/systemd/resolved.conf >/dev/null <<'EOF'\n[Resolve]\nDNS=8.8.8.8#dns.google 8.8.4.4#dns.google\nFallbackDNS=9.9.9.9 149.112.112.112\nDNSOverTLS=opportunistic\nEOF\n  lock_dns_to_resolved\n  ;;\n\nDHCP)\n  sudo tee /etc/systemd/resolved.conf >/dev/null <<'EOF'\n[Resolve]\nDNSOverTLS=no\nEOF\n  unlock_dns_to_dhcp\n  ;;\n\nCustom)\n  echo \"Enter your DNS servers (space-separated, e.g. '192.168.1.1 1.1.1.1'):\"\n  read -r dns_servers\n\n  if [[ -z $dns_servers ]]; then\n    echo \"Error: No DNS servers provided.\"\n    exit 1\n  fi\n\n  sudo tee /etc/systemd/resolved.conf >/dev/null <<EOF\n[Resolve]\nDNS=$dns_servers\nFallbackDNS=9.9.9.9 149.112.112.112\nEOF\n  lock_dns_to_resolved\n  ;;\nesac\n\nsudo systemctl restart systemd-networkd systemd-resolved\n"
  },
  {
    "path": "bin/omarchy-setup-fido2",
    "content": "#!/bin/bash\n\nset -e\n\nGREEN='\\033[0;32m'\nRED='\\033[0;31m'\nYELLOW='\\033[1;33m'\nNC='\\033[0m' # No Color\n\nprint_success() {\n  echo -e \"${GREEN}$1${NC}\"\n}\n\nprint_error() {\n  echo -e \"${RED}$1${NC}\"\n}\n\nprint_info() {\n  echo -e \"${YELLOW}$1${NC}\"\n}\n\ncheck_fido2_hardware() {\n  tokens=$(fido2-token -L 2>/dev/null)\n  if [[ -z $tokens ]]; then\n    print_error \"\\nNo FIDO2 device detected. Please plug it in (you may need to unlock it as well).\"\n    return 1\n  fi\n  return 0\n}\n\nsetup_pam_config() {\n  # Configure sudo\n  if ! grep -q pam_u2f.so /etc/pam.d/sudo; then\n    print_info \"Configuring sudo for FIDO2 authentication...\"\n    sudo sed -i '1i auth    sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/sudo\n  fi\n\n  # Configure polkit\n  if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then\n    print_info \"Configuring polkit for FIDO2 authentication...\"\n    sudo sed -i '1i auth      sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/polkit-1\n  elif [[ ! -f /etc/pam.d/polkit-1 ]]; then\n    print_info \"Creating polkit configuration with FIDO2 authentication...\"\n    sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'\nauth      sufficient pam_u2f.so cue authfile=/etc/fido2/fido2\nauth      required pam_unix.so\n\naccount   required pam_unix.so\npassword  required pam_unix.so\nsession   required pam_unix.so\nEOF\n  fi\n}\n\nremove_pam_config() {\n  # Remove from sudo\n  if grep -q pam_u2f.so /etc/pam.d/sudo; then\n    print_info \"Removing FIDO2 authentication from sudo...\"\n    sudo sed -i '/pam_u2f\\.so/d' /etc/pam.d/sudo\n  fi\n\n  # Remove from polkit\n  if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_u2f.so' /etc/pam.d/polkit-1; then\n    print_info \"Removing FIDO2 authentication from polkit...\"\n    sudo sed -i '/pam_u2f\\.so/d' /etc/pam.d/polkit-1\n  fi\n}\n\nif [[ \"--remove\" == $1 ]]; then\n  print_success \"Removing FIDO2 device from authentication.\\n\"\n\n  # Remove PAM configuration\n  remove_pam_config\n\n  # Remove FIDO2 configuration\n  if [[ -d /etc/fido2 ]]; then\n    print_info \"Removing FIDO2 configuration...\"\n    sudo rm -rf /etc/fido2\n  fi\n\n  # Uninstall packages\n  print_info \"Removing FIDO2 packages...\"\n  sudo pacman -Rns --noconfirm libfido2 pam-u2f\n\n  print_success \"FIDO2 authentication has been completely removed.\"\nelse\n  print_success \"Setting up FIDO2 device for authentication.\\n\"\n\n  # Install required packages\n  print_info \"Installing required packages...\"\n  omarchy-pkg-add libfido2 pam-u2f\n\n  if ! check_fido2_hardware; then\n    exit 1\n  fi\n\n  # Create the pamu2fcfg file\n  if [[ ! -f /etc/fido2/fido2 ]]; then\n    sudo mkdir -p /etc/fido2\n    print_success \"\\nLet's setup your device by confirming on the device now.\"\n    print_info \"Touch your FIDO2 key when it lights up...\\n\"\n\n    if pamu2fcfg >/tmp/fido2; then\n      sudo mv /tmp/fido2 /etc/fido2/fido2\n      print_success \"FIDO2 device registered successfully!\"\n    else\n      print_error \"\\nFIDO2 registration failed. Please try again.\"\n      exit 1\n    fi\n  else\n    print_info \"FIDO2 device already registered.\"\n  fi\n\n  # Configure PAM\n  setup_pam_config\n\n  # Test with sudo\n  print_info \"\\nTesting FIDO2 authentication with sudo...\"\n  print_info \"Touch your FIDO2 key when prompted.\\n\"\n\n  if sudo echo \"FIDO2 authentication test successful\"; then\n    print_success \"\\nPerfect! FIDO2 authentication is now configured.\"\n    print_info \"You can use your FIDO2 key for sudo and polkit authentication.\"\n  else\n    print_error \"\\nVerification failed. You may want to check your configuration.\"\n  fi\nfi\n"
  },
  {
    "path": "bin/omarchy-setup-fingerprint",
    "content": "#!/bin/bash\n\nset -e\n\nGREEN='\\033[0;32m'\nRED='\\033[0;31m'\nYELLOW='\\033[1;33m'\nNC='\\033[0m' # No Color\n\nprint_success() {\n  echo -e \"${GREEN}$1${NC}\"\n}\n\nprint_error() {\n  echo -e \"${RED}$1${NC}\"\n}\n\nprint_info() {\n  echo -e \"${YELLOW}$1${NC}\"\n}\n\ncheck_fingerprint_hardware() {\n  # Get fingerprint devices for the user\n  devices=$(fprintd-list \"$USER\" 2>/dev/null)\n\n  # Exit if no devices found\n  if [[ -z $devices ]]; then\n    print_error \"\\nNo fingerprint sensor detected.\"\n    return 1\n  fi\n  return 0\n}\n\nsetup_pam_config() {\n  # Configure sudo\n  if ! grep -q pam_fprintd.so /etc/pam.d/sudo; then\n    print_info \"Configuring sudo for fingerprint authentication...\"\n    sudo sed -i '1i auth    sufficient pam_fprintd.so' /etc/pam.d/sudo\n  fi\n\n  # Configure polkit\n  if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_fprintd.so' /etc/pam.d/polkit-1; then\n    print_info \"Configuring polkit for fingerprint authentication...\"\n    sudo sed -i '1i auth      sufficient pam_fprintd.so' /etc/pam.d/polkit-1\n  elif [[ ! -f /etc/pam.d/polkit-1 ]]; then\n    print_info \"Creating polkit configuration with fingerprint authentication...\"\n    sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'\nauth      sufficient pam_fprintd.so\nauth      required pam_unix.so\n\naccount   required pam_unix.so\npassword  required pam_unix.so\nsession   required pam_unix.so\nEOF\n  fi\n}\n\nadd_hyprlock_fingerprint_icon() {\n  print_info \"Adding fingerprint icon to hyprlock placeholder text...\"\n  sed -i 's/placeholder_text = .*/placeholder_text = <span> Enter Password 󰈷 <\\/span>/' ~/.config/hypr/hyprlock.conf\n  sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = true/' ~/.config/hypr/hyprlock.conf\n}\n\nremove_hyprlock_fingerprint_icon() {\n  print_info \"Removing fingerprint icon from hyprlock placeholder text...\"\n  sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf\n  sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf\n}\n\nremove_pam_config() {\n  # Remove from sudo\n  if grep -q pam_fprintd.so /etc/pam.d/sudo; then\n    print_info \"Removing fingerprint authentication from sudo...\"\n    sudo sed -i '/pam_fprintd\\.so/d' /etc/pam.d/sudo\n  fi\n\n  # Remove from polkit\n  if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then\n    print_info \"Removing fingerprint authentication from polkit...\"\n    sudo sed -i '/pam_fprintd\\.so/d' /etc/pam.d/polkit-1\n  fi\n}\n\nif [[ \"--remove\" == $1 ]]; then\n  print_success \"Removing fingerprint scanner from authentication.\\n\"\n\n  # Remove PAM configuration\n  remove_pam_config\n\n  # Remove fingerprint icon from hyprlock placeholder text\n  remove_hyprlock_fingerprint_icon\n\n  # Uninstall packages\n  print_info \"Removing fingerprint packages...\"\n  sudo pacman -Rns --noconfirm fprintd\n\n  print_success \"Fingerprint authentication has been completely removed.\"\nelse\n  print_success \"Setting up fingerprint scanner for authentication.\\n\"\n\n  # Install required packages\n  print_info \"Installing required packages...\"\n  omarchy-pkg-add fprintd usbutils\n\n  if ! check_fingerprint_hardware; then\n    exit 1\n  fi\n\n  # Configure PAM\n  setup_pam_config\n\n  # Add fingerprint icon to hyprlock placeholder text\n  add_hyprlock_fingerprint_icon\n\n  # Enroll first fingerprint\n  print_success \"\\nLet's setup your right index finger as the first fingerprint.\"\n  print_info \"Keep moving the finger around on sensor until the process completes.\\n\"\n\n  if sudo fprintd-enroll \"$USER\"; then\n    print_success \"\\nFingerprint enrolled successfully!\"\n\n    # Verify\n    print_info \"\\nNow let's verify that it's working correctly.\\n\"\n    if fprintd-verify; then\n      print_success \"\\nPerfect! Fingerprint authentication is now configured.\"\n      print_info \"You can use your fingerprint for sudo, polkit, and lock screen (Super + Escape).\"\n    else\n      print_error \"\\nVerification failed. You may want to try enrolling again.\"\n    fi\n  else\n    print_error \"\\nEnrollment failed. Please try again.\"\n    exit 1\n  fi\nfi\n"
  },
  {
    "path": "bin/omarchy-setup-makima",
    "content": "#!/bin/bash\n\n# Setup makima - key remapping service for remapping Copilot key to Omarchy Menu\n\nCONFIG_FILE=\"$HOME/.config/makima/AT Translated Set 2 keyboard.toml\"\n\nif [[ ! -f $CONFIG_FILE ]]; then\n  omarchy-pkg-add makima-bin\n\n  mkdir -p \"$HOME/.config/makima\"\n  cp \"$OMARCHY_PATH/default/makima/AT Translated Set 2 keyboard.toml\" \"$CONFIG_FILE\"\n\n  sudo mkdir -p /etc/systemd/system/makima.service.d\n  sudo tee /etc/systemd/system/makima.service.d/override.conf >/dev/null <<EOF\n[Service]\nUser=$USER\nEnvironment=\"MAKIMA_CONFIG=/home/$USER/.config/makima\"\nEOF\n\n  sudo systemctl daemon-reload\n  sudo systemctl enable --now makima 2>/dev/null || true\nfi\n"
  },
  {
    "path": "bin/omarchy-show-done",
    "content": "#!/bin/bash\n\n# Display a \"Done!\" message with a spinner and wait for user to press any key.\n# Used by various install scripts to indicate completion.\n\necho\ngum spin --spinner \"globe\" --title \"Done! Press any key to close...\" -- bash -c 'read -n 1 -s'\n"
  },
  {
    "path": "bin/omarchy-show-logo",
    "content": "#!/bin/bash\n\n# Display the Omarchy logo in the terminal using green color.\n# Used by various presentation scripts to show branding.\n\nclear\necho -e \"\\033[32m\"\ncat <~/.local/share/omarchy/logo.txt\necho -e \"\\033[0m\"\necho\n"
  },
  {
    "path": "bin/omarchy-snapshot",
    "content": "#!/bin/bash\n\nset -e\n\nCOMMAND=\"$1\"\nOMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy}\n\nif [[ -z $COMMAND ]]; then\n  echo \"Usage: omarchy-snapshot <create|restore>\" >&2\n  exit 1\nfi\n\nif ! command -v snapper &>/dev/null; then\n  exit 127 # omarchy-update can use this to just ignore if snapper is not available\nfi\n\ncase \"$COMMAND\" in\ncreate)\n  DESC=\"$(omarchy-version)\"\n\n  echo -e \"\\e[32mCreate system snapshot\\e[0m\"\n\n  # Get existing snapper config names from CSV output\n  mapfile -t CONFIGS < <(sudo snapper --csvout list-configs | awk -F, 'NR>1 {print $1}')\n\n  for config in \"${CONFIGS[@]}\"; do\n    sudo snapper -c \"$config\" create -c number -d \"$DESC\"\n  done\n  echo\n  ;;\nrestore)\n  sudo limine-snapper-restore\n  ;;\nesac\n"
  },
  {
    "path": "bin/omarchy-state",
    "content": "#!/bin/bash\n\n# Manage persistent state files for Omarchy toggles and settings.\n# Usage: omarchy-state <set|clear> <state-name-or-pattern>\n# Used to track whether features like suspend, idle lock, etc are enabled or disabled.\n\nSTATE_DIR=\"$HOME/.local/state/omarchy\"\nmkdir -p \"$STATE_DIR\"\n\nCOMMAND=\"$1\"\nSTATE_NAME=\"$2\"\n\nif [[ -z $COMMAND ]]; then\n  echo \"Usage: omarchy-state <set|clear> <state-name-or-pattern>\"\n  exit 1\nfi\n\nif [[ -z $STATE_NAME ]]; then\n  echo \"Usage: omarchy-state $COMMAND <state-name>\"\n  exit 1\nfi\n\ncase \"$COMMAND\" in\nset) touch \"$STATE_DIR/$STATE_NAME\" ;;\nclear) find \"$STATE_DIR\" -maxdepth 1 -type f -name \"$STATE_NAME\" -delete ;;\nesac\n"
  },
  {
    "path": "bin/omarchy-sudo-keepalive",
    "content": "#!/bin/bash\n\n# Prompt for sudo once and keep the credential alive in the background.\n# Source this script so the trap applies to the calling shell:\n#   source omarchy-sudo-keepalive\n\nsudo -v\nwhile true; do sudo -n true; sleep 60; done 2>/dev/null &\nSUDO_KEEPALIVE_PID=$!\ntrap \"kill $SUDO_KEEPALIVE_PID 2>/dev/null\" EXIT\n"
  },
  {
    "path": "bin/omarchy-sudo-passwordless-toggle",
    "content": "#!/bin/bash\n\n# Toggle passwordless sudo for the current user.\n# First run: enables passwordless sudo for 15 minutes (after confirmation).\n# Second run: disables it early.\n\nNOPASSWD_FILE=\"/etc/sudoers.d/99-omarchy-nopasswd-${USER}\"\nTIMER_NAME=\"omarchy-nopasswd-expire-${USER}\"\n\n# Safety: if the file exists but the timer doesn't (e.g. after reboot), clean up\nif sudo test -f \"$NOPASSWD_FILE\" && ! systemctl is-active \"${TIMER_NAME}.timer\" &>/dev/null; then\n  sudo rm \"$NOPASSWD_FILE\"\nfi\n\n# Check for the file directly — sudo -n can stay cached or be granted by other rules\nif sudo test -f \"$NOPASSWD_FILE\"; then\n  sudo rm \"$NOPASSWD_FILE\"\n  sudo systemctl stop \"${TIMER_NAME}.timer\" 2>/dev/null\n  echo \"Passwordless sudo has been DISABLED. Sudo will require a password again.\"\nelse\n  echo \"\"\n  echo \"⚠️  WARNING: This will allow ANY process running as your user to\"\n  echo \"execute ANY command as root WITHOUT a password for 15 minutes.\"\n  echo \"\"\n  echo \"This is useful for AI agents that need to run sudo commands,\"\n  echo \"but it significantly weakens the security of your system.\"\n  echo \"Anyone or anything with access to your user account gets full root.\"\n  echo \"\"\n  echo \"Passwordless sudo will automatically disable after 15 minutes.\"\n  echo \"Run this command again to disable it early.\"\n  echo \"\"\n\n  if gum confirm \"Enable passwordless sudo for 15 minutes? This is a significant security risk!\"; then\n    echo \"${USER} ALL=(ALL) NOPASSWD: ALL\" | sudo tee \"$NOPASSWD_FILE\" > /dev/null\n    sudo chmod 440 \"$NOPASSWD_FILE\"\n    sudo systemd-run --on-active=15m --timer-property=AccuracySec=1s --unit=\"$TIMER_NAME\" \\\n      rm \"$NOPASSWD_FILE\"\n    echo \"Passwordless sudo has been ENABLED. It will automatically disable in 15 minutes.\"\n    echo \"Note: if you restart before then, run omarchy-sudo-passwordless-toggle again to disable it.\"\n  else\n    echo \"Aborted. No changes made.\"\n  fi\nfi\n"
  },
  {
    "path": "bin/omarchy-sudo-reset",
    "content": "#!/bin/bash\n\n# Reset the sudo lockout/faillock for the current user.\n# This clears any failed authentication attempts that may have locked the user out.\n\n# Resetting sudo lockout for user\nsu -c \"faillock --reset --user $USER\"\n"
  },
  {
    "path": "bin/omarchy-swayosd-brightness",
    "content": "#!/bin/bash\n\n# Display brightness level using SwayOSD on the current monitor.\n# Usage: omarchy-swayosd-brightness <percent>\n\npercent=\"$1\"\n\nprogress=\"$(awk -v p=\"$percent\" 'BEGIN{printf \"%.2f\", p/100}')\"\n[[ $progress == \"0.00\" ]] && progress=\"0.01\"\n\nswayosd-client \\\n  --monitor \"$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')\" \\\n  --custom-icon display-brightness \\\n  --custom-progress \"$progress\" \\\n  --custom-progress-text \"${percent}%\"\n"
  },
  {
    "path": "bin/omarchy-swayosd-kbd-brightness",
    "content": "#!/bin/bash\n\n# Display keyboard brightness level using SwayOSD on the current monitor.\n# Usage: omarchy-swayosd-kbd-brightness <percent>\n\npercent=\"$1\"\n\nprogress=\"$(awk -v p=\"$percent\" 'BEGIN{printf \"%.2f\", p/100}')\"\n[[ $progress == \"0.00\" ]] && progress=\"0.01\"\n\nswayosd-client \\\n  --monitor \"$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')\" \\\n  --custom-icon keyboard-brightness \\\n  --custom-progress \"$progress\" \\\n  --custom-progress-text \"${percent}%\"\n"
  },
  {
    "path": "bin/omarchy-system-logout",
    "content": "#!/bin/bash\n\n# Logout command that first closes all application windows (thus giving them a chance to save state),\n# then stops the session, returning to the SDDM login screen.\n\n# Schedule the session stop after closing windows (detached from terminal)\nnohup bash -c \"sleep 2 && uwsm stop\" >/dev/null 2>&1 &\n\n# Now close all windows\nomarchy-hyprland-window-close-all\nsleep 1 # Allow apps like Chrome to shutdown correctly\n"
  },
  {
    "path": "bin/omarchy-system-reboot",
    "content": "#!/bin/bash\n\n# Reboot command that first closes all application windows (thus giving them a chance to save state).\n# This is particularly helpful for applications like Chromium that otherwise won't shutdown cleanly.\n\nomarchy-state clear re*-required\n\n# Schedule the reboot to happen after closing windows (detached from terminal)\nnohup bash -c \"sleep 2 && systemctl reboot --no-wall\" >/dev/null 2>&1 &\n\n# Now close all windows\nomarchy-hyprland-window-close-all\nsleep 1 # Allow apps like Chrome to shutdown correctly\n"
  },
  {
    "path": "bin/omarchy-system-shutdown",
    "content": "#!/bin/bash\n\n# Shutdown command that first closes all application windows (thus giving them a chance to save state).\n# This is particularly helpful for applications like Chromium that otherwise won't shutdown cleanly.\n\nomarchy-state clear re*-required\n\n# Schedule the shutdown to happen after closing windows (detached from terminal)\nnohup bash -c \"sleep 2 && systemctl poweroff --no-wall\" >/dev/null 2>&1 &\n\n# Now close all windows\nomarchy-hyprland-window-close-all\nsleep 1 # Allow apps like Chrome to shutdown correctly\n"
  },
  {
    "path": "bin/omarchy-theme-bg-install",
    "content": "#!/bin/bash\n\nCURRENT_THEME_NAME=$(cat \"$HOME/.config/omarchy/current/theme.name\")\nTHEME_USER_BACKGROUNDS=\"$HOME/.config/omarchy/backgrounds/$CURRENT_THEME_NAME\"\n\nmkdir -p \"$THEME_USER_BACKGROUNDS\"\nnautilus \"$THEME_USER_BACKGROUNDS\"\n"
  },
  {
    "path": "bin/omarchy-theme-bg-next",
    "content": "#!/bin/bash\n\n# Cycles through the background images available\n\nTHEME_NAME=$(cat \"$HOME/.config/omarchy/current/theme.name\" 2>/dev/null)\nTHEME_BACKGROUNDS_PATH=\"$HOME/.config/omarchy/current/theme/backgrounds/\"\nUSER_BACKGROUNDS_PATH=\"$HOME/.config/omarchy/backgrounds/$THEME_NAME/\"\nCURRENT_BACKGROUND_LINK=\"$HOME/.config/omarchy/current/background\"\n\nmapfile -d '' -t BACKGROUNDS < <(find -L \"$USER_BACKGROUNDS_PATH\" \"$THEME_BACKGROUNDS_PATH\" -maxdepth 1 -type f -print0 2>/dev/null | sort -z)\nTOTAL=${#BACKGROUNDS[@]}\n\nif (( TOTAL == 0 )); then\n  notify-send \"No background was found for theme\" -t 2000\n  pkill -x swaybg\n  setsid uwsm-app -- swaybg --color '#000000' >/dev/null 2>&1 &\nelse\n  # Get current background from symlink\n  if [[ -L $CURRENT_BACKGROUND_LINK ]]; then\n    CURRENT_BACKGROUND=$(readlink \"$CURRENT_BACKGROUND_LINK\")\n  else\n    # Default to first background if no symlink exists\n    CURRENT_BACKGROUND=\"\"\n  fi\n\n  # Find current background index\n  INDEX=-1\n  for i in \"${!BACKGROUNDS[@]}\"; do\n    if [[ ${BACKGROUNDS[$i]} == $CURRENT_BACKGROUND ]]; then\n      INDEX=$i\n      break\n    fi\n  done\n\n  # Get next background (wrap around)\n  if (( INDEX == -1 )); then\n    # Use the first background when no match was found\n    NEW_BACKGROUND=\"${BACKGROUNDS[0]}\"\n  else\n    NEXT_INDEX=$(((INDEX + 1) % TOTAL))\n    NEW_BACKGROUND=\"${BACKGROUNDS[$NEXT_INDEX]}\"\n  fi\n\n  # Set new background symlink\n  ln -nsf \"$NEW_BACKGROUND\" \"$CURRENT_BACKGROUND_LINK\"\n\n  # Relaunch swaybg\n  pkill -x swaybg\n  setsid uwsm-app -- swaybg -i \"$CURRENT_BACKGROUND_LINK\" -m fill >/dev/null 2>&1 &\nfi\n"
  },
  {
    "path": "bin/omarchy-theme-bg-set",
    "content": "#!/bin/bash\n\n# Sets the specified image as the current background\n\nif [[ -z $1 ]]; then\n  echo \"Usage: omarchy-theme-bg-set <path-to-image>\" >&2\n  exit 1\nfi\n\nBACKGROUND=\"$1\"\nCURRENT_BACKGROUND_LINK=\"$HOME/.config/omarchy/current/background\"\n\n# Create symlink to the new background\nln -nsf \"$BACKGROUND\" \"$CURRENT_BACKGROUND_LINK\"\n\n# Kill existing swaybg and start new one\npkill -x swaybg\nsetsid uwsm-app -- swaybg -i \"$CURRENT_BACKGROUND_LINK\" -m fill >/dev/null 2>&1 &\n"
  },
  {
    "path": "bin/omarchy-theme-current",
    "content": "#!/bin/bash\n\nTHEME_NAME_PATH=\"$HOME/.config/omarchy/current/theme.name\"\n\nif [[ -f $THEME_NAME_PATH ]]; then\n  cat $THEME_NAME_PATH | sed -E 's/(^|-)([a-z])/\\1\\u\\2/g; s/-/ /g'\nelse\n  echo \"Unknown\"\nfi\n"
  },
  {
    "path": "bin/omarchy-theme-install",
    "content": "#!/bin/bash\n\n# omarchy-theme-install: Install a new theme from a git repo for Omarchy\n# Usage: omarchy-theme-install <git-repo-url>\n\nif [[ -z $1 ]]; then\n  echo -e \"\\e[32mSee https://manuals.omamix.org/2/the-omarchy-manual/90/extra-themes\\n\\e[0m\"\n  REPO_URL=$(gum input --placeholder=\"Git repo URL for theme\" --header=\"\")\nelse\n  REPO_URL=\"$1\"\nfi\n\nif [[ -z $REPO_URL ]]; then\n  exit 1\nfi\n\nTHEMES_DIR=\"$HOME/.config/omarchy/themes\"\nTHEME_NAME=$(basename \"$REPO_URL\" .git | sed -E 's/^omarchy-//; s/-theme$//')\nTHEME_PATH=\"$THEMES_DIR/$THEME_NAME\"\n\n# Remove existing theme if present\nif [[ -d $THEME_PATH ]]; then\n  rm -rf \"$THEME_PATH\"\nfi\n\n# Clone the repo directly to ~/.config/omarchy/themes\nif ! git clone \"$REPO_URL\" \"$THEME_PATH\"; then\n  echo \"Error: Failed to clone theme repo.\"\n  exit 1\nfi\n\n# Apply the new theme with omarchy-theme-set\nomarchy-theme-set $THEME_NAME\n"
  },
  {
    "path": "bin/omarchy-theme-list",
    "content": "#!/bin/bash\n\n{\n  find ~/.config/omarchy/themes/ -mindepth 1 -maxdepth 1 \\( -type d -o -type l \\) -printf '%f\\n'\n  find \"$OMARCHY_PATH/themes/\" -mindepth 1 -maxdepth 1 -type d -printf '%f\\n'\n} | sort -u | while read -r name; do\n  echo \"$name\" | sed -E 's/(^|-)([a-z])/\\1\\u\\2/g; s/-/ /g'\ndone\n"
  },
  {
    "path": "bin/omarchy-theme-refresh",
    "content": "#!/bin/bash\n\n# Refresh the current theme from its templates.\n\nTHEME_NAME_PATH=\"$HOME/.config/omarchy/current/theme.name\"\n\nif [[ -f $THEME_NAME_PATH ]]; then\n  omarchy-theme-set \"$(cat $THEME_NAME_PATH)\"\nfi\n"
  },
  {
    "path": "bin/omarchy-theme-remove",
    "content": "#!/bin/bash\n\n# omarchy-theme-remove: Remove a theme from Omarchy by name\n# Usage: omarchy-theme-remove <theme-name>\n\nif [[ -z $1 ]]; then\n  mapfile -t extra_themes < <(find ~/.config/omarchy/themes -mindepth 1 -maxdepth 1 -type d ! -xtype l -printf '%f\\n')\n\n  if (( ${#extra_themes[@]} > 0 )); then\n    THEME_NAME=$(printf '%s\\n' \"${extra_themes[@]}\" | sort | gum choose --header=\"Remove extra theme\")\n  else\n    echo \"No extra themes installed.\"\n    exit 1\n  fi\nelse\n  THEME_NAME=\"$1\"\nfi\n\nTHEMES_DIR=\"$HOME/.config/omarchy/themes\"\nCURRENT_DIR=\"$HOME/.config/omarchy/current\"\nTHEME_PATH=\"$THEMES_DIR/$THEME_NAME\"\n\n# Ensure a theme was set\nif [[ -z $THEME_NAME ]]; then\n  exit 1\nfi\n\n# Check if theme exists before attempting removal\nif [[ ! -d $THEME_PATH ]]; then\n  echo \"Error: Theme '$THEME_NAME' not found.\"\n  exit 1\nfi\n\n# Now remove the theme directory for THEME_NAME\nrm -rf \"$THEME_PATH\"\n"
  },
  {
    "path": "bin/omarchy-theme-set",
    "content": "#!/bin/bash\n\nif [[ -z $1 ]]; then\n  echo \"Usage: omarchy-theme-set <theme-name>\"\n  exit 1\nfi\n\nCURRENT_THEME_PATH=\"$HOME/.config/omarchy/current/theme\"\nNEXT_THEME_PATH=\"$HOME/.config/omarchy/current/next-theme\"\nUSER_THEMES_PATH=\"$HOME/.config/omarchy/themes\"\nOMARCHY_THEMES_PATH=\"$OMARCHY_PATH/themes\"\n\nTHEME_NAME=$(echo \"$1\" | sed -E 's/<[^>]+>//g' | tr '[:upper:]' '[:lower:]' | tr ' ' '-')\n\nif [[ ! -d $OMARCHY_THEMES_PATH/$THEME_NAME ]] && [[ ! -d $USER_THEMES_PATH/$THEME_NAME ]]; then\n  echo \"Theme '$THEME_NAME' does not exist\"\n  exit 1\nfi\n\n# Setup clean next theme directory (for atomic theme config swapping)\nrm -rf \"$NEXT_THEME_PATH\"\nmkdir -p \"$NEXT_THEME_PATH\"\n\n# Copy official theme first, then overlay user customizations on top\ncp -r \"$OMARCHY_THEMES_PATH/$THEME_NAME/\"* \"$NEXT_THEME_PATH/\" 2>/dev/null\ncp -r \"$USER_THEMES_PATH/$THEME_NAME/\"* \"$NEXT_THEME_PATH/\" 2>/dev/null\n\n# Generate dynamic configs\nomarchy-theme-set-templates\n\n# Swap next theme in as current\nrm -rf \"$CURRENT_THEME_PATH\"\nmv \"$NEXT_THEME_PATH\" \"$CURRENT_THEME_PATH\"\n\n# Store theme name for reference\necho \"$THEME_NAME\" >\"$HOME/.config/omarchy/current/theme.name\"\n\n# Change background with theme\nomarchy-theme-bg-next\n\n# Restart components to apply new theme\nif pgrep -x waybar >/dev/null; then\n  omarchy-restart-waybar\nfi\nomarchy-restart-swayosd\nomarchy-restart-terminal\nomarchy-restart-hyprctl\nomarchy-restart-btop\nomarchy-restart-opencode\nomarchy-restart-mako\n\n# Change app-specific themes\nomarchy-theme-set-gnome\nomarchy-theme-set-browser\nomarchy-theme-set-vscode\nomarchy-theme-set-obsidian\nomarchy-theme-set-keyboard\n\n# Call hook on theme set\nomarchy-hook theme-set \"$THEME_NAME\"\n"
  },
  {
    "path": "bin/omarchy-theme-set-browser",
    "content": "#!/bin/bash\n\nCHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme\n\nif omarchy-cmd-present chromium || omarchy-cmd-present brave; then\n  if [[ -f $CHROMIUM_THEME ]]; then\n    THEME_RGB_COLOR=$(<$CHROMIUM_THEME)\n    THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ })\n  else\n    # Use a default, neutral grey if theme doesn't have a color\n    THEME_RGB_COLOR=\"28,32,39\"\n    THEME_HEX_COLOR=\"#1c2027\"\n  fi\n\n  if omarchy-cmd-present chromium; then\n    echo \"{\\\"BrowserThemeColor\\\": \\\"$THEME_HEX_COLOR\\\"}\" | tee \"/etc/chromium/policies/managed/color.json\" >/dev/null\n    chromium --refresh-platform-policy --no-startup-window >/dev/null\n  fi\n\n  if omarchy-cmd-present brave; then\n    echo \"{\\\"BrowserThemeColor\\\": \\\"$THEME_HEX_COLOR\\\"}\" | tee \"/etc/brave/policies/managed/color.json\" >/dev/null\n    brave --refresh-platform-policy --no-startup-window >/dev/null\n  fi\nfi\n"
  },
  {
    "path": "bin/omarchy-theme-set-gnome",
    "content": "#!/bin/bash\n\n# Change gnome modes\nif [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then\n  gsettings set org.gnome.desktop.interface color-scheme \"prefer-light\"\n  gsettings set org.gnome.desktop.interface gtk-theme \"Adwaita\"\nelse\n  gsettings set org.gnome.desktop.interface color-scheme \"prefer-dark\"\n  gsettings set org.gnome.desktop.interface gtk-theme \"Adwaita-dark\"\nfi\n\n# Change gnome icon theme color\nGNOME_ICONS_THEME=~/.config/omarchy/current/theme/icons.theme\nif [[ -f $GNOME_ICONS_THEME ]]; then\n  gsettings set org.gnome.desktop.interface icon-theme \"$(<$GNOME_ICONS_THEME)\"\nelse\n  gsettings set org.gnome.desktop.interface icon-theme \"Yaru-blue\"\nfi\n"
  },
  {
    "path": "bin/omarchy-theme-set-keyboard",
    "content": "#!/bin/bash\n\nomarchy-theme-set-keyboard-asus-rog\nomarchy-theme-set-keyboard-f16\n"
  },
  {
    "path": "bin/omarchy-theme-set-keyboard-asus-rog",
    "content": "#!/bin/bash\n\nASUSCTL_THEME=~/.config/omarchy/current/theme/keyboard.rgb\n\nif omarchy-cmd-present asusctl; then\n  asusctl aura effect static -c $(sed 's/^#//' $ASUSCTL_THEME)\nfi\n"
  },
  {
    "path": "bin/omarchy-theme-set-keyboard-f16",
    "content": "#!/bin/bash\n\nFRAMEWORK16_THEME=~/.config/omarchy/current/theme/keyboard.rgb\n\nif omarchy-cmd-present qmk_hid && [[ -f $FRAMEWORK16_THEME ]]; then\n  hex=$(cat \"$FRAMEWORK16_THEME\")\n  hex=\"${hex#\\#}\"\n\n  # Convert hex to QMK HSV (0-255 scale) using Python's colorsys\n  read -r h s <<< $(python3 -c \"\nimport colorsys\nr, g, b = int('$hex'[:2],16)/255, int('$hex'[2:4],16)/255, int('$hex'[4:6],16)/255\nh, s, v = colorsys.rgb_to_hsv(r, g, b)\nprint(int(h * 255), int(s * 255))\n\")\n\n  qmk_hid via --rgb-effect 1 2>/dev/null\n  qmk_hid via --rgb-hue \"$h\" 2>/dev/null\n  qmk_hid via --rgb-saturation \"$s\" 2>/dev/null\n  qmk_hid via --rgb-brightness 100 2>/dev/null\n  qmk_hid via --save 2>/dev/null\nfi\n"
  },
  {
    "path": "bin/omarchy-theme-set-obsidian",
    "content": "#!/bin/bash\n\n# Sync Omarchy theme to all Obsidian vaults\n\nCURRENT_THEME_DIR=\"$HOME/.config/omarchy/current/theme\"\n\n[[ -f $CURRENT_THEME_DIR/obsidian.css ]] || exit 0\n\njq -r '.vaults | values[].path' ~/.config/obsidian/obsidian.json 2>/dev/null | while read -r vault_path; do\n  [[ -d $vault_path/.obsidian ]] || continue\n\n  theme_dir=\"$vault_path/.obsidian/themes/Omarchy\"\n  mkdir -p \"$theme_dir\"\n\n  [[ -f $theme_dir/manifest.json ]] || cat >\"$theme_dir/manifest.json\" <<'EOF'\n{\n  \"name\": \"Omarchy\",\n  \"version\": \"1.0.0\",\n  \"minAppVersion\": \"0.16.0\",\n  \"description\": \"Automatically syncs with your current Omarchy system theme colors and fonts\",\n  \"author\": \"Omarchy\",\n  \"authorUrl\": \"https://omarchy.org\"\n}\nEOF\n\n  cp \"$CURRENT_THEME_DIR/obsidian.css\" \"$theme_dir/theme.css\"\ndone\n"
  },
  {
    "path": "bin/omarchy-theme-set-templates",
    "content": "#!/bin/bash\n\nTEMPLATES_DIR=\"$OMARCHY_PATH/default/themed\"\nUSER_TEMPLATES_DIR=\"$HOME/.config/omarchy/themed\"\nNEXT_THEME_DIR=\"$HOME/.config/omarchy/current/next-theme\"\nCOLORS_FILE=\"$NEXT_THEME_DIR/colors.toml\"\n\n# Convert hex color to decimal RGB (e.g., \"#1e1e2e\" -> \"30,30,46\")\nhex_to_rgb() {\n  local hex=\"${1#\\#}\"\n  printf \"%d,%d,%d\" \"0x${hex:0:2}\" \"0x${hex:2:2}\" \"0x${hex:4:2}\"\n}\n\n# Only generate dynamic templates for themes with a colors.toml definition\nif [[ -f $COLORS_FILE ]]; then\n  sed_script=$(mktemp)\n\n  while IFS='=' read -r key value; do\n    key=\"${key//[\\\"\\' ]/}\"                # strip quotes and spaces from key\n    [[ $key && $key != \\#* ]] || continue # skip empty lines and comments\n    value=\"${value#*[\\\"\\']}\"\n    value=\"${value%%[\\\"\\']*}\" # extract value between quotes (ignores inline comments)\n\n    printf 's|{{ %s }}|%s|g\\n' \"$key\" \"$value\"            # {{ key }} -> value\n    printf 's|{{ %s_strip }}|%s|g\\n' \"$key\" \"${value#\\#}\" # {{ key_strip }} -> value without leading #\n    if [[ $value =~ ^# ]]; then\n      rgb=$(hex_to_rgb \"$value\")\n      echo \"s|{{ ${key}_rgb }}|${rgb}|g\"\n    fi\n  done <\"$COLORS_FILE\" >\"$sed_script\"\n\n  shopt -s nullglob\n\n  # Process user templates first, then built-in templates (user overrides built-in)\n  for tpl in \"$USER_TEMPLATES_DIR\"/*.tpl \"$TEMPLATES_DIR\"/*.tpl; do\n    filename=$(basename \"$tpl\" .tpl)\n    output_path=\"$NEXT_THEME_DIR/$filename\"\n\n    # Don't overwrite configs already exists in the output directory (copied from theme specific folder)\n    if [[ ! -f $output_path ]]; then\n      sed -f \"$sed_script\" \"$tpl\" >\"$output_path\"\n    fi\n  done\n\n  rm \"$sed_script\"\nfi\n"
  },
  {
    "path": "bin/omarchy-theme-set-vscode",
    "content": "#!/bin/bash\n\n# Sync Omarchy theme to VS Code, VSCodium, and Cursor\n\nVS_CODE_THEME=\"$HOME/.config/omarchy/current/theme/vscode.json\"\n\nset_theme() {\n  local editor_cmd=\"$1\"\n  local settings_path=\"$2\"\n  local skip_flag=\"$3\"\n\n  omarchy-cmd-present \"$editor_cmd\" && [[ ! -f $skip_flag ]] || return 0\n\n  if [[ -f $VS_CODE_THEME ]]; then\n    theme_name=$(jq -r '.name' \"$VS_CODE_THEME\")\n    extension=$(jq -r '.extension' \"$VS_CODE_THEME\")\n\n    if [[ -n $extension ]] && ! \"$editor_cmd\" --list-extensions | grep -Fxq \"$extension\"; then\n      \"$editor_cmd\" --install-extension \"$extension\" >/dev/null\n    fi\n\n    mkdir -p \"$(dirname \"$settings_path\")\"\n    [[ -f $settings_path ]] || printf '{\\n}\\n' >\"$settings_path\"\n\n    if ! grep -q '\"workbench.colorTheme\"' \"$settings_path\"; then\n      sed -i --follow-symlinks -E '0,/\\{/{s/\\{/{\\ \"workbench.colorTheme\": \"\",/}' \"$settings_path\"\n    fi\n\n    sed -i --follow-symlinks -E \\\n      \"s/(\\\"workbench.colorTheme\\\"[[:space:]]*:[[:space:]]*\\\")[^\\\"]*(\\\")/\\1$theme_name\\2/\" \\\n      \"$settings_path\"\n  elif [[ -f $settings_path ]]; then\n    sed -i --follow-symlinks -E 's/\\\"workbench\\.colorTheme\\\"[[:space:]]*:[^,}]*,?//' \"$settings_path\"\n  fi\n}\n\nset_theme \"code\" \"$HOME/.config/Code/User/settings.json\" \"$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes\"\nset_theme \"codium\" \"$HOME/.config/VSCodium/User/settings.json\" \"$HOME/.local/state/omarchy/toggles/skip-codium-theme-changes\"\nset_theme \"cursor\" \"$HOME/.config/Cursor/User/settings.json\" \"$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes\"\n"
  },
  {
    "path": "bin/omarchy-theme-update",
    "content": "#!/bin/bash\n\nfor dir in ~/.config/omarchy/themes/*/; do\n  if [[ -d $dir ]] && [[ ! -L ${dir%/} ]] && [[ -d $dir/.git ]]; then\n    echo \"Updating: $(basename \"$dir\")\"\n    git -C \"$dir\" pull\n  fi\ndone\n"
  },
  {
    "path": "bin/omarchy-toggle-hybrid-gpu",
    "content": "#!/bin/bash\n\n# Toggle dedicated vs integrated GPU mode via supergfxd (for hybrid gpu laptops, like Asus G14).\n# Requires reboot to take effect.\n\n# Ensure supergfxctl has been installed\nif omarchy-cmd-missing supergfxctl; then\n  omarchy-pkg-add supergfxctl\n\n  # Create config before starting service to prevent hang on first boot\n  sudo tee /etc/supergfxd.conf >/dev/null <<'CONF'\n{\n  \"mode\": \"Hybrid\",\n  \"vfio_enable\": true,\n  \"vfio_save\": false,\n  \"always_reboot\": false,\n  \"no_logind\": false,\n  \"logout_timeout_s\": 180,\n  \"hotplug_type\": \"None\"\n}\nCONF\n\n  sudo systemctl enable --now supergfxd\nfi\n\ngpu_mode=$(supergfxctl -g)\n\ncase \"$gpu_mode\" in\n\"Integrated\")\n  if gum confirm \"Enable dedicated GPU and reboot?\"; then\n    # Switch to hybrid mode\n    sudo sed -i \"s/\\\"mode\\\": \\\".*\\\"/\\\"mode\\\": \\\"Hybrid\\\"/\" /etc/supergfxd.conf\n\n    # Let hybrid mode be the default after system sleep\n    sudo rm -rf /usr/lib/systemd/system-sleep/force-igpu\n\n    # Remove the startup delay override (not needed for Hybrid mode)\n    sudo rm -rf /etc/systemd/system/supergfxd.service.d/delay-start.conf\n\n    omarchy-system-reboot\n  fi\n  ;;\n\"Hybrid\")\n  if gum confirm \"Use only integrated GPU and reboot?\"; then\n    # Switch to integrated mode and ensure vfio is enabled (needed for sleep/wake trick)\n    sudo sed -i \"s/\\\"mode\\\": \\\".*\\\"/\\\"mode\\\": \\\"Integrated\\\"/\" /etc/supergfxd.conf\n    sudo sed -i 's/\"vfio_enable\": false/\"vfio_enable\": true/' /etc/supergfxd.conf\n\n    # Force igpu mode after system sleep (or dgpu could get activated)\n    sudo mkdir -p /usr/lib/systemd/system-sleep\n    sudo cp -p $OMARCHY_PATH/default/systemd/system-sleep/force-igpu /usr/lib/systemd/system-sleep/\n\n    # Delay supergfxd startup to avoid race condition with display manager\n    # that can cause system freeze when booting in Integrated mode\n    sudo mkdir -p /etc/systemd/system/supergfxd.service.d\n    sudo cp -p $OMARCHY_PATH/default/systemd/system/supergfxd.service.d/delay-start.conf /etc/systemd/system/supergfxd.service.d/\n\n    omarchy-system-reboot\n  fi\n  ;;\n*)\n  echo \"Hybrid GPU not found or in unknown mode.\"\n  exit 1\n  ;;\nesac\n"
  },
  {
    "path": "bin/omarchy-toggle-idle",
    "content": "#!/bin/bash\n\nif pgrep -x hypridle >/dev/null; then\n  pkill -x hypridle\n  notify-send \"󱫖    Stop locking computer when idle\"\nelse\n  uwsm-app -- hypridle >/dev/null 2>&1 &\n  notify-send \"󱫖    Now locking computer when idle\"\nfi\n\npkill -RTMIN+9 waybar\n"
  },
  {
    "path": "bin/omarchy-toggle-nightlight",
    "content": "#!/bin/bash\n\n# Default temperature values\nON_TEMP=4000\nOFF_TEMP=6000\n\n# Ensure hyprsunset is running\nif ! pgrep -x hyprsunset; then\n  setsid uwsm-app -- hyprsunset &\n  sleep 1 # Give it time to register\nfi\n\n# Query the current temperature\nCURRENT_TEMP=$(hyprctl hyprsunset temperature 2>/dev/null | grep -oE '[0-9]+')\n\nrestart_nightlighted_waybar() {\n  if grep -q \"custom/nightlight\" ~/.config/waybar/config.jsonc; then\n    omarchy-restart-waybar # restart waybar in case user has waybar module for hyprsunset\n  fi\n}\n\nif [[ $CURRENT_TEMP == $OFF_TEMP ]]; then\n  hyprctl hyprsunset temperature $ON_TEMP\n  notify-send \"  Nightlight screen temperature\"\n  restart_nightlighted_waybar\nelse\n  hyprctl hyprsunset temperature $OFF_TEMP\n  notify-send \"   Daylight screen temperature\"\n  restart_nightlighted_waybar\nfi\n"
  },
  {
    "path": "bin/omarchy-toggle-notification-silencing",
    "content": "#!/bin/bash\n\nmakoctl mode -t do-not-disturb\n\nif makoctl mode | grep -q 'do-not-disturb'; then\n  notify-send \"󰂛    Silenced notifications\"\nelse\n  notify-send \"󰂚    Enabled notifications\"\nfi\n\npkill -RTMIN+10 waybar\n"
  },
  {
    "path": "bin/omarchy-toggle-screensaver",
    "content": "#!/bin/bash\n\nSTATE_FILE=~/.local/state/omarchy/toggles/screensaver-off\n\nif [[ -f $STATE_FILE ]]; then\n  rm -f $STATE_FILE\n  notify-send \"󱄄   Screensaver enabled\"\nelse\n  mkdir -p \"$(dirname $STATE_FILE)\"\n  touch $STATE_FILE\n  notify-send \"󱄄   Screensaver disabled\"\nfi\n"
  },
  {
    "path": "bin/omarchy-toggle-suspend",
    "content": "#!/bin/bash\n\nSTATE_FILE=~/.local/state/omarchy/toggles/suspend-off\n\nif [[ -f $STATE_FILE ]]; then\n  rm -f $STATE_FILE\n  notify-send \"󰒲   Suspend now available in system menu\"\nelse\n  mkdir -p \"$(dirname $STATE_FILE)\"\n  touch $STATE_FILE\n  notify-send \"󰒲   Suspend removed from system menu\"\nfi\n"
  },
  {
    "path": "bin/omarchy-toggle-waybar",
    "content": "#!/bin/bash\n\nif pgrep -x waybar >/dev/null; then\n  pkill -x waybar\nelse\n  uwsm-app -- waybar >/dev/null 2>&1 &\nfi\n"
  },
  {
    "path": "bin/omarchy-tui-install",
    "content": "#!/bin/bash\n\nset -e\n\nif (( $# != 4 )); then\n  echo -e \"\\e[32mLet's create a TUI shortcut you can start with the app launcher.\\n\\e[0m\"\n  APP_NAME=$(gum input --prompt \"Name> \" --placeholder \"My TUI\")\n  APP_EXEC=$(gum input --prompt \"Launch Command> \" --placeholder \"lazydocker or bash -c 'dust; read -n 1 -s'\")\n  WINDOW_STYLE=$(gum choose --header \"Window style\" float tile)\n  ICON_URL=$(gum input --prompt \"Icon URL> \" --placeholder \"See https://dashboardicons.com (must use PNG or SVG!)\")\nelse\n  APP_NAME=\"$1\"\n  APP_EXEC=\"$2\"\n  WINDOW_STYLE=\"$3\"\n  ICON_URL=\"$4\"\nfi\n\nif [[ -z $APP_NAME || -z $APP_EXEC || -z $ICON_URL ]]; then\n  echo \"You must set app name, app command, and icon URL!\"\n  exit 1\nfi\n\nICON_DIR=\"$HOME/.local/share/applications/icons\"\nDESKTOP_FILE=\"$HOME/.local/share/applications/$APP_NAME.desktop\"\n\nif [[ ! $ICON_URL =~ ^https?:// ]] && [[ -f $ICON_URL ]]; then\n  ICON_PATH=\"$ICON_URL\"\nelse\n  ICON_PATH=\"$ICON_DIR/$APP_NAME.png\"\n  mkdir -p \"$ICON_DIR\"\n  if ! curl -sL -o \"$ICON_PATH\" \"$ICON_URL\"; then\n    echo \"Error: Failed to download icon.\"\n    exit 1\n  fi\nfi\n\nif [[ $WINDOW_STYLE == \"float\" ]]; then\n  APP_CLASS=\"TUI.float\"\nelse\n  APP_CLASS=\"TUI.tile\"\nfi\n\ncat >\"$DESKTOP_FILE\" <<EOF\n[Desktop Entry]\nVersion=1.0\nName=$APP_NAME\nComment=$APP_NAME\nExec=xdg-terminal-exec --app-id=$APP_CLASS -e $APP_EXEC\nTerminal=false\nType=Application\nIcon=$ICON_PATH\nStartupNotify=true\nEOF\n\nchmod +x \"$DESKTOP_FILE\"\n\nif (( $# != 4 )); then\n  echo -e \"You can now find $APP_NAME using the app launcher (SUPER + SPACE)\\n\"\nfi\n"
  },
  {
    "path": "bin/omarchy-tui-remove",
    "content": "#!/bin/bash\n\nset -e\n\nICON_DIR=\"$HOME/.local/share/applications/icons\"\nDESKTOP_DIR=\"$HOME/.local/share/applications/\"\n\nif (( $# == 0 )); then\n  # Find all TUIs\n  while IFS= read -r -d '' file; do\n    if grep -qE '^Exec=.*(\\$TERMINAL|xdg-terminal-exec).*-e' \"$file\"; then\n      TUIS+=(\"$(basename \"${file%.desktop}\")\")\n    fi\n  done < <(find \"$DESKTOP_DIR\" -name '*.desktop' -print0)\n\n  if ((${#TUIS[@]})); then\n    IFS=$'\\n' SORTED_TUIS=($(sort <<<\"${TUIS[*]}\"))\n    unset IFS\n    APP_NAMES_STRING=$(gum choose --no-limit --header \"Select TUI to remove...\" --selected-prefix=\"✗ \" \"${SORTED_TUIS[@]}\")\n    # Convert newline-separated string to array\n    APP_NAMES=()\n    while IFS= read -r line; do\n      [[ -n $line ]] && APP_NAMES+=(\"$line\")\n    done <<< \"$APP_NAMES_STRING\"\n  else\n    echo \"No TUIs to remove.\"\n    exit 1\n  fi\nelse\n  # Use array to preserve spaces in app names\n  APP_NAMES=(\"$@\")\nfi\n\nif (( ${#APP_NAMES[@]} == 0 )); then\n  echo \"You must provide TUI names.\"\n  exit 1\nfi\n\nfor APP_NAME in \"${APP_NAMES[@]}\"; do\n  rm -f \"$DESKTOP_DIR/$APP_NAME.desktop\"\n  rm -f \"$ICON_DIR/$APP_NAME.png\"\n  echo \"Removed $APP_NAME\"\ndone\n"
  },
  {
    "path": "bin/omarchy-tui-remove-all",
    "content": "#!/bin/bash\n\n# Remove all TUIs installed via omarchy-tui-install.\n# Identifies TUIs by their Exec pattern (xdg-terminal-exec --app-id=TUI.).\n\nset -e\n\nAPP_DIR=\"${1:-$HOME/.local/share/applications}\"\nICON_DIR=\"$HOME/.local/share/applications/icons\"\n\necho \"Scanning for TUIs in $APP_DIR...\"\n\ntui_desktop_files=()\nwhile IFS= read -r -d '' file; do\n  if grep -q \"Exec=xdg-terminal-exec --app-id=TUI\\.\" \"$file\" 2>/dev/null; then\n    tui_desktop_files+=(\"$file\")\n  fi\ndone < <(find \"$APP_DIR\" -maxdepth 1 -name \"*.desktop\" -print0 2>/dev/null)\n\nif (( ${#tui_desktop_files[@]} == 0 )); then\n  echo \"No TUIs found.\"\n  exit 0\nfi\n\nfor file in \"${tui_desktop_files[@]}\"; do\n  app_name=$(basename \"$file\" .desktop)\n  echo \"Removing TUI: $app_name\"\n  rm -f \"$file\"\n  rm -f \"$ICON_DIR/$app_name.png\"\ndone\n\nif command -v update-desktop-database &>/dev/null; then\n  update-desktop-database \"$APP_DIR\" &>/dev/null || true\nfi\n\necho \"TUIs removed successfully.\"\n"
  },
  {
    "path": "bin/omarchy-tz-select",
    "content": "#!/bin/bash\n\ntimezone=$(timedatectl list-timezones | gum filter --height 20 --header \"Set timezone\") || exit 1\nsudo timedatectl set-timezone \"$timezone\"\necho \"Timezone is now set to $timezone\"\nomarchy-restart-waybar\n"
  },
  {
    "path": "bin/omarchy-update",
    "content": "#!/bin/bash\n\nset -e\n\ntrap '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 assistance, get help from the community at https://omarchy.org/discord\\033[0m\"' ERR\n\nif [[ $1 == \"-y\" ]] || omarchy-update-confirm; then\n  omarchy-snapshot create || (($? == 127))\n  omarchy-update-git\n  omarchy-update-perform\nfi\n"
  },
  {
    "path": "bin/omarchy-update-analyze-logs",
    "content": "#!/bin/bash\n\nupdate_log=\"/tmp/omarchy-update.log\"\n\n# Check for initramfs generation failure\nif grep -q \"Updating linux initcpios\" \"$update_log\"; then\n  if ! grep -q \"Initcpio image generation successful\" \"$update_log\"; then\n    echo -e '\\e[31mError: Initramfs generation may have failed. Review logs before restart.\\e[0m'\n    echo\n  fi\nfi\n"
  },
  {
    "path": "bin/omarchy-update-aur-pkgs",
    "content": "#!/bin/bash\n\n# Update AUR packages if any are installed\nif pacman -Qem >/dev/null; then\n  if omarchy-pkg-aur-accessible; then\n    echo -e \"\\e[32m\\nUpdate AUR packages\\e[0m\"\n    yay -Sua --noconfirm --cleanafter --ignore gcc14,gcc14-libs\n    echo\n  else\n    echo -e \"\\e[31m\\nAUR is unavailable (so skipping updates)\\e[0m\"\n    echo\n  fi\nfi\n"
  },
  {
    "path": "bin/omarchy-update-available",
    "content": "#!/bin/bash\n\n# Get remote tag\nlatest_tag=$(git -C \"$OMARCHY_PATH\" ls-remote --tags origin | grep -v \"{}\" | awk '{print $2}' | sed 's#refs/tags/##' | sort -V | tail -n 1)\nif [[ -z $latest_tag ]]; then\n  echo \"Error: Could not retrieve latest tag.\"\n  exit 1\nfi\n\n# Get local tag\ncurrent_tag=$(git -C \"$OMARCHY_PATH\" describe --tags $(git -C \"$OMARCHY_PATH\" rev-list --tags --max-count=1))\nif [[ -z $current_tag ]]; then\n  echo \"Error: Could not retrieve current tag.\"\n  exit 1\nfi\n\nif [[ $current_tag != $latest_tag ]]; then\n  echo \"Omarchy update available ($latest_tag)\"\n  exit 0\nelse\n  echo \"Omarchy is up to date ($current_tag)\"\n  exit 1\nfi\n"
  },
  {
    "path": "bin/omarchy-update-available-reset",
    "content": "#!/bin/bash\n\n# Ensure Waybar icon offering the available update is removed\npkill -RTMIN+7 waybar\nexit 0\n"
  },
  {
    "path": "bin/omarchy-update-branch",
    "content": "#!/bin/bash\n\nset -e\n\nif (($# == 0)); then\n  echo \"Usage: omarchy-update-branch [master|dev]\"\n  exit 1\nfi\n\nbranch=\"$1\"\n\n# Snapshot before switching branch\nomarchy-snapshot create || (( $? == 127 ))\n\nif ! git -C \"$OMARCHY_PATH\" diff --quiet || ! git -C \"$OMARCHY_PATH\" diff --cached --quiet; then\n  stashed=true\n  git -C \"$OMARCHY_PATH\" stash push -u -m \"Autostash before switching to $branch\"\nelse\n  stashed=false\nfi\n\n# Switch branches\ngit -C \"$OMARCHY_PATH\" switch \"$branch\"\n\n# Reapply stash if we made one\nif [[ $stashed == \"true\" ]]; then\n  if ! git -C \"$OMARCHY_PATH\" stash pop; then\n    echo \"⚠️ Conflicts when applying stash — stash kept\"\n  fi\nfi\n\n# Update the system from the new branch\nomarchy-update-perform\n"
  },
  {
    "path": "bin/omarchy-update-confirm",
    "content": "#!/bin/bash\n\ngum style --border normal --border-foreground 6 --padding \"1 2\" \\\n  \"Ready to update?\" \\\n  \"\" \\\n  \"• You cannot stop the update once you start!\" \\\n  \"• Make sure you're connected to power or have a full battery\" \\\n  \"\" \\\n  \"What's new: https://github.com/basecamp/omarchy/releases\"\n\necho\n\nif ! gum confirm \"Continue with update?\"; then\n  echo \"Update cancelled\"\n  exit 1\nfi\n"
  },
  {
    "path": "bin/omarchy-update-firmware",
    "content": "#!/bin/bash\n\nset -e\necho -e \"\\e[32mUpdate Firmware\\e[0m\"\n\nif omarchy-cmd-missing fwupdmgr; then\n  omarchy-pkg-add fwupd\nfi\n\nfwupdmgr refresh --force\nsudo fwupdmgr update\n"
  },
  {
    "path": "bin/omarchy-update-git",
    "content": "#!/bin/bash\n\nset -e\n\necho -e \"\\e[32mUpdate Omarchy\\e[0m\"\n\nomarchy-update-time\n\ngit -C $OMARCHY_PATH pull --autostash\ngit -C $OMARCHY_PATH --no-pager diff --check || git -C $OMARCHY_PATH reset --merge\n"
  },
  {
    "path": "bin/omarchy-update-keyring",
    "content": "#!/bin/bash\n\n# Ensure we have the omarchy-keyring and it's populated\nif omarchy-pkg-missing omarchy-keyring || ! sudo pacman-key --list-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571 &>/dev/null; then\n  sudo pacman-key --recv-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571 --keyserver keys.openpgp.org\n  sudo pacman-key --lsign-key 40DFB630FF42BCFFB047046CF0134EE680CAC571\n\n  # This is generally not a good idea, but this is a special case because we're going to be updating\n  # the full set of packages in omarchy-update-system-pkgs right after this (and it needs latest keyring)!\n  sudo pacman -Sy\n  omarchy-pkg-add omarchy-keyring\n\n  sudo pacman-key --list-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571\nfi\n\n# Ensure we have the latest archlinux-keyring, maintainer keys might have changed\necho -e \"\\e[32m\\nUpdate Arch signing keys\\e[0m\"\nsudo pacman -Sy --noconfirm archlinux-keyring >/dev/null\n"
  },
  {
    "path": "bin/omarchy-update-orphan-pkgs",
    "content": "#!/bin/bash\n\norphans=$(pacman -Qtdq || true)\nif [[ -n $orphans ]]; then\n  echo -e \"\\e[32m\\nRemove orphan system packages\\e[0m\"\n  for pkg in $orphans; do\n    sudo pacman -Rs --noconfirm \"$pkg\" || true\n  done\n  echo\nfi\n"
  },
  {
    "path": "bin/omarchy-update-perform",
    "content": "#!/bin/bash\n\nset -e\n\n# Ensure screensaver/sleep doesn't set in during updates\nhyprctl dispatch tagwindow +noidle &>/dev/null || true\n\n# Capture update logs (CLICOLOR_FORCE keeps gum styled when stdout is piped through tee)\nexport CLICOLOR_FORCE=1\nexec > >(tee \"/tmp/omarchy-update.log\") 2>&1\n\n# Perform all update steps\nomarchy-update-keyring\nomarchy-update-available-reset\nomarchy-update-system-pkgs\nomarchy-migrate\nomarchy-update-aur-pkgs\nomarchy-update-orphan-pkgs\nomarchy-hook post-update\n\nomarchy-update-analyze-logs\n\nomarchy-update-restart\n\n# Re-enable screensaver/sleep after updates\nhyprctl dispatch tagwindow -- -noidle &>/dev/null || true\n"
  },
  {
    "path": "bin/omarchy-update-restart",
    "content": "#!/bin/bash\n\necho\n\nif [[ ! -d /usr/lib/modules/$(uname -r) ]]; then\n  gum confirm \"Linux kernel has been updated. Reboot?\" && omarchy-system-reboot\nelif [[ -f $HOME/.local/state/omarchy/reboot-required ]]; then\n  gum confirm \"Updates require reboot. Ready?\" && omarchy-system-reboot\nfi\n\nrunning_hyprland=$(readlink /proc/$(pgrep -x Hyprland)/exe 2>/dev/null)\nif [[ $running_hyprland == *\"(deleted)\"* ]]; then\n  gum confirm \"Hyprland has been updated. Reboot?\" && omarchy-system-reboot\nfi\n\nfor file in \"$HOME\"/.local/state/omarchy/restart-*-required; do\n  if [[ -f $file ]]; then\n    filename=$(basename \"$file\")\n    service=$(echo \"$filename\" | sed 's/restart-\\(.*\\)-required/\\1/')\n    echo \"Restarting $service\"\n    omarchy-state clear \"$filename\"\n    omarchy-restart-\"$service\"\n  fi\ndone\n"
  },
  {
    "path": "bin/omarchy-update-system-pkgs",
    "content": "#!/bin/bash\n\nset -e\n\necho -e \"\\e[32m\\nUpdate system packages\\e[0m\"\nsudo pacman -Syyu --noconfirm\n"
  },
  {
    "path": "bin/omarchy-update-time",
    "content": "#!/bin/bash\n\necho \"Updating time...\"\nsudo systemctl restart systemd-timesyncd\n"
  },
  {
    "path": "bin/omarchy-update-without-idle",
    "content": "#!/bin/bash\n\n# No-op now that omarchy-update-perform is responsible for idle management.\n# But this file can't be removed since it was referenced in old omarchy-update files,\n# which would fail if this file is missing.\n"
  },
  {
    "path": "bin/omarchy-upload-log",
    "content": "#!/bin/bash\n\n# Upload logs to 0x0.st\n\nLOG_TYPE=\"${1:-install}\"\nTEMP_LOG=\"/tmp/upload-log.txt\"\nSYSTEM_INFO=\"/tmp/system-info.txt\"\n\n# Get system information if fastfetch is available\nif command -v fastfetch >/dev/null 2>&1; then\n  {\n    echo \"=========================================\"\n    echo \"SYSTEM INFORMATION\"\n    echo \"=========================================\"\n    # Use fastfetch with no logo to get clean output\n    fastfetch --logo none --pipe 2>/dev/null || echo \"Failed to get system info\"\n    echo \"\"\n    echo \"=========================================\"\n    echo \"LOG CONTENT\"\n    echo \"=========================================\"\n    echo \"\"\n  } >\"$SYSTEM_INFO\"\nelse\n  # Fallback to basic info if fastfetch isn't available\n  {\n    echo \"=========================================\"\n    echo \"SYSTEM INFORMATION\"\n    echo \"=========================================\"\n    echo \"Hostname: $(hostname)\"\n    echo \"Kernel: $(uname -r)\"\n    echo \"Date: $(date)\"\n    echo \"\"\n    echo \"=========================================\"\n    echo \"LOG CONTENT\"\n    echo \"=========================================\"\n    echo \"\"\n  } >\"$SYSTEM_INFO\"\nfi\n\ncase \"$LOG_TYPE\" in\ninstall)\n  ARCHINSTALL_LOG=\"/var/log/archinstall/install.log\"\n  OMARCHY_LOG=\"/var/log/omarchy-install.log\"\n\n  # Combine system info with logs\n  cat \"$SYSTEM_INFO\" >\"$TEMP_LOG\"\n  cat $ARCHINSTALL_LOG $OMARCHY_LOG >>\"$TEMP_LOG\" 2>/dev/null\n\n  if [[ ! -s $TEMP_LOG ]]; then\n    echo \"Error: No install logs found\"\n    exit 1\n  fi\n\n  echo \"Uploading installation log to 0x0.st...\"\n  ;;\n\nthis-boot)\n  # Combine system info with boot logs\n  cat \"$SYSTEM_INFO\" >\"$TEMP_LOG\"\n  journalctl -b 0 >>\"$TEMP_LOG\" 2>/dev/null\n\n  if [[ ! -s $TEMP_LOG ]]; then\n    echo \"Error: No logs found for current boot\"\n    exit 1\n  fi\n\n  echo \"Uploading current boot logs to 0x0.st...\"\n  ;;\n\nlast-boot)\n  # Combine system info with previous boot logs\n  cat \"$SYSTEM_INFO\" >\"$TEMP_LOG\"\n  journalctl -b -1 >>\"$TEMP_LOG\" 2>/dev/null\n\n  if [[ ! -s $TEMP_LOG ]]; then\n    echo \"Error: No logs found for previous boot\"\n    exit 1\n  fi\n\n  echo \"Uploading previous boot logs to 0x0.st...\"\n  ;;\n\ninstalled|system-info)\n  # System info plus all installed packages\n  cat \"$SYSTEM_INFO\" >\"$TEMP_LOG\"\n  {\n    echo \"\"\n    echo \"=========================================\"\n    echo \"INSTALLED PACKAGES (pacman -Q)\"\n    echo \"=========================================\"\n    pacman -Q 2>/dev/null || echo \"Failed to get package list\"\n  } >>\"$TEMP_LOG\"\n\n  if [[ ! -s $TEMP_LOG ]]; then\n    echo \"Error: Failed to gather system information\"\n    exit 1\n  fi\n\n  echo \"Uploading system information to 0x0.st...\"\n  ;;\n\n*)\n  echo \"Usage: $0 [install|this-boot|last-boot|installed|system-info]\"\n  echo \"  install      - Upload installation logs (default)\"\n  echo \"  this-boot    - Upload logs from current boot\"\n  echo \"  last-boot    - Upload logs from previous boot\"\n  echo \"  installed    - Upload system info and installed packages\"\n  exit 1\n  ;;\nesac\n\necho \"\"\n\nURL=$(curl -sF \"file=@$TEMP_LOG\" -Fexpires=24 https://0x0.st)\n\nif (( $? == 0 )) && [[ -n $URL ]]; then\n  echo \"✓ Log uploaded successfully!\"\n  echo \"Share this URL:\"\n  echo \"\"\n  echo \"  $URL\"\n  echo \"\"\n  echo \"This link will expire in 24 hours.\"\nelse\n  echo \"Error: Failed to upload log file\"\n  exit 1\nfi\n"
  },
  {
    "path": "bin/omarchy-version",
    "content": "#!/bin/bash\ncat $OMARCHY_PATH/version\n"
  },
  {
    "path": "bin/omarchy-version-branch",
    "content": "#!/bin/bash\n\necho $(git -C \"$OMARCHY_PATH\" rev-parse --abbrev-ref HEAD)\n"
  },
  {
    "path": "bin/omarchy-version-channel",
    "content": "#!/bin/bash\n\nif grep -q \"https://stable-mirror.omarchy.org/\" /etc/pacman.d/mirrorlist; then\n  mirror=\"stable\"\nelif grep -q \"https://rc-mirror.omarchy.org/\" /etc/pacman.d/mirrorlist; then\n  mirror=\"rc\"\nelif grep -q \"https://mirror.omarchy.org/\" /etc/pacman.d/mirrorlist; then\n  mirror=\"edge\"\nelse\n  mirror=\"unknown\"\nfi\n\nif grep -q \"https://pkgs.omarchy.org/stable/\" /etc/pacman.conf; then\n  pkgs=\"stable\"\nelif grep -q \"https://pkgs.omarchy.org/edge/\" /etc/pacman.conf; then\n  pkgs=\"edge\"\nelif grep -q \"https://pkgs.omarchy.org/rc/\" /etc/pacman.conf; then\n  pkgs=\"rc\"\nelse\n  pkgs=\"unknown\"\nfi\n\nif [[ $mirror == $pkgs ]]; then\n  echo $mirror\nelse\n  echo \"$mirror / $pkgs\"\nfi\n"
  },
  {
    "path": "bin/omarchy-version-pkgs",
    "content": "#!/bin/bash\n\ndate -d \"$(grep upgraded /var/log/pacman.log | tail -1 | sed -E 's/\\[([^]]+)\\].*/\\1/')\" \"+%A, %B %d %Y at %H:%M\"\n"
  },
  {
    "path": "bin/omarchy-voxtype-config",
    "content": "#!/bin/bash\nset -e\n\n# Used by Voxtype waybar module to open config on right click\n\nexec omarchy-launch-editor ~/.config/voxtype/config.toml\n"
  },
  {
    "path": "bin/omarchy-voxtype-install",
    "content": "#!/bin/bash\nset -e\n\n# Install voxtype and configure it for use.\n\nif gum confirm \"Install Voxtype + AI model (~150MB) to enable dictation?\"; then\n  omarchy-pkg-add wtype voxtype-bin\n\n  # Setup voxtype\n  mkdir -p ~/.config/voxtype\n  cp $OMARCHY_PATH/default/voxtype/config.toml ~/.config/voxtype/\n\n  voxtype setup --download --no-post-install\n  voxtype setup systemd\n\n  omarchy-restart-waybar\n  notify-send \"    Voxtype Dictation Ready\" \"Press Super + Ctrl + X to toggle dictation.\\nEdit ~/.config/voxtype/config.toml for options.\" -t 10000\nfi\n"
  },
  {
    "path": "bin/omarchy-voxtype-model",
    "content": "#!/bin/bash\nset -e\n\nomarchy-launch-floating-terminal-with-presentation \"voxtype setup model\"\nomarchy-restart-waybar\n"
  },
  {
    "path": "bin/omarchy-voxtype-remove",
    "content": "#!/bin/bash\nset -e\n\n# Remove voxtype and its configurations.\n\nif omarchy-cmd-present voxtype; then\n  echo \"Uninstall Voxtype to remove dictation.\"\n\n  # Remove services\n  systemctl --user stop voxtype.service 2>/dev/null || true\n  rm -f ~/.config/systemd/user/voxtype*\n  systemctl --user daemon-reload\n\n  # Remove packages and configs\n  omarchy-pkg-drop wtype voxtype-bin\n  rm -rf ~/.config/voxtype\n  rm -rf ~/.local/share/voxtype\nelse\n  echo \"Voxtype was not installed.\"\nfi\n"
  },
  {
    "path": "bin/omarchy-voxtype-status",
    "content": "#!/bin/bash\n\nif omarchy-cmd-present voxtype; then\n  voxtype status --follow --extended --format json | while read -r line; do\n    echo \"$line\" | jq -c '. + {alt: .class}'\n  done\nelse\n  echo '{\"alt\": \"\", \"tooltip\": \"\"}'\nfi\n"
  },
  {
    "path": "bin/omarchy-webapp-handler-hey",
    "content": "#!/bin/bash\nurl=\"$1\"\nweb_url=\"https://app.hey.com\"\n\n# Handle mailto: URLs\nif [[ $url =~ ^mailto: ]]; then\n  email=$(echo \"$url\" | sed 's/mailto://')\n  web_url=\"https://app.hey.com/messages/new?to=$email\"\nfi\n\nexec omarchy-launch-webapp \"$web_url\"\n"
  },
  {
    "path": "bin/omarchy-webapp-handler-zoom",
    "content": "#!/bin/bash\n\nurl=\"$1\"\nweb_url=\"https://app.zoom.us/wc/home\"\n\nif [[ $url =~ ^zoom(mtg|us):// ]]; then\n  confno=$(echo \"$url\" | sed -n 's/.*[?&]confno=\\([^&]*\\).*/\\1/p')\n\n  if [[ -n $confno ]]; then\n    pwd=$(echo \"$url\" | sed -n 's/.*[?&]pwd=\\([^&]*\\).*/\\1/p')\n\n    if [[ -n $pwd ]]; then\n      web_url=\"https://app.zoom.us/wc/join/$confno?pwd=$pwd\"\n    else\n      web_url=\"https://app.zoom.us/wc/join/$confno\"\n    fi\n  fi\nfi\n\nexec omarchy-launch-webapp \"$web_url\"\n"
  },
  {
    "path": "bin/omarchy-webapp-install",
    "content": "#!/bin/bash\n\nset -e\n\nICON_DIR=\"$HOME/.local/share/applications/icons\"\n\nif (( $# < 3 )); then\n  echo -e \"\\e[32mLet's create a new web app you can start with the app launcher.\\n\\e[0m\"\n  APP_NAME=$(gum input --prompt \"Name> \" --placeholder \"My favorite web app\")\n  APP_URL=$(gum input --prompt \"URL> \" --placeholder \"https://example.com\")\n  if [[ ! $APP_URL =~ ^[a-zA-Z][a-zA-Z0-9+.-]*: ]]; then\n    APP_URL=\"https://$APP_URL\"\n  fi\n\n  # Try to fetch favicon automatically first.\n  FAVICON_URL=\"https://www.google.com/s2/favicons?domain=${APP_URL}&sz=128\"\n  mkdir -p \"$ICON_DIR\"\n  if curl -fsSL -o \"$ICON_DIR/$APP_NAME.png\" \"$FAVICON_URL\" && [[ -s $ICON_DIR/$APP_NAME.png ]]; then\n    ICON_REF=\"$APP_NAME.png\"\n  else\n    ICON_REF=$(gum input --prompt \"Icon URL> \" --placeholder \"Could not fetch favicon automatically. Enter PNG icon URL (see https://dashboardicons.com)\")\n  fi\n\n  CUSTOM_EXEC=\"\"\n  MIME_TYPES=\"\"\n  INTERACTIVE_MODE=true\nelse\n  APP_NAME=\"$1\"\n  APP_URL=\"$2\"\n  if [[ ! $APP_URL =~ ^[a-zA-Z][a-zA-Z0-9+.-]*: ]]; then\n    APP_URL=\"https://$APP_URL\"\n  fi\n  ICON_REF=\"$3\"\n  CUSTOM_EXEC=\"$4\" # Optional custom exec command\n  MIME_TYPES=\"$5\"  # Optional mime types\n  INTERACTIVE_MODE=false\nfi\n\n# Ensure valid execution\nif [[ -z $APP_NAME || -z $APP_URL ]]; then\n  echo \"You must set app name and app URL!\"\n  exit 1\nfi\n\n# Resolve icon from URL or from a local icon name.\nmkdir -p \"$ICON_DIR\"\n\nif [[ -z $ICON_REF ]]; then\n  ICON_REF=\"https://www.google.com/s2/favicons?domain=${APP_URL}&sz=128\"\nfi\n\nif [[ $ICON_REF =~ ^https?:// ]]; then\n  ICON_PATH=\"$ICON_DIR/$APP_NAME.png\"\n  if ! curl -fsSL -o \"$ICON_PATH\" \"$ICON_REF\" || [[ ! -s $ICON_PATH ]]; then\n    echo \"Error: Failed to download icon.\"\n    exit 1\n  fi\nelse\n  ICON_PATH=\"$ICON_DIR/$ICON_REF\"\nfi\n\n# Use custom exec if provided, otherwise default behavior\nEXEC_COMMAND=\"${CUSTOM_EXEC:-omarchy-launch-webapp $APP_URL}\"\n\n# Create application .desktop file\nDESKTOP_FILE=\"$HOME/.local/share/applications/$APP_NAME.desktop\"\n\ncat >\"$DESKTOP_FILE\" <<EOF\n[Desktop Entry]\nVersion=1.0\nName=$APP_NAME\nComment=$APP_NAME\nExec=$EXEC_COMMAND\nTerminal=false\nType=Application\nIcon=$ICON_PATH\nStartupNotify=true\nEOF\n\n# Add mime types if provided\nif [[ -n $MIME_TYPES ]]; then\n  echo \"MimeType=$MIME_TYPES\" >>\"$DESKTOP_FILE\"\nfi\n\nchmod +x \"$DESKTOP_FILE\"\n\nif [[ $INTERACTIVE_MODE == \"true\" ]]; then\n  echo -e \"You can now find $APP_NAME using the app launcher (SUPER + SPACE)\\n\"\nfi\n"
  },
  {
    "path": "bin/omarchy-webapp-remove",
    "content": "#!/bin/bash\n\nset -e\n\nICON_DIR=\"$HOME/.local/share/applications/icons\"\nDESKTOP_DIR=\"$HOME/.local/share/applications/\"\n\nif (( $# == 0 )); then\n  # Find all web apps\n  while IFS= read -r -d '' file; do\n    if grep -q '^Exec=.*\\(omarchy-launch-webapp\\|omarchy-webapp-handler\\).*' \"$file\"; then\n      WEB_APPS+=(\"$(basename \"${file%.desktop}\")\")\n    fi\n  done < <(find \"$DESKTOP_DIR\" -name '*.desktop' -print0)\n\n  if ((${#WEB_APPS[@]})); then\n    IFS=$'\\n' SORTED_WEB_APPS=($(sort <<<\"${WEB_APPS[*]}\"))\n    unset IFS\n    APP_NAMES_STRING=$(gum choose --no-limit --header \"Select web app to remove...\" --selected-prefix=\"✗ \" \"${SORTED_WEB_APPS[@]}\")\n    # Convert newline-separated string to array\n    APP_NAMES=()\n    while IFS= read -r line; do\n      [[ -n $line ]] && APP_NAMES+=(\"$line\")\n    done <<< \"$APP_NAMES_STRING\"\n  else\n    echo \"No web apps to remove.\"\n    exit 1\n  fi\nelse\n  # Use array to preserve spaces in app names\n  APP_NAMES=(\"$@\")\nfi\n\nif (( ${#APP_NAMES[@]} == 0 )); then\n  echo \"You must select at least one web app to remove.\"\n  exit 1\nfi\n\nfor APP_NAME in \"${APP_NAMES[@]}\"; do\n  rm -f \"$DESKTOP_DIR/$APP_NAME.desktop\"\n  rm -f \"$ICON_DIR/$APP_NAME.png\"\n  echo \"Removed $APP_NAME\"\ndone\n"
  },
  {
    "path": "bin/omarchy-webapp-remove-all",
    "content": "#!/bin/bash\n\n# Remove all web apps installed via omarchy-webapp-install.\n# Identifies web apps by their Exec pattern (omarchy-launch-webapp or omarchy-webapp-handler).\n\nset -e\n\nAPP_DIR=\"${1:-$HOME/.local/share/applications}\"\nICON_DIR=\"$HOME/.local/share/applications/icons\"\n\necho \"Scanning for web apps in $APP_DIR...\"\n\nwebapp_desktop_files=()\nwhile IFS= read -r -d '' file; do\n  if grep -q \"Exec=omarchy-launch-webapp\\|Exec=omarchy-webapp-handler\" \"$file\" 2>/dev/null; then\n    webapp_desktop_files+=(\"$file\")\n  fi\ndone < <(find \"$APP_DIR\" -maxdepth 1 -name \"*.desktop\" -print0 2>/dev/null)\n\nif (( ${#webapp_desktop_files[@]} == 0 )); then\n  echo \"No web apps found.\"\n  exit 0\nfi\n\nfor file in \"${webapp_desktop_files[@]}\"; do\n  app_name=$(basename \"$file\" .desktop)\n  echo \"Removing web app: $app_name\"\n  rm -f \"$file\"\n  rm -f \"$ICON_DIR/$app_name.png\"\ndone\n\nif command -v update-desktop-database &>/dev/null; then\n  update-desktop-database \"$APP_DIR\" &>/dev/null || true\nfi\n\necho \"Web apps removed successfully.\"\n"
  },
  {
    "path": "bin/omarchy-wifi-powersave",
    "content": "#!/bin/bash\nfor iface in /sys/class/net/*/wireless; do\n  iface=\"$(basename \"$(dirname \"$iface\")\")\"\n  iw dev \"$iface\" set power_save \"$1\" 2>/dev/null\ndone\n"
  },
  {
    "path": "bin/omarchy-windows-vm",
    "content": "#!/bin/bash\nCOMPOSE_FILE=\"$HOME/.config/windows/docker-compose.yml\"\n\ncheck_prerequisites() {\n  local DISK_SIZE_GB=${1:-64}\n  local REQUIRED_SPACE=$((DISK_SIZE_GB + 10))  # Add 10GB for Windows ISO and overhead\n\n  # Check for KVM support\n  if [[ ! -e /dev/kvm ]]; then\n    gum style \\\n      --border normal \\\n      --padding \"1 2\" \\\n      --margin \"1\" \\\n      \"❌ KVM virtualization not available!\" \\\n      \"\" \\\n      \"Please enable virtualization in BIOS or run:\" \\\n      \"  sudo modprobe kvm-intel  # for Intel CPUs\" \\\n      \"  sudo modprobe kvm-amd    # for AMD CPUs\"\n    exit 1\n  fi\n\n  # Check disk space\n  AVAILABLE_SPACE=$(df \"$HOME\" | awk 'NR==2 {print int($4/1024/1024)}')\n  if (( AVAILABLE_SPACE < REQUIRED_SPACE )); then\n    echo \"❌ Insufficient disk space!\"\n    echo \"   Available: ${AVAILABLE_SPACE}GB\"\n    echo \"   Required: ${REQUIRED_SPACE}GB (${DISK_SIZE_GB}GB disk + 10GB for Windows image)\"\n    exit 1\n  fi\n}\n\ninstall_windows() {\n  # Set up trap to handle Ctrl+C\n  trap \"echo ''; echo 'Installation cancelled by user'; exit 1\" INT\n\n  check_prerequisites\n\n  omarchy-pkg-add freerdp openbsd-netcat gum\n\n  mkdir -p \"$HOME/.windows\"\n  mkdir -p \"$HOME/.config/windows\"\n  mkdir -p \"$HOME/.local/share/applications/icons\"\n\n  # Install Windows VM icon and desktop file\n  if [[ -f $OMARCHY_PATH/applications/icons/windows.png ]]; then\n    cp \"$OMARCHY_PATH/applications/icons/windows.png\" \"$HOME/.local/share/applications/icons/windows.png\"\n  fi\n\n  cat << EOF | tee \"$HOME/.local/share/applications/windows-vm.desktop\" > /dev/null\n[Desktop Entry]\nName=Windows\nComment=Start Windows VM via Docker and connect with RDP\nExec=uwsm app -- omarchy-windows-vm launch\nIcon=$HOME/.local/share/applications/icons/windows.png\nTerminal=false\nType=Application\nCategories=System;Virtualization;\nEOF\n\n  # Get system resources\n  TOTAL_RAM=$(free -h | awk 'NR==2 {print $2}')\n  TOTAL_RAM_GB=$(awk 'NR==1 {printf \"%d\", $2/1024/1024}' /proc/meminfo)\n  TOTAL_CORES=$(nproc)\n\n  echo \"\"\n  echo \"System Resources Detected:\"\n  echo \"  Total RAM: $TOTAL_RAM\"\n  echo \"  Total CPU Cores: $TOTAL_CORES\"\n  echo \"\"\n\n  RAM_OPTIONS=\"\"\n  for size in 2 4 8 16 32 64; do\n    if (( size <= TOTAL_RAM_GB )); then\n      RAM_OPTIONS=\"$RAM_OPTIONS ${size}G\"\n    fi\n  done\n\n  SELECTED_RAM=$(echo $RAM_OPTIONS | tr ' ' '\\n' | gum choose --selected=\"4G\" --header=\"How much RAM would you like to allocate to Windows VM?\")\n\n  # Check if user cancelled\n  if [[ -z $SELECTED_RAM ]]; then\n    echo \"Installation cancelled by user\"\n    exit 1\n  fi\n\n  SELECTED_CORES=$(gum input --placeholder=\"Number of CPU cores (1-$TOTAL_CORES)\" --value=\"2\" --header=\"How many CPU cores would you like to allocate to Windows VM?\" --char-limit=2)\n\n  # Check if user cancelled (Ctrl+C in gum input returns empty string)\n  if [[ -z $SELECTED_CORES ]]; then\n    echo \"Installation cancelled by user\"\n    exit 1\n  fi\n\n  if ! [[ $SELECTED_CORES =~ ^[0-9]+$ ]] || (( SELECTED_CORES < 1 )) || (( SELECTED_CORES > TOTAL_CORES )); then\n    echo \"Invalid input. Using default: 2 cores\"\n    SELECTED_CORES=2\n  fi\n\n  AVAILABLE_SPACE=$(df \"$HOME\" | awk 'NR==2 {print int($4/1024/1024)}')\n  MAX_DISK_GB=$((AVAILABLE_SPACE - 10))  # Leave 10GB for Windows image\n\n  # Check if we have enough space for minimum\n  if (( MAX_DISK_GB < 32 )); then\n    echo \"❌ Insufficient disk space for Windows VM!\"\n    echo \"   Available: ${AVAILABLE_SPACE}GB\"\n    echo \"   Minimum required: 42GB (32GB disk + 10GB for Windows image)\"\n    exit 1\n  fi\n\n  DISK_OPTIONS=\"\"\n  for size in 32 64 128 256 512; do\n    if (( size <= MAX_DISK_GB )); then\n      DISK_OPTIONS=\"$DISK_OPTIONS ${size}G\"\n    fi\n  done\n\n  # Default to 64G if available, otherwise 32G\n  DEFAULT_DISK=\"64G\"\n  if ! echo \"$DISK_OPTIONS\" | grep -q \"64G\"; then\n    DEFAULT_DISK=\"32G\"\n  fi\n\n  SELECTED_DISK=$(echo $DISK_OPTIONS | tr ' ' '\\n' | gum choose --selected=\"$DEFAULT_DISK\" --header=\"How much disk space would you like to give Windows VM? (64GB+ recommended)\")\n\n  # Check if user cancelled\n  if [[ -z $SELECTED_DISK ]]; then\n    echo \"Installation cancelled by user\"\n    exit 1\n  fi\n\n  # Extract just the number for prerequisite check\n  DISK_SIZE_NUM=$(echo \"$SELECTED_DISK\" | sed 's/G//')\n\n  # Re-check prerequisites with selected disk size\n  check_prerequisites \"$DISK_SIZE_NUM\"\n\n  # Prompt for username and password\n  USERNAME=$(gum input --placeholder=\"Username (Press enter to use default: docker)\" --header=\"Enter Windows username:\")\n  if [[ -z $USERNAME ]]; then\n    USERNAME=\"docker\"\n  fi\n\n  PASSWORD=$(gum input --placeholder=\"Password (Press enter to use default: admin)\" --password --header=\"Enter Windows password:\")\n  if [[ -z $PASSWORD ]]; then\n    PASSWORD=\"admin\"\n    PASSWORD_DISPLAY=\"(default)\"\n  else\n    PASSWORD_DISPLAY=\"(user-defined)\"\n  fi\n\n  # Display configuration summary\n  gum style \\\n    --border normal \\\n    --padding \"1 2\" \\\n    --margin \"1\" \\\n    --align left \\\n    --bold \\\n    \"Windows VM Configuration\" \\\n    \"\" \\\n    \"RAM:       $SELECTED_RAM\" \\\n    \"CPU:       $SELECTED_CORES cores\" \\\n    \"Disk:      $SELECTED_DISK\" \\\n    \"Username:  $USERNAME\" \\\n    \"Password:  $PASSWORD_DISPLAY\"\n\n  # Ask for confirmation\n  echo \"\"\n  if ! gum confirm \"Proceed with this configuration?\"; then\n    echo \"Installation cancelled by user\"\n    exit 1\n  fi\n\n  mkdir -p $HOME/Windows\n\n  # Create docker-compose.yml in user config directory\n  cat << EOF | tee \"$COMPOSE_FILE\" > /dev/null\nservices:\n  windows:\n    image: dockurr/windows\n    container_name: omarchy-windows\n    environment:\n      VERSION: \"11\"\n      RAM_SIZE: \"$SELECTED_RAM\"\n      CPU_CORES: \"$SELECTED_CORES\"\n      DISK_SIZE: \"$SELECTED_DISK\"\n      USERNAME: \"$USERNAME\"\n      PASSWORD: \"$PASSWORD\"\n      TZ: \"$(timedatectl show -p Timezone --value 2>/dev/null || echo UTC)\"\n      ARGUMENTS: \"-rtc base=localtime,clock=host,driftfix=slew\"\n    devices:\n      - /dev/kvm\n      - /dev/net/tun\n    cap_add:\n      - NET_ADMIN\n    ports:\n      - 127.0.0.1:8006:8006\n      - 127.0.0.1:3389:3389/tcp\n      - 127.0.0.1:3389:3389/udp\n    volumes:\n      - $HOME/.windows:/storage\n      - $HOME/Windows:/shared\n    restart: unless-stopped\n    stop_grace_period: 2m\nEOF\n\n  echo \"\"\n  echo \"Starting Windows VM installation...\"\n  echo \"This will download a Windows 11 image (may take 10-15 minutes).\"\n  echo \"\"\n  echo \"Monitor installation progress at: http://127.0.0.1:8006\"\n  echo \"\"\n\n  # Start docker-compose with user's config\n  echo \"Starting Windows VM with docker-compose...\"\n  if ! docker-compose -f \"$COMPOSE_FILE\" up -d 2>&1; then\n    echo \"❌ Failed to start Windows VM!\"\n    echo \"   Common issues:\"\n    echo \"   - Docker daemon not running: sudo systemctl start docker\"\n    echo \"   - Port already in use: check if another VM is running\"\n    echo \"   - Permission issues: make sure you're in the docker group\"\n    exit 1\n  fi\n\n  echo \"\"\n  echo \"Windows VM is starting up!\"\n  echo \"\"\n  echo \"Opening browser to monitor installation...\"\n\n  # Open browser to monitor installation\n  sleep 3\n  xdg-open \"http://127.0.0.1:8006\"\n\n  echo \"\"\n  echo \"Installation is running in the background.\"\n  echo \"You can monitor progress at: http://127.0.0.1:8006\"\n  echo \"\"\n  echo \"Once finished, launch 'Windows' via Super + Space\"\n  echo \"\"\n  echo \"To stop the VM: omarchy-windows-vm stop\"\n  echo \"To change resources: ~/.config/windows/docker-compose.yml\"\n  echo \"\"\n}\n\nremove_windows() {\n  if ! gum confirm --default=false \"Remove Windows VM and delete all associated data?\"; then\n    echo \"Removal cancelled by user\"\n    exit 1\n  fi\n\n  echo \"Removing Windows VM...\"\n\n  docker-compose -f \"$COMPOSE_FILE\" down 2>/dev/null || true\n\n  docker rmi dockurr/windows 2>/dev/null || echo \"Image already removed or not found\"\n\n  rm \"$HOME/.local/share/applications/windows-vm.desktop\"\n  rm -rf \"$HOME/.config/windows\"\n  rm -rf \"$HOME/.windows\"\n\n  echo \"\"\n  echo \"Windows VM removal completed!\"\n}\n\nlaunch_windows() {\n  KEEP_ALIVE=false\n  if [[ $1 = \"--keep-alive\" ]] || [[ $1 = \"-k\" ]]; then\n    KEEP_ALIVE=true\n  fi\n\n  # Check if config exists\n  if [[ ! -f $COMPOSE_FILE ]]; then\n    echo \"Windows VM not configured. Please run: omarchy-windows-vm install\"\n    exit 1\n  fi\n\n  # Extract credentials from compose file\n  WIN_USER=$(grep \"USERNAME:\" \"$COMPOSE_FILE\" | sed 's/.*USERNAME: \"\\(.*\\)\"/\\1/')\n  WIN_PASS=$(grep \"PASSWORD:\" \"$COMPOSE_FILE\" | sed 's/.*PASSWORD: \"\\(.*\\)\"/\\1/')\n\n  # Use defaults if not found\n  [[ -z $WIN_USER ]] && WIN_USER=\"docker\"\n  [[ -z $WIN_PASS ]] && WIN_PASS=\"admin\"\n\n  # Check if container is already running\n  CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' omarchy-windows 2>/dev/null)\n\n  if [[ $CONTAINER_STATUS != \"running\" ]]; then\n    echo \"Starting Windows VM...\"\n\n    # Send desktop notification\n    notify-send \"    Starting Windows VM\" \"      This can take 15-30 seconds\" -t 15000\n\n    if ! docker-compose -f \"$COMPOSE_FILE\" up -d 2>&1; then\n      echo \"❌ Failed to start Windows VM!\"\n      echo \"   Try checking: omarchy-windows-vm status\"\n      echo \"   View logs: docker logs omarchy-windows\"\n      notify-send -u critical \"Windows VM\" \"Failed to start Windows VM\"\n      exit 1\n    fi\n\n    echo \"Waiting for Windows VM to start...\"\n    WAIT_COUNT=0\n    until docker logs omarchy-windows 2>&1 | grep -qi \"windows started successfully\"; do\n      sleep 2\n      WAIT_COUNT=$((WAIT_COUNT + 1))\n      if (( WAIT_COUNT > 60 )); then  # 2 minutes timeout\n        echo \"\"\n        echo \"❌ Timeout: Windows VM failed to start within 2 minutes\"\n        echo \"   Check logs: docker logs omarchy-windows\"\n        exit 1\n      fi\n    done\n  fi\n\n  # Build the connection info\n  if [[ $KEEP_ALIVE = \"true\" ]]; then\n    LIFECYCLE=\"VM will keep running after RDP closes\nTo stop: omarchy-windows-vm stop\"\n  else\n    LIFECYCLE=\"VM will auto-stop when RDP closes\"\n  fi\n\n  gum style \\\n    --border normal \\\n    --padding \"1 2\" \\\n    --margin \"1\" \\\n    --align center \\\n    \"Connecting to Windows VM\" \\\n    \"\" \\\n    \"$LIFECYCLE\"\n\n  # Detect display scale from Hyprland\n  HYPR_SCALE=$(hyprctl monitors -j | jq -r '.[] | select (.focused == true) | .scale')\n  SCALE_PERCENT=$(echo \"$HYPR_SCALE\" | awk '{print int($1 * 100)}')\n\n  RDP_SCALE=\"\"\n  if (( SCALE_PERCENT >= 170 )); then\n    RDP_SCALE=\"/scale:180\"\n  elif (( SCALE_PERCENT >= 130 )); then\n    RDP_SCALE=\"/scale:140\"\n  fi\n  # If scale is less than 130%, don't set any scale (use default 100)\n\n  # Connect with RDP in fullscreen (auto-detects resolution)\n  xfreerdp3 /u:\"$WIN_USER\" /p:\"$WIN_PASS\" /v:127.0.0.1:3389 -grab-keyboard /sound /microphone /clipboard /cert:ignore /title:\"Windows VM - Omarchy\" /dynamic-resolution /gfx:AVC444 /floatbar:sticky:off,default:visible,show:fullscreen $RDP_SCALE\n\n  # After RDP closes, stop the container unless --keep-alive was specified\n  if [[ $KEEP_ALIVE = \"false\" ]]; then\n    echo \"\"\n    echo \"RDP session closed. Stopping Windows VM...\"\n    docker-compose -f \"$COMPOSE_FILE\" down\n    echo \"Windows VM stopped.\"\n  else\n    echo \"\"\n    echo \"RDP session closed. Windows VM is still running.\"\n    echo \"To stop it: omarchy-windows-vm stop\"\n  fi\n}\n\nstop_windows() {\n  if [[ ! -f $COMPOSE_FILE ]]; then\n    echo \"Windows VM not configured.\"\n    exit 1\n  fi\n\n  echo \"Stopping Windows VM...\"\n  docker-compose -f \"$COMPOSE_FILE\" down\n  echo \"Windows VM stopped.\"\n}\n\nstatus_windows() {\n  if [[ ! -f $COMPOSE_FILE ]]; then\n    echo \"Windows VM not configured.\"\n    echo \"To set up: omarchy-windows-vm install\"\n    exit 1\n  fi\n\n  CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' omarchy-windows 2>/dev/null)\n\n  if [[ -z $CONTAINER_STATUS ]]; then\n    echo \"Windows VM container not found.\"\n    echo \"To start: omarchy-windows-vm launch\"\n  elif [[ $CONTAINER_STATUS = \"running\" ]]; then\n    gum style \\\n      --border normal \\\n      --padding \"1 2\" \\\n      --margin \"1\" \\\n      --align left \\\n      \"Windows VM Status: RUNNING\" \\\n      \"\" \\\n      \"Web interface: http://127.0.0.1:8006\" \\\n      \"RDP available: port 3389\" \\\n      \"\" \\\n      \"To connect: omarchy-windows-vm launch\" \\\n      \"To stop:    omarchy-windows-vm stop\"\n  else\n    echo \"Windows VM is stopped (status: $CONTAINER_STATUS)\"\n    echo \"To start: omarchy-windows-vm launch\"\n  fi\n}\n\nshow_usage() {\n  echo \"Usage: omarchy-windows-vm [command] [options]\"\n  echo \"\"\n  echo \"Commands:\"\n  echo \"  install              Install and configure Windows VM\"\n  echo \"  remove               Remove Windows VM and optionally its data\"\n  echo \"  launch [options]     Start Windows VM (if needed) and connect via RDP\"\n  echo \"                       Options:\"\n  echo \"                         --keep-alive, -k   Keep VM running after RDP closes\"\n  echo \"  stop                 Stop the running Windows VM\"\n  echo \"  status               Show current VM status\"\n  echo \"  help                 Show this help message\"\n  echo \"\"\n  echo \"Examples:\"\n  echo \"  omarchy-windows-vm install           # Set up Windows VM for first time\"\n  echo \"  omarchy-windows-vm launch            # Connect to VM (auto-stop on exit)\"\n  echo \"  omarchy-windows-vm launch -k         # Connect to VM (keep running)\"\n  echo \"  omarchy-windows-vm stop              # Shut down the VM\"\n}\n\n# Main command dispatcher\ncase \"$1\" in\n  install)\n    install_windows\n    ;;\n  remove)\n    remove_windows\n    ;;\n  launch|start)\n    launch_windows \"$2\"\n    ;;\n  stop|down)\n    stop_windows\n    ;;\n  status)\n    status_windows\n    ;;\n  help|--help|-h|\"\")\n    show_usage\n    ;;\n  *)\n    echo \"Unknown command: $1\" >&2\n    echo \"\" >&2\n    show_usage >&2\n    exit 1\n    ;;\nesac\n"
  },
  {
    "path": "boot.sh",
    "content": "#!/bin/bash\n\n# Set install mode to online since boot.sh is used for curl installations\nexport OMARCHY_ONLINE_INSTALL=true\n\nansi_art='                 ▄▄▄\n ▄█████▄    ▄███████████▄    ▄███████   ▄███████   ▄███████   ▄█   █▄    ▄█   █▄\n███   ███  ███   ███   ███  ███   ███  ███   ███  ███   ███  ███   ███  ███   ███\n███   ███  ███   ███   ███  ███   ███  ███   ███  ███   █▀   ███   ███  ███   ███\n███   ███  ███   ███   ███ ▄███▄▄▄███ ▄███▄▄▄██▀  ███       ▄███▄▄▄███▄ ███▄▄▄███\n███   ███  ███   ███   ███ ▀███▀▀▀███ ▀███▀▀▀▀    ███      ▀▀███▀▀▀███  ▀▀▀▀▀▀███\n███   ███  ███   ███   ███  ███   ███ ██████████  ███   █▄   ███   ███  ▄██   ███\n███   ███  ███   ███   ███  ███   ███  ███   ███  ███   ███  ███   ███  ███   ███\n ▀█████▀    ▀█   ███   █▀   ███   █▀   ███   ███  ███████▀   ███   █▀    ▀█████▀\n                                       ███   █▀                                  '\n\nclear\necho -e \"\\n$ansi_art\\n\"\n\n# Use custom branch if instructed, otherwise default to master\nOMARCHY_REF=\"${OMARCHY_REF:-master}\"\n\n# Set mirror based on branch\nif [[ $OMARCHY_REF == \"dev\" ]]; then\n  export OMARCHY_MIRROR=edge\n  echo 'Server = https://mirror.omarchy.org/$repo/os/$arch' | sudo tee /etc/pacman.d/mirrorlist >/dev/null\nelif [[ $OMARCHY_REF == \"rc\" ]]; then\n  export OMARCHY_MIRROR=rc\n  echo 'Server = https://rc-mirror.omarchy.org/$repo/os/$arch' | sudo tee /etc/pacman.d/mirrorlist >/dev/null\nelse\n  export OMARCHY_MIRROR=stable\n  echo 'Server = https://stable-mirror.omarchy.org/$repo/os/$arch' | sudo tee /etc/pacman.d/mirrorlist >/dev/null\nfi\n\nsudo pacman -Syu --noconfirm --needed git\n\n# Use custom repo if specified, otherwise default to basecamp/omarchy\nOMARCHY_REPO=\"${OMARCHY_REPO:-basecamp/omarchy}\"\n\necho -e \"\\nCloning Omarchy from: https://github.com/${OMARCHY_REPO}.git\"\nrm -rf ~/.local/share/omarchy/\ngit clone \"https://github.com/${OMARCHY_REPO}.git\" ~/.local/share/omarchy >/dev/null\n\necho -e \"\\e[32mUsing branch: $OMARCHY_REF\\e[0m\"\ncd ~/.local/share/omarchy\ngit fetch origin \"${OMARCHY_REF}\" && git checkout \"${OMARCHY_REF}\"\ncd -\n\necho -e \"\\nInstallation starting...\"\nsource ~/.local/share/omarchy/install.sh\n"
  },
  {
    "path": "config/Typora/themes/ia_typora.css",
    "content": ":root {\n  --accent-color: #aeb1b5; /* #'s before H1-3 */\n  --background-color: white;\n  --border-color: #ddd;\n  --code-bg-color: #f8f8f8;\n  --font-color: #42464c;\n  --header-color: #222324;\n  --link-color: #2077b2;\n  --control-text-color: #667176;\n  --side-bar-bg-color: #fafafa;\n  --body-font: \"iA Writer Mono S\";\n  --border-radius: 2px;\n  --document-horizontal-margin: 80px;\n  --document-padding-x: 10ch;\n  --font-size: 20px;\n  --h1-fontsize: 20px;   /* 1,5   rem = 24px */\n  --h2-fontsize: 20px; /* 1,375 rem = 22px */\n  --h3-fontsize: 20px;  /* 1,25  rem = 20px */\n  --h4-fontsize: 20px; /* 1,125 rem = 18px */\n  --line-height: 1.8;\n  --main-content-margin: 0 auto;\n  --main-content-max-width: 85ch;\n  --monospace-font-size: 20px;\n  --monospace-font: \"iA Writer Mono S\";\n  --monospace-line-height: 1.6;\n  --monospace: var(--monospace-font); /* Fixes source code mode */\n  --nav-width: 200px;\n  --vertical-padding: 40px;\n}\n\n/* Narrow layout styles */\n@media (max-width: 640px) {\n  :root {\n    --document-padding-x: 4ch;\n  }\n}\n\nhtml {\n  font-size: var(--font-size);\n  background-color: var(--background-color);\n}\n\nhtml,\nbody {\n  color: var(--font-color);\n  font-family: var(--body-font);\n  line-height: var(--line-height);\n}\n\n#write {\n\t/* size of writing area: */\n  padding-left: var(--document-padding-x);\n  padding-right: var(--document-padding-x);\n  max-width: var(--main-content-max-width);\n  box-sizing: border-box;\n}\n\n/**\n * ---------------------\n * Block Elements\n */\n\n/* yaml */\npre.md-meta-block {\n  background-color: var(--background-color);\n  padding-bottom: .5rem;\n  color: var(--accent-color);\n  border-bottom: 2px solid var(--border-color);\n  font-family: var(--monospace-font);\n}\n\n/* headings */\nh1, h2, h3 {\n  font-weight: bold;\n  color: var(--header-color);  \n}\n\nh1 {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  font-size: var(--h1-fontsize);\n}\n\nh1:not(:first-child) {\n  margin-top: 1rem;\n}\n\nh2 {\n  margin-top: 1rem;\n  margin-bottom: 0rem;\n  font-size: var(--h2-fontsize);\n}\n\nh3 {\n  margin-top: 1rem;\n  margin-bottom: 0rem;\n  font-size: var(--h3-fontsize);\n}\n\nh4, h5, h6 {\n  color: var(--header-color);  \n  margin-top: 1rem;\n  margin-bottom: 0rem;\n  font-size: 1rem;\n}\n\nh4 {\n  font-size: var(--h4-fontsize);\n}\n\nh6 {\n  color: var(--control-text-color);\t\n}\n\nh1::before,\nh2::before,\nh3::before {\n  font-weight: 400;\n  text-align: right;\n  width: 5ch;\n  padding-right: 1ch;\n  margin-left: -5ch;\n  color: var(--accent-color);\n  display: inline-block;\n}\n\nh1::before {\n  content: '#';\n}\n\nh2::before {\n  content: '##';\n}\n\nh3::before {\n  content: '###';\n}\n\nh1 tt,\nh1 code {\n    font-size: inherit;\n}\nh2 tt,\nh2 code {\n    font-size: inherit;\n}\nh3 tt,\nh3 code {\n    font-size: inherit;\n}\nh4 tt,\nh4 code {\n    font-size: inherit;\n}\nh5 tt,\nh5 code {\n    font-size: inherit;\n}\nh6 tt,\nh6 code {\n    font-size: inherit;\n}\n\n/* table */\ntable {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n}\n\ntable tr:nth-child(2n),\nthead {\n    background-color: var(--side-bar-bg-color);\n}\n\ntd,\nth {\n  border-style: solid;\n  border-color: var(--border-color);\n  border-width: 1px;\n  padding: .35rem .7rem\n}\n\nli p {\n  margin: 0;\n}\n\n.task-list {\n  padding-left: 0;\n}\n\n.task-list-item {\n  padding-left: 1.5em;\n  margin-bottom: 0rem;\n}\n\n#write input[type='checkbox'] {\n  margin-top: 5px;\n}\n\nblockquote {\n  margin: 1rem 0;\n  padding-left: 2ch;\n  margin-left: .5ch;\n  position: relative;\n  overflow: hidden;\n  border-left: 2px solid var(--border-color);\n  color: var(--accent-color);\n}\n\n/* horizontal line */\nhr {\n  border: none;\n  border-bottom: 2px solid var(--border-color);\n  margin-top: 1.4rem;\n  margin-bottom: 1.4rem;\n}\n\np {\n  margin: 2rem 0;\n}\n\n/**\n * Code Fences\n * see http:/*support.typora.io/Code-Block-Styles\n */\n\n.cm-s-inner .CodeMirror-gutters {\n   background: var(--code-bg-color);\n}\n\n.code-tooltip {\n  box-shadow: none;\n  border-radius: var(--border-radius);\n  background-color: var(--code-bg-color);\n  border-color: var(--border-color);\n  border-style: solid;\n  border-width: 1px;\n}\n\n.code-tooltip input {\n  outline: none;\n  width: 20ch;\n}\n\n.md-fences .code-tooltip {\n  bottom: -1.8rem;\n  padding: none;\n}\n\n.md-fences.md-focus .cm-s-inner {\n  /* Remove bottom right border radius when tooltip is shown */\n  border-bottom-right-radius: 0;\n}\n\n/* code tooltip autocomplete list */\n\n.autoComplt-hint {\n  background-color: transparent !important;\n  margin: 0 !important;\n  padding: 0.125rem 0.375rem !important;\n  color: var(--text-color) !important;\n  line-height: var(--line-height) !important;\n  height: 1.4rem !important;\n}\n\n.autoComplt-hint-selected {\n  background-color: var(--link-color) !important;\n  color: var(--background-color) !important;\n}\n\n/* basic styles */\n\n.md-fences,\ncode,\ntt {\n  border: 1px solid var(--border-color);\n  background-color: var(--code-bg-color);\n  font-family: var(--monospace-font);\n  font-size: var(--monospace-font-size);\n  border-radius: .25rem;\n  padding: 0 .125rem;\n  line-height: var(--monospace-line-height);\n}\n\n.md-fences {\n  margin-bottom: 18px;\n  margin-top: 15px;\n  padding: 0.2em 1em;\n  padding-top: 8px;\n  padding-bottom: 6px;\n}\n\na {\n  color:  var(--link-color);\n}\n\n\n/**\n * Control UI (optional)\n */\n\n.outline-item:hover {\n  color: var(--header-color);\n}\n\n#write div.md-toc-tooltip {\n\tbackground-color: var(--background-color);\n}\n\n"
  },
  {
    "path": "config/Typora/themes/ia_typora_night.css",
    "content": "@import 'night/codeblock.dark.css';\n@import 'night/mermaid.dark.css';\n@import 'night/sourcemode.dark.css';\n@import 'ia_typora.css';\n\n:root {\n  --accented-background-color: #1e1e1e;\n  --light-header-color: #dbdbdb; /* H1-H3 */\n  --select-text-bg-color: #186a9a;\n  --accent-color: #4f525a;\n  --background-color: #101010;\n  --font-color: #bbbcbc;\n  --header-color: #bebebe; /* H4-H6 */\n  --border-color: #232629;\n  --link-color: #5584aa; \n  --code-bg-color: #1c1a1a;\n  --hover-bg-color: #050505; \n  --control-text-color: var(--font-color); \n  --side-bar-bg-color: var(--accented-background-color);\n  --control-text-hover-color: var(--header-color);\n  --item-hover-text-color: var(--header-color);\n  --item-hover-bg-color: var(--hover-bg-color); \n  --bg-color: var(--background-color);\n  --text-color: var(--font-color);\n  --meta-content-color: var(--accent-color);\n  --md-char-color: var(--accent-color);\n  --window-border: 1px solid rgba(0,0,0,.07);\n  --active-file-bg-color: var(--hover-bg-color);\n}\n\n.outline-item:hover {\n  background-color: var(--hover-bg-color);\n}\n\n#write {\n  cursor: -webkit-image-set(url(\"night/cursor.png\") 1x, url(\"night/cursor@2x.png\") 2x) 8 8, auto;\n}\n\nh1,\nh2,\nh3 {\n  color: var(--light-header-color);\n}\n\nmark {\n  background: #b8b80a\n}\n\ntable tr:nth-child(2n),\nthead {\n    background-color: #141313;\n}\n\nsup.md-footnote {\n  background-color: var(--code-bg-color);\n  color: var(--font-color);\n}\n\n/* right click menu */\n.context-menu {\n  background-color: #141313;\n}\n\n.context-menu.dropdown-menu .divider {\n  background-color: #232629;\n}\n\n/* focus mode */\n.on-focus-mode .md-end-block:not(.md-focus):not(.md-focus-container) * {\n  color: #4f525a !important;\n}\n\n.on-focus-mode .md-end-block:not(.md-focus) img,\n.on-focus-mode .md-task-list-item:not(.md-focus-container)>input {\n  opacity: #4f525a !important;\n}\n\n.on-focus-mode li[cid]:not(.md-focus-container){\n  color: #4f525a;\n}\n\n.on-focus-mode .md-fences.md-focus .CodeMirror-code>*:not(.CodeMirror-activeline) *,\n.on-focus-mode .CodeMirror.cm-s-inner:not(.CodeMirror-focused) * {\n  color: #4f525a !important;\n}\n\n.on-focus-mode .md-focus,\n.on-focus-mode .md-focus-container {\n  color: var(--light-header-color);\n}\n\n.on-focus-mode #typora-source .CodeMirror-code>*:not(.CodeMirror-activeline) * {\n  color: #4f525a !important;\n}\n\n"
  },
  {
    "path": "config/alacritty/alacritty.toml",
    "content": "general.import = [ \"~/.config/omarchy/current/theme/alacritty.toml\" ]\n\n[env]\nTERM = \"xterm-256color\"\n\n[terminal]\nosc52 = \"CopyPaste\"\n\n[font]\nnormal = { family = \"JetBrainsMono Nerd Font\", style = \"Regular\" }\nbold = { family = \"JetBrainsMono Nerd Font\", style = \"Bold\" }\nitalic = { family = \"JetBrainsMono Nerd Font\", style = \"Italic\" }\nsize = 9\n\n[window]\npadding.x = 14\npadding.y = 14\ndecorations = \"None\"\n\n[keyboard]\nbindings = [\n{ key = \"Insert\", mods = \"Shift\", action = \"Paste\" },\n{ key = \"Insert\", mods = \"Control\", action = \"Copy\" },\n{ key = \"Return\", mods = \"Shift\", chars = \"\\u001B\\r\" }\n]\n"
  },
  {
    "path": "config/brave-flags.conf",
    "content": "--ozone-platform=wayland\n--ozone-platform-hint=wayland\n--enable-features=TouchpadOverscrollHistoryNavigation\n--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url\n"
  },
  {
    "path": "config/btop/btop.conf",
    "content": "#? Config file for btop\n\n#* Name of a btop++/bpytop/bashtop formatted \".theme\" file, \"Default\" and \"TTY\" for builtin themes.\n#* Themes should be placed in \"../share/btop/themes\" relative to binary or \"$HOME/.config/btop/themes\"\ncolor_theme = \"current\"\n\n#* If the theme set background should be shown, set to False if you want terminal background transparency.\ntheme_background = True\n\n#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.\ntruecolor = True\n\n#* Set to true to force tty mode regardless if a real tty has been detected or not.\n#* Will force 16-color mode and TTY theme, set all graph symbols to \"tty\" and swap out other non tty friendly symbols.\nforce_tty = False\n\n#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.\n#* Format: \"box_name:P:G,box_name:P:G\" P=(0 or 1) for alternate positions, G=graph symbol to use for box.\n#* Use whitespace \" \" as separator between different presets.\n#* Example: \"cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty\"\npresets = \"cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty\"\n\n#* Set to True to enable \"h,j,k,l,g,G\" keys for directional control in lists.\n#* Conflicting keys for h:\"help\" and k:\"kill\" is accessible while holding shift.\nvim_keys = True\n\n#* Rounded corners on boxes, is ignored if TTY mode is ON.\nrounded_corners = True\n\n#* Default symbols to use for graph creation, \"braille\", \"block\" or \"tty\".\n#* \"braille\" offers the highest resolution but might not be included in all fonts.\n#* \"block\" has half the resolution of braille but uses more common characters.\n#* \"tty\" uses only 3 different symbols but will work with most fonts and should work in a real TTY.\n#* Note that \"tty\" only has half the horizontal resolution of the other two, so will show a shorter historical view.\ngraph_symbol = \"braille\"\n\n# Graph symbol to use for graphs in cpu box, \"default\", \"braille\", \"block\" or \"tty\".\ngraph_symbol_cpu = \"default\"\n\n# Graph symbol to use for graphs in gpu box, \"default\", \"braille\", \"block\" or \"tty\".\ngraph_symbol_gpu = \"default\"\n\n# Graph symbol to use for graphs in cpu box, \"default\", \"braille\", \"block\" or \"tty\".\ngraph_symbol_mem = \"default\"\n\n# Graph symbol to use for graphs in cpu box, \"default\", \"braille\", \"block\" or \"tty\".\ngraph_symbol_net = \"default\"\n\n# Graph symbol to use for graphs in cpu box, \"default\", \"braille\", \"block\" or \"tty\".\ngraph_symbol_proc = \"default\"\n\n#* Manually set which boxes to show. Available values are \"cpu mem net proc\" and \"gpu0\" through \"gpu5\", separate values with whitespace.\nshown_boxes = \"cpu mem net proc\"\n\n#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.\nupdate_ms = 2000\n\n#* Processes sorting, \"pid\" \"program\" \"arguments\" \"threads\" \"user\" \"memory\" \"cpu lazy\" \"cpu direct\",\n#* \"cpu lazy\" sorts top process over time (easier to follow), \"cpu direct\" updates top process directly.\nproc_sorting = \"cpu lazy\"\n\n#* Reverse sorting order, True or False.\nproc_reversed = False\n\n#* Show processes as a tree.\nproc_tree = False\n\n#* Use the cpu graph colors in the process list.\nproc_colors = True\n\n#* Use a darkening gradient in the process list.\nproc_gradient = True\n\n#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.\nproc_per_core = False\n\n#* Show process memory as bytes instead of percent.\nproc_mem_bytes = True\n\n#* Show cpu graph for each process.\nproc_cpu_graphs = True\n\n#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)\nproc_info_smaps = False\n\n#* Show proc box on left side of screen instead of right.\nproc_left = False\n\n#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).\nproc_filter_kernel = False\n\n#* In tree-view, always accumulate child process resources in the parent process.\nproc_aggregate = False\n\n#* Sets the CPU stat shown in upper half of the CPU graph, \"total\" is always available.\n#* Select from a list of detected attributes from the options menu.\ncpu_graph_upper = \"Auto\"\n\n#* Sets the CPU stat shown in lower half of the CPU graph, \"total\" is always available.\n#* Select from a list of detected attributes from the options menu.\ncpu_graph_lower = \"Auto\"\n\n#* If gpu info should be shown in the cpu box. Available values = \"Auto\", \"On\" and \"Off\".\nshow_gpu_info = \"Auto\"\n\n#* Toggles if the lower CPU graph should be inverted.\ncpu_invert_lower = True\n\n#* Set to True to completely disable the lower CPU graph.\ncpu_single_graph = False\n\n#* Show cpu box at bottom of screen instead of top.\ncpu_bottom = False\n\n#* Shows the system uptime in the CPU box.\nshow_uptime = True\n\n#* Show cpu temperature.\ncheck_temp = True\n\n#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.\ncpu_sensor = \"Auto\"\n\n#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.\nshow_coretemp = True\n\n#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.\n#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.\n#* Format \"x:y\" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.\n#* Example: \"4:0 5:1 6:3\"\ncpu_core_map = \"\"\n\n#* Which temperature scale to use, available values: \"celsius\", \"fahrenheit\", \"kelvin\" and \"rankine\".\ntemp_scale = \"celsius\"\n\n#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.\nbase_10_sizes = False\n\n#* Show CPU frequency.\nshow_cpu_freq = True\n\n#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.\n#* Special formatting: /host = hostname | /user = username | /uptime = system uptime\nclock_format = \"%X\"\n\n#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.\nbackground_update = True\n\n#* Custom cpu model name, empty string to disable.\ncustom_cpu_name = \"\"\n\n#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace \" \".\n#* Begin line with \"exclude=\" to change to exclude filter, otherwise defaults to \"most include\" filter. Example: disks_filter=\"exclude=/boot /home/user\".\ndisks_filter = \"\"\n\n#* Show graphs instead of meters for memory values.\nmem_graphs = True\n\n#* Show mem box below net box instead of above.\nmem_below_net = False\n\n#* Count ZFS ARC in cached and available memory.\nzfs_arc_cached = True\n\n#* If swap memory should be shown in memory box.\nshow_swap = True\n\n#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.\nswap_disk = True\n\n#* If mem box should be split to also show disks info.\nshow_disks = True\n\n#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.\nonly_physical = True\n\n#* Read disks list from /etc/fstab. This also disables only_physical.\nuse_fstab = True\n\n#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)\nzfs_hide_datasets = False\n\n#* Set to true to show available disk space for privileged users.\ndisk_free_priv = False\n\n#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.\nshow_io_stat = True\n\n#* Toggles io mode for disks, showing big graphs for disk read/write speeds.\nio_mode = False\n\n#* Set to True to show combined read/write io graphs in io mode.\nio_graph_combined = False\n\n#* Set the top speed for the io graphs in MiB/s (100 by default), use format \"mountpoint:speed\" separate disks with whitespace \" \".\n#* Example: \"/mnt/media:100 /:20 /boot:1\".\nio_graph_speeds = \"\"\n\n#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.\nnet_download = 100\n\nnet_upload = 100\n\n#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.\nnet_auto = True\n\n#* Sync the auto scaling for download and upload to whichever currently has the highest scale.\nnet_sync = True\n\n#* Starts with the Network Interface specified here.\nnet_iface = \"\"\n\n#* Show battery stats in top right if battery is present.\nshow_battery = True\n\n#* Which battery to use if multiple are present. \"Auto\" for auto detection.\nselected_battery = \"Auto\"\n\n#* Set loglevel for \"~/.config/btop/btop.log\" levels are: \"ERROR\" \"WARNING\" \"INFO\" \"DEBUG\".\n#* The level set includes all lower levels, i.e. \"DEBUG\" will show all logging info.\nlog_level = \"WARNING\"\n\n#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.\nnvml_measure_pcie_speeds = True\n\n#* Horizontally mirror the GPU graph.\ngpu_mirror_graph = True\n\n#* Custom gpu0 model name, empty string to disable.\ncustom_gpu_name0 = \"\"\n\n#* Custom gpu1 model name, empty string to disable.\ncustom_gpu_name1 = \"\"\n\n#* Custom gpu2 model name, empty string to disable.\ncustom_gpu_name2 = \"\"\n\n#* Custom gpu3 model name, empty string to disable.\ncustom_gpu_name3 = \"\"\n\n#* Custom gpu4 model name, empty string to disable.\ncustom_gpu_name4 = \"\"\n\n#* Custom gpu5 model name, empty string to disable.\ncustom_gpu_name5 = \"\"\n\n"
  },
  {
    "path": "config/chromium/Default/Preferences",
    "content": "{\n  \"extensions\": {\n    \"theme\": {\n      \"id\": \"\",\n      \"use_system\": false,\n      \"use_custom\": false\n    }\n  },\n  \"browser\": {\n    \"theme\": {\n      \"color_scheme\": 2,\n      \"user_color\": 2\n    }\n  }\n}\n"
  },
  {
    "path": "config/chromium-flags.conf",
    "content": "--ozone-platform=wayland\n--ozone-platform-hint=wayland\n--enable-features=TouchpadOverscrollHistoryNavigation\n--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url\n"
  },
  {
    "path": "config/elephant/calc.toml",
    "content": "async = false\n"
  },
  {
    "path": "config/elephant/desktopapplications.toml",
    "content": "show_actions = false\nonly_search_title = true\nhistory = false\n"
  },
  {
    "path": "config/elephant/symbols.toml",
    "content": "command = 'wl-copy && hyprctl dispatch sendshortcut \"SHIFT, Insert,\"'\n"
  },
  {
    "path": "config/environment.d/fcitx.conf",
    "content": "INPUT_METHOD=fcitx\nQT_IM_MODULE=fcitx\nXMODIFIERS=@im=fcitx\nSDL_IM_MODULE=fcitx\n"
  },
  {
    "path": "config/fastfetch/config.jsonc",
    "content": "{\n  \"$schema\": \"https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json\",\n  \"logo\": {\n    \"type\": \"file\",\n    \"source\": \"~/.config/omarchy/branding/about.txt\",\n    \"color\": { \"1\": \"green\" },\n    \"padding\": {\n      \"top\": 2,\n      \"right\": 6,\n      \"left\": 2\n    }\n  },\n  \"modules\": [\n    \"break\",\n    {\n      \"type\": \"custom\",\n      \"format\": \"\\u001b[90m┌──────────────────────Hardware──────────────────────┐\"\n    },\n    {\n      \"type\": \"host\",\n      \"key\": \" PC\",\n      \"keyColor\": \"green\"\n    },\n    {\n      \"type\": \"cpu\",\n      \"key\": \"│ ├\",\n      \"showPeCoreCount\": true,\n      \"keyColor\": \"green\"\n    },\n    {\n      \"type\": \"gpu\",\n      \"key\": \"│ ├\",\n      \"detectionMethod\": \"pci\",\n      \"keyColor\": \"green\"\n    },\n    {\n      \"type\": \"display\",\n      \"key\": \"│ ├󱄄\",\n      \"keyColor\": \"green\"\n    },\n    {\n      \"type\": \"disk\",\n      \"key\": \"│ ├󰋊\",\n      \"keyColor\": \"green\"\n    },\n    {\n      \"type\": \"memory\",\n      \"key\": \"│ ├\",\n      \"keyColor\": \"green\"\n    },\n    {\n      \"type\": \"swap\",\n      \"key\": \"└ └󰓡 \",\n      \"keyColor\": \"green\"\n    },\n    {\n      \"type\": \"custom\",\n      \"format\": \"\\u001b[90m└────────────────────────────────────────────────────┘\"\n    },\n    \"break\",\n    {\n      \"type\": \"custom\",\n      \"format\": \"\\u001b[90m┌──────────────────────Software──────────────────────┐\"\n    },\n    {\n      \"type\": \"command\",\n      \"key\": \"\\ue900 OS\",\n      \"keyColor\": \"blue\",\n      \"text\": \"version=$(omarchy-version); echo \\\"Omarchy $version\\\"\"\n    },\n    {\n      \"type\": \"command\",\n      \"key\": \"│ ├󰘬\",\n      \"keyColor\": \"blue\",\n      \"text\": \"branch=$(omarchy-version-branch); echo \\\"$branch\\\"\"\n    },\n    {\n      \"type\": \"command\",\n      \"key\": \"│ ├󰔫\",\n      \"keyColor\": \"blue\",\n      \"text\": \"channel=$(omarchy-version-channel); echo \\\"$channel\\\"\"\n    },\n    {\n      \"type\": \"kernel\",\n      \"key\": \"│ ├\",\n      \"keyColor\": \"blue\"\n    },\n    {\n      \"type\": \"wm\",\n      \"key\": \"│ ├\",\n      \"keyColor\": \"blue\"\n    },\n    {\n      \"type\": \"de\",\n      \"key\": \" DE\",\n      \"keyColor\": \"blue\"\n    },\n    {\n      \"type\": \"terminal\",\n      \"key\": \"│ ├\",\n      \"keyColor\": \"blue\"\n    },\n    {\n      \"type\": \"packages\",\n      \"key\": \"│ ├󰏖\",\n      \"keyColor\": \"blue\"\n    },\n    {\n      \"type\": \"wmtheme\",\n      \"key\": \"│ ├󰉼\",\n      \"keyColor\": \"blue\"\n    },\n    {\n      \"type\": \"command\",\n      \"key\": \"│ ├󰸌\",\n      \"keyColor\": \"blue\",\n      \"text\": \"theme=$(omarchy-theme-current); echo -e \\\"$theme \\\\e[38m●\\\\e[37m●\\\\e[36m●\\\\e[35m●\\\\e[34m●\\\\e[33m●\\\\e[32m●\\\\e[31m●\\\"\"\n    },\n    {\n      \"type\": \"terminalfont\",\n      \"key\": \"└ └\",\n      \"keyColor\": \"blue\"\n    },\n    {\n      \"type\": \"custom\",\n      \"format\": \"\\u001b[90m└────────────────────────────────────────────────────┘\"\n    },\n    \"break\",\n    {\n      \"type\": \"custom\",\n      \"format\": \"\\u001b[90m┌────────────────Age / Uptime / Update───────────────┐\"\n    },\n    {\n      \"type\": \"command\",\n      \"key\": \"󱦟 OS Age\",\n      \"keyColor\": \"magenta\",\n      \"text\": \"echo $(( ($(date +%s) - $(stat -c %W /)) / 86400 )) days\"\n    },\n    {\n      \"type\": \"uptime\",\n      \"key\": \"󱫐 Uptime\",\n      \"keyColor\": \"magenta\"\n    },\n    {\n      \"type\": \"command\",\n      \"key\": \" Update\",\n      \"keyColor\": \"magenta\",\n      \"text\": \"updated=$(omarchy-version-pkgs); echo \\\"$updated\\\"\"\n    },\n    {\n      \"type\": \"custom\",\n      \"format\": \"\\u001b[90m└────────────────────────────────────────────────────┘\"\n    },\n    \"break\"\n  ]\n}\n"
  },
  {
    "path": "config/fcitx5/conf/clipboard.conf",
    "content": "TriggerKey=\nPastePrimaryKey=\n"
  },
  {
    "path": "config/fcitx5/conf/xcb.conf",
    "content": "Allow Overriding System XKB Settings=False\n"
  },
  {
    "path": "config/fontconfig/fonts.conf",
    "content": "<?xml version=\"1.0\"?>\n<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">\n<fontconfig>\n  <match target=\"pattern\">\n    <test name=\"family\" qual=\"any\">\n      <string>sans-serif</string>\n    </test>\n    <edit name=\"family\" mode=\"assign\" binding=\"strong\">\n      <string>Liberation Sans</string>\n    </edit>\n  </match>\n\n  <match target=\"pattern\">\n    <test name=\"family\" qual=\"any\">\n      <string>serif</string>\n    </test>\n    <edit name=\"family\" mode=\"assign\" binding=\"strong\">\n      <string>Liberation Serif</string>\n    </edit>\n  </match>\n\n  <match target=\"pattern\">\n    <test name=\"family\" qual=\"any\">\n      <string>monospace</string>\n    </test>\n    <edit name=\"family\" mode=\"assign\" binding=\"strong\">\n      <string>JetBrainsMono Nerd Font</string>\n    </edit>\n  </match>\n\n  <alias>\n    <family>system-ui</family>\n    <prefer>\n      <family>Liberation Sans</family>\n    </prefer>\n  </alias>\n\n  <alias>\n    <family>ui-monospace</family>\n    <default>\n      <family>monospace</family>\n    </default>\n  </alias>\n\n  <alias>\n    <family>-apple-system</family>\n    <prefer>\n      <family>Liberation Sans</family>\n    </prefer>\n  </alias>\n\n  <alias>\n    <family>BlinkMacSystemFont</family>\n    <prefer>\n      <family>Liberation Sans</family>\n    </prefer>\n  </alias>\n\n  <alias>\n    <family>sans-serif</family>\n    <accept>\n      <family>Noto Color Emoji</family>\n    </accept>\n  </alias>\n\n  <alias>\n    <family>serif</family>\n    <accept>\n      <family>Noto Color Emoji</family>\n    </accept>\n  </alias>\n\n  <alias>\n    <family>monospace</family>\n    <accept>\n      <family>Noto Color Emoji</family>\n    </accept>\n  </alias>\n</fontconfig>\n"
  },
  {
    "path": "config/ghostty/config",
    "content": "# Dynamic theme colors\nconfig-file = ?\"~/.config/omarchy/current/theme/ghostty.conf\"\n\n# Font\nfont-family = \"JetBrainsMono Nerd Font\"\nfont-style = Regular\nfont-size = 9\n\n# Window\nwindow-theme = ghostty\nwindow-padding-x = 14\nwindow-padding-y = 14\nconfirm-close-surface=false\nresize-overlay = never\ngtk-toolbar-style = flat\n\n# Cursor styling\ncursor-style = \"block\"\ncursor-style-blink = false\n\n# Cursor styling + SSH session terminfo\n# (all shell integration options must be passed together)\nshell-integration-features = no-cursor,ssh-env\n\n# Keyboard bindings\nkeybind = shift+insert=paste_from_clipboard\nkeybind = control+insert=copy_to_clipboard\nkeybind = super+control+shift+alt+arrow_down=resize_split:down,100\nkeybind = super+control+shift+alt+arrow_up=resize_split:up,100\nkeybind = super+control+shift+alt+arrow_left=resize_split:left,100\nkeybind = super+control+shift+alt+arrow_right=resize_split:right,100\n\n# Slowdown mouse scrolling\nmouse-scroll-multiplier = 0.95\n\n# Fix general slowness on hyprland (https://github.com/ghostty-org/ghostty/discussions/3224)\nasync-backend = epoll\n"
  },
  {
    "path": "config/git/config",
    "content": "# See https://git-scm.com/docs/git-config\n\n[alias]\n\tco = checkout\n\tbr = branch\n\tci = commit\n\tst = status\n[init]\n\tdefaultBranch = master\n[pull]\n\trebase = true \t\t\t # Rebase (instead of merge) on pull\n[push]\n\tautoSetupRemote = true   # Automatically set upstream branch on push\n[diff]\n\talgorithm = histogram    # Clearer diffs on moved/edited lines\n\tcolorMoved = plain       # Highlight moved blocks in diffs\n\tmnemonicPrefix = true    # More intuitive refs in diff output\n[commit]\n\tverbose = true           # Include diff comment in commit message template\n[column]\n\tui = auto \t\t\t     # Output in columns when possible\n[branch]\n\tsort = -committerdate    # Sort branches by most recent commit first\n[tag]\n\tsort = -version:refname  # Sort version numbers as you would expect\n[rerere]\n\tenabled = true           # Record and reuse conflict resolutions\n\tautoupdate = true        # Apply stored conflict resolutions automatically\n"
  },
  {
    "path": "config/hypr/autostart.conf",
    "content": "# Extra autostart processes\n# exec-once = uwsm-app -- my-service\n"
  },
  {
    "path": "config/hypr/bindings.conf",
    "content": "# Application bindings\nbindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir=\"$(omarchy-cmd-terminal-cwd)\"\nbindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec --dir=\"$(omarchy-cmd-terminal-cwd)\" bash -c \"tmux attach || tmux new -s Work\"\nbindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser\nbindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window\nbindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window \"$(omarchy-cmd-terminal-cwd)\"\nbindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser\nbindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private\nbindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify\nbindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor\nbindd = SUPER SHIFT, D, Docker, exec, omarchy-launch-tui lazydocker\nbindd = SUPER SHIFT, G, Signal, exec, omarchy-launch-or-focus ^signal$ \"uwsm-app -- signal-desktop\"\nbindd = SUPER SHIFT, O, Obsidian, exec, omarchy-launch-or-focus ^obsidian$ \"uwsm-app -- obsidian -disable-gpu --enable-wayland-ime\"\nbindd = SUPER SHIFT, W, Typora, exec, uwsm-app -- typora --enable-wayland-ime\nbindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password\n\n# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment\nbindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp \"https://chatgpt.com\"\nbindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp \"https://grok.com\"\nbindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp \"https://app.hey.com/calendar/weeks/\"\nbindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp \"https://app.hey.com\"\nbindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp \"https://youtube.com/\"\nbindd = SUPER SHIFT ALT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp \"https://web.whatsapp.com/\"\nbindd = SUPER SHIFT CTRL, G, Google Messages, exec, omarchy-launch-or-focus-webapp \"Google Messages\" \"https://messages.google.com/web/conversations\"\nbindd = SUPER SHIFT, P, Google Photos, exec, omarchy-launch-or-focus-webapp \"Google Photos\" \"https://photos.google.com/\"\nbindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp \"https://x.com/\"\nbindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp \"https://x.com/compose/post\"\n\n# Add extra bindings\n# bind = SUPER SHIFT, R, exec, alacritty -e ssh your-server\n\n# Overwrite existing bindings, like putting Omarchy Menu on Super + Space\n# unbind = SUPER, SPACE\n# bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu\n"
  },
  {
    "path": "config/hypr/hypridle.conf",
    "content": "general {\n    lock_cmd = omarchy-lock-screen                         # lock screen and 1password\n    before_sleep_cmd = loginctl lock-session               # lock before suspend.\n    after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on  # delay for PAM readiness, then turn on display.\n    inhibit_sleep = 3                                      # wait until screen is locked\n}\n\nlistener {\n    timeout = 150                                             # 2.5min\n    on-timeout = pidof hyprlock || omarchy-launch-screensaver # start screensaver (if we haven't locked already)\n}\n\nlistener {\n    timeout = 151                      # 5min\n    on-timeout = loginctl lock-session # lock screen when timeout has passed\n}\n\nlistener {\n    timeout = 330                                            # 5.5min\n    on-timeout = brightnessctl -sd '*::kbd_backlight' set 0  # save state and turn off keyboard backlight\n    on-resume = brightnessctl -rd '*::kbd_backlight'         # restore keyboard backlight\n}\n\nlistener {\n    timeout = 330                                            # 5.5min\n    on-timeout = hyprctl dispatch dpms off                   # screen off when timeout has passed\n    on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected\n}\n"
  },
  {
    "path": "config/hypr/hyprland.conf",
    "content": "# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/\n\n# Use defaults Omarchy defaults (but don't edit these directly!)\nsource = ~/.local/share/omarchy/default/hypr/autostart.conf\nsource = ~/.local/share/omarchy/default/hypr/bindings/media.conf\nsource = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf\nsource = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf\nsource = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf\nsource = ~/.local/share/omarchy/default/hypr/envs.conf\nsource = ~/.local/share/omarchy/default/hypr/looknfeel.conf\nsource = ~/.local/share/omarchy/default/hypr/input.conf\nsource = ~/.local/share/omarchy/default/hypr/windows.conf\nsource = ~/.config/omarchy/current/theme/hyprland.conf\n\n# Change your own setup in these files (and overwrite any settings from defaults!)\nsource = ~/.config/hypr/monitors.conf\nsource = ~/.config/hypr/input.conf\nsource = ~/.config/hypr/bindings.conf\nsource = ~/.config/hypr/looknfeel.conf\nsource = ~/.config/hypr/autostart.conf\n\n# Add any other personal Hyprland configuration below\n# windowrule = workspace 5, match:class qemu\n"
  },
  {
    "path": "config/hypr/hyprlock.conf",
    "content": "source = ~/.config/omarchy/current/theme/hyprlock.conf\n\ngeneral {\n    ignore_empty_input = true\n}\n\nbackground {\n    monitor =\n    color = $color\n    path = ~/.config/omarchy/current/background\n    blur_passes = 3\n}\n\nanimations {\n    enabled = false\n}\n\ninput-field {\n    monitor =\n    size = 650, 100\n    position = 0, 0\n    halign = center\n    valign = center\n\n    inner_color = $inner_color\n    outer_color = $outer_color\n    outline_thickness = 4\n\n    font_family = JetBrainsMono Nerd Font\n    font_color = $font_color\n\n    placeholder_text = Enter Password\n    check_color = $check_color\n    fail_text = <i>$FAIL ($ATTEMPTS)</i>\n\n    rounding = 0\n    shadow_passes = 0\n    fade_on_empty = false\n}\n\nauth {\n    fingerprint:enabled = false\n}\n"
  },
  {
    "path": "config/hypr/hyprsunset.conf",
    "content": "# Makes hyprsunset do nothing to the screen by default\n# Without this, the default applies some tint to the monitor\nprofile {\n    time = 07:00\n    identity = true\n}\n\n# To enable auto switch to nightlight, set in your .config/hypr/autostart:\n# exec-once = uwsm app -- hyprsunset\n# and use the following:\n# profile {\n#     time = 20:00\n#     temperature = 4000\n# }\n"
  },
  {
    "path": "config/hypr/input.conf",
    "content": "# Control your input devices\n# See https://wiki.hypr.land/Configuring/Variables/#input\ninput {\n  # Use multiple keyboard layouts and switch between them with Left Alt + Right Alt\n  # kb_layout = us,dk,eu\n\n  # Use a specific keyboard variant if needed (e.g. intl for international keyboards)\n  # kb_variant = intl\n\n  kb_options = compose:caps # ,grp:alts_toggle\n\n  # Change speed of keyboard repeat\n  repeat_rate = 40\n  repeat_delay = 600\n\n  # Start with numlock on by default\n  numlock_by_default = true\n\n  # Increase sensitivity for mouse/trackpad (default: 0)\n  # sensitivity = 0.35\n\n  # Turn off mouse acceleration (default: false)\n  # force_no_accel = true\n\n  touchpad {\n    # Use natural (inverse) scrolling\n    # natural_scroll = true\n\n    # Use two-finger clicks for right-click instead of lower-right corner\n    # clickfinger_behavior = true\n\n    # Control the speed of your scrolling\n    scroll_factor = 0.4\n\n    # Enable the touchpad while typing\n    # disable_while_typing = false\n\n    # Left-click-and-drag with three fingers\n    # drag_3fg = 1\n  }\n}\n\n# Scroll nicely in the terminal\nwindowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5\nwindowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2\n\n# Enable touchpad gestures for changing workspaces\n# See https://wiki.hyprland.org/Configuring/Gestures/\n# gesture = 3, horizontal, workspace\n\n# Enable touchpad gestures for moving focus (helpful on scrolling layout)\n# gesture = 3, left,  dispatcher, movefocus, l\n# gesture = 3, right, dispatcher, movefocus, r\n"
  },
  {
    "path": "config/hypr/looknfeel.conf",
    "content": "# Change the default Omarchy look'n'feel\n\n# https://wiki.hyprland.org/Configuring/Variables/#general\ngeneral {\n    # No gaps between windows or borders\n    # gaps_in = 0\n    # gaps_out = 0\n    # border_size = 0\n\n    # Change to niri-like side-scrolling layout\n    # layout = scrolling\n}\n\n# https://wiki.hyprland.org/Configuring/Variables/#decoration\ndecoration {\n    # Use round window corners\n    # rounding = 8\n\n    # Dim unfocused windows (0.0 = no dim, 1.0 = fully dimmed)\n    # dim_inactive = true\n    # dim_strength = 0.15\n}\n\n# https://wiki.hyprland.org/Configuring/Variables/#animations\nanimations {\n    # Disable all animations\n    # enabled = no\n}\n\n# https://wiki.hypr.land/Configuring/Variables/#layout\nlayout {\n    # Avoid overly wide single-window layouts on wide screens\n    # single_window_aspect_ratio = 1 1\n}\n"
  },
  {
    "path": "config/hypr/monitors.conf",
    "content": "# See https://wiki.hyprland.org/Configuring/Monitors/\n# List current monitors and resolutions possible: hyprctl monitors\n# Format: monitor = [port], resolution, position, scale\n\n# Optimized for retina-class 2x displays, like 13\" 2.8K, 27\" 5K, 32\" 6K.\nenv = GDK_SCALE,2\nmonitor=,preferred,auto,auto\n\n# Good compromise for 27\" or 32\" 4K monitors (but fractional!)\n# env = GDK_SCALE,1.75\n# monitor=,preferred,auto,1.6\n\n# Straight 1x setup for low-resolution displays like 1080p or 1440p\n# Or for ultrawide monitors like 34\" 3440x1440 or 49\" 5120x1440\n# env = GDK_SCALE,1\n# monitor=,preferred,auto,1\n\n# Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°)\n# monitor = DP-2, preferred, auto, 1, transform, 1\n\n# Example for Framework 13 w/ 6K XDR Apple display\n# monitor = DP-5, 6016x3384@60, auto, 2\n# monitor = eDP-1, 2880x1920@120, auto, 2\n"
  },
  {
    "path": "config/hypr/xdph.conf",
    "content": "screencopy {\n    allow_token_by_default = true\n    custom_picker_binary = hyprland-preview-share-picker\n}\n"
  },
  {
    "path": "config/hyprland-preview-share-picker/config.yaml",
    "content": "# paths to stylesheets on the filesystem which should be applied to the application\n#\n# relative paths are resolved relative to the location of the config file\nstylesheets: [\"../omarchy/current/theme/hyprland-preview-share-picker.css\"]\n# default page selected when the picker is opened\ndefault_page: outputs\n\nwindow:\n  # height of the application window\n  height: 500\n  # width of the application window\n  width: 1000\n\nimage:\n  # size to which the images should be internally resized to reduce the memory footprint\n  resize_size: 500\n  # target size of the longer side of the image widget\n  widget_size: 150\n\nclasses:\n  # css classname of the window\n  window: window\n  # css classname of the card containing an image and a label\n  image_card: card\n  # css classname of the card containing an image and a label when the image is still being loaded\n  image_card_loading: card-loading\n  # css classname of the image inside the card\n  image: image\n  # css classname of the label inside the card\n  image_label: image-label\n  # css classname of the notebook containing all pages\n  notebook: notebook\n  # css classname of a label of the notebook\n  tab_label: tab-label\n  # css classname of a notebook page (e.g. windows container)\n  notebook_page: page\n  # css classname of the region selection button\n  region_button: region-button\n  # css classname of the button containing the session restore checkbox and label\n  restore_button: restore-button\n\nwindows:\n  # minimum amount of image cards per row on the windows page\n  min_per_row: 3\n  # maximum amount of image cards per row on the windows page\n  max_per_row: 999\n  # number of clicks needed to select a window\n  clicks: 1\n  # spacing in pixels between the window cards\n  spacing: 12\n\noutputs:\n  # number of clicks needed to select an output\n  clicks: 1\n  # spacing in pixels between the outputs in the layout\n  # note: the spacing is applied from both sides (the gap is `spacing * 2`)\n  spacing: 6\n  # show the label with the output name\n  show_label: false\n  # size the output cards respectively to their scaling\n  respect_output_scaling: true\n\nregion:\n  # command to run for region selection\n  # the output needs to be in the <output>@<x>,<y>,<w>,<h> (e.g. DP-3@2789,436,756,576) format\n  command: slurp -f '%o@%x,%y,%w,%h'\n\n# hide the token restore checkbox and use the default value instead\nhide_token_restore: true\n# enable debug logs by default\ndebug: false\n"
  },
  {
    "path": "config/imv/config",
    "content": "[binds]\n\n# Print the current image file\n<Ctrl+p> = exec lp \"$imv_current_file\"\n\n# Delete the current image and quit the viewer\n<Ctrl+x> = exec rm \"$imv_current_file\"; quit\n\n# Delete the current image and move to the next one\n<Ctrl+Shift+X> = exec rm \"$imv_current_file\"; close\n\n# Rotate the currently open image by 90 degrees\n<Ctrl+r> = exec mogrify -rotate 90 \"$imv_current_file\"\n"
  },
  {
    "path": "config/kitty/kitty.conf",
    "content": "include ~/.config/omarchy/current/theme/kitty.conf\n\n# Font\nfont_family JetBrainsMono Nerd Font\nbold_italic_font auto\nfont_size        9.0\n\n# Window\nwindow_padding_width 14\nhide_window_decorations yes\nconfirm_os_window_close 0\n\n# Keybindings\nmap ctrl+insert copy_to_clipboard\nmap shift+insert paste_from_clipboard\n\n# Allow remote access\nallow_remote_control yes\n\n# Aesthetics\ncursor_shape block\ncursor_blink_interval 0\nshell_integration no-cursor\nenable_audio_bell no\n\n# Minimal Tab bar styling\ntab_bar_edge                bottom\ntab_bar_style               powerline\ntab_powerline_style         slanted\ntab_title_template          {title}{' :{}:'.format(num_windows) if num_windows > 1 else ''}\n"
  },
  {
    "path": "config/lazygit/config.yml",
    "content": ""
  },
  {
    "path": "config/omarchy/extensions/menu.sh",
    "content": "# Overwrite parts of the omarchy-menu with user-specific submenus.\n# See $OMARCHY_PATH/bin/omarchy-menu for functions that can be overwritten.\n#\n# WARNING: Overwritten functions will obviously not be updated when Omarchy changes.\n#\n# Example of minimal system menu:\n#\n# show_system_menu() {\n#   case $(menu \"System\" \"  Lock\\n󰐥  Shutdown\") in\n#   *Lock*) omarchy-lock-screen ;;\n#   *Shutdown*) omarchy-system-shutdown ;;\n#   *) back_to show_main_menu ;;\n#   esac\n# }\n#\n# Example of overriding just the about menu action: (Using zsh instead of bash (default))\n#\n# show_about() {\n#   exec omarchy-launch-or-focus-tui \"zsh -c 'fastfetch; read -k 1'\"\n# }\n"
  },
  {
    "path": "config/omarchy/hooks/battery-low.sample",
    "content": "#!/bin/bash\n\n# This hook is called with the current battery percentage when the low battery\n# notification is sent. To put it into use, remove .sample from the name.\n\nSOUND_FILE=\"/usr/share/sounds/freedesktop/stereo/dialog-warning.oga\"\n\nif omarchy-cmd-present mpv && [[ -f $SOUND_FILE ]]; then\n  mpv --no-video \"$SOUND_FILE\" >/dev/null 2>&1\nfi\n"
  },
  {
    "path": "config/omarchy/hooks/font-set.sample",
    "content": "#!/bin/bash\n\n# This hook is called with the snake-cased name of the font that has just been set.\n# To put it into use, remove .sample from the name.\n\n# Example: Show the name of the theme that was just set.\n# notify-send \"New font\" \"Your new font is $1\"\n"
  },
  {
    "path": "config/omarchy/hooks/post-update.sample",
    "content": "#!/bin/bash\n\n# This hook is called after an Omarchy system update has been performed.\n# To put it into use, remove .sample from the name.\n\n# Example: Show notification after the system has been updated.\n# notify-send \"Update Performed\" \"Your system is now up to date\"\n"
  },
  {
    "path": "config/omarchy/hooks/theme-set.sample",
    "content": "#!/bin/bash\n\n# This hook is called with the snake-cased name of the theme that has just been set.\n# To put it into use, remove .sample from the name.\n\n# Example: Show the name of the theme that was just set.\n# notify-send \"New theme\" \"Your new theme is $1\"\n"
  },
  {
    "path": "config/omarchy/themed/alacritty.toml.tpl.sample",
    "content": "# Omarchy User Template Example: Alacritty\n#\n# This is a sample template file demonstrating how to create custom themed\n# configurations. Templates use placeholder variables that get replaced with\n# your current theme's colors when you switch themes.\n#\n# HOW TO USE:\n#   1. Rename this file to: alacritty.toml.tpl (remove the .sample extension)\n#   2. Customize it as needed\n#   3. Change your theme to apply the template\n#\n# User templates in ~/.config/omarchy/themed/ take priority over the built-in\n# templates in the Omarchy default/themed/ directory. This lets you override\n# any built-in template or create templates for applications not included\n# by default.\n#\n# AVAILABLE VARIABLES:\n#   {{ background }}            - Main background color (e.g., \"#1a1b26\")\n#   {{ foreground }}            - Main foreground/text color\n#   {{ cursor }}                - Cursor color\n#   {{ accent }}                - Theme accent color\n#   {{ selection_background }}  - Selection highlight background\n#   {{ selection_foreground }}  - Selection highlight foreground\n#\n#   {{ color0 }} through {{ color15 }} - Standard 16-color terminal palette\n#     color0-7:  Normal colors (black, red, green, yellow, blue, magenta, cyan, white)\n#     color8-15: Bright variants\n#\n# VARIABLE MODIFIERS:\n#   {{ variable_strip }} - Hex color without the # prefix (e.g., \"1a1b26\")\n#   {{ variable_rgb }}   - Decimal RGB values (e.g., \"26,27,38\")\n#\n# Example using modifiers:\n#   background = \"{{ background }}\"       -> background = \"#1a1b26\"\n#   background = \"{{ background_strip }}\" -> background = \"1a1b26\"\n#   background = \"rgb({{ background_rgb }})\" -> background = \"rgb(26,27,38)\"\n#\n# ---------------------------------------------------------------------------\n\n[colors.primary]\nbackground = \"{{ background }}\"\nforeground = \"{{ foreground }}\"\n\n[colors.cursor]\ntext = \"{{ background }}\"\ncursor = \"{{ cursor }}\"\n\n[colors.vi_mode_cursor]\ntext = \"{{ background }}\"\ncursor = \"{{ cursor }}\"\n\n[colors.search.matches]\nforeground = \"{{ background }}\"\nbackground = \"{{ color3 }}\"\n\n[colors.search.focused_match]\nforeground = \"{{ background }}\"\nbackground = \"{{ color1 }}\"\n\n[colors.footer_bar]\nforeground = \"{{ background }}\"\nbackground = \"{{ foreground }}\"\n\n[colors.selection]\ntext = \"{{ selection_foreground }}\"\nbackground = \"{{ selection_background }}\"\n\n[colors.normal]\nblack = \"{{ color0 }}\"\nred = \"{{ color1 }}\"\ngreen = \"{{ color2 }}\"\nyellow = \"{{ color3 }}\"\nblue = \"{{ color4 }}\"\nmagenta = \"{{ color5 }}\"\ncyan = \"{{ color6 }}\"\nwhite = \"{{ color7 }}\"\n\n[colors.bright]\nblack = \"{{ color8 }}\"\nred = \"{{ color9 }}\"\ngreen = \"{{ color10 }}\"\nyellow = \"{{ color11 }}\"\nblue = \"{{ color12 }}\"\nmagenta = \"{{ color13 }}\"\ncyan = \"{{ color14 }}\"\nwhite = \"{{ color15 }}\"\n"
  },
  {
    "path": "config/opencode/opencode.json",
    "content": "{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"theme\": \"system\",\n  \"autoupdate\": false\n}\n"
  },
  {
    "path": "config/starship.toml",
    "content": "add_newline = true\ncommand_timeout = 200\nformat = \"[$directory$git_branch$git_status]($style)$character\"\n\n[character]\nerror_symbol = \"[✗](bold cyan)\"\nsuccess_symbol = \"[❯](bold cyan)\"\n\n[directory]\ntruncation_length = 2\ntruncation_symbol = \"…/\"\nrepo_root_style = \"bold cyan\"\nrepo_root_format = \"[$repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style) \"\n\n[git_branch]\nformat = \"[$branch]($style) \"\nstyle = \"italic cyan\"\n\n[git_status]\nformat     = '[$all_status]($style)'\nstyle      = \"cyan\"\nahead      = \"⇡${count} \"\ndiverged   = \"⇕⇡${ahead_count}⇣${behind_count} \"\nbehind     = \"⇣${count} \"\nconflicted = \" \"\nup_to_date = \" \"\nuntracked  = \"? \"\nmodified   = \" \"\nstashed    = \"\"\nstaged     = \"\"\nrenamed    = \"\"\ndeleted    = \"\"\n"
  },
  {
    "path": "config/swayosd/config.toml",
    "content": "[server]\nshow_percentage = true\nmax_volume = 100\nstyle = \"~/.config/swayosd/style.css\"\n"
  },
  {
    "path": "config/swayosd/style.css",
    "content": "@import \"../omarchy/current/theme/swayosd.css\";\n\nwindow {\n  border-radius: 0;\n  opacity: 0.97;\n  border: 2px solid @border-color;\n\n  background-color: @background-color;\n}\n\nlabel {\n  font-family: 'JetBrainsMono Nerd Font';\n  font-size: 11pt;\n\n  color: @label;\n}\n\nimage {\n  color: @image;\n}\n\nprogressbar {\n  border-radius: 0;\n}\n\nprogress {\n  background-color: @progress;\n}\n"
  },
  {
    "path": "config/systemd/user/omarchy-battery-monitor.service",
    "content": "[Unit]\nDescription=Omarchy Battery Monitor Check\nAfter=graphical-session.target\n\n[Service]\nType=oneshot\nExecStart=%h/.local/share/omarchy/bin/omarchy-battery-monitor\nEnvironment=DISPLAY=:0\nLogLevelMax=warning\n"
  },
  {
    "path": "config/systemd/user/omarchy-battery-monitor.timer",
    "content": "[Unit]\nDescription=Omarchy Battery Monitor Timer\nRequires=omarchy-battery-monitor.service\n\n[Timer]\nOnBootSec=1min\nOnUnitActiveSec=30sec\nAccuracySec=10sec\n\n[Install]\nWantedBy=timers.target"
  },
  {
    "path": "config/tmux/tmux.conf",
    "content": "# Prefix\nset -g prefix C-Space\nset -g prefix2 C-b\nbind C-Space send-prefix\n\n# Reload config\nbind q source-file ~/.config/tmux/tmux.conf \\; display \"Configuration reloaded\"\n\n# Vi mode for copy\nsetw -g mode-keys vi\nbind -T copy-mode-vi v send -X begin-selection\nbind -T copy-mode-vi y send -X copy-selection-and-cancel\n\n# Pane Controls\nbind h split-window -v -c \"#{pane_current_path}\"\nbind v split-window -h -c \"#{pane_current_path}\"\nbind x kill-pane\n\nbind -n C-M-Left select-pane -L\nbind -n C-M-Right select-pane -R\nbind -n C-M-Up select-pane -U\nbind -n C-M-Down select-pane -D\n\nbind -n C-M-S-Left resize-pane -L 5\nbind -n C-M-S-Down resize-pane -D 5\nbind -n C-M-S-Up resize-pane -U 5\nbind -n C-M-S-Right resize-pane -R 5\n\n# Window navigation\nbind r command-prompt -I \"#W\" \"rename-window -- '%%'\"\nbind c new-window -c \"#{pane_current_path}\"\nbind k kill-window\n\nbind -n M-1 select-window -t 1\nbind -n M-2 select-window -t 2\nbind -n M-3 select-window -t 3\nbind -n M-4 select-window -t 4\nbind -n M-5 select-window -t 5\nbind -n M-6 select-window -t 6\nbind -n M-7 select-window -t 7\nbind -n M-8 select-window -t 8\nbind -n M-9 select-window -t 9\n\nbind -n M-Left select-window -t -1\nbind -n M-Right select-window -t +1\nbind -n M-S-Left swap-window -t -1 \\; select-window -t -1\nbind -n M-S-Right swap-window -t +1 \\; select-window -t +1\n\n# Session controls\nbind R command-prompt -I \"#S\" \"rename-session -- '%%'\"\nbind C new-session -c \"#{pane_current_path}\"\nbind K kill-session\nbind P switch-client -p\nbind N switch-client -n\n\nbind -n M-Up switch-client -p\nbind -n M-Down switch-client -n\n\n# General\nset -g default-terminal \"tmux-256color\"\nset -ag terminal-overrides \",*:RGB\"\nset -g mouse on\nset -g base-index 1\nsetw -g pane-base-index 1\nset -g renumber-windows on\nset -g history-limit 50000\nset -g escape-time 0\nset -g focus-events on\nset -g set-clipboard on\nset -g allow-passthrough on\nsetw -g aggressive-resize on\nset -g detach-on-destroy off\n\n# Status bar\nset -g status-position top\nset -g status-interval 5\nset -g status-left-length 30\nset -g status-right-length 50\nset -g window-status-separator \"\"\nset -gw automatic-rename on\nset -gw automatic-rename-format '#{b:pane_current_path}'\n\n# Theme\nset -g status-style \"bg=default,fg=default\"\nset -g status-left \"#[fg=black,bg=blue,bold] #S #[bg=default] \"\nset -g status-right \"#[fg=blue]#{?pane_in_mode,COPY ,}#{?client_prefix,PREFIX ,}#{?window_zoomed_flag,ZOOM ,}#[fg=brightblack]#h \"\nset -g window-status-format \"#[fg=brightblack] #I:#W \"\nset -g window-status-current-format \"#[fg=blue,bold] #I:#W \"\nset -g pane-border-style \"fg=brightblack\"\nset -g pane-active-border-style \"fg=blue\"\nset -g message-style \"bg=default,fg=blue\"\nset -g message-command-style \"bg=default,fg=blue\"\nset -g mode-style \"bg=blue,fg=black\"\nsetw -g clock-mode-colour blue\n"
  },
  {
    "path": "config/uwsm/default",
    "content": "# Changes require a restart to take effect.\n\n# Install other terminals via Install > Terminal\nexport TERMINAL=xdg-terminal-exec\n\n# Use code for VSCode\nexport EDITOR=nvim\n\n# Use a custom directory for screenshots (remember to make the directory!)\n# export OMARCHY_SCREENSHOT_DIR=\"$HOME/Pictures/Screenshots\"\n\n# Use a custom directory for screenrecordings (remember to make the directory!)\n# export OMARCHY_SCREENRECORD_DIR=\"$HOME/Videos/Screencasts\"\n"
  },
  {
    "path": "config/uwsm/env",
    "content": "# Changes require a restart to take effect.\n\n# Ensure Omarchy bins are in the path\nexport OMARCHY_PATH=$HOME/.local/share/omarchy\nexport PATH=$OMARCHY_PATH/bin:$PATH:$HOME/.local/bin\n\n# Set default terminal and editor\nsource ~/.config/uwsm/default\n\n# Activate mise if present on the system\nomarchy-cmd-present mise && eval \"$(mise activate bash --shims)\"\n"
  },
  {
    "path": "config/walker/config.toml",
    "content": "force_keyboard_focus = true                                                 # forces keyboard forcus to stay in Walker\nselection_wrap = true                                                       # wrap list if at bottom or top\ntheme = \"omarchy-default\"                                                   # theme to use\nadditional_theme_location = \"~/.local/share/omarchy/default/walker/themes/\"\nhide_action_hints = true                                                    # globally hide the action hints\n\n[placeholders]\n\"default\" = { input = \" Search...\", list = \"No Results\" } # placeholders for input and empty list, key is the providers name, so f.e. \"desktopapplications\" or \"menus:other\"\n\n[keybinds]\nquick_activate = []\n\n[columns]\nsymbols = 1 # providers to be queried by default\n\n[providers]\nmax_results = 256 # 256 should be enough for everyone\ndefault = [\n  \"desktopapplications\",\n  \"websearch\",\n]\n\n[[providers.prefixes]]\nprefix = \"/\"\nprovider = \"providerlist\"\n\n[[providers.prefixes]]\nprefix = \".\"\nprovider = \"files\"\n\n[[providers.prefixes]]\nprefix = \":\"\nprovider = \"symbols\"\n\n[[providers.prefixes]]\nprefix = \"=\"\nprovider = \"calc\"\n\n[[providers.prefixes]]\nprefix = \"@\"\nprovider = \"websearch\"\n\n[[providers.prefixes]]\nprefix = \"$\"\nprovider = \"clipboard\"\n\n[[emergencies]]\ntext = \"Restart Walker\"\ncommand = \"omarchy-restart-walker\"\n"
  },
  {
    "path": "config/waybar/config.jsonc",
    "content": "{\n  \"reload_style_on_change\": true,\n  \"layer\": \"top\",\n  \"position\": \"top\",\n  \"spacing\": 0,\n  \"height\": 26,\n  \"modules-left\": [\"custom/omarchy\", \"hyprland/workspaces\"],\n  \"modules-center\": [\"clock\", \"custom/update\", \"custom/voxtype\", \"custom/screenrecording-indicator\", \"custom/idle-indicator\", \"custom/notification-silencing-indicator\"],\n  \"modules-right\": [\n    \"group/tray-expander\",\n    \"bluetooth\",\n    \"network\",\n    \"pulseaudio\",\n    \"cpu\",\n    \"battery\"\n  ],\n  \"hyprland/workspaces\": {\n    \"on-click\": \"activate\",\n    \"format\": \"{icon}\",\n    \"format-icons\": {\n      \"default\": \"\",\n      \"1\": \"1\",\n      \"2\": \"2\",\n      \"3\": \"3\",\n      \"4\": \"4\",\n      \"5\": \"5\",\n      \"6\": \"6\",\n      \"7\": \"7\",\n      \"8\": \"8\",\n      \"9\": \"9\",\n      \"10\": \"0\",\n      \"active\": \"󱓻\"\n    },\n    \"persistent-workspaces\": {\n      \"1\": [],\n      \"2\": [],\n      \"3\": [],\n      \"4\": [],\n      \"5\": []\n    }\n  },\n  \"custom/omarchy\": {\n    \"format\": \"<span font='omarchy'>\\ue900</span>\",\n    \"on-click\": \"omarchy-menu\",\n    \"on-click-right\": \"xdg-terminal-exec\",\n    \"tooltip-format\": \"Omarchy Menu\\n\\nSuper + Alt + Space\"\n  },\n  \"custom/update\": {\n    \"format\": \"\",\n    \"exec\": \"omarchy-update-available\",\n    \"on-click\": \"omarchy-launch-floating-terminal-with-presentation omarchy-update\",\n    \"tooltip-format\": \"Omarchy update available\",\n    \"signal\": 7,\n    \"interval\": 21600\n  },\n\n  \"cpu\": {\n    \"interval\": 5,\n    \"format\": \"󰍛\",\n    \"on-click\": \"omarchy-launch-or-focus-tui btop\",\n    \"on-click-right\": \"alacritty\"\n  },\n  \"clock\": {\n    \"format\": \"{:L%A %H:%M}\",\n    \"format-alt\": \"{:L%d %B W%V %Y}\",\n    \"tooltip\": false,\n    \"on-click-right\": \"omarchy-launch-floating-terminal-with-presentation omarchy-tz-select\"\n  },\n  \"network\": {\n    \"format-icons\": [\"󰤯\", \"󰤟\", \"󰤢\", \"󰤥\", \"󰤨\"],\n    \"format\": \"{icon}\",\n    \"format-wifi\": \"{icon}\",\n    \"format-ethernet\": \"󰀂\",\n    \"format-disconnected\": \"󰤮\",\n    \"tooltip-format-wifi\": \"{essid} ({frequency} GHz)\\n⇣{bandwidthDownBytes}  ⇡{bandwidthUpBytes}\",\n    \"tooltip-format-ethernet\": \"⇣{bandwidthDownBytes}  ⇡{bandwidthUpBytes}\",\n    \"tooltip-format-disconnected\": \"Disconnected\",\n    \"interval\": 3,\n    \"spacing\": 1,\n    \"on-click\": \"omarchy-launch-wifi\"\n  },\n  \"battery\": {\n    \"format\": \"{capacity}% {icon}\",\n    \"format-discharging\": \"{icon}\",\n    \"format-charging\": \"{icon}\",\n    \"format-plugged\": \"\",\n    \"format-icons\": {\n      \"charging\": [\"󰢜\", \"󰂆\", \"󰂇\", \"󰂈\", \"󰢝\", \"󰂉\", \"󰢞\", \"󰂊\", \"󰂋\", \"󰂅\"],\n      \"default\": [\"󰁺\", \"󰁻\", \"󰁼\", \"󰁽\", \"󰁾\", \"󰁿\", \"󰂀\", \"󰂁\", \"󰂂\", \"󰁹\"]\n    },\n    \"format-full\": \"󰂅\",\n    \"tooltip-format-discharging\": \"{power:>1.0f}W↓ {capacity}%\",\n    \"tooltip-format-charging\": \"{power:>1.0f}W↑ {capacity}%\",\n    \"interval\": 5,\n    \"on-click\": \"omarchy-menu power\",\n    \"states\": {\n      \"warning\": 20,\n      \"critical\": 10\n    }\n  },\n  \"bluetooth\": {\n    \"format\": \"\",\n    \"format-off\": \"󰂲\",\n    \"format-disabled\": \"󰂲\",\n    \"format-connected\": \"󰂱\",\n    \"format-no-controller\": \"\",\n    \"tooltip-format\": \"Devices connected: {num_connections}\",\n    \"on-click\": \"omarchy-launch-bluetooth\"\n  },\n  \"pulseaudio\": {\n    \"format\": \"{icon}\",\n    \"on-click\": \"omarchy-launch-audio\",\n    \"on-click-right\": \"pamixer -t\",\n    \"tooltip-format\": \"Playing at {volume}%\",\n    \"scroll-step\": 5,\n    \"format-muted\": \"\",\n    \"format-icons\": {\n      \"headphone\": \"\",\n      \"headset\": \"\",\n      \"default\": [\"\", \"\", \"\"]\n    }\n  },\n  \"group/tray-expander\": {\n    \"orientation\": \"inherit\",\n    \"drawer\": {\n      \"transition-duration\": 600,\n      \"children-class\": \"tray-group-item\"\n    },\n    \"modules\": [\"custom/expand-icon\", \"tray\"]\n  },\n  \"custom/expand-icon\": {\n    \"format\": \"\",\n    \"tooltip\": false,\n    \"on-scroll-up\": \"\",\n    \"on-scroll-down\": \"\",\n    \"on-scroll-left\": \"\",\n    \"on-scroll-right\": \"\"\n  },\n  \"custom/screenrecording-indicator\": {\n    \"on-click\": \"omarchy-cmd-screenrecord\",\n    \"exec\": \"$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh\",\n    \"signal\": 8,\n    \"return-type\": \"json\"\n  },\n  \"custom/idle-indicator\": {\n    \"on-click\": \"omarchy-toggle-idle\",\n    \"exec\": \"$OMARCHY_PATH/default/waybar/indicators/idle.sh\",\n    \"signal\": 9,\n    \"return-type\": \"json\"\n  },\n  \"custom/notification-silencing-indicator\": {\n    \"on-click\": \"omarchy-toggle-notification-silencing\",\n    \"exec\": \"$OMARCHY_PATH/default/waybar/indicators/notification-silencing.sh\",\n    \"signal\": 10,\n    \"return-type\": \"json\"\n  },\n  \"custom/voxtype\": {\n    \"exec\": \"omarchy-voxtype-status\",\n    \"return-type\": \"json\",\n    \"format\": \"{icon}\",\n    \"format-icons\": {\n      \"idle\": \"\",\n      \"recording\": \"󰍬\",\n      \"transcribing\": \"󰔟\"\n    },\n    \"tooltip\": true,\n    \"on-click-right\": \"omarchy-voxtype-config\",\n    \"on-click\": \"omarchy-voxtype-model\"\n  },\n  \"tray\": {\n    \"icon-size\": 12,\n    \"spacing\": 17\n  }\n}\n"
  },
  {
    "path": "config/waybar/style.css",
    "content": "@import \"../omarchy/current/theme/waybar.css\";\n\n* {\n  background-color: @background;\n  color: @foreground;\n\n  border: none;\n  border-radius: 0;\n  min-height: 0;\n  font-family: 'JetBrainsMono Nerd Font';\n  font-size: 12px;\n}\n\n.modules-left {\n  margin-left: 8px;\n}\n\n.modules-right {\n  margin-right: 8px;\n}\n\n#workspaces button {\n  all: initial;\n  padding: 0 6px;\n  margin: 0 1.5px;\n  min-width: 9px;\n}\n\n#workspaces button.empty {\n  opacity: 0.5;\n}\n\n#cpu,\n#battery,\n#pulseaudio,\n#custom-omarchy,\n#custom-update {\n  min-width: 12px;\n  margin: 0 7.5px;\n}\n\n#tray {\n  margin-right: 16px;\n}\n\n#bluetooth {\n  margin-right: 17px;\n}\n\n#network {\n  margin-right: 13px;\n}\n\n#custom-expand-icon {\n  margin-right: 18px;\n}\n\ntooltip {\n  padding: 2px;\n}\n\n#custom-update {\n  font-size: 10px;\n}\n\n#clock {\n  margin-left: 8.75px;\n}\n\n.hidden {\n  opacity: 0;\n}\n\n#custom-screenrecording-indicator,\n#custom-idle-indicator,\n#custom-notification-silencing-indicator {\n  min-width: 12px;\n  margin-left: 5px;\n  margin-right: 0;\n  font-size: 10px;\n  padding-bottom: 1px;\n}\n\n#custom-screenrecording-indicator.active {\n  color: #a55555;\n}\n\n#custom-idle-indicator.active,\n#custom-notification-silencing-indicator.active {\n  color: #a55555;\n}\n\n#custom-voxtype {\n  min-width: 12px;\n  margin: 0 0 0 7.5px;\n}\n\n#custom-voxtype.recording {\n  color: #a55555;\n}\n"
  },
  {
    "path": "config/wiremix/wiremix.toml",
    "content": "# overwrites default wiremix configuration\n# defaults: https://github.com/tsowell/wiremix/blob/main/wiremix.toml\n\n[char_sets.default]\ndefault_device = \"⮞\"\n"
  },
  {
    "path": "config/xdg-terminals.list",
    "content": "# Terminal emulator preference order for xdg-terminal-exec\n# The first found and valid terminal will be used\nAlacritty.desktop\n"
  },
  {
    "path": "config/xournalpp/settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--The Xournal++ settings file. Do not edit this file! Most settings are available in the Settings dialog, the others are commented in this file, but handle with care!-->\n<settings>\n  <property name=\"pressureSensitivity\" value=\"true\"/>\n  <property name=\"minimumPressure\" value=\"0.05\"/>\n  <property name=\"pressureMultiplier\" value=\"1\"/>\n  <property name=\"zoomGesturesEnabled\" value=\"true\"/>\n  <property name=\"selectedToolbar\" value=\"Portrait\"/>\n  <property name=\"lastSavePath\" value=\"/home/dhh/Downloads\"/>\n  <property name=\"lastOpenPath\" value=\"\"/>\n  <property name=\"lastImagePath\" value=\"/home/dhh/Dropbox/Images\"/>\n  <property name=\"edgePanSpeed\" value=\"20\"/>\n  <property name=\"edgePanMaxMult\" value=\"5\"/>\n  <property name=\"zoomStep\" value=\"10\"/>\n  <property name=\"zoomStepScroll\" value=\"2\"/>\n  <property name=\"displayDpi\" value=\"72\"/>\n  <property name=\"mainWndWidth\" value=\"800\"/>\n  <property name=\"mainWndHeight\" value=\"600\"/>\n  <property name=\"maximized\" value=\"true\"/>\n  <property name=\"showToolbar\" value=\"true\"/>\n  <property name=\"showSidebar\" value=\"true\"/>\n  <property name=\"sidebarWidth\" value=\"150\"/>\n  <property name=\"sidebarNumberingStyle\" value=\"1\"/>\n  <property name=\"sidebarOnRight\" value=\"false\"/>\n  <property name=\"scrollbarOnLeft\" value=\"false\"/>\n  <property name=\"menubarVisible\" value=\"true\"/>\n  <property name=\"filepathShownInTitlebar\" value=\"false\"/>\n  <property name=\"numColumns\" value=\"1\"/>\n  <property name=\"numRows\" value=\"1\"/>\n  <property name=\"viewFixedRows\" value=\"false\"/>\n  <property name=\"showPairedPages\" value=\"false\"/>\n  <property name=\"layoutVertical\" value=\"false\"/>\n  <property name=\"layoutRightToLeft\" value=\"false\"/>\n  <property name=\"layoutBottomToTop\" value=\"false\"/>\n  <property name=\"numPairsOffset\" value=\"1\"/>\n  <!--The icon theme, allowed values are \"disabled\", \"onDrawOfLastPage\", and \"onScrollOfLastPage\"-->\n  <property name=\"emptyLastPageAppend\" value=\"disabled\"/>\n  <property name=\"presentationMode\" value=\"false\"/>\n  <!--Which GUI elements are shown in default view mode, separated by a colon (,)-->\n  <property name=\"defaultViewModeAttributes\" value=\"showMenubar,showToolbar,showSidebar\"/>\n  <!--Which GUI elements are shown in fullscreen view mode, separated by a colon (,)-->\n  <property name=\"fullscreenViewModeAttributes\" value=\"goFullscren,showToolbar,showSidebar\"/>\n  <!--Which GUI elements are shown in presentation view mode, separated by a colon (,)-->\n  <property name=\"presentationViewModeAttributes\" value=\"goFullscren,showToolbar\"/>\n  <!--The cursor icon used with a stylus, allowed values are \"none\", \"dot\", \"big\", \"arrow\"-->\n  <property name=\"stylusCursorType\" value=\"dot\"/>\n  <!--The eraser cursor visibility used with a stylus, allowed values are \"never\", \"always\", \"hover\", \"touch\"-->\n  <property name=\"eraserVisibility\" value=\"always\"/>\n  <!--The icon theme, allowed values are \"iconsColor\", \"iconsLucide\"-->\n  <property name=\"iconTheme\" value=\"iconsColor\"/>\n  <!--Dark/light mode, allowed values are \"useSystem\", \"forceLight\", \"forceDark\"-->\n  <property name=\"themeVariant\" value=\"forceDark\"/>\n  <property name=\"highlightPosition\" value=\"false\"/>\n  <property name=\"cursorHighlightColor\" value=\"2164260608\"/>\n  <property name=\"cursorHighlightBorderColor\" value=\"2147483903\"/>\n  <property name=\"cursorHighlightRadius\" value=\"30\"/>\n  <property name=\"cursorHighlightBorderWidth\" value=\"0\"/>\n  <property name=\"useStockIcons\" value=\"false\"/>\n  <property name=\"disableScrollbarFadeout\" value=\"false\"/>\n  <property name=\"disableAudio\" value=\"false\"/>\n  <!--Hides scroolbars in the main window, allowed values: \"none\", \"horizontal\", \"vertical\", \"both\"-->\n  <property name=\"scrollbarHideType\" value=\"none\"/>\n  <property name=\"autoloadMostRecent\" value=\"false\"/>\n  <property name=\"autoloadPdfXoj\" value=\"true\"/>\n  <property name=\"defaultSaveName\" value=\"%F-Note-%H-%M\"/>\n  <property name=\"defaultPdfExportName\" value=\"%{name}_annotated\"/>\n  <property name=\"autosaveEnabled\" value=\"true\"/>\n  <property name=\"autosaveTimeout\" value=\"3\"/>\n  <property name=\"addHorizontalSpace\" value=\"false\"/>\n  <property name=\"addHorizontalSpaceAmount\" value=\"150\"/>\n  <property name=\"addVerticalSpace\" value=\"false\"/>\n  <property name=\"addVerticalSpaceAmount\" value=\"150\"/>\n  <property name=\"drawDirModsEnabled\" value=\"false\"/>\n  <property name=\"drawDirModsRadius\" value=\"50\"/>\n  <property name=\"snapRotation\" value=\"true\"/>\n  <property name=\"snapRotationTolerance\" value=\"0.3\"/>\n  <property name=\"snapGrid\" value=\"true\"/>\n  <property name=\"snapGridTolerance\" value=\"0.5\"/>\n  <property name=\"snapGridSize\" value=\"14.17\"/>\n  <property name=\"strokeRecognizerMinSize\" value=\"40\"/>\n  <property name=\"touchDrawing\" value=\"false\"/>\n  <property name=\"gtkTouchInertialScrolling\" value=\"true\"/>\n  <property name=\"pressureGuessing\" value=\"false\"/>\n  <property name=\"selectionBorderColor\" value=\"4294901760\"/>\n  <property name=\"backgroundColor\" value=\"4292664021\"/>\n  <property name=\"selectionMarkerColor\" value=\"4285702095\"/>\n  <property name=\"touchZoomStartThreshold\" value=\"0\"/>\n  <property name=\"pageRerenderThreshold\" value=\"5\"/>\n  <!--The count of rendered PDF pages which will be cached.-->\n  <property name=\"pdfPageCacheSize\" value=\"10\"/>\n  <property name=\"preloadPagesBefore\" value=\"3\"/>\n  <property name=\"preloadPagesAfter\" value=\"5\"/>\n  <property name=\"eagerPageCleanup\" value=\"true\"/>\n  <!--Config for new pages-->\n  <property name=\"pageTemplate\" value=\"xoj/template&#10;copyLastPageSettings=true&#10;size=595.275591x841.889764&#10;backgroundType=lined&#10;backgroundColor=#ffffff&#10;\"/>\n  <property name=\"sizeUnit\" value=\"\"/>\n  <property name=\"audioFolder\" value=\"\"/>\n  <property name=\"audioInputDevice\" value=\"-1\"/>\n  <property name=\"audioOutputDevice\" value=\"-1\"/>\n  <property name=\"audioSampleRate\" value=\"44100\"/>\n  <property name=\"audioGain\" value=\"1\"/>\n  <property name=\"defaultSeekTime\" value=\"5\"/>\n  <property name=\"pluginEnabled\" value=\"\"/>\n  <property name=\"pluginDisabled\" value=\"\"/>\n  <property name=\"strokeFilterIgnoreTime\" value=\"150\"/>\n  <property name=\"strokeFilterIgnoreLength\" value=\"1\"/>\n  <property name=\"strokeFilterSuccessiveTime\" value=\"500\"/>\n  <property name=\"strokeFilterEnabled\" value=\"false\"/>\n  <property name=\"doActionOnStrokeFiltered\" value=\"false\"/>\n  <property name=\"trySelectOnStrokeFiltered\" value=\"false\"/>\n  <property name=\"snapRecognizedShapesEnabled\" value=\"false\"/>\n  <property name=\"restoreLineWidthEnabled\" value=\"false\"/>\n  <property name=\"numIgnoredStylusEvents\" value=\"0\"/>\n  <property name=\"inputSystemTPCButton\" value=\"false\"/>\n  <property name=\"inputSystemDrawOutsideWindow\" value=\"true\"/>\n  <property name=\"preferredLocale\" value=\"\"/>\n  <property name=\"stabilizerAveragingMethod\" value=\"0\"/>\n  <property name=\"stabilizerPreprocessor\" value=\"0\"/>\n  <property name=\"stabilizerBuffersize\" value=\"20\"/>\n  <property name=\"stabilizerSigma\" value=\"0.5\"/>\n  <property name=\"stabilizerDeadzoneRadius\" value=\"1.3\"/>\n  <property name=\"stabilizerDrag\" value=\"0.4\"/>\n  <property name=\"stabilizerMass\" value=\"5\"/>\n  <property name=\"stabilizerCuspDetection\" value=\"true\"/>\n  <property name=\"stabilizerFinalizeStroke\" value=\"true\"/>\n  <property name=\"latexSettings.autoCheckDependencies\" value=\"true\"/>\n  <property name=\"latexSettings.defaultText\" value=\"x^2\"/>\n  <property name=\"latexSettings.globalTemplatePath\" value=\"/usr/share/xournalpp/resources/default_template.tex\"/>\n  <property name=\"latexSettings.genCmd\" value=\"pdflatex -halt-on-error -interaction=nonstopmode '{}'\"/>\n  <property name=\"latexSettings.sourceViewThemeId\" value=\"\"/>\n  <property name=\"latexSettings.editorFont\" value=\"Monospace 12\"/>\n  <property name=\"latexSettings.useCustomEditorFont\" value=\"false\"/>\n  <property name=\"latexSettings.editorWordWrap\" value=\"true\"/>\n  <property name=\"latexSettings.sourceViewAutoIndent\" value=\"true\"/>\n  <property name=\"latexSettings.sourceViewSyntaxHighlight\" value=\"true\"/>\n  <property name=\"latexSettings.sourceViewShowLineNumbers\" value=\"false\"/>\n  <property name=\"font\" font=\"Sans\" size=\"12\"/>\n  <data name=\"buttonConfig\">\n    <data name=\"default\">\n      <attribute name=\"color\" type=\"hex\" value=\"ff000000\"/>\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n      <attribute name=\"size\" type=\"string\" value=\"thin\"/>\n      <attribute name=\"tool\" type=\"string\" value=\"pen\"/>\n    </data>\n    <data name=\"eraser\">\n      <attribute name=\"eraserMode\" type=\"string\" value=\"none\"/>\n      <attribute name=\"size\" type=\"string\" value=\"none\"/>\n      <attribute name=\"tool\" type=\"string\" value=\"eraser\"/>\n    </data>\n    <data name=\"middle\">\n      <attribute name=\"tool\" type=\"string\" value=\"hand\"/>\n    </data>\n    <data name=\"right\">\n      <attribute name=\"tool\" type=\"string\" value=\"none\"/>\n    </data>\n    <data name=\"stylus\">\n      <attribute name=\"tool\" type=\"string\" value=\"none\"/>\n    </data>\n    <data name=\"stylus2\">\n      <attribute name=\"tool\" type=\"string\" value=\"none\"/>\n    </data>\n    <data name=\"touch\">\n      <attribute name=\"device\" type=\"string\" value=\"\"/>\n      <attribute name=\"disableDrawing\" type=\"boolean\" value=\"false\"/>\n      <attribute name=\"tool\" type=\"string\" value=\"none\"/>\n    </data>\n  </data>\n  <data name=\"deviceClasses\">\n    <data name=\"Wayland Finger Scrolling\">\n      <attribute name=\"deviceClass\" type=\"int\" value=\"1\"/>\n      <attribute name=\"deviceSource\" type=\"int\" value=\"6\"/>\n    </data>\n    <data name=\"Wayland Pointer\">\n      <attribute name=\"deviceClass\" type=\"int\" value=\"1\"/>\n      <attribute name=\"deviceSource\" type=\"int\" value=\"0\"/>\n    </data>\n  </data>\n  <data name=\"tools\">\n    <attribute name=\"current\" type=\"string\" value=\"text\"/>\n    <data name=\"drawArrow\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"drawCoordinateSystem\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"drawDoubleArrow\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"drawEllipse\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"drawRect\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"drawSpline\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"eraser\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n      <attribute name=\"size\" type=\"string\" value=\"MEDIUM\"/>\n      <attribute name=\"type\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"hand\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"highlighter\">\n      <attribute name=\"color\" type=\"hex\" value=\"ffffff00\"/>\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n      <attribute name=\"fill\" type=\"int\" value=\"0\"/>\n      <attribute name=\"fillAlpha\" type=\"int\" value=\"128\"/>\n      <attribute name=\"size\" type=\"string\" value=\"MEDIUM\"/>\n    </data>\n    <data name=\"image\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"pen\">\n      <attribute name=\"color\" type=\"hex\" value=\"ff3333cc\"/>\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n      <attribute name=\"fill\" type=\"int\" value=\"0\"/>\n      <attribute name=\"fillAlpha\" type=\"int\" value=\"128\"/>\n      <attribute name=\"size\" type=\"string\" value=\"MEDIUM\"/>\n      <attribute name=\"style\" type=\"string\" value=\"plain\"/>\n    </data>\n    <data name=\"playObject\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"selectMultiLayerRect\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"selectMultiLayerRegion\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"selectObject\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"selectPdfTextLinear\">\n      <attribute name=\"color\" type=\"hex\" value=\"ff000000\"/>\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"selectPdfTextRect\">\n      <attribute name=\"color\" type=\"hex\" value=\"ff000000\"/>\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"selectRect\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"selectRegion\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"showFloatingToolbox\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"text\">\n      <attribute name=\"color\" type=\"hex\" value=\"ff000000\"/>\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n    <data name=\"verticalSpace\">\n      <attribute name=\"drawingType\" type=\"string\" value=\"default\"/>\n    </data>\n  </data>\n  <data name=\"touch\">\n    <attribute name=\"cmdDisable\" type=\"string\" value=\"\"/>\n    <attribute name=\"cmdEnable\" type=\"string\" value=\"\"/>\n    <attribute name=\"disableTouch\" type=\"boolean\" value=\"false\"/>\n    <attribute name=\"method\" type=\"string\" value=\"auto\"/>\n    <attribute name=\"timeout\" type=\"int\" value=\"1000\"/>\n  </data>\n</settings>\n"
  },
  {
    "path": "default/alacritty/screensaver.toml",
    "content": "[colors.primary]\nbackground = \"0x000000\"\n\n[colors.cursor]\ncursor = \"0x000000\"\n\n[font]\nsize = 18.0\n\n[window]\nopacity = 1.0\n"
  },
  {
    "path": "default/bash/aliases",
    "content": "# File system\nif command -v eza &> /dev/null; then\n  alias ls='eza -lh --group-directories-first --icons=auto'\n  alias lsa='ls -a'\n  alias lt='eza --tree --level=2 --long --icons --git'\n  alias lta='lt -a'\nfi\n\nif [[ \"$TERM\" == \"xterm-kitty\" ]]; then\n  alias ff=\"fzf --preview 'case \\$(file --mime-type -b {}) in image/*) kitty icat --clear --transfer-mode=memory --stdin=no --place=\\${FZF_PREVIEW_COLUMNS}x\\${FZF_PREVIEW_LINES}@0x0 {} ;; *) bat --style=numbers --color=always {} ;; esac'\"\nelse\n  alias ff=\"fzf --preview 'bat --style=numbers --color=always {}'\"\nfi\nalias eff='$EDITOR \"$(ff)\"'\nsff() { if [ $# -eq 0 ]; then echo \"Usage: sff <destination> (e.g. sff host:/tmp/)\"; return 1; fi; local file; file=$(find . -type f -printf '%T@\\t%p\\n' | sort -rn | cut -f2- | ff) && [ -n \"$file\" ] && scp \"$file\" \"$1\"; }\n\nif command -v zoxide &> /dev/null; then\n  alias cd=\"zd\"\n  zd() {\n    if (( $# == 0 )); then\n      builtin cd ~ || return\n    elif [[ -d $1 ]]; then\n      builtin cd \"$1\" || return\n    else\n      if ! z \"$@\"; then\n        echo \"Error: Directory not found\"\n        return 1\n      fi\n\n      printf \"\\U000F17A9 \"\n      pwd\n    fi\n  }\nfi\n\nopen() (\n  xdg-open \"$@\" >/dev/null 2>&1 &\n)\n\n# Directories\nalias ..='cd ..'\nalias ...='cd ../..'\nalias ....='cd ../../..'\n\n# Tools\nalias c='opencode'\nalias cx='printf \"\\033[2J\\033[3J\\033[H\" && claude --allow-dangerously-skip-permissions'\nalias d='docker'\nalias r='rails'\nalias t='tmux attach || tmux new -s Work'\nn() { if [ \"$#\" -eq 0 ]; then command nvim . ; else command nvim \"$@\"; fi; }\n\n# Git\nalias g='git'\nalias gcm='git commit -m'\nalias gcam='git commit -a -m'\nalias gcad='git commit -a --amend'\n"
  },
  {
    "path": "default/bash/envs",
    "content": "# Editor used by CLI\nexport SUDO_EDITOR=\"$EDITOR\"\nexport BAT_THEME=ansi\n\n# Duplicated from .config/uwsm/env so SSH works too\nexport OMARCHY_PATH=$HOME/.local/share/omarchy\nexport PATH=$OMARCHY_PATH/bin:$PATH:$HOME/.local/bin\n"
  },
  {
    "path": "default/bash/fns/compression",
    "content": "# Compression\ncompress() { tar -czf \"${1%/}.tar.gz\" \"${1%/}\"; }\nalias decompress=\"tar -xzf\"\n"
  },
  {
    "path": "default/bash/fns/drives",
    "content": "# Write iso file to sd card\niso2sd() {\n  if (( $# < 1 )); then\n    echo \"Usage: iso2sd <input_file> [output_device]\"\n    echo \"Example: iso2sd ~/Downloads/ubuntu-25.04-desktop-amd64.iso /dev/sda\"\n    return 1\n  fi\n\n  local iso=\"$1\"\n  local drive=\"$2\"\n\n  if [[ -z $drive ]]; then\n    local available_sds=$(lsblk -dpno NAME | grep -E '/dev/sd')\n\n    if [[ -z $available_sds ]]; then\n      echo \"No SD drives found and no drive specified\"\n      return 1\n    fi\n\n    drive=$(omarchy-drive-select \"$available_sds\")\n\n    if [[ -z $drive ]]; then\n      echo \"No drive selected\"\n      return 1\n    fi\n  fi\n\n  sudo dd bs=4M status=progress oflag=sync if=\"$iso\" of=\"$drive\"\n  sudo eject \"$drive\"\n}\n\n# Format an entire drive for a single partition using exFAT\nformat-drive() {\n  if (( $# != 2 )); then\n    echo \"Usage: format-drive <device> <name>\"\n    echo \"Example: format-drive /dev/sda 'My Stuff'\"\n    echo -e \"\\nAvailable drives:\"\n    lsblk -d -o NAME -n | awk '{print \"/dev/\"$1}'\n  else\n    echo \"WARNING: This will completely erase all data on $1 and label it '$2'.\"\n    read -rp \"Are you sure you want to continue? (y/N): \" confirm\n\n    if [[ $confirm =~ ^[Yy]$ ]]; then\n      sudo wipefs -a \"$1\"\n      sudo dd if=/dev/zero of=\"$1\" bs=1M count=100 status=progress\n      sudo parted -s \"$1\" mklabel gpt\n      sudo parted -s \"$1\" mkpart primary 1MiB 100%\n      sudo parted -s \"$1\" set 1 msftdata on\n\n      partition=\"$([[ $1 == *\"nvme\"* ]] && echo \"${1}p1\" || echo \"${1}1\")\"\n      sudo partprobe \"$1\" || true\n      sudo udevadm settle || true\n\n      sudo mkfs.exfat -n \"$2\" \"$partition\"\n\n      echo \"Drive $1 formatted as exFAT and labeled '$2'.\"\n    fi\n  fi\n}\n"
  },
  {
    "path": "default/bash/fns/ssh-port-forwarding",
    "content": "# SSH Port Forwarding Functions\nfip() {\n  (( $# < 2 )) && echo \"Usage: fip <host> <port1> [port2] ...\" && return 1\n  local host=\"$1\"\n  shift\n  for port in \"$@\"; do\n    ssh -f -N -L \"$port:localhost:$port\" \"$host\" && echo \"Forwarding localhost:$port -> $host:$port\"\n  done\n}\n\ndip() {\n  (( $# == 0 )) && echo \"Usage: dip <port1> [port2] ...\" && return 1\n  for port in \"$@\"; do\n    pkill -f \"ssh.*-L $port:localhost:$port\" && echo \"Stopped forwarding port $port\" || echo \"No forwarding on port $port\"\n  done\n}\n\nlip() {\n  pgrep -af \"ssh.*-L [0-9]+:localhost:[0-9]+\" || echo \"No active forwards\"\n}\n"
  },
  {
    "path": "default/bash/fns/tmux",
    "content": "# Create a Tmux Dev Layout with editor, ai, and terminal\n# Usage: tdl <c|cx|codex|other_ai> [<second_ai>]\ntdl() {\n  [[ -z $1 ]] && { echo \"Usage: tdl <c|cx|codex|other_ai> [<second_ai>]\"; return 1; }\n  [[ -z $TMUX ]] && { echo \"You must start tmux to use tdl.\"; return 1; }\n\n  local current_dir=\"${PWD}\"\n  local editor_pane ai_pane ai2_pane\n  local ai=\"$1\"\n  local ai2=\"$2\"\n\n  # Use TMUX_PANE for the pane we're running in (stable even if active window changes)\n  editor_pane=\"$TMUX_PANE\"\n\n  # Name the current window after the base directory name\n  tmux rename-window -t \"$editor_pane\" \"$(basename \"$current_dir\")\"\n\n  # Split window vertically - top 85%, bottom 15% (target editor pane explicitly)\n  tmux split-window -v -p 15 -t \"$editor_pane\" -c \"$current_dir\"\n\n  # Split editor pane horizontally - AI on right 30% (capture new pane ID directly)\n  ai_pane=$(tmux split-window -h -p 30 -t \"$editor_pane\" -c \"$current_dir\" -P -F '#{pane_id}')\n\n  # If second AI provided, split the AI pane vertically\n  if [[ -n $ai2 ]]; then\n    ai2_pane=$(tmux split-window -v -t \"$ai_pane\" -c \"$current_dir\" -P -F '#{pane_id}')\n    tmux send-keys -t \"$ai2_pane\" \"$ai2\" C-m\n  fi\n\n  # Run ai in the right pane\n  tmux send-keys -t \"$ai_pane\" \"$ai\" C-m\n\n  # Run nvim in the left pane\n  tmux send-keys -t \"$editor_pane\" \"$EDITOR .\" C-m\n\n  # Select the nvim pane for focus\n  tmux select-pane -t \"$editor_pane\"\n}\n\n# Create multiple tdl windows with one per subdirectory in the current directory\n# Usage: tdlm <c|cx|codex|other_ai> [<second_ai>]\ntdlm() {\n  [[ -z $1 ]] && { echo \"Usage: tdlm <c|cx|codex|other_ai> [<second_ai>]\"; return 1; }\n  [[ -z $TMUX ]] && { echo \"You must start tmux to use tdlm.\"; return 1; }\n\n  local ai=\"$1\"\n  local ai2=\"$2\"\n  local base_dir=\"$PWD\"\n  local first=true\n\n  # Rename the session to the current directory name (replace dots/colons which tmux disallows)\n  tmux rename-session \"$(basename \"$base_dir\" | tr '.:' '--')\"\n\n  for dir in \"$base_dir\"/*/; do\n    [[ -d $dir ]] || continue\n    local dirpath=\"${dir%/}\"\n\n    if $first; then\n      # Reuse the current window for the first project\n      tmux send-keys -t \"$TMUX_PANE\" \"cd '$dirpath' && tdl $ai $ai2\" C-m\n      first=false\n    else\n      local pane_id=$(tmux new-window -c \"$dirpath\" -P -F '#{pane_id}')\n      tmux send-keys -t \"$pane_id\" \"tdl $ai $ai2\" C-m\n    fi\n  done\n}\n\n# Create a multi-pane swarm layout with the same command started in each pane (great for AI)\n# Usage: tsl <pane_count> <command>\ntsl() {\n  [[ -z $1 || -z $2 ]] && { echo \"Usage: tsl <pane_count> <command>\"; return 1; }\n  [[ -z $TMUX ]] && { echo \"You must start tmux to use tsl.\"; return 1; }\n\n  local count=\"$1\"\n  local cmd=\"$2\"\n  local current_dir=\"${PWD}\"\n  local -a panes\n\n  tmux rename-window -t \"$TMUX_PANE\" \"$(basename \"$current_dir\")\"\n\n  panes+=(\"$TMUX_PANE\")\n\n  while (( ${#panes[@]} < count )); do\n    local new_pane\n    local split_target=\"${panes[-1]}\"\n    new_pane=$(tmux split-window -h -t \"$split_target\" -c \"$current_dir\" -P -F '#{pane_id}')\n    panes+=(\"$new_pane\")\n    tmux select-layout -t \"${panes[0]}\" tiled\n  done\n\n  for pane in \"${panes[@]}\"; do\n    tmux send-keys -t \"$pane\" \"$cmd\" C-m\n  done\n\n  tmux select-pane -t \"${panes[0]}\"\n}\n"
  },
  {
    "path": "default/bash/fns/transcoding",
    "content": "# Transcode a video to a good-balance 1080p that's great for sharing online\ntranscode-video-1080p() {\n  ffmpeg -i \"$1\" -vf scale=1920:1080 -c:v libx264 -preset fast -crf 23 -c:a copy \"${1%.*}-1080p.mp4\"\n}\n\n# Transcode a video to a good-balance 4K that's great for sharing online\ntranscode-video-4K() {\n  ffmpeg -i \"$1\" -c:v libx265 -preset slow -crf 24 -c:a aac -b:a 192k \"${1%.*}-optimized.mp4\"\n}\n\n# Transcode any image to JPG image that's great for shrinking wallpapers\nimg2jpg() {\n  img=\"$1\"\n  shift\n\n  magick \"$img\" \"$@\" -quality 95 -strip \"${img%.*}-converted.jpg\"\n}\n\n# Transcode any image to a small JPG (max 1080px wide) that's great for sharing online\nimg2jpg-small() {\n  img=\"$1\"\n  shift\n\n  magick \"$img\" \"$@\" -resize 1080x\\> -quality 95 -strip \"${img%.*}-small.jpg\"\n}\n\n# Transcode any image to a medium JPG (max 1800px wide) that's great for sharing online\nimg2jpg-medium() {\n  img=\"$1\"\n  shift\n\n  magick \"$img\" \"$@\" -resize 1800x\\> -quality 95 -strip \"${img%.*}-medium.jpg\"\n}\n\n# Transcode any image to compressed-but-lossless PNG\nimg2png() {\n  img=\"$1\"\n  shift\n\n  magick \"$img\" \"$@\" -strip -define png:compression-filter=5 \\\n    -define png:compression-level=9 \\\n    -define png:compression-strategy=1 \\\n    -define png:exclude-chunk=all \\\n    \"${img%.*}-optimized.png\"\n}\n"
  },
  {
    "path": "default/bash/fns/worktrees",
    "content": "# Create a new worktree and branch from within current git directory.\nga() {\n  if [[ -z \"$1\" ]]; then\n    echo \"Usage: ga [branch name]\"\n    return 1\n  fi\n\n  local branch=\"$1\"\n  local base=\"$(basename \"$PWD\")\"\n  local path=\"../${base}--${branch}\"\n\n  git worktree add -b \"$branch\" \"$path\"\n  mise trust \"$path\"\n  cd \"$path\"\n}\n\n# Remove worktree and branch from within active worktree directory.\ngd() {\n  if gum confirm \"Remove worktree and branch?\"; then\n    local cwd base branch root worktree\n\n    cwd=\"$(pwd)\"\n    worktree=\"$(basename \"$cwd\")\"\n\n    # split on first `--`\n    root=\"${worktree%%--*}\"\n    branch=\"${worktree#*--}\"\n\n    # Protect against accidentally nuking a non-worktree directory\n    if [[ \"$root\" != \"$worktree\" ]]; then\n      cd \"../$root\"\n      git worktree remove \"$cwd\" --force || return 1\n      git branch -D \"$branch\"\n    fi\n  fi\n}\n"
  },
  {
    "path": "default/bash/functions",
    "content": "for f in $OMARCHY_PATH/default/bash/fns/*; do source \"$f\"; done\n"
  },
  {
    "path": "default/bash/init",
    "content": "if command -v mise &> /dev/null; then\n  eval \"$(mise activate bash)\"\nfi\n\nif command -v starship &> /dev/null; then\n  eval \"$(starship init bash)\"\nfi\n\nif command -v zoxide &> /dev/null; then\n  eval \"$(zoxide init bash)\"\nfi\n\nif command -v try &> /dev/null; then\n  eval \"$(SHELL=/bin/bash command try init ~/Work/tries)\"\nfi\n\nif command -v fzf &> /dev/null; then\n  if [[ -f /usr/share/fzf/completion.bash ]]; then\n    source /usr/share/fzf/completion.bash\n  fi\n  if [[ -f /usr/share/fzf/key-bindings.bash ]]; then\n    source /usr/share/fzf/key-bindings.bash\n  fi\nfi\n"
  },
  {
    "path": "default/bash/inputrc",
    "content": "set meta-flag on\nset input-meta on\nset output-meta on\nset convert-meta off\nset completion-ignore-case on\nset completion-prefix-display-length 2\nset show-all-if-ambiguous on\nset show-all-if-unmodified on\n\n# Arrow keys match what you've typed so far against your command history\n\"\\e[A\": history-search-backward\n\"\\e[B\": history-search-forward\n\"\\e[C\": forward-char\n\"\\e[D\": backward-char\n\n# Immediately add a trailing slash when autocompleting symlinks to directories\nset mark-symlinked-directories on\n\n# Do not autocomplete hidden files unless the pattern explicitly begins with a dot\nset match-hidden-files off\n\n# Show all autocomplete results at once\nset page-completions off\n\n# If there are more than 200 possible completions for a word, ask to show them all\nset completion-query-items 200\n\n# Show extra file information when completing, like `ls -F` does\nset visible-stats on\n\n# Be more intelligent when autocompleting by also looking at the text after\n# the cursor. For example, when the current line is \"cd ~/src/mozil\", and\n# the cursor is on the \"z\", pressing Tab will not autocomplete it to \"cd\n# ~/src/mozillail\", but to \"cd ~/src/mozilla\". (This is supported by the\n# Readline used by Bash 4.)\nset skip-completed-text on\n\n# Coloring for Bash 4 tab completions.\nset colored-stats on\n\n# Cycle forward and backward through completion candidates (tab/shift+tab)\n# (completion listing and display behavior configured above)\nTAB: menu-complete\n\"\\e[Z\": menu-complete-backward\n\n# On first Tab, complete the common prefix before cycling candidates\nset menu-complete-display-prefix on\n"
  },
  {
    "path": "default/bash/rc",
    "content": "source ~/.local/share/omarchy/default/bash/envs\nsource ~/.local/share/omarchy/default/bash/shell\nsource ~/.local/share/omarchy/default/bash/aliases\nsource ~/.local/share/omarchy/default/bash/functions\nsource ~/.local/share/omarchy/default/bash/init\n[[ $- == *i* ]] && bind -f ~/.local/share/omarchy/default/bash/inputrc\n"
  },
  {
    "path": "default/bash/shell",
    "content": "# History control\nshopt -s histappend\nHISTCONTROL=ignoreboth\nHISTSIZE=32768\nHISTFILESIZE=\"${HISTSIZE}\"\n\n# Autocompletion\nif [[ ! -v BASH_COMPLETION_VERSINFO && -f /usr/share/bash-completion/bash_completion ]]; then\n  source /usr/share/bash-completion/bash_completion\nfi\n\n# Ensure command hashing is off for mise\nset +h\n"
  },
  {
    "path": "default/bashrc",
    "content": "# If not running interactively, don't do anything (leave this at the top of this file)\n[[ $- != *i* ]] && return\n\n# All the default Omarchy aliases and functions\n# (don't mess with these directly, just overwrite them here!)\nsource ~/.local/share/omarchy/default/bash/rc\n\n# Add your own exports, aliases, and functions here.\n#\n# Make an alias for invoking commands you use constantly\n# alias p='python'\n"
  },
  {
    "path": "default/chromium/extensions/copy-url/background.js",
    "content": "chrome.commands.onCommand.addListener((command) => {\n  if (command === 'copy-url') {\n    chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {\n      const currentTab = tabs[0];\n\n      chrome.scripting.executeScript({\n        target: { tabId: currentTab.id },\n        func: () => {\n          navigator.clipboard.writeText(window.location.href);\n        }\n      }).then(() => {\n        chrome.notifications.create({\n          type: 'basic',\n          iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==',\n          title: '   URL copied to clipboard',\n          message: ''\n        });\n      });\n    });\n  }\n});\n"
  },
  {
    "path": "default/chromium/extensions/copy-url/manifest.json",
    "content": "{\n  \"manifest_version\": 3,\n  \"name\": \"Copy URL\",\n  \"version\": \"1.0\",\n  \"description\": \"Copy current URL to clipboard, this extension is installed by Omarchy\",\n  \"permissions\": [\"activeTab\", \"scripting\", \"notifications\"],\n  \"icons\": {\n    \"16\": \"icon.png\",\n    \"48\": \"icon.png\",\n    \"128\": \"icon.png\"\n  },\n  \"commands\": {\n    \"copy-url\": {\n      \"suggested_key\": {\"default\": \"Alt+Shift+L\"},\n      \"description\": \"Copy URL\"\n    }\n  },\n  \"background\": {\"service_worker\": \"background.js\"}\n}\n"
  },
  {
    "path": "default/elephant/omarchy_background_selector.lua",
    "content": "Name = \"omarchyBackgroundSelector\"\nNamePretty = \"Omarchy Background Selector\"\nCache = false\nHideFromProviderlist = true\nSearchName = true\n\nlocal function ShellEscape(s)\n  return \"'\" .. s:gsub(\"'\", \"'\\\\''\") .. \"'\"\nend\n\nfunction FormatName(filename)\n  -- Remove leading number and dash\n  local name = filename:gsub(\"^%d+\", \"\"):gsub(\"^%-\", \"\")\n  -- Remove extension\n  name = name:gsub(\"%.[^%.]+$\", \"\")\n  -- Replace dashes with spaces\n  name = name:gsub(\"-\", \" \")\n  -- Capitalize each word\n  name = name:gsub(\"%S+\", function(word)\n    return word:sub(1, 1):upper() .. word:sub(2):lower()\n  end)\n  return name\nend\n\nfunction GetEntries()\n  local entries = {}\n  local home = os.getenv(\"HOME\")\n\n  -- Read current theme name\n  local theme_name_file = io.open(home .. \"/.config/omarchy/current/theme.name\", \"r\")\n  local theme_name = theme_name_file and theme_name_file:read(\"*l\") or nil\n  if theme_name_file then\n    theme_name_file:close()\n  end\n\n  -- Directories to search\n  local dirs = {\n    home .. \"/.config/omarchy/current/theme/backgrounds\",\n  }\n  if theme_name then\n    table.insert(dirs, home .. \"/.config/omarchy/backgrounds/\" .. theme_name)\n  end\n\n  -- Track added files to avoid duplicates\n  local seen = {}\n\n  for _, wallpaper_dir in ipairs(dirs) do\n    local handle = io.popen(\n      \"find \" .. ShellEscape(wallpaper_dir)\n        .. \" -maxdepth 1 -type f \\\\( -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' -o -name '*.gif' -o -name '*.bmp' -o -name '*.webp' \\\\) 2>/dev/null | sort\"\n    )\n    if handle then\n      for background in handle:lines() do\n        local filename = background:match(\"([^/]+)$\")\n        if filename and not seen[filename] then\n          seen[filename] = true\n          table.insert(entries, {\n            Text = FormatName(filename),\n            Value = background,\n            Actions = {\n              activate = \"omarchy-theme-bg-set \" .. ShellEscape(background),\n            },\n            Preview = background,\n            PreviewType = \"file\",\n          })\n        end\n      end\n      handle:close()\n    end\n  end\n\n  return entries\nend\n"
  },
  {
    "path": "default/elephant/omarchy_themes.lua",
    "content": "--\n-- Dynamic Omarchy Theme Menu for Elephant/Walker\n--\nName = \"omarchythemes\"\nNamePretty = \"Omarchy Themes\"\nHideFromProviderlist = true\n\n-- Check if file exists using Lua (no subprocess)\nlocal function file_exists(path)\n  local f = io.open(path, \"r\")\n  if f then\n    f:close()\n    return true\n  end\n  return false\nend\n\n-- Get first matching file from directory using ls (single call for fallback)\nlocal function first_image_in_dir(dir)\n  local handle = io.popen(\"ls -1 '\" .. dir .. \"' 2>/dev/null | head -n 1\")\n  if handle then\n    local file = handle:read(\"*l\")\n    handle:close()\n    if file and file ~= \"\" then\n      return dir .. \"/\" .. file\n    end\n  end\n  return nil\nend\n\n-- The main function elephant will call\nfunction GetEntries()\n  local entries = {}\n  local user_theme_dir = os.getenv(\"HOME\") .. \"/.config/omarchy/themes\"\n  local omarchy_path = os.getenv(\"OMARCHY_PATH\") or \"\"\n  local default_theme_dir = omarchy_path .. \"/themes\"\n\n  local seen_themes = {}\n\n  -- Helper function to process themes from a directory\n  local function process_themes_from_dir(theme_dir)\n    -- Single find call to get all theme directories\n    local handle = io.popen(\"find -L '\" .. theme_dir .. \"' -mindepth 1 -maxdepth 1 -type d 2>/dev/null\")\n    if not handle then\n      return\n    end\n\n    for theme_path in handle:lines() do\n      local theme_name = theme_path:match(\".*/(.+)$\")\n\n      if theme_name and not seen_themes[theme_name] then\n        seen_themes[theme_name] = true\n\n        -- Check for preview images directly (no subprocess)\n        local preview_path = nil\n        local preview_png = theme_path .. \"/preview.png\"\n        local preview_jpg = theme_path .. \"/preview.jpg\"\n\n        if file_exists(preview_png) then\n          preview_path = preview_png\n        elseif file_exists(preview_jpg) then\n          preview_path = preview_jpg\n        else\n          -- Fallback: get first image from backgrounds (one ls call)\n          preview_path = first_image_in_dir(theme_path .. \"/backgrounds\")\n        end\n\n        if preview_path and preview_path ~= \"\" then\n          local display_name = theme_name:gsub(\"_\", \" \"):gsub(\"%-\", \" \")\n          display_name = display_name:gsub(\"(%a)([%w_']*)\", function(first, rest)\n            return first:upper() .. rest:lower()\n          end)\n          display_name = display_name .. \"  \"\n\n          table.insert(entries, {\n            Text = display_name,\n            Preview = preview_path,\n            PreviewType = \"file\",\n            Actions = {\n              activate = \"omarchy-theme-set \" .. theme_name,\n            },\n          })\n        end\n      end\n    end\n\n    handle:close()\n  end\n\n  -- Process user themes first (they take precedence)\n  process_themes_from_dir(user_theme_dir)\n  -- Then process default themes (only if not already seen)\n  process_themes_from_dir(default_theme_dir)\n\n  return entries\nend\n"
  },
  {
    "path": "default/ghostty/screensaver",
    "content": "window-padding-x = 0\nwindow-padding-y = 0\nwindow-padding-color = \"extend-always\"\n"
  },
  {
    "path": "default/gpg/dirmngr.conf",
    "content": "keyserver hkps://keyserver.ubuntu.com\nkeyserver hkps://pgp.surfnet.nl\nkeyserver hkps://keys.mailvelope.com\nkeyserver hkps://keyring.debian.org\nkeyserver hkps://pgp.mit.edu\n\nconnect-quick-timeout 4\n"
  },
  {
    "path": "default/hypr/apps/1password.conf",
    "content": "windowrule = no_screen_share on, match:class ^(1[p|P]assword)$\nwindowrule = tag +floating-window, match:class ^(1[p|P]assword)$\n"
  },
  {
    "path": "default/hypr/apps/bitwarden.conf",
    "content": "windowrule = no_screen_share on, match:class ^(Bitwarden)$\nwindowrule = tag +floating-window, match:class ^(Bitwarden)$\n\n# Bitwarden Chrome Extension\nwindowrule = no_screen_share on, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default\nwindowrule = tag +floating-window, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default\n"
  },
  {
    "path": "default/hypr/apps/browser.conf",
    "content": "# Browser types\nwindowrule = tag +chromium-based-browser, match:class ((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium)\nwindowrule = tag +firefox-based-browser, match:class ([fF]irefox|zen|librewolf)\nwindowrule = tag -default-opacity, match:tag chromium-based-browser\nwindowrule = tag -default-opacity, match:tag firefox-based-browser\n\n# Video apps: remove chromium browser tag so they don't get opacity applied\nwindowrule = tag -chromium-based-browser, match:class (chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default)\nwindowrule = tag -default-opacity, match:class (chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default)\n\n# Force chromium-based browsers into a tile to deal with --app bug\nwindowrule = tile on, match:tag chromium-based-browser\n\n# Only a subtle opacity change, but not for video sites\nwindowrule = opacity 1.0 0.97, match:tag chromium-based-browser\nwindowrule = opacity 1.0 0.97, match:tag firefox-based-browser\n"
  },
  {
    "path": "default/hypr/apps/davinci-resolve.conf",
    "content": "# Focus floating DaVinci Resolve dialog windows\nwindowrule = stay_focused on, match:class .*[Rr]esolve.*, match:float 1\n"
  },
  {
    "path": "default/hypr/apps/geforce.conf",
    "content": "windowrule {\n  name = geforce\n  match:class = GeForceNOW\n  idle_inhibit = fullscreen\n}\n"
  },
  {
    "path": "default/hypr/apps/hyprshot.conf",
    "content": "# Remove 1px border around hyprshot screenshots\nlayerrule = no_anim on, match:namespace selection\n"
  },
  {
    "path": "default/hypr/apps/jetbrains.conf",
    "content": "# Fix splash screen showing in weird places and prevent annoying focus takeovers\nwindowrule {\n    name = jetbrains-splash\n    match:class = ^(jetbrains-.*)$\n    match:title = ^(splash)$\n    match:float = 1\n    tag = +jetbrains-splash\n    center = on\n    no_focus = on\n    border_size = 0\n}\n\n# Center popups/find windows\nwindowrule {\n    name = jetbrains-popup\n    match:class = ^(jetbrains-.*)\n    match:title = ^(| )$\n    match:float = 1\n    tag = +jetbrains\n    center = on\n    # Enabling this makes it possible to provide input in popup dialogs (search window, new file, etc.)\n    stay_focused = on\n    border_size = 0\n    min_size = (monitor_w*0.5) (monitor_h*0.5)\n  }\n\n# Disable window flicker when autocomplete or tooltips appear\nwindowrule {\n    name = jetbrains-tooltip\n    match:class = ^(jetbrains-.*)$\n    match:title = ^(win.*)$\n    match:float = 1\n    no_initial_focus = on\n}\n\n# Disable mouse focus\nwindowrule {\n    name = jetbrains-focus\n    no_follow_mouse = on\n    match:class = ^(jetbrains-.*)$\n}\n"
  },
  {
    "path": "default/hypr/apps/localsend.conf",
    "content": "# Float LocalSend and fzf file picker\nwindowrule = float on, match:class (Share|localsend)\nwindowrule = center on, match:class (Share|localsend)\nwindowrule = size 1100 700, match:class localsend\n"
  },
  {
    "path": "default/hypr/apps/moonlight.conf",
    "content": "windowrule {\n  name = moonlight\n  match:class = com.moonlight_stream.Moonlight\n  fullscreen = 1\n  idle_inhibit = fullscreen\n}\n"
  },
  {
    "path": "default/hypr/apps/pip.conf",
    "content": "# Picture-in-picture overlays\nwindowrule = tag +pip, match:title (Picture.?in.?[Pp]icture)\nwindowrule = tag -default-opacity, match:tag pip\nwindowrule = float on, match:tag pip\nwindowrule = pin on, match:tag pip\nwindowrule = size 600 338, match:tag pip\nwindowrule = keep_aspect_ratio on, match:tag pip\nwindowrule = border_size 0, match:tag pip\nwindowrule = opacity 1 1, match:tag pip\nwindowrule = move (monitor_w-window_w-40) (monitor_h*0.04), match:tag pip\n"
  },
  {
    "path": "default/hypr/apps/qemu.conf",
    "content": "windowrule = tag -default-opacity, match:class qemu\nwindowrule = opacity 1 1, match:class qemu\n"
  },
  {
    "path": "default/hypr/apps/retroarch.conf",
    "content": "windowrule = fullscreen on, match:class com.libretro.RetroArch\nwindowrule = tag -default-opacity, match:class com.libretro.RetroArch\nwindowrule = opacity 1 1, match:class com.libretro.RetroArch\nwindowrule = idle_inhibit fullscreen, match:class com.libretro.RetroArch\n"
  },
  {
    "path": "default/hypr/apps/steam.conf",
    "content": "# Float Steam\nwindowrule = float on, match:class steam\nwindowrule = center on, match:class steam, match:title Steam\nwindowrule = tag -default-opacity, match:class steam.*\nwindowrule = opacity 1 1, match:class steam.*\nwindowrule = size 1100 700, match:class steam, match:title Steam\nwindowrule = size 460 800, match:class steam, match:title Friends List\nwindowrule = idle_inhibit fullscreen, match:class steam\n"
  },
  {
    "path": "default/hypr/apps/system.conf",
    "content": "# Floating windows\nwindowrule = float on, match:tag floating-window\nwindowrule = center on, match:tag floating-window\nwindowrule = size 875 600, match:tag floating-window\n\nwindowrule = tag +floating-window, match:class (org.omarchy.bluetui|org.omarchy.impala|org.omarchy.wiremix|org.omarchy.btop|org.omarchy.terminal|org.omarchy.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Omarchy|About|TUI.float|imv|mpv)\nwindowrule = tag +floating-window, match:class (xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), match:title ^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*)\nwindowrule = float on, match:class org.gnome.Calculator\n\n# Fullscreen screensaver\nwindowrule = fullscreen on, match:class org.omarchy.screensaver\nwindowrule = float on, match:class org.omarchy.screensaver\nwindowrule = animation slide, match:class org.omarchy.screensaver\n\n# No transparency on media windows\nwindowrule = tag -default-opacity, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$\nwindowrule = opacity 1 1, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$\n\n# Popped window rounding\nwindowrule = rounding 8, match:tag pop\n\n# Prevent idle while open\nwindowrule = idle_inhibit always, match:tag noidle\n"
  },
  {
    "path": "default/hypr/apps/telegram.conf",
    "content": "# Prevent Telegram from stealing focus on new messages\nwindowrule = focus_on_activate off, match:class org.telegram.desktop\n"
  },
  {
    "path": "default/hypr/apps/terminals.conf",
    "content": "# Define terminal tag to style them uniformly\nwindowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty)\nwindowrule = tag -default-opacity, match:tag terminal\nwindowrule = opacity 0.97 0.9, match:tag terminal\n"
  },
  {
    "path": "default/hypr/apps/walker.conf",
    "content": "# Application-specific animation\nlayerrule = no_anim on, match:namespace walker\n"
  },
  {
    "path": "default/hypr/apps/webcam-overlay.conf",
    "content": "# Webcam overlay for screen recording\nwindowrule = float on, match:title WebcamOverlay\nwindowrule = pin on, match:title WebcamOverlay\nwindowrule = no_initial_focus on, match:title WebcamOverlay\nwindowrule = no_dim on, match:title WebcamOverlay\nwindowrule = move (monitor_w-window_w-40) (monitor_h-window_h-40), match:title WebcamOverlay\n"
  },
  {
    "path": "default/hypr/apps.conf",
    "content": "# App-specific tweaks\nsource = ~/.local/share/omarchy/default/hypr/apps/1password.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/bitwarden.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/browser.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/hyprshot.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/jetbrains.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/localsend.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/pip.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/qemu.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/retroarch.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/steam.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/geforce.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/moonlight.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/system.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/telegram.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/terminals.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/walker.conf\nsource = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf\n"
  },
  {
    "path": "default/hypr/autostart.conf",
    "content": "exec-once = uwsm-app -- hypridle\nexec-once = uwsm-app -- mako\nexec-once = uwsm-app -- waybar\nexec-once = uwsm-app -- fcitx5 --disable notificationitem\nexec-once = uwsm-app -- swaybg -i ~/.config/omarchy/current/background -m fill\nexec-once = uwsm-app -- swayosd-server\nexec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1\nexec-once = omarchy-cmd-first-run\n\n# Slow app launch fix -- set systemd vars\nexec-once = systemctl --user import-environment $(env | cut -d'=' -f 1)\nexec-once = dbus-update-activation-environment --systemd --all\n"
  },
  {
    "path": "default/hypr/bindings/clipboard.conf",
    "content": "# Copy / Paste\nbindd = SUPER, C, Universal copy, sendshortcut, CTRL, Insert,\nbindd = SUPER, V, Universal paste, sendshortcut, SHIFT, Insert,\nbindd = SUPER, X, Universal cut, sendshortcut, CTRL, X,\nbindd = SUPER CTRL, V, Clipboard manager, exec, omarchy-launch-walker -m clipboard\n"
  },
  {
    "path": "default/hypr/bindings/media.conf",
    "content": "# Only display the OSD on the currently focused monitor\n$osdclient = swayosd-client --monitor \"$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')\"\n\n# Laptop multimedia keys for volume and LCD brightness (with OSD)\nbindeld = ,XF86AudioRaiseVolume, Volume up, exec, $osdclient --output-volume raise\nbindeld = ,XF86AudioLowerVolume, Volume down, exec, $osdclient --output-volume lower\nbindeld = ,XF86AudioMute, Mute, exec, $osdclient --output-volume mute-toggle\nbindeld = ,XF86AudioMicMute, Mute microphone, exec, $osdclient --input-volume mute-toggle\nbindeld = ,XF86MonBrightnessUp, Brightness up, exec, omarchy-brightness-display +5%\nbindeld = ,XF86MonBrightnessDown, Brightness down, exec, omarchy-brightness-display 5%-\nbindeld = ,XF86KbdBrightnessUp, Keyboard brightness up, exec, omarchy-brightness-keyboard up\nbindeld = ,XF86KbdBrightnessDown, Keyboard brightness down, exec, omarchy-brightness-keyboard down\nbindld = ,XF86KbdLightOnOff, Keyboard backlight cycle, exec, omarchy-brightness-keyboard cycle\n\n# Precise 1% multimedia adjustments with Alt modifier\nbindeld = ALT, XF86AudioRaiseVolume, Volume up precise, exec, $osdclient --output-volume +1\nbindeld = ALT, XF86AudioLowerVolume, Volume down precise, exec, $osdclient --output-volume -1\nbindeld = ALT, XF86MonBrightnessUp, Brightness up precise, exec, omarchy-brightness-display +1%\nbindeld = ALT, XF86MonBrightnessDown, Brightness down precise, exec, omarchy-brightness-display 1%-\n\n# Requires playerctl\nbindld = , XF86AudioNext, Next track, exec, $osdclient --playerctl next\nbindld = , XF86AudioPause, Pause, exec, $osdclient --playerctl play-pause\nbindld = , XF86AudioPlay, Play, exec, $osdclient --playerctl play-pause\nbindld = , XF86AudioPrev, Previous track, exec, $osdclient --playerctl previous\n\n# Switch audio output with Super + Mute\nbindld = SUPER, XF86AudioMute, Switch audio output, exec, omarchy-cmd-audio-switch\n"
  },
  {
    "path": "default/hypr/bindings/tiling-v2.conf",
    "content": "# Close windows\nbindd = SUPER, W, Close window, killactive,\nbindd = CTRL ALT, DELETE, Close all windows, exec, omarchy-hyprland-window-close-all\n\n# Control tiling\nbindd = SUPER, J, Toggle window split, layoutmsg, togglesplit\nbindd = SUPER, P, Pseudo window, pseudo, # dwindle\nbindd = SUPER, T, Toggle window floating/tiling, togglefloating,\nbindd = SUPER, F, Full screen, fullscreen, 0\nbindd = SUPER CTRL, F, Tiled full screen, fullscreenstate, 0 2\nbindd = SUPER ALT, F, Full width, fullscreen, 1\nbindd = SUPER, O, Pop window out (float & pin), exec, omarchy-hyprland-window-pop\nbindd = SUPER, L, Toggle workspace layout, exec, omarchy-hyprland-workspace-layout-toggle\n\n# Move focus with SUPER + arrow keys\nbindd = SUPER, LEFT, Move window focus left, movefocus, l\nbindd = SUPER, RIGHT, Move window focus right, movefocus, r\nbindd = SUPER, UP, Move window focus up, movefocus, u\nbindd = SUPER, DOWN, Move window focus down, movefocus, d\n\n# Switch workspaces with SUPER + [1-9; 0]\nbindd = SUPER, code:10, Switch to workspace 1, workspace, 1\nbindd = SUPER, code:11, Switch to workspace 2, workspace, 2\nbindd = SUPER, code:12, Switch to workspace 3, workspace, 3\nbindd = SUPER, code:13, Switch to workspace 4, workspace, 4\nbindd = SUPER, code:14, Switch to workspace 5, workspace, 5\nbindd = SUPER, code:15, Switch to workspace 6, workspace, 6\nbindd = SUPER, code:16, Switch to workspace 7, workspace, 7\nbindd = SUPER, code:17, Switch to workspace 8, workspace, 8\nbindd = SUPER, code:18, Switch to workspace 9, workspace, 9\nbindd = SUPER, code:19, Switch to workspace 10, workspace, 10\n\n# Move active window to a workspace with SUPER + SHIFT + [1-9; 0]\nbindd = SUPER SHIFT, code:10, Move window to workspace 1, movetoworkspace, 1\nbindd = SUPER SHIFT, code:11, Move window to workspace 2, movetoworkspace, 2\nbindd = SUPER SHIFT, code:12, Move window to workspace 3, movetoworkspace, 3\nbindd = SUPER SHIFT, code:13, Move window to workspace 4, movetoworkspace, 4\nbindd = SUPER SHIFT, code:14, Move window to workspace 5, movetoworkspace, 5\nbindd = SUPER SHIFT, code:15, Move window to workspace 6, movetoworkspace, 6\nbindd = SUPER SHIFT, code:16, Move window to workspace 7, movetoworkspace, 7\nbindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8\nbindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9\nbindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10\n\n# Move active window silently to a workspace with SUPER + SHIFT + ALT + [1-9; 0]\nbindd = SUPER SHIFT ALT, code:10, Move window silently to workspace 1, movetoworkspacesilent, 1\nbindd = SUPER SHIFT ALT, code:11, Move window silently to workspace 2, movetoworkspacesilent, 2\nbindd = SUPER SHIFT ALT, code:12, Move window silently to workspace 3, movetoworkspacesilent, 3\nbindd = SUPER SHIFT ALT, code:13, Move window silently to workspace 4, movetoworkspacesilent, 4\nbindd = SUPER SHIFT ALT, code:14, Move window silently to workspace 5, movetoworkspacesilent, 5\nbindd = SUPER SHIFT ALT, code:15, Move window silently to workspace 6, movetoworkspacesilent, 6\nbindd = SUPER SHIFT ALT, code:16, Move window silently to workspace 7, movetoworkspacesilent, 7\nbindd = SUPER SHIFT ALT, code:17, Move window silently to workspace 8, movetoworkspacesilent, 8\nbindd = SUPER SHIFT ALT, code:18, Move window silently to workspace 9, movetoworkspacesilent, 9\nbindd = SUPER SHIFT ALT, code:19, Move window silently to workspace 10, movetoworkspacesilent, 10\n\n# Control scratchpad\nbindd = SUPER, S, Toggle scratchpad, togglespecialworkspace, scratchpad\nbindd = SUPER ALT, S, Move window to scratchpad, movetoworkspacesilent, special:scratchpad\n\n# TAB between workspaces\nbindd = SUPER, TAB, Next workspace, workspace, e+1\nbindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1\nbindd = SUPER CTRL, TAB, Former workspace, workspace, previous\n\n# Move workspaces to other monitors\nbindd = SUPER SHIFT ALT, LEFT, Move workspace to left monitor, movecurrentworkspacetomonitor, l\nbindd = SUPER SHIFT ALT, RIGHT, Move workspace to right monitor, movecurrentworkspacetomonitor, r\nbindd = SUPER SHIFT ALT, UP, Move workspace to up monitor, movecurrentworkspacetomonitor, u\nbindd = SUPER SHIFT ALT, DOWN, Move workspace to down monitor, movecurrentworkspacetomonitor, d\n\n# Swap active window with the one next to it with SUPER + SHIFT + arrow keys\nbindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l\nbindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r\nbindd = SUPER SHIFT, UP, Swap window up, swapwindow, u\nbindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d\n\n# Cycle through applications on active workspace\nbindd = ALT, TAB, Cycle to next window, cyclenext\nbindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev\nbindd = ALT, TAB, Reveal active window on top, bringactivetotop\nbindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop\n\n# Resize active window\nbindd = SUPER, code:20, Expand window left, resizeactive, -100 0    # - key\nbindd = SUPER, code:21, Shrink window left, resizeactive, 100 0     # = key\nbindd = SUPER SHIFT, code:20, Shrink window up, resizeactive, 0 -100\nbindd = SUPER SHIFT, code:21, Expand window down, resizeactive, 0 100\n\n# Scroll through existing workspaces with SUPER + scroll\nbindd = SUPER, mouse_down, Scroll active workspace forward, workspace, e+1\nbindd = SUPER, mouse_up, Scroll active workspace backward, workspace, e-1\n\n# Move/resize windows with mainMod + LMB/RMB and dragging\nbindmd = SUPER, mouse:272, Move window, movewindow\nbindmd = SUPER, mouse:273, Resize window, resizewindow\n\n# Toggle groups\nbindd = SUPER, G, Toggle window grouping, togglegroup\nbindd = SUPER ALT, G, Move active window out of group, moveoutofgroup\n\n# Join groups\nbindd = SUPER ALT, LEFT, Move window to group on left, moveintogroup, l\nbindd = SUPER ALT, RIGHT, Move window to group on right, moveintogroup, r\nbindd = SUPER ALT, UP, Move window to group on top, moveintogroup, u\nbindd = SUPER ALT, DOWN, Move window to group on bottom, moveintogroup, d\n\n# Navigate a single set of grouped windows\nbindd = SUPER ALT, TAB, Next window in group, changegroupactive, f\nbindd = SUPER ALT SHIFT, TAB, Previous window in group, changegroupactive, b\n\n# Window navigation for grouped windows\nbindd = SUPER CTRL, LEFT, Move grouped window focus left, changegroupactive, b\nbindd = SUPER CTRL, RIGHT, Move grouped window focus right, changegroupactive, f\n\n# Scroll through a set of grouped windows with SUPER + ALT + scroll\nbindd = SUPER ALT, mouse_down, Next window in group, changegroupactive, f\nbindd = SUPER ALT, mouse_up, Previous window in group, changegroupactive, b\n\n# Activate window in a group by number\nbindd = SUPER ALT, code:10, Switch to group window 1, changegroupactive, 1\nbindd = SUPER ALT, code:11, Switch to group window 2, changegroupactive, 2\nbindd = SUPER ALT, code:12, Switch to group window 3, changegroupactive, 3\nbindd = SUPER ALT, code:13, Switch to group window 4, changegroupactive, 4\nbindd = SUPER ALT, code:14, Switch to group window 5, changegroupactive, 5\n\n# Cycle monitor scaling\nbindd = SUPER, Slash, Cycle monitor scaling, exec, omarchy-hyprland-monitor-scaling-cycle\n"
  },
  {
    "path": "default/hypr/bindings/tiling.conf",
    "content": "# This is now a deprecated file meant for those who did not wish to learn the latest Omarchy hotkeys.\n# Do not make changes here, but bring them to tiling-v2.conf instead.\n\n# Close windows\nbindd = SUPER, W, Close window, killactive,\nbindd = CTRL ALT, DELETE, Close all windows, exec, omarchy-hyprland-window-close-all\n\n# Control tiling\nbindd = SUPER, J, Toggle window split, togglesplit, # dwindle\nbindd = SUPER, P, Pseudo window, pseudo, # dwindle\nbindd = SUPER SHIFT, V, Toggle window floating/tiling, togglefloating,\nbindd = SHIFT, F11, Force full screen, fullscreen, 0\nbindd = ALT, F11, Full width, fullscreen, 1\n\n# Move focus with SUPER + arrow keys\nbindd = SUPER, LEFT, Move focus left, movefocus, l\nbindd = SUPER, RIGHT, Move focus right, movefocus, r\nbindd = SUPER, UP, Move focus up, movefocus, u\nbindd = SUPER, DOWN, Move focus down, movefocus, d\n\n# Switch workspaces with SUPER + [0-9]\nbindd = SUPER, code:10, Switch to workspace 1, workspace, 1\nbindd = SUPER, code:11, Switch to workspace 2, workspace, 2\nbindd = SUPER, code:12, Switch to workspace 3, workspace, 3\nbindd = SUPER, code:13, Switch to workspace 4, workspace, 4\nbindd = SUPER, code:14, Switch to workspace 5, workspace, 5\nbindd = SUPER, code:15, Switch to workspace 6, workspace, 6\nbindd = SUPER, code:16, Switch to workspace 7, workspace, 7\nbindd = SUPER, code:17, Switch to workspace 8, workspace, 8\nbindd = SUPER, code:18, Switch to workspace 9, workspace, 9\nbindd = SUPER, code:19, Switch to workspace 10, workspace, 10\n\n# Move active window to a workspace with SUPER + SHIFT + [0-9]\nbindd = SUPER SHIFT, code:10, Move window to workspace 1, movetoworkspace, 1\nbindd = SUPER SHIFT, code:11, Move window to workspace 2, movetoworkspace, 2\nbindd = SUPER SHIFT, code:12, Move window to workspace 3, movetoworkspace, 3\nbindd = SUPER SHIFT, code:13, Move window to workspace 4, movetoworkspace, 4\nbindd = SUPER SHIFT, code:14, Move window to workspace 5, movetoworkspace, 5\nbindd = SUPER SHIFT, code:15, Move window to workspace 6, movetoworkspace, 6\nbindd = SUPER SHIFT, code:16, Move window to workspace 7, movetoworkspace, 7\nbindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8\nbindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9\nbindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10\n\n# TAB between workspaces\nbindd = SUPER, TAB, Next workspace, workspace, e+1\nbindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1\nbindd = SUPER CTRL, TAB, Former workspace, workspace, previous\n\n# Swap active window with the one next to it with SUPER + SHIFT + arrow keys\nbindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l\nbindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r\nbindd = SUPER SHIFT, UP, Swap window up, swapwindow, u\nbindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d\n\n# Cycle through applications on active workspace\nbindd = ALT, TAB, Cycle to next window, cyclenext\nbindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev\nbindd = ALT, TAB, Reveal active window on top, bringactivetotop\nbindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop\n\n# Resize active window\nbindd = SUPER, code:20, Expand window left, resizeactive, -100 0    # - key\nbindd = SUPER, code:21, Shrink window left, resizeactive, 100 0     # = key\nbindd = SUPER SHIFT, code:20, Shrink window up, resizeactive, 0 -100\nbindd = SUPER SHIFT, code:21, Expand window down, resizeactive, 0 100\n\n# Scroll through existing workspaces with SUPER + scroll\nbindd = SUPER, MOUSE_DOWN, Scroll active workspace forward, workspace, e+1\nbindd = SUPER, MOUSE_UP, Scroll active workspace backward, workspace, e-1\n\n# Move/resize windows with mainMod + LMB/RMB and dragging\nbindmd = SUPER, mouse:272, Move window, movewindow\nbindmd = SUPER, mouse:273, Resize window, resizewindow\n"
  },
  {
    "path": "default/hypr/bindings/utilities.conf",
    "content": "# Menus\nbindd = SUPER, SPACE, Launch apps, exec, omarchy-launch-walker\nbindd = SUPER CTRL, E, Emoji picker, exec, omarchy-launch-walker -m symbols\nbindd = SUPER CTRL, C, Capture menu, exec, omarchy-menu capture\nbindd = SUPER CTRL, O, Toggle menu, exec, omarchy-menu toggle\nbindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu\nbindd = SUPER, ESCAPE, System menu, exec, omarchy-menu system\nbindld = , XF86PowerOff, Power menu, exec, omarchy-menu system\nbindd = SUPER, K, Show key bindings, exec, omarchy-menu-keybindings\nbindd = , XF86Calculator, Calculator, exec, gnome-calculator\n\n# Aesthetics\nbindd = SUPER SHIFT, SPACE, Toggle top bar, exec, omarchy-toggle-waybar\nbindd = SUPER CTRL, SPACE, Theme background menu, exec, omarchy-menu background\nbindd = SUPER SHIFT CTRL, SPACE, Theme menu, exec, omarchy-menu theme\nbindd = SUPER, BACKSPACE, Toggle window transparency, exec, hyprctl dispatch setprop \"address:$(hyprctl activewindow -j | jq -r '.address')\" opaque toggle\nbindd = SUPER SHIFT, BACKSPACE, Toggle window gaps, exec, omarchy-hyprland-window-gaps-toggle\nbindd = SUPER CTRL, BACKSPACE, Toggle single-window square aspect, exec, omarchy-hyprland-window-single-square-aspect-toggle\n\n# Notifications\nbindd = SUPER, COMMA, Dismiss last notification, exec, makoctl dismiss\nbindd = SUPER SHIFT, COMMA, Dismiss all notifications, exec, makoctl dismiss --all\nbindd = SUPER CTRL, COMMA, Toggle silencing notifications, exec, omarchy-toggle-notification-silencing\nbindd = SUPER ALT, COMMA, Invoke last notification, exec, makoctl invoke\nbindd = SUPER SHIFT ALT, COMMA, Restore last notification, exec, makoctl restore\n\n# Toggles\nbindd = SUPER CTRL, I, Toggle locking on idle, exec, omarchy-toggle-idle\nbindd = SUPER CTRL, N, Toggle nightlight, exec, omarchy-toggle-nightlight\n\n# Control Apple Display brightness\nbindd = CTRL, F1, Apple Display brightness down, exec, omarchy-brightness-display-apple -5000\nbindd = CTRL, F2, Apple Display brightness up, exec, omarchy-brightness-display-apple +5000\nbindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-brightness-display-apple +60000\n\n# Captures\nbindd = , PRINT, Screenshot, exec, omarchy-cmd-screenshot\nbindd = ALT, PRINT, Screenrecording, exec, omarchy-menu screenrecord\nbindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a\n\n# File sharing\nbindd = SUPER CTRL, S, Share, exec, omarchy-menu share\n\n# Waybar-less information\nbindd = SUPER CTRL ALT, T, Show time, exec, notify-send \"    $(date +\"%A %H:%M  —  %d %B W%V %Y\")\"\nbindd = SUPER CTRL ALT, B, Show battery remaining, exec, notify-send \"$(omarchy-battery-status)\"\n\n# Control panels\nbindd = SUPER CTRL, A, Audio controls, exec, omarchy-launch-audio\nbindd = SUPER CTRL, B, Bluetooth controls, exec, omarchy-launch-bluetooth\nbindd = SUPER CTRL, W, Wifi controls, exec, omarchy-launch-wifi\nbindd = SUPER CTRL, T, Activity, exec, omarchy-launch-tui btop\n\n# Dictation\nbindd = SUPER CTRL, X, Toggle dictation, exec, voxtype record toggle\n\n# Zoom\nbindd = SUPER CTRL, Z, Zoom in, exec, hyprctl keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float + 1')\nbindd = SUPER CTRL ALT, Z, Reset zoom, exec, hyprctl keyword cursor:zoom_factor 1\n\n# Lock system\nbindd = SUPER CTRL, L, Lock system, exec, omarchy-lock-screen\n"
  },
  {
    "path": "default/hypr/bindings.conf",
    "content": "# Deprecated bindings file. New installations include everything directly.\n\nbindd = SUPER, RETURN, Terminal, exec, $terminal\nbindd = SUPER, F, File manager, exec, $fileManager\nbindd = SUPER, B, Web browser, exec, $browser\nbindd = SUPER, M, Music player, exec, $music\nbindd = SUPER, N, Neovim, exec, $terminal -e nvim\nbindd = SUPER, T, Top, exec, $terminal -e btop\nbindd = SUPER, D, Lazy Docker, exec, $terminal -e lazydocker\nbindd = SUPER, G, Messenger, exec, $messenger\nbindd = SUPER, O, Obsidian, exec, obsidian -disable-gpu\nbindd = SUPER, SLASH, Password manager, exec, $passwordManager\n\nsource = ~/.local/share/omarchy/default/hypr/bindings/media.conf\nsource = ~/.local/share/omarchy/default/hypr/bindings/tiling.conf\nsource = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf\n"
  },
  {
    "path": "default/hypr/envs.conf",
    "content": "# Cursor size\nenv = XCURSOR_SIZE,24\nenv = HYPRCURSOR_SIZE,24\n\n# Force all apps to use Wayland\nenv = GDK_BACKEND,wayland,x11,*\nenv = QT_QPA_PLATFORM,wayland;xcb\nenv = QT_STYLE_OVERRIDE,kvantum\nenv = SDL_VIDEODRIVER,wayland,x11\nenv = MOZ_ENABLE_WAYLAND,1\nenv = ELECTRON_OZONE_PLATFORM_HINT,wayland\nenv = OZONE_PLATFORM,wayland\nenv = XDG_SESSION_TYPE,wayland\n\n# Allow better support for screen sharing (Google Meet, Discord, etc)\nenv = XDG_CURRENT_DESKTOP,Hyprland\nenv = XDG_SESSION_DESKTOP,Hyprland\n\nxwayland {\n  force_zero_scaling = true\n}\n\n# Use XCompose file\nenv = XCOMPOSEFILE,~/.XCompose\n\n# Don't show update on first launch\necosystem {\n  no_update_news = true\n}\n"
  },
  {
    "path": "default/hypr/input.conf",
    "content": "# https://wiki.hyprland.org/Configuring/Variables/#input\ninput {\n    kb_layout = us\n    kb_variant =\n    kb_model =\n    kb_options = compose:caps\n    kb_rules =\n\n    follow_mouse = 1\n\n    sensitivity = 0 # -1.0 - 1.0, 0 means no modification.\n\n    touchpad {\n        natural_scroll = false\n    }\n}\n\nmisc {\n    key_press_enables_dpms = true  # key press will trigger wake\n    mouse_move_enables_dpms = true # mouse move will trigger wake\n}\n"
  },
  {
    "path": "default/hypr/looknfeel.conf",
    "content": "# Refer to https://wiki.hyprland.org/Configuring/Variables/\n\n# Variables\n$activeBorderColor = rgba(33ccffee) rgba(00ff99ee) 45deg\n$inactiveBorderColor = rgba(595959aa)\n\n# https://wiki.hyprland.org/Configuring/Variables/#general\ngeneral {\n    gaps_in = 5\n    gaps_out = 10\n\n    border_size = 2\n\n    # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors\n    col.active_border = $activeBorderColor\n    col.inactive_border = $inactiveBorderColor\n\n    # Set to true enable resizing windows by clicking and dragging on borders and gaps\n    resize_on_border = false\n\n    # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on\n    allow_tearing = false\n\n    layout = dwindle\n}\n\n# https://wiki.hyprland.org/Configuring/Variables/#decoration\ndecoration {\n    rounding = 0\n\n    shadow {\n        enabled = true\n        range = 2\n        render_power = 3\n        color = rgba(1a1a1aee)\n    }\n\n    # https://wiki.hyprland.org/Configuring/Variables/#blur\n    blur {\n        enabled = true\n        size = 2\n        passes = 2\n        special = true\n        brightness = 0.60\n        contrast = 0.75\n    }\n}\n\n# https://wiki.hypr.land/Configuring/Variables/#group\ngroup {\n    col.border_active = $activeBorderColor\n    col.border_inactive = $inactiveBorderColor\n    col.border_locked_active = -1\n    col.border_locked_inactive = -1\n\n    groupbar {\n        font_size = 12\n        font_family = monospace\n        font_weight_active = ultraheavy\n        font_weight_inactive = normal\n\n        indicator_height = 0\n        indicator_gap = 5\n        height = 22\n        gaps_in = 5\n        gaps_out = 0\n\n        text_color = rgb(ffffff)\n        text_color_inactive = rgba(ffffff90)\n        col.active = rgba(00000040)\n        col.inactive = rgba(00000020)\n\n        gradients = true\n        gradient_rounding = 0\n        gradient_round_only_edges = false\n    }\n}\n\n\n# https://wiki.hyprland.org/Configuring/Variables/#animations\nanimations {\n    enabled = yes, please :)\n\n    # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more\n\n    bezier = easeOutQuint,0.23,1,0.32,1\n    bezier = easeInOutCubic,0.65,0.05,0.36,1\n    bezier = linear,0,0,1,1\n    bezier = almostLinear,0.5,0.5,0.75,1.0\n    bezier = quick,0.15,0,0.1,1\n\n    animation = global, 1, 10, default\n    animation = border, 1, 5.39, easeOutQuint\n    animation = windows, 1, 4.79, easeOutQuint\n    animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%\n    animation = windowsOut, 1, 1.49, linear, popin 87%\n    animation = fadeIn, 1, 1.73, almostLinear\n    animation = fadeOut, 1, 1.46, almostLinear\n    animation = fade, 1, 3.03, quick\n    animation = layers, 1, 3.81, easeOutQuint\n    animation = layersIn, 1, 4, easeOutQuint, fade\n    animation = layersOut, 1, 1.5, linear, fade\n    animation = fadeLayersIn, 1, 1.79, almostLinear\n    animation = fadeLayersOut, 1, 1.39, almostLinear\n    animation = workspaces, 0, 0, ease\n    animation = specialWorkspace, 1, 4, easeOutQuint, slidevert\n}\n\n# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more\ndwindle {\n    pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below\n    preserve_split = true # You probably want this\n    force_split = 2 # Always split on the right\n}\n\n# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more\nmaster {\n    new_status = master\n}\n\n# https://wiki.hyprland.org/Configuring/Variables/#misc\nmisc {\n    disable_hyprland_logo = true\n    disable_splash_rendering  = true\n    focus_on_activate = true\n    anr_missed_pings = 3\n    on_focus_under_fullscreen = 1\n}\n\n# https://wiki.hypr.land/Configuring/Variables/#cursor\ncursor {\n    hide_on_key_press = true\n    warp_on_change_workspace = 1\n}\n\n# Auto toggle scratchpad on switching workspace from scratchpad\nbinds {\n    hide_special_on_workspace_change = true\n}\n\n# Style Gum confirm to match terminal theme\nenv = GUM_CONFIRM_PROMPT_FOREGROUND,6       # Cyan\nenv = GUM_CONFIRM_SELECTED_FOREGROUND,0     # Black\nenv = GUM_CONFIRM_SELECTED_BACKGROUND,2     # Green\nenv = GUM_CONFIRM_UNSELECTED_FOREGROUND,7   # White\nenv = GUM_CONFIRM_UNSELECTED_BACKGROUND,8   # Dark grey\n"
  },
  {
    "path": "default/hypr/plain-bindings.conf",
    "content": "# Application bindings\nbindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir=\"$(omarchy-cmd-terminal-cwd)\"\nbindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser\nbindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window\nbindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window \"$(omarchy-cmd-terminal-cwd)\"\nbindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser\nbindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private\nbindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor\n\n# Add extra bindings\n# bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp \"https://chatgpt.com\"\n# bindd = SUPER SHIFT, R, exec, alacritty -e ssh your-server\n\n# Overwrite existing bindings, like putting Omarchy Menu on Super + Space\n# unbind = SUPER, SPACE\n# bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu\n"
  },
  {
    "path": "default/hypr/windows.conf",
    "content": "# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more\n# Hyprland 0.53+ syntax\nwindowrule = suppress_event maximize, match:class .*\n\n# Tag all windows for default opacity (apps can override with -default-opacity tag)\nwindowrule = tag +default-opacity, match:class .*\n\n# Fix some dragging issues with XWayland\nwindowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0\n\n# App-specific tweaks (may remove default-opacity tag)\nsource = ~/.local/share/omarchy/default/hypr/apps.conf\n\n# Apply default opacity after apps have had a chance to opt out\nwindowrule = opacity 0.97 0.9, match:tag default-opacity\n"
  },
  {
    "path": "default/limine/default.conf",
    "content": "TARGET_OS_NAME=\"Omarchy\"\n\nESP_PATH=\"/boot\"\n\nKERNEL_CMDLINE[default]=\"@@CMDLINE@@\"\nKERNEL_CMDLINE[default]+=\" quiet splash\"\n\nENABLE_UKI=yes\nCUSTOM_UKI_NAME=\"omarchy\"\n\nENABLE_LIMINE_FALLBACK=yes\n\n# Find and add other bootloaders\nFIND_BOOTLOADERS=yes\n\nBOOT_ORDER=\"*, *fallback, Snapshots\"\n\nMAX_SNAPSHOT_ENTRIES=5\n\nSNAPSHOT_FORMAT_CHOICE=5\n"
  },
  {
    "path": "default/limine/limine.conf",
    "content": "### Read more at config document: https://github.com/limine-bootloader/limine/blob/trunk/CONFIG.md\n#timeout: 3\ndefault_entry: 2\ninterface_branding: Omarchy Bootloader\ninterface_branding_color: 2\nhash_mismatch_panic: no\n\nterm_background: 1a1b26\nbackdrop: 1a1b26\n\n# Terminal colors (Tokyo Night palette)\nterm_palette: 15161e;f7768e;9ece6a;e0af68;7aa2f7;bb9af7;7dcfff;a9b1d6\nterm_palette_bright: 414868;f7768e;9ece6a;e0af68;7aa2f7;bb9af7;7dcfff;c0caf5\n\n# Text colors\nterm_foreground: c0caf5\nterm_foreground_bright: c0caf5\nterm_background_bright: 24283b\n"
  },
  {
    "path": "default/makima/AT Translated Set 2 keyboard.toml",
    "content": "# Run omarchy-restart-makima after any changes\n\n[remap]\nKEY_LEFTMETA-KEY_LEFTSHIFT-KEY_F23 = [\"KEY_LEFTMETA\", \"KEY_LEFTALT\", \"KEY_SPACE\"]\n\n[settings]\nGRAB_DEVICE = \"true\"\n"
  },
  {
    "path": "default/mako/core.ini",
    "content": "anchor=top-right\ndefault-timeout=5000\nwidth=420\nouter-margin=20\npadding=10,15\nborder-size=2\nmax-icon-size=32\nfont=sans-serif 14px\n\n[app-name=Spotify]\ninvisible=1\n\n[mode=do-not-disturb]\ninvisible=true\n\n[mode=do-not-disturb app-name=notify-send]\ninvisible=false\n\n[urgency=critical]\ndefault-timeout=0\nlayer=overlay\n\n[summary~=\"Setup Wi-Fi\"]\non-button-left=exec sh -c 'omarchy-notification-dismiss \"Setup Wi-Fi\"; omarchy-launch-wifi'\n\n[summary~=\"Update System\"]\non-button-left=exec sh -c 'omarchy-notification-dismiss \"Update System\"; omarchy-launch-floating-terminal-with-presentation omarchy-update'\n\n[summary~=\"Learn Keybindings\"]\non-button-left=exec sh -c 'omarchy-notification-dismiss \"Learn Keybindings\"; omarchy-menu-keybindings'\n\n[summary~=\"Screenshot copied & saved\"]\nmax-icon-size=80\nformat=<b>%s</b>\\n%b\n"
  },
  {
    "path": "default/omarchy-skill/SKILL.md",
    "content": "---\nname: omarchy\ndescription: >\n  REQUIRED for end-user customization of Linux desktop, window manager, or system config.\n  Use when editing ~/.config/hypr/, ~/.config/waybar/, ~/.config/walker/,\n  ~/.config/alacritty/, ~/.config/kitty/, ~/.config/ghostty/, ~/.config/mako/,\n  or ~/.config/omarchy/. Triggers: Hyprland, window rules, animations, keybindings,\n  monitors, gaps, borders, blur, opacity, waybar, walker, terminal config, themes,\n  wallpaper, night light, idle, lock screen, screenshots, layer rules, workspace\n  settings, display config, and user-facing omarchy commands. Excludes Omarchy\n  source development in ~/.local/share/omarchy/ and omarchy-dev-* workflows.\n---\n\n# Omarchy Skill\n\nManage [Omarchy](https://omarchy.org/) Linux systems - a beautiful, modern, opinionated Arch Linux distribution with Hyprland.\n\nThis skill is for end-user customization on installed systems.\nIt is not for contributing to Omarchy source code.\n\n## When This Skill MUST Be Used\n\n**ALWAYS invoke this skill for end-user requests involving ANY of these:**\n\n- Editing ANY file in `~/.config/hypr/` (window rules, animations, keybindings, monitors, etc.)\n- Editing ANY file in `~/.config/waybar/`, `~/.config/walker/`, `~/.config/mako/`\n- Editing terminal configs (alacritty, kitty, ghostty)\n- Editing ANY file in `~/.config/omarchy/`\n- Window behavior, animations, opacity, blur, gaps, borders\n- Layer rules, workspace settings, display/monitor configuration\n- Themes, wallpapers, fonts, appearance changes\n- User-facing `omarchy-*` commands (`omarchy-theme-*`, `omarchy-refresh-*`, `omarchy-restart-*`, etc.)\n- Screenshots, screen recording, night light, idle behavior, lock screen\n\n**If you're about to edit a config file in ~/.config/ on this system, STOP and use this skill first.**\n\n**Do NOT use this skill for Omarchy development tasks** (editing files in `~/.local/share/omarchy/`, creating migrations, or running `omarchy-dev-*` workflows).\n\n## Critical Safety Rules\n\n**For end-user customization tasks, NEVER modify anything in `~/.local/share/omarchy/`** - but READING is safe and encouraged.\n\nThis directory contains Omarchy's source files managed by git. Any changes will be:\n- Lost on next `omarchy-update`\n- Cause conflicts with upstream\n- Break the system's update mechanism\n\n```\n~/.local/share/omarchy/     # READ-ONLY - NEVER EDIT (reading is OK)\n├── bin/                    # Source scripts (symlinked to PATH)\n├── config/                 # Default config templates\n├── themes/                 # Stock themes\n├── default/                # System defaults\n├── migrations/             # Update migrations\n└── install/                # Installation scripts\n```\n\n**Reading `~/.local/share/omarchy/` is SAFE and useful** - do it freely to:\n- Understand how omarchy commands work: `cat $(which omarchy-theme-set)`\n- See default configs before customizing: `cat ~/.local/share/omarchy/config/waybar/config.jsonc`\n- Check stock theme files to copy for customization\n- Reference default hyprland settings: `cat ~/.local/share/omarchy/default/hypr/*`\n\n**Always use these safe locations instead:**\n- `~/.config/` - User configuration (safe to edit)\n- `~/.config/omarchy/themes/<custom-name>/` - Custom themes (must be real directories)\n- `~/.config/omarchy/hooks/` - Custom automation hooks\n\nIf the request is to develop Omarchy itself, this skill is out of scope. Follow repository development instructions instead of this skill.\n\n## System Architecture\n\nOmarchy is built on:\n\n| Component | Purpose | Config Location |\n|-----------|---------|-----------------|\n| **Arch Linux** | Base OS | `/etc/`, `~/.config/` |\n| **Hyprland** | Wayland compositor/WM | `~/.config/hypr/` |\n| **Waybar** | Status bar | `~/.config/waybar/` |\n| **Walker** | App launcher | `~/.config/walker/` |\n| **Alacritty/Kitty/Ghostty** | Terminals | `~/.config/<terminal>/` |\n| **Mako** | Notifications | `~/.config/mako/` |\n| **SwayOSD** | On-screen display | `~/.config/swayosd/` |\n\n## Command Discovery\n\nOmarchy provides ~145 commands following `omarchy-<category>-<action>` pattern.\n\n```bash\n# List all omarchy commands\ncompgen -c | grep -E '^omarchy-' | sort -u\n\n# Find commands by category\ncompgen -c | grep -E '^omarchy-theme'\ncompgen -c | grep -E '^omarchy-restart'\n\n# Read a command's source to understand it\ncat $(which omarchy-theme-set)\n```\n\n### Command Categories\n\n| Prefix | Purpose | Example |\n|--------|---------|---------|\n| `omarchy-refresh-*` | Reset config to defaults (backs up first) | `omarchy-refresh-waybar` |\n| `omarchy-restart-*` | Restart a service/app | `omarchy-restart-waybar` |\n| `omarchy-toggle-*` | Toggle feature on/off | `omarchy-toggle-nightlight` |\n| `omarchy-theme-*` | Theme management | `omarchy-theme-set <name>` |\n| `omarchy-install-*` | Install optional software | `omarchy-install-docker-dbs` |\n| `omarchy-launch-*` | Launch apps | `omarchy-launch-browser` |\n| `omarchy-cmd-*` | System commands | `omarchy-cmd-screenshot` |\n| `omarchy-pkg-*` | Package management | `omarchy-pkg-install <pkg>` |\n| `omarchy-setup-*` | Initial setup tasks | `omarchy-setup-fingerprint` |\n| `omarchy-update-*` | System updates | `omarchy-update` |\n\n## Configuration Locations\n\n### Hyprland (Window Manager)\n\n```\n~/.config/hypr/\n├── hyprland.conf      # Main config (sources others)\n├── bindings.conf      # Keybindings\n├── monitors.conf      # Display configuration\n├── input.conf         # Keyboard/mouse settings\n├── looknfeel.conf     # Appearance (gaps, borders, animations)\n├── envs.conf          # Environment variables\n├── autostart.conf     # Startup applications\n├── hypridle.conf      # Idle behavior (screen off, lock, suspend)\n├── hyprlock.conf      # Lock screen appearance\n└── hyprsunset.conf    # Night light / blue light filter\n```\n\n**Key behaviors:**\n- Hyprland auto-reloads on config save (no restart needed for most changes)\n- Use `hyprctl reload` to force reload\n- Use `omarchy-refresh-hyprland` to reset to defaults\n\n### Waybar (Status Bar)\n\n```\n~/.config/waybar/\n├── config.jsonc       # Bar layout and modules (JSONC format)\n└── style.css          # Styling\n```\n\n**Waybar does NOT auto-reload.** You MUST run `omarchy-restart-waybar` after any config changes.\n\n**Commands:** `omarchy-restart-waybar`, `omarchy-refresh-waybar`, `omarchy-toggle-waybar`\n\n### Terminals\n\n```\n~/.config/alacritty/alacritty.toml\n~/.config/kitty/kitty.conf\n~/.config/ghostty/config\n```\n\n**Command:** `omarchy-restart-terminal`\n\n### Other Configs\n\n| App | Location |\n|-----|----------|\n| btop | `~/.config/btop/btop.conf` |\n| fastfetch | `~/.config/fastfetch/config.jsonc` |\n| lazygit | `~/.config/lazygit/config.yml` |\n| starship | `~/.config/starship.toml` |\n| git | `~/.config/git/config` |\n| walker | `~/.config/walker/config.toml` |\n\n## Safe Customization Patterns\n\n### Pattern 1: Edit User Config Directly\n\nFor simple changes, edit files in `~/.config/`:\n\n```bash\n# 1. Read current config\ncat ~/.config/hypr/bindings.conf\n\n# 2. Backup before changes\ncp ~/.config/hypr/bindings.conf ~/.config/hypr/bindings.conf.bak.$(date +%s)\n\n# 3. Make changes with Edit tool\n\n# 4. Apply changes\n# - Hyprland: auto-reloads on save (no restart needed)\n# - Waybar: MUST restart with omarchy-restart-waybar\n# - Walker: MUST restart with omarchy-restart-walker\n# - Terminals: MUST restart with omarchy-restart-terminal\n```\n\n### Pattern 2: Make a new theme\n\n1. Create a directory under ~/.config/omarchy/themes.\n2. See how an existing theme is done via ~/.local/share/omarchy/themes/catppuccin.\n3. Download a matching background (or several) from the internet and put them in ~/.config/omarchy/themes/[name-of-new-theme]\n4. When done with the theme, run omarchy-theme-set \"Name of new theme\"\n\n### Pattern 3: Use Hooks for Automation\n\nCreate scripts in `~/.config/omarchy/hooks/` to run automatically on events:\n\n```bash\n# Available hooks (see samples in ~/.config/omarchy/hooks/):\n~/.config/omarchy/hooks/\n├── theme-set        # Runs after theme change (receives theme name as $1)\n├── font-set         # Runs after font change\n└── post-update      # Runs after omarchy-update\n```\n\nExample hook (`~/.config/omarchy/hooks/theme-set`):\n```bash\n#!/bin/bash\nTHEME_NAME=$1\necho \"Theme changed to: $THEME_NAME\"\n# Add custom actions here\n```\n\n### Pattern 4: Reset to Defaults -- ALWAYS SEEK USER CONFIRMATION BEFORE RUNNING\n\nWhen customizations go wrong:\n\n```bash\n# Reset specific config (creates backup automatically)\nomarchy-refresh-waybar\nomarchy-refresh-hyprland\n\n# The refresh command:\n# 1. Backs up current config with timestamp\n# 2. Copies default from ~/.local/share/omarchy/config/\n# 3. Restarts the component\n```\n\n## Common Tasks\n\n### Themes\n\n```bash\nomarchy-theme-list              # Show available themes\nomarchy-theme-current           # Show current theme\nomarchy-theme-set <name>        # Apply theme (use \"Tokyo Night\" not \"tokyo-night\")\nomarchy-theme-next              # Cycle to next theme\nomarchy-theme-bg-next           # Cycle wallpaper\nomarchy-theme-install <url>     # Install from git repo\n```\n\n### Keybindings\n\nEdit `~/.config/hypr/bindings.conf`. Format:\n```\nbind = SUPER, Return, exec, xdg-terminal-exec\nbind = SUPER, Q, killactive\nbind = SUPER SHIFT, E, exit\n```\n\nView current bindings: `omarchy-menu-keybindings --print`\n\n**IMPORTANT: When re-binding an existing key:**\n\n1. First check existing bindings: `omarchy-menu-keybindings --print`\n2. If the key is already bound, you MUST add an `unbind` directive BEFORE your new `bind`\n3. Inform the user what the key was previously bound to\n\nExample - rebinding SUPER+F (which is bound to fullscreen by default):\n```\n# Unbind existing SUPER+F (was: fullscreen)\nunbind = SUPER, F\n# New binding for file manager\nbind = SUPER, F, exec, nautilus\n```\n\nAlways tell the user: \"Note: SUPER+F was previously bound to fullscreen. I've added an unbind directive to override it.\"\n\n### Display/Monitors\n\nEdit `~/.config/hypr/monitors.conf`. Format:\n```\nmonitor = eDP-1, 1920x1080@60, 0x0, 1\nmonitor = HDMI-A-1, 2560x1440@144, 1920x0, 1\n```\n\nList monitors: `hyprctl monitors`\n\n### Window Rules\n\n**CRITICAL: Hyprland window rules syntax changes frequently between versions.**\n\nBefore writing ANY window rules, you MUST fetch the current documentation from the official Hyprland wiki:\n- https://github.com/hyprwm/hyprland-wiki/blob/main/content/Configuring/Window-Rules.md\n\nDO NOT rely on cached or memorized window rule syntax. The format has changed multiple times and using outdated syntax will cause errors or unexpected behavior.\n\nWindow rules go in `~/.config/hypr/hyprland.conf` or a sourced file. Always verify the current syntax from the wiki first.\n\n### Fonts\n\n```bash\nomarchy-font-list               # Available fonts\nomarchy-font-current            # Current font\nomarchy-font-set <name>         # Change font\n```\n\n### System\n\n```bash\nomarchy-update                  # Full system update\nomarchy-version                 # Show Omarchy version\nomarchy-debug --no-sudo --print # Debug info (ALWAYS use these flags)\nomarchy-lock-screen             # Lock screen\nomarchy-system-shutdown         # Shutdown\nomarchy-system-reboot           # Reboot\n```\n\n**IMPORTANT:** Always run `omarchy-debug` with `--no-sudo --print` flags to avoid interactive sudo prompts that will hang the terminal.\n\n## Troubleshooting\n\n```bash\n# Get debug information (ALWAYS use these flags to avoid interactive prompts)\nomarchy-debug --no-sudo --print\n\n# Upload logs for support\nomarchy-upload-log\n\n# Reset specific config to defaults\nomarchy-refresh-<app>\n\n# Refresh specific config file\n# config-file path is relative to ~/.config/\n# eg. omarchy-refresh-config hypr/hyprlock.conf will refresh ~/.config/hypr/hyprlock.conf\nomarchy-refresh-config <config-file>\n\n# Full reinstall of configs (nuclear option)\nomarchy-reinstall\n```\n\n## Decision Framework\n\nWhen user requests system changes:\n\n1. **Is it a stock omarchy command?** Use it directly\n2. **Is it a config edit?** Edit in `~/.config/`, never `~/.local/share/omarchy/`\n3. **Is it a theme customization?** Create a NEW custom theme directory\n4. **Is it automation?** Use hooks in `~/.config/omarchy/hooks/`\n5. **Is it a package install?** Use `omarchy-pkg-add` (or `omarchy-pkg-aur-add` for AUR-only packages)\n6. **Unsure if command exists?** Search with `compgen -c | grep omarchy`\n\n## Out of Scope\n\nThis skill intentionally does not cover Omarchy source development. Do not use this skill for:\n- Editing files in `~/.local/share/omarchy/` (`bin/`, `config/`, `default/`, `themes/`, `migrations/`, etc.)\n- Creating or editing migrations\n- Running `omarchy-dev-*` commands\n\n## Example Requests\n\n- \"Change my theme to catppuccin\" -> `omarchy-theme-set catppuccin`\n- \"Add a keybinding for Super+E to open file manager\" -> Check existing bindings first, add `unbind` if needed, then add `bind` in `~/.config/hypr/bindings.conf`\n- \"Configure my external monitor\" -> Edit `~/.config/hypr/monitors.conf`\n- \"Make the window gaps smaller\" -> Edit `~/.config/hypr/looknfeel.conf`\n- \"Set up night light to turn on at sunset\" -> `omarchy-toggle-nightlight` or edit `~/.config/hypr/hyprsunset.conf`\n- \"Customize the catppuccin theme colors\" -> Create `~/.config/omarchy/themes/catppuccin-custom/` by copying from stock, then edit\n- \"Run a script every time I change themes\" -> Create `~/.config/omarchy/hooks/theme-set`\n- \"Reset waybar to defaults\" -> `omarchy-refresh-waybar`\n"
  },
  {
    "path": "default/pacman/mirrorlist-edge",
    "content": "Server = https://mirror.omarchy.org/$repo/os/$arch\n"
  },
  {
    "path": "default/pacman/mirrorlist-rc",
    "content": "Server = https://rc-mirror.omarchy.org/$repo/os/$arch\n"
  },
  {
    "path": "default/pacman/mirrorlist-stable",
    "content": "Server = https://stable-mirror.omarchy.org/$repo/os/$arch\n"
  },
  {
    "path": "default/pacman/pacman-edge.conf",
    "content": "# See the pacman.conf(5) manpage for option and repository directives\n\n[options]\nColor\nILoveCandy\nVerbosePkgLists\nHoldPkg = pacman glibc\nArchitecture = auto\nCheckSpace\nParallelDownloads = 5\nDownloadUser = alpm\n\n# By default, pacman accepts packages signed by keys that its local keyring\n# trusts (see pacman-key and its man page), as well as unsigned packages.\nSigLevel = Required DatabaseOptional\nLocalFileSigLevel = Optional\n\n# pacman searches repositories in the order defined here\n[core]\nInclude = /etc/pacman.d/mirrorlist\n\n[extra]\nInclude = /etc/pacman.d/mirrorlist\n\n[multilib]\nInclude = /etc/pacman.d/mirrorlist\n\n[omarchy]\nSigLevel = Optional TrustAll\nServer = https://pkgs.omarchy.org/edge/$arch\n"
  },
  {
    "path": "default/pacman/pacman-rc.conf",
    "content": "# See the pacman.conf(5) manpage for option and repository directives\n\n[options]\nColor\nILoveCandy\nVerbosePkgLists\nHoldPkg = pacman glibc\nArchitecture = auto\nCheckSpace\nParallelDownloads = 5\nDownloadUser = alpm\n\n# By default, pacman accepts packages signed by keys that its local keyring\n# trusts (see pacman-key and its man page), as well as unsigned packages.\nSigLevel = Required DatabaseOptional\nLocalFileSigLevel = Optional\n\n# pacman searches repositories in the order defined here\n[core]\nInclude = /etc/pacman.d/mirrorlist\n\n[extra]\nInclude = /etc/pacman.d/mirrorlist\n\n[multilib]\nInclude = /etc/pacman.d/mirrorlist\n\n[omarchy]\nSigLevel = Optional TrustAll\nServer = https://pkgs.omarchy.org/edge/$arch\n"
  },
  {
    "path": "default/pacman/pacman-stable.conf",
    "content": "# See the pacman.conf(5) manpage for option and repository directives\n\n[options]\nColor\nILoveCandy\nVerbosePkgLists\nHoldPkg = pacman glibc\nArchitecture = auto\nCheckSpace\nParallelDownloads = 5\nDownloadUser = alpm\n\n# By default, pacman accepts packages signed by keys that its local keyring\n# trusts (see pacman-key and its man page), as well as unsigned packages.\nSigLevel = Required DatabaseOptional\nLocalFileSigLevel = Optional\n\n# pacman searches repositories in the order defined here\n[core]\nInclude = /etc/pacman.d/mirrorlist\n\n[extra]\nInclude = /etc/pacman.d/mirrorlist\n\n[multilib]\nInclude = /etc/pacman.d/mirrorlist\n\n[omarchy]\nSigLevel = Optional TrustAll\nServer = https://pkgs.omarchy.org/stable/$arch\n"
  },
  {
    "path": "default/plymouth/omarchy.plymouth",
    "content": "[Plymouth Theme]\nName=Omarchy\nDescription=Omarchy splash screen.\nModuleName=script\n\n[script]\nImageDir=/usr/share/plymouth/themes/omarchy\nScriptFile=/usr/share/plymouth/themes/omarchy/omarchy.script\nConsoleLogBackgroundColor=0x1a1b26\nMonospaceFont=Cantarell 11\nFont=Cantarell 11\n"
  },
  {
    "path": "default/plymouth/omarchy.script",
    "content": "# Omarchy Plymouth Theme Script\n\nWindow.SetBackgroundTopColor(0.101, 0.105, 0.149);\nWindow.SetBackgroundBottomColor(0.101, 0.105,  0.149);\n\nlogo.image = Image(\"logo.png\");\nlogo.sprite = Sprite(logo.image);\nlogo.sprite.SetX (Window.GetWidth()  / 2 - logo.image.GetWidth()  / 2);\nlogo.sprite.SetY (Window.GetHeight() / 2 - logo.image.GetHeight() / 2);\nlogo.sprite.SetOpacity (1);\n\n# Use these to adjust the progress bar timing\nglobal.fake_progress_limit = 0.7;  # Target percentage for fake progress (0.0 to 1.0)\nglobal.fake_progress_duration = 15.0;  # Duration in seconds to reach limit\n\n# Progress bar animation variables\nglobal.fake_progress = 0.0;\nglobal.real_progress = 0.0;\nglobal.fake_progress_active = 0; # 0 / 1 boolean\nglobal.animation_frame = 0;\nglobal.fake_progress_start_time = 0;  # Track when fake progress started\nglobal.password_shown = 0;  # Track if password dialog has been shown\nglobal.max_progress = 0.0;  # Track the maximum progress reached to prevent backwards movement\n\nfun refresh_callback ()\n  {\n    global.animation_frame++;\n    \n    # Animate fake progress to limit over time with easing\n    if (global.fake_progress_active == 1)\n      {\n        # Calculate elapsed time since start\n        elapsed_time = global.animation_frame / 50.0;  # Convert frames to seconds (50 FPS)\n        \n        # Calculate linear progress ratio (0 to 1) based on time\n        time_ratio = elapsed_time / global.fake_progress_duration;\n        if (time_ratio > 1.0)\n          time_ratio = 1.0;\n        \n        # Apply easing curve: ease-out quadratic\n        # Formula: 1 - (1 - x)^2\n        eased_ratio = 1 - ((1 - time_ratio) * (1 - time_ratio));\n        \n        # Calculate fake progress based on eased ratio\n        global.fake_progress = eased_ratio * global.fake_progress_limit;\n        \n        # Update progress bar with fake progress\n        update_progress_bar(global.fake_progress);\n      }\n  }\n\n\nPlymouth.SetRefreshFunction (refresh_callback);\n\n#----------------------------------------- Helper Functions --------------------------------\n\nfun update_progress_bar(progress)\n  {\n    # Only update if progress is moving forward\n    if (progress > global.max_progress)\n      {\n        global.max_progress = progress;\n        width = Math.Int(progress_bar.original_image.GetWidth() * progress);\n        if (width < 1) width = 1;  # Ensure minimum width of 1 pixel\n        \n        progress_bar.image = progress_bar.original_image.Scale(width, progress_bar.original_image.GetHeight());\n        progress_bar.sprite.SetImage(progress_bar.image);\n      }\n  }\n\nfun show_progress_bar()\n  {\n    progress_box.sprite.SetOpacity(1);\n    progress_bar.sprite.SetOpacity(1);\n  }\n\nfun hide_progress_bar()\n  {\n    progress_box.sprite.SetOpacity(0);\n    progress_bar.sprite.SetOpacity(0);\n  }\n\nfun show_password_dialog()\n  {\n    lock.sprite.SetOpacity(1);\n    entry.sprite.SetOpacity(1);\n  }\n\nfun hide_password_dialog()\n  {\n    lock.sprite.SetOpacity(0);\n    entry.sprite.SetOpacity(0);\n    for (index = 0; bullet.sprites[index]; index++)\n      bullet.sprites[index].SetOpacity(0);\n  }\n\nfun start_fake_progress()\n  {\n    # Don't reset if we already have progress\n    if (global.max_progress == 0.0)\n      {\n        global.fake_progress = 0.0;\n        global.real_progress = 0.0;\n        update_progress_bar(0.0);\n      }\n    global.fake_progress_active = 1;\n    global.animation_frame = 0;\n  }\n\nfun stop_fake_progress()\n  {\n    global.fake_progress_active = 0;\n  }\n\n#----------------------------------------- Dialogue --------------------------------\n\nlock.image = Image(\"lock.png\");\nentry.image = Image(\"entry.png\");\nbullet.image = Image(\"bullet.png\");\n\nentry.sprite = Sprite(entry.image);\nentry.x = Window.GetWidth()/2 - entry.image.GetWidth() / 2;\nentry.y = logo.sprite.GetY() + logo.image.GetHeight() + 40;\nentry.sprite.SetPosition(entry.x, entry.y, 10001);\nentry.sprite.SetOpacity(0);\n\n# Scale lock to be slightly shorter than entry field height\n# Original lock is 84x96, entry height determines scale\nlock_height = entry.image.GetHeight() * 0.8;\nlock_scale = lock_height / 96;\nlock_width = 84 * lock_scale;\n\nscaled_lock = lock.image.Scale(lock_width, lock_height);\nlock.sprite = Sprite(scaled_lock);\nlock.x = entry.x - lock_width - 15;\nlock.y = entry.y + entry.image.GetHeight()/2 - lock_height/2;\nlock.sprite.SetPosition(lock.x, lock.y, 10001);\nlock.sprite.SetOpacity(0);\n\n# Bullet array\nbullet.sprites = [];\n\nfun display_normal_callback ()\n  {\n    hide_password_dialog();\n    \n    # Get current mode\n    mode = Plymouth.GetMode();\n    \n    # Only show progress bar for boot and resume modes\n    if ((mode == \"boot\" || mode == \"resume\") && global.password_shown == 1)\n      {\n        show_progress_bar();\n        start_fake_progress();\n      }\n  }\n\nfun display_password_callback (prompt, bullets)\n  {\n    global.password_shown = 1;  # Mark that password dialog has been shown\n    \n    # Reset progress when password dialog appears\n    stop_fake_progress();\n    hide_progress_bar();\n    global.max_progress = 0.0;\n    global.fake_progress = 0.0;\n    global.real_progress = 0.0;\n    show_password_dialog();\n    \n    # Clear all bullets first\n    for (index = 0; bullet.sprites[index]; index++)\n      bullet.sprites[index].SetOpacity(0);\n    \n    # Create and show bullets for current password (max 21)\n    max_bullets = 21;\n    bullets_to_show = bullets;\n    if (bullets_to_show > max_bullets)\n      bullets_to_show = max_bullets;\n    \n    for (index = 0; index < bullets_to_show; index++)\n      {\n        if (!bullet.sprites[index])\n          {\n            # Scale bullet image to 7x7 pixels\n            scaled_bullet = bullet.image.Scale(7, 7);\n            bullet.sprites[index] = Sprite(scaled_bullet);\n            bullet.x = entry.x + 20 + index * (7 + 5);\n            bullet.y = entry.y + entry.image.GetHeight() / 2 - 3.5;\n            bullet.sprites[index].SetPosition(bullet.x, bullet.y, 10002);\n          }\n        bullet.sprites[index].SetOpacity(1);\n      }\n  }\n\nPlymouth.SetDisplayNormalFunction(display_normal_callback);\nPlymouth.SetDisplayPasswordFunction(display_password_callback);\n\n#----------------------------------------- Progress Bar --------------------------------\n\nprogress_box.image = Image(\"progress_box.png\");\nprogress_box.sprite = Sprite(progress_box.image);\n\nprogress_box.x = Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;\nprogress_box.y = entry.y + entry.image.GetHeight() / 2 - progress_box.image.GetHeight() / 2;\nprogress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);\nprogress_box.sprite.SetOpacity(0);\n\nprogress_bar.original_image = Image(\"progress_bar.png\");\nprogress_bar.sprite = Sprite();\nprogress_bar.image = progress_bar.original_image.Scale(1, progress_bar.original_image.GetHeight());\n\nprogress_bar.x = Window.GetWidth() / 2 - progress_bar.original_image.GetWidth() / 2;\nprogress_bar.y = progress_box.y + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;\nprogress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);\nprogress_bar.sprite.SetOpacity(0);\n\nfun progress_callback (duration, progress)\n  {\n    global.real_progress = progress;\n    \n    # If real progress is above limit, stop fake progress and use real progress\n    if (progress > global.fake_progress_limit)\n      {\n        stop_fake_progress();\n        update_progress_bar(progress);\n      }\n  }\n\nPlymouth.SetBootProgressFunction(progress_callback);\n\n#----------------------------------------- Quit --------------------------------\n\nfun quit_callback ()\n{\n  logo.sprite.SetOpacity (1);\n}\n\nPlymouth.SetQuitFunction(quit_callback);\n\n#----------------------------------------- Message --------------------------------\n\nmessage_sprite = Sprite();\nmessage_sprite.SetPosition(10, 10, 10000);\n\nfun display_message_callback (text)\n{\n  my_image = Image.Text(text, 1, 1, 1);\n  message_sprite.SetImage(my_image);\n}\n\nfun hide_message_callback (text)\n{\n  message_sprite.SetOpacity(0);\n}\n\nPlymouth.SetDisplayMessageFunction (display_message_callback);\nPlymouth.SetHideMessageFunction (hide_message_callback);\n"
  },
  {
    "path": "default/sddm/omarchy/Main.qml",
    "content": "import QtQuick 2.0\nimport SddmComponents 2.0\n\nRectangle {\n    id: root\n    width: 640\n    height: 480\n    color: \"#000000\"\n\n    property string currentUser: userModel.lastUser\n    property int sessionIndex: {\n        for (var i = 0; i < sessionModel.rowCount(); i++) {\n            var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || \"\").toString()\n            if (name.indexOf(\"uwsm\") !== -1)\n                return i\n        }\n        return sessionModel.lastIndex\n    }\n\n    Connections {\n        target: sddm\n        function onLoginFailed() {\n            errorMessage.text = \"Login failed\"\n            password.text = \"\"\n            password.focus = true\n        }\n        function onLoginSucceeded() {\n            errorMessage.text = \"\"\n        }\n    }\n\n    Column {\n        anchors.centerIn: parent\n        spacing: root.height * 0.04\n        width: parent.width\n\n        Image {\n            source: \"logo.svg\"\n            width: root.width * 0.35\n            height: Math.round(width * sourceSize.height / sourceSize.width)\n            fillMode: Image.PreserveAspectFit\n            anchors.horizontalCenter: parent.horizontalCenter\n        }\n\n        Row {\n            anchors.horizontalCenter: parent.horizontalCenter\n            spacing: root.width * 0.007\n\n            Text {\n                text: \"\\uf023\"\n                color: \"#ffffff\"\n                font.family: \"JetBrainsMono Nerd Font\"\n                font.pixelSize: root.height * 0.025\n                anchors.verticalCenter: parent.verticalCenter\n            }\n\n            Rectangle {\n                width: root.width * 0.17\n                height: root.height * 0.04\n                color: \"#000000\"\n                border.color: \"#ffffff\"\n                border.width: 1\n                clip: true\n\n                TextInput {\n                    id: password\n                    anchors.fill: parent\n                    anchors.margins: root.height * 0.008\n                    verticalAlignment: TextInput.AlignVCenter\n                    echoMode: TextInput.Password\n                    font.family: \"JetBrainsMono Nerd Font\"\n                    font.pixelSize: root.height * 0.02\n                    font.letterSpacing: root.height * 0.004\n                    passwordCharacter: \"\\u2022\"\n                    color: \"#ffffff\"\n                    focus: true\n\n                    Keys.onPressed: {\n                        if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {\n                            sddm.login(root.currentUser, password.text, root.sessionIndex)\n                            event.accepted = true\n                        }\n                    }\n                }\n            }\n        }\n\n        Text {\n            id: errorMessage\n            text: \"\"\n            color: \"#f7768e\"\n            font.family: \"JetBrainsMono Nerd Font\"\n            font.pixelSize: root.height * 0.018\n            anchors.horizontalCenter: parent.horizontalCenter\n        }\n    }\n\n    Component.onCompleted: password.forceActiveFocus()\n}\n"
  },
  {
    "path": "default/sddm/omarchy/metadata.desktop",
    "content": "[SddmGreeterTheme]\nName=Omarchy\nDescription=Minimal terminal-style login theme matching the Limine bootloader aesthetic\nAuthor=Omarchy\nType=sddm-theme\nVersion=1.0\n"
  },
  {
    "path": "default/sddm/omarchy/theme.conf",
    "content": "[General]\n"
  },
  {
    "path": "default/systemd/faster-shutdown.conf",
    "content": "[Manager]\nDefaultTimeoutStopSec=5s\n"
  },
  {
    "path": "default/systemd/system/supergfxd.service.d/delay-start.conf",
    "content": "[Service]\n# Delay startup to avoid race condition with display manager initialization\n# when booting in Integrated mode. Without this delay, the system can freeze\n# on boot because supergfxd tries to disable the dGPU while the display\n# subsystem is still initializing.\nExecStartPre=/bin/sleep 5\n"
  },
  {
    "path": "default/systemd/system-sleep/force-igpu",
    "content": "#!/bin/bash\n\n# Use the Vfio to Integrated trick to turn off NVIDIA dgpu when in integrated mode\n# without needing to restart the computer. This is needed because computers like the Asus G14\n# will wake after suspend in Hybrid mode, even if the system was in Integrated mode before\n# suspending.\n\ncase \"$1\" in\n  pre)\n    # Before hibernating, switch to Vfio so the nvidia driver is detached from the dGPU.\n    # Without this, hibernate resume fails because the nvidia driver can't freeze a\n    # powered-off dGPU (returns -EIO), which aborts the entire resume.\n    if [[ $2 == \"hibernate\" ]]; then\n      /usr/bin/supergfxctl -m Vfio\n      sleep 1\n    fi\n    ;;\n  post)\n    # small delay so the device is fully re-enumerated\n    sleep 4\n\n    # force-bind dGPU to vfio (fully detached from nvidia)\n    /usr/bin/supergfxctl -m Vfio\n    sleep 1\n\n    # then go back to Integrated, which powers it off again\n    /usr/bin/supergfxctl -m Integrated\n    ;;\nesac\n"
  },
  {
    "path": "default/systemd/system-sleep/keyboard-backlight",
    "content": "#!/bin/bash\n\n# Turn off keyboard backlight before hibernate to prevent hang on power-off.\n# The ASUS keyboard controller can block S4 shutdown if LEDs are active.\n\nif [[ $1 == \"pre\" && $2 == \"hibernate\" ]]; then\n  device=\"\"\n  for candidate in /sys/class/leds/*kbd_backlight*; do\n    if [[ -e \"$candidate\" ]]; then\n      device=\"$(basename \"$candidate\")\"\n      break\n    fi\n  done\n\n  if [[ -n \"$device\" ]]; then\n    brightnessctl -d \"$device\" set 0 >/dev/null 2>&1\n  fi\nfi\n"
  },
  {
    "path": "default/systemd/system-sleep/unmount-fuse",
    "content": "#!/bin/bash\n\n# Lazy-unmount gvfsd-fuse filesystems before suspend/hibernate to prevent the\n# kernel's process freeze from timing out. FUSE daemons (like gvfsd-fuse from\n# Nautilus) can block in uninterruptible sleep during freeze, causing suspend\n# to silently fail. After wake, restart gvfs so the FUSE mount is restored.\n\nif [[ $1 == \"pre\" ]]; then\n  while IFS=' ' read -r _ mountpoint fstype _; do\n    if [[ $fstype == fuse.gvfsd-fuse ]]; then\n      mountpoint=$(printf '%b' \"$mountpoint\")\n      fusermount3 -uz \"$mountpoint\" 2>/dev/null || fusermount -uz \"$mountpoint\" 2>/dev/null || true\n    fi\n  done < /proc/mounts\nfi\n\nif [[ $1 == \"post\" ]]; then\n  # Run in background — user.slice is still frozen at this point, so a\n  # synchronous restart would block the thaw for up to 90 seconds.\n  (\n    sleep 5\n    for uid_dir in /run/user/*; do\n      uid=$(basename \"$uid_dir\")\n      if [[ -S $uid_dir/bus ]]; then\n        sudo -u \"#$uid\" env \\\n          DBUS_SESSION_BUS_ADDRESS=\"unix:path=$uid_dir/bus\" \\\n          XDG_RUNTIME_DIR=\"$uid_dir\" \\\n          systemctl --user restart gvfs-daemon.service 2>/dev/null || true\n      fi\n    done\n  ) &\n  disown\nfi\n"
  },
  {
    "path": "default/systemd/user@.service.d/faster-shutdown.conf",
    "content": "[Service]\nTimeoutStopSec=5s\n"
  },
  {
    "path": "default/themed/alacritty.toml.tpl",
    "content": "[colors.primary]\nbackground = \"{{ background }}\"\nforeground = \"{{ foreground }}\"\n\n[colors.cursor]\ntext = \"{{ background }}\"\ncursor = \"{{ cursor }}\"\n\n[colors.vi_mode_cursor]\ntext = \"{{ background }}\"\ncursor = \"{{ cursor }}\"\n\n[colors.search.matches]\nforeground = \"{{ background }}\"\nbackground = \"{{ color3 }}\"\n\n[colors.search.focused_match]\nforeground = \"{{ background }}\"\nbackground = \"{{ color1 }}\"\n\n[colors.footer_bar]\nforeground = \"{{ background }}\"\nbackground = \"{{ foreground }}\"\n\n[colors.selection]\ntext = \"{{ selection_foreground }}\"\nbackground = \"{{ selection_background }}\"\n\n[colors.normal]\nblack = \"{{ color0 }}\"\nred = \"{{ color1 }}\"\ngreen = \"{{ color2 }}\"\nyellow = \"{{ color3 }}\"\nblue = \"{{ color4 }}\"\nmagenta = \"{{ color5 }}\"\ncyan = \"{{ color6 }}\"\nwhite = \"{{ color7 }}\"\n\n[colors.bright]\nblack = \"{{ color8 }}\"\nred = \"{{ color9 }}\"\ngreen = \"{{ color10 }}\"\nyellow = \"{{ color11 }}\"\nblue = \"{{ color12 }}\"\nmagenta = \"{{ color13 }}\"\ncyan = \"{{ color14 }}\"\nwhite = \"{{ color15 }}\"\n"
  },
  {
    "path": "default/themed/btop.theme.tpl",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"{{ background }}\"\n\n# Main text color\ntheme[main_fg]=\"{{ foreground }}\"\n\n# Title color for boxes\ntheme[title]=\"{{ foreground }}\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"{{ accent }}\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"{{ color8 }}\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"{{ accent }}\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"{{ color8 }}\"\n\n# Color of text appearing on top of graphs, i.e uptime and current network graph scaling\ntheme[graph_text]=\"{{ foreground }}\"\n\n# Background color of the percentage meters\ntheme[meter_bg]=\"{{ color8 }}\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"{{ foreground }}\"\n\n# CPU, Memory, Network, Proc box outline colors\ntheme[cpu_box]=\"{{ color5 }}\"\ntheme[mem_box]=\"{{ color2 }}\"\ntheme[net_box]=\"{{ color1 }}\"\ntheme[proc_box]=\"{{ accent }}\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"{{ color8 }}\"\n\n# Temperature graph color (Green -> Yellow -> Red)\ntheme[temp_start]=\"{{ color2 }}\"\ntheme[temp_mid]=\"{{ color3 }}\"\ntheme[temp_end]=\"{{ color1 }}\"\n\n# CPU graph colors (Teal -> Lavender)\ntheme[cpu_start]=\"{{ color6 }}\"\ntheme[cpu_mid]=\"{{ color4 }}\"\ntheme[cpu_end]=\"{{ color5 }}\"\n\n# Mem/Disk free meter (Mauve -> Lavender -> Blue)\ntheme[free_start]=\"{{ color5 }}\"\ntheme[free_mid]=\"{{ color4 }}\"\ntheme[free_end]=\"{{ color6 }}\"\n\n# Mem/Disk cached meter (Sapphire -> Lavender)\ntheme[cached_start]=\"{{ color4 }}\"\ntheme[cached_mid]=\"{{ color6 }}\"\ntheme[cached_end]=\"{{ color5 }}\"\n\n# Mem/Disk available meter (Peach -> Red)\ntheme[available_start]=\"{{ color3 }}\"\ntheme[available_mid]=\"{{ color1 }}\"\ntheme[available_end]=\"{{ color1 }}\"\n\n# Mem/Disk used meter (Green -> Sky)\ntheme[used_start]=\"{{ color2 }}\"\ntheme[used_mid]=\"{{ color6 }}\"\ntheme[used_end]=\"{{ color4 }}\"\n\n# Download graph colors (Peach -> Red)\ntheme[download_start]=\"{{ color3 }}\"\ntheme[download_mid]=\"{{ color1 }}\"\ntheme[download_end]=\"{{ color1 }}\"\n\n# Upload graph colors (Green -> Sky)\ntheme[upload_start]=\"{{ color2 }}\"\ntheme[upload_mid]=\"{{ color6 }}\"\ntheme[upload_end]=\"{{ color4 }}\"\n\n# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)\ntheme[process_start]=\"{{ color6 }}\"\ntheme[process_mid]=\"{{ color4 }}\"\ntheme[process_end]=\"{{ color5 }}\"\n"
  },
  {
    "path": "default/themed/chromium.theme.tpl",
    "content": "{{ background_rgb }}\n"
  },
  {
    "path": "default/themed/ghostty.conf.tpl",
    "content": "background = {{ background }}\nforeground = {{ foreground }}\ncursor-color = {{ cursor }}\nselection-background = {{ selection_background }}\nselection-foreground = {{ selection_foreground }}\n\npalette = 0={{ color0 }}\npalette = 1={{ color1 }}\npalette = 2={{ color2 }}\npalette = 3={{ color3 }}\npalette = 4={{ color4 }}\npalette = 5={{ color5 }}\npalette = 6={{ color6 }}\npalette = 7={{ color7 }}\npalette = 8={{ color8 }}\npalette = 9={{ color9 }}\npalette = 10={{ color10 }}\npalette = 11={{ color11 }}\npalette = 12={{ color12 }}\npalette = 13={{ color13 }}\npalette = 14={{ color14 }}\npalette = 15={{ color15 }}\n"
  },
  {
    "path": "default/themed/hyprland-preview-share-picker.css.tpl",
    "content": "@define-color foreground {{ foreground }};\n@define-color background {{ background }};\n@define-color accent {{ accent }};\n@define-color muted {{ color8 }};\n@define-color card_bg {{ color0 }};\n@define-color text_dark {{ background }};\n@define-color accent_hover {{ color12 }};\n@define-color selected_tab {{ accent }};\n@define-color text {{ foreground }};\n\n* {\n  all: unset;\n  font-family: JetBrains Mono NF;\n  color: @foreground;\n  font-weight: bold;\n  font-size: 16px;\n}\n\n.window {\n  background: alpha(@background, 0.95);\n  border: solid 2px @accent;\n  margin: 4px;\n  padding: 18px;\n}\n\ntabs {\n    padding: 0.5rem 1rem;\n}\n\ntabs > tab {\n    margin-right: 1rem;\n}\n\n.tab-label {\n    color: @text;\n    transition: all 0.2s ease;\n}\n\ntabs > tab:checked > .tab-label, tabs > tab:active > .tab-label {\n    text-decoration: underline currentColor;\n    color: @selected_tab;\n}\n\ntabs > tab:focus > .tab-label {\n    color: @foreground;\n}\n\n.page {\n    padding: 1rem;\n}\n\n.image-label {\n    font-size: 12px;\n    padding: 0.25rem;\n}\n\nflowboxchild > .card, button > .card {\n    transition: all 0.2s ease;\n    border: solid 2px transparent;\n    border-color: @background;\n    border-radius: 5px;\n    background-color: @card_bg;\n    padding: 5px;\n}\n\nflowboxchild:hover > .card, button:hover > .card, flowboxchild:active > .card, flowboxchild:selected > .card, button:active > .card, button:selected > .card, button:focus > .card {\n    border: solid 2px @accent;\n}\n\n.image {\n    border-radius: 5px;\n}\n\n.region-button {\n    padding: 0.5rem 1rem;\n    border-radius: 5px;\n    background-color: @accent;\n    color: @text_dark;\n    transition: all 0.2s ease;\n}\n\n.region-button > label {\n    color: @text_dark;\n}\n\n.region-button:not(:disabled):hover, .region-button:not(:disabled):focus {\n    background-color: @accent_hover;\n    color: @text_dark;\n}\n\n.region-button:disabled {\n    background-color: @muted;\n    color: @background;\n}\n"
  },
  {
    "path": "default/themed/hyprland.conf.tpl",
    "content": "$activeBorderColor = rgb({{ accent_strip }})\n\ngeneral {\n    col.active_border = $activeBorderColor\n}\n\ngroup {\n    col.border_active = $activeBorderColor\n}\n"
  },
  {
    "path": "default/themed/hyprlock.conf.tpl",
    "content": "$color = rgba({{ background_rgb }}, 1.0)\n$inner_color = rgba({{ background_rgb }}, 0.8)\n$outer_color = rgba({{ foreground_rgb }}, 1.0)\n$font_color = rgba({{ foreground_rgb }}, 1.0)\n$check_color = rgba({{ accent_rgb }}, 1.0)\n"
  },
  {
    "path": "default/themed/keyboard.rgb.tpl",
    "content": "{{ accent }}\n"
  },
  {
    "path": "default/themed/kitty.conf.tpl",
    "content": "foreground {{ foreground }}\nbackground {{ background }}\nselection_foreground {{ selection_foreground }}\nselection_background {{ selection_background }}\n\ncursor {{ cursor }}\ncursor_text_color {{ background }}\n\nactive_border_color {{ accent }}\nactive_tab_background {{ accent }}\n\ncolor0 {{ color0 }}\ncolor1 {{ color1 }}\ncolor2 {{ color2 }}\ncolor3 {{ color3 }}\ncolor4 {{ color4 }}\ncolor5 {{ color5 }}\ncolor6 {{ color6 }}\ncolor7 {{ color7 }}\ncolor8 {{ color8 }}\ncolor9 {{ color9 }}\ncolor10 {{ color10 }}\ncolor11 {{ color11 }}\ncolor12 {{ color12 }}\ncolor13 {{ color13 }}\ncolor14 {{ color14 }}\ncolor15 {{ color15 }}\n"
  },
  {
    "path": "default/themed/mako.ini.tpl",
    "content": "include=~/.local/share/omarchy/default/mako/core.ini\n\ntext-color={{ foreground }}\nborder-color={{ accent }}\nbackground-color={{ background }}\n"
  },
  {
    "path": "default/themed/obsidian.css.tpl",
    "content": "/* Omarchy Theme for Obsidian */\n\n.theme-dark, .theme-light {\n  /* Core colors */\n  --background-primary: {{ background }};\n  --background-primary-alt: {{ background }};\n  --background-secondary: {{ background }};\n  --background-secondary-alt: {{ background }};\n  --text-normal: {{ foreground }};\n\n  /* Selection colors */\n  --text-selection: {{ selection_background }};\n\n  /* Border color */\n  --background-modifier-border: {{ color8 }};\n\n  /* Semantic heading colors */\n  --text-title-h1: {{ color1 }};\n  --text-title-h2: {{ color2 }};\n  --text-title-h3: {{ color3 }};\n  --text-title-h4: {{ color4 }};\n  --text-title-h5: {{ color5 }};\n  --text-title-h6: {{ color5 }};\n\n  /* Links and accents */\n  --text-link: {{ color4 }};\n  --text-accent: {{ accent }};\n  --text-accent-hover: {{ accent }};\n  --interactive-accent: {{ accent }};\n  --interactive-accent-hover: {{ accent }};\n\n  /* Muted text */\n  --text-muted: color-mix(in srgb, {{ foreground }} 70%, transparent);\n  --text-faint: color-mix(in srgb, {{ foreground }} 55%, transparent);\n\n  /* Code */\n  --code-normal: {{ color6 }};\n\n  /* Errors and success */\n  --text-error: {{ color1 }};\n  --text-error-hover: {{ color1 }};\n  --text-success: {{ color2 }};\n\n  /* Tags */\n  --tag-color: {{ color6 }};\n  --tag-background: {{ color8 }};\n\n  /* Graph */\n  --graph-line: {{ color8 }};\n  --graph-node: {{ accent }};\n  --graph-node-focused: {{ color4 }};\n  --graph-node-tag: {{ color6 }};\n  --graph-node-attachment: {{ color2 }};\n}\n\n/* Headers */\n.cm-header-1, .markdown-rendered h1 { color: var(--text-title-h1); }\n.cm-header-2, .markdown-rendered h2 { color: var(--text-title-h2); }\n.cm-header-3, .markdown-rendered h3 { color: var(--text-title-h3); }\n.cm-header-4, .markdown-rendered h4 { color: var(--text-title-h4); }\n.cm-header-5, .markdown-rendered h5 { color: var(--text-title-h5); }\n.cm-header-6, .markdown-rendered h6 { color: var(--text-title-h6); }\n\n/* Code blocks */\n.markdown-rendered code {\n  color: {{ color6 }};\n}\n\n/* Syntax highlighting */\n.cm-s-obsidian span.cm-keyword { color: {{ color1 }}; }\n.cm-s-obsidian span.cm-string { color: {{ color2 }}; }\n.cm-s-obsidian span.cm-number { color: {{ color3 }}; }\n.cm-s-obsidian span.cm-comment { color: {{ color8 }}; }\n.cm-s-obsidian span.cm-operator { color: {{ color4 }}; }\n.cm-s-obsidian span.cm-def { color: {{ color4 }}; }\n\n/* Links */\n.markdown-rendered a {\n  color: var(--text-link);\n}\n\n/* Blockquotes */\n.markdown-rendered blockquote {\n  border-left-color: {{ accent }};\n}\n\n/* Active elements */\n.workspace-leaf.mod-active .workspace-leaf-header-title {\n  color: var(--interactive-accent);\n}\n\n.nav-file-title.is-active {\n  color: var(--interactive-accent);\n}\n\n/* Search results */\n.search-result-file-title {\n  color: var(--interactive-accent);\n}\n"
  },
  {
    "path": "default/themed/swayosd.css.tpl",
    "content": "@define-color background-color {{ background }};\n@define-color border-color {{ foreground }};\n@define-color label {{ foreground }};\n@define-color image {{ foreground }};\n@define-color progress {{ accent }};\n"
  },
  {
    "path": "default/themed/walker.css.tpl",
    "content": "@define-color selected-text {{ accent }};\n@define-color text {{ foreground }};\n@define-color base {{ background }};\n@define-color border {{ foreground }};\n@define-color foreground {{ foreground }};\n@define-color background {{ background }};\n"
  },
  {
    "path": "default/themed/waybar.css.tpl",
    "content": "@define-color foreground {{ foreground }};\n@define-color background {{ background }};\n"
  },
  {
    "path": "default/udev/framework16-qmk-hid.rules",
    "content": "SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"32ac\", ATTRS{idProduct}==\"0012\", MODE=\"0660\", TAG+=\"uaccess\"\n"
  },
  {
    "path": "default/voxtype/config.toml",
    "content": "# Voxtype Configuration\n#\n# Location: ~/.config/voxtype/config.toml\n# All settings can be overridden via CLI flags\n#\n# State file for external integrations (Waybar, polybar, etc.)\n# Use \"auto\" for default location ($XDG_RUNTIME_DIR/voxtype/state),\n# a custom path, or \"disabled\" to turn off. The daemon writes state\n# (\"idle\", \"recording\", \"transcribing\") to this file whenever it changes.\n# Required for `voxtype record toggle` and `voxtype status` commands.\nstate_file = \"auto\"\n\n[hotkey]\n# Hotkey is configured in Hyprland. Default is Super + Ctrl + X\nenabled = false\n\n[audio]\n# Audio input device (\"default\" uses system default)\n# List devices with: pactl list sources short\ndevice = \"default\"\n\n# Sample rate in Hz (whisper expects 16000)\nsample_rate = 16000\n\n# Maximum recording duration in seconds (safety limit)\nmax_duration_secs = 60\n\n# [audio.feedback]\n# Enable audio feedback sounds (beeps when recording starts/stops)\n# enabled = true\n#\n# Sound theme: \"default\", \"subtle\", \"mechanical\", or path to custom theme directory\n# theme = \"default\"\n#\n# Volume level (0.0 to 1.0)\n# volume = 0.7\n\n[whisper]\n# Model to use for transcription\n# Options: tiny, tiny.en, base, base.en, small, small.en, medium, medium.en, large-v3, large-v3-turbo\n# .en models are English-only but faster and more accurate for English\n# large-v3-turbo is faster than large-v3 with minimal accuracy loss (recommended for GPU)\n# Or provide absolute path to a custom .bin model file\nmodel = \"base.en\"\n\n# Language for transcription\n# Use \"en\" for English, \"auto\" for auto-detection\n# See: https://github.com/openai/whisper#available-models-and-languages\nlanguage = \"en\"\n\n# Translate non-English speech to English\ntranslate = false\n\n# Number of CPU threads for inference (omit for auto-detection)\n# threads = 4\n\n[output]\n# Primary output mode: \"type\" or \"clipboard\"\n# - type: Simulates keyboard input at cursor position (requires ydotool)\n# - clipboard: Copies text to clipboard (requires wl-copy)\nmode = \"type\"\n\n# Fall back to clipboard if typing fails\nfallback_to_clipboard = true\n\n# Delay between typed characters in milliseconds\n# 0 = fastest possible, increase if characters are dropped\ntype_delay_ms = 1\n\n# Post-processing command (optional)\n# Pipe transcribed text through an external command for cleanup before output.\n# The command receives text on stdin and outputs processed text on stdout.\n# Useful for LLM-based text cleanup, grammar correction, filler word removal.\n# On any failure (timeout, error), falls back to original transcription.\n#\n# [output.post_process]\n# command = \"ollama run llama3.2:1b 'Clean up this dictation. Fix grammar, remove filler words. Output only the cleaned text:'\"\n# timeout_ms = 30000  # 30 second timeout (generous for LLM)\n\n[output.notification]\n# Show notification when recording starts (hotkey pressed)\non_recording_start = false\n\n# Show notification when recording stops (transcription beginning)\non_recording_stop = false\n\n# Show notification with transcribed text after transcription completes\non_transcription = false\n\n# [text]\n# Text processing options (word replacements, spoken punctuation)\n#\n# Enable spoken punctuation conversion (e.g., say \"period\" to get \".\")\n# spoken_punctuation = false\n#\n# Custom word replacements (case-insensitive)\n# replacements = { \"hyperwhisper\" = \"hyprwhspr\" }\n"
  },
  {
    "path": "default/walker/restart.conf",
    "content": "[Service]\nRestart=always\nRestartSec=2\n"
  },
  {
    "path": "default/walker/themes/omarchy-default/layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<interface>\n  <requires lib=\"gtk\" version=\"4.0\"></requires>\n  <object class=\"GtkWindow\" id=\"Window\">\n    <style>\n      <class name=\"window\"></class>\n    </style>\n    <property name=\"resizable\">true</property>\n    <property name=\"title\">Walker</property>\n    <child>\n      <object class=\"GtkBox\" id=\"BoxWrapper\">\n        <style>\n          <class name=\"box-wrapper\"></class>\n        </style>\n        <property name=\"width-request\">644</property>\n        <property name=\"overflow\">hidden</property>\n        <property name=\"orientation\">horizontal</property>\n        <property name=\"valign\">center</property>\n        <property name=\"halign\">center</property>\n        <child>\n          <object class=\"GtkBox\" id=\"Box\">\n            <style>\n              <class name=\"box\"></class>\n            </style>\n            <property name=\"orientation\">vertical</property>\n            <property name=\"hexpand-set\">true</property>\n            <property name=\"hexpand\">true</property>\n            <property name=\"spacing\">10</property>\n            <child>\n              <object class=\"GtkBox\" id=\"SearchContainer\">\n                <style>\n                  <class name=\"search-container\"></class>\n                </style>\n                <property name=\"overflow\">hidden</property>\n                <property name=\"orientation\">horizontal</property>\n                <property name=\"halign\">fill</property>\n                <property name=\"hexpand-set\">true</property>\n                <property name=\"hexpand\">true</property>\n                <child>\n                  <object class=\"GtkEntry\" id=\"Input\">\n                    <style>\n                      <class name=\"input\"></class>\n                    </style>\n                    <property name=\"halign\">fill</property>\n                    <property name=\"hexpand-set\">true</property>\n                    <property name=\"hexpand\">true</property>\n                  </object>\n                </child>\n              </object>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"ContentContainer\">\n                <style>\n                  <class name=\"content-container\"></class>\n                </style>\n                <property name=\"orientation\">horizontal</property>\n                <property name=\"spacing\">10</property>\n                <property name=\"vexpand\">true</property>\n                <property name=\"vexpand-set\">true</property>\n                <child>\n                  <object class=\"GtkLabel\" id=\"ElephantHint\">\n                    <style>\n                      <class name=\"elephant-hint\"></class>\n                    </style>\n                    <property name=\"hexpand\">true</property>\n                    <property name=\"height-request\">100</property>\n                    <property name=\"label\">Waiting for elephant...</property>\n                  </object>\n                </child>\n                <child>\n                  <object class=\"GtkLabel\" id=\"Placeholder\">\n                    <style>\n                      <class name=\"placeholder\"></class>\n                    </style>\n                    <property name=\"label\">No Results</property>\n                    <property name=\"yalign\">0.0</property>\n                    <property name=\"hexpand\">true</property>\n                  </object>\n                </child>\n                <child>\n                  <object class=\"GtkScrolledWindow\" id=\"Scroll\">\n                    <style>\n                      <class name=\"scroll\"></class>\n                    </style>\n                    <property name=\"hexpand\">true</property>\n                    <property name=\"can_focus\">false</property>\n                    <property name=\"overlay-scrolling\">true</property>\n                    <property name=\"max-content-width\">600</property>\n                    <property name=\"max-content-height\">300</property>\n                    <property name=\"min-content-height\">0</property>\n                    <property name=\"propagate-natural-height\">true</property>\n                    <property name=\"propagate-natural-width\">true</property>\n                    <property name=\"hscrollbar-policy\">automatic</property>\n                    <property name=\"vscrollbar-policy\">automatic</property>\n                    <child>\n                      <object class=\"GtkGridView\" id=\"List\">\n                        <style>\n                          <class name=\"list\"></class>\n                        </style>\n                        <property name=\"max_columns\">1</property>\n                        <property name=\"can_focus\">false</property>\n                      </object>\n                    </child>\n                  </object>\n                </child>\n                <child>\n                  <object class=\"GtkBox\" id=\"Preview\">\n                    <style>\n                      <class name=\"preview\"></class>\n                    </style>\n                  </object>\n                </child>\n              </object>\n            </child>\n            <child>\n              <object class=\"GtkBox\" id=\"Keybinds\">\n                <property name=\"hexpand\">true</property>\n                <property name=\"margin-top\">10</property>\n                <style>\n                  <class name=\"keybinds\"></class>\n                </style>\n                <child>\n                  <object class=\"GtkBox\" id=\"GlobalKeybinds\">\n                    <property name=\"spacing\">10</property>\n                    <style>\n                      <class name=\"global-keybinds\"></class>\n                    </style>\n                  </object>\n                </child>\n                <child>\n                  <object class=\"GtkBox\" id=\"ItemKeybinds\">\n                    <property name=\"hexpand\">true</property>\n                    <property name=\"halign\">end</property>\n                    <property name=\"spacing\">10</property>\n                    <style>\n                      <class name=\"item-keybinds\"></class>\n                    </style>\n                  </object>\n                </child>\n              </object>\n            </child>\n            <child>\n              <object class=\"GtkLabel\" id=\"Error\">\n                <style>\n                  <class name=\"error\"></class>\n                </style>\n                <property name=\"xalign\">0</property>\n                <property name=\"visible\">false</property>\n              </object>\n            </child>\n          </object>\n        </child>\n      </object>\n    </child>\n  </object>\n</interface>\n"
  },
  {
    "path": "default/walker/themes/omarchy-default/style.css",
    "content": "@import \"../../../../../../../.config/omarchy/current/theme/walker.css\";\n\n* {\n  all: unset;\n}\n\n* {\n  font-family: monospace;\n  font-size: 18px;\n  color: @text;\n}\n\nscrollbar {\n  opacity: 0;\n}\n\n.normal-icons {\n  -gtk-icon-size: 16px;\n}\n\n.large-icons {\n  -gtk-icon-size: 32px;\n}\n\n.box-wrapper {\n  background: alpha(@base, 0.95);\n  padding: 20px;\n  border: 2px solid @border;\n}\n\n.preview-box {\n}\n\n.box {\n}\n\n.search-container {\n  background: @base;\n  padding: 10px;\n}\n\n.input placeholder {\n  opacity: 0.5;\n}\n\n.input {\n}\n\n.input:focus,\n.input:active {\n  box-shadow: none;\n  outline: none;\n}\n\n.content-container {\n}\n\n.placeholder {\n}\n\n.scroll {\n}\n\n.list {\n}\n\nchild,\nchild > * {\n}\n\nchild:hover .item-box {\n}\n\nchild:selected .item-box {\n}\n\nchild:selected .item-box * {\n  color: @selected-text;\n}\n\n.item-box {\n  padding-left: 14px;\n}\n\n.item-text-box {\n  all: unset;\n  padding: 14px 0;\n}\n\n.item-text {\n}\n\n.item-subtext {\n  font-size: 0px;\n  min-height: 0px;\n  margin: 0px;\n  padding: 0px;\n}\n\n.item-image {\n  margin-right: 14px;\n  -gtk-icon-transform: scale(0.9);\n}\n\n.current {\n  font-style: italic;\n}\n\n.keybind-hints {\n  background: @background;\n  padding: 10px;\n  margin-top: 10px;\n}\n\n.preview {\n}\n"
  },
  {
    "path": "default/walker/walker.desktop",
    "content": "[Desktop Entry]\nName=Walker\nComment=Walker Service\nExec=walker --gapplication-service\nStartupNotify=false\nTerminal=false\nType=Application\n"
  },
  {
    "path": "default/waybar/indicators/idle.sh",
    "content": "#!/bin/bash\n\nif pgrep -x hypridle >/dev/null; then\n  echo '{\"text\": \"\"}'\nelse\n  echo '{\"text\": \"󱫖\", \"tooltip\": \"Idle lock disabled\", \"class\": \"active\"}'\nfi\n"
  },
  {
    "path": "default/waybar/indicators/notification-silencing.sh",
    "content": "#!/bin/bash\n\nif makoctl mode | grep -q 'do-not-disturb'; then\n  echo '{\"text\": \"󰂛\", \"tooltip\": \"Notifications silenced\", \"class\": \"active\"}'\nelse\n  echo '{\"text\": \"\"}'\nfi\n"
  },
  {
    "path": "default/waybar/indicators/screen-recording.sh",
    "content": "#!/bin/bash\n\nif pgrep -f \"^gpu-screen-recorder\" >/dev/null; then\n  echo '{\"text\": \"󰻂\", \"tooltip\": \"Stop recording\", \"class\": \"active\"}'\nelse\n  echo '{\"text\": \"\"}'\nfi\n"
  },
  {
    "path": "default/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf",
    "content": "## Use software volume control for all ALSA devices.\n## This prevents hardware mixer quirks (like muffled audio on Realtek codecs)\n## and provides consistent volume behavior across all hardware.\n\nmonitor.alsa.rules = [\n  {\n    matches = [\n      {\n        device.name = \"~alsa_card.*\"\n      }\n    ]\n    actions = {\n      update-props = {\n        api.alsa.soft-mixer = true\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "default/xcompose",
    "content": "include \"%L\"\n\n# Emoji\n<Multi_key> <m> <s> : \"😄\" # smile\n<Multi_key> <m> <c> : \"😂\" # cry\n<Multi_key> <m> <l> : \"😍\" # love\n<Multi_key> <m> <v> : \"✌️\"  # victory\n<Multi_key> <m> <h> : \"❤️\"  # heart\n<Multi_key> <m> <y> : \"👍\" # yes\n<Multi_key> <m> <n> : \"👎\" # no\n<Multi_key> <m> <f> : \"🖕\" # fuck\n<Multi_key> <m> <w> : \"🤞\" # wish\n<Multi_key> <m> <r> : \"🤘\" # rock\n<Multi_key> <m> <k> : \"😘\" # kiss\n<Multi_key> <m> <e> : \"🙄\" # eyeroll\n<Multi_key> <m> <d> : \"🤤\" # droll\n<Multi_key> <m> <m> : \"💰\" # money\n<Multi_key> <m> <x> : \"🎉\" # xellebrate\n<Multi_key> <m> <1> : \"💯\" # 100%\n<Multi_key> <m> <t> : \"🥂\" # toast\n<Multi_key> <m> <p> : \"🙏\" # pray\n<Multi_key> <m> <i> : \"😉\" # wink\n<Multi_key> <m> <o> : \"👌\" # OK\n<Multi_key> <m> <g> : \"👋\" # greeting\n<Multi_key> <m> <a> : \"💪\" # arm\n<Multi_key> <m> <b> : \"🤯\" # blowing\n\n# Typography\n<Multi_key> <space> <space> : \"—\"\n"
  },
  {
    "path": "icon.txt",
    "content": "██████████████████████████████████████████████████████\n██████████████████████████████████████████████████████\n████                     ████                     ████\n████                     ████                     ████\n████    █████████████████████         ████████    ████\n████    █████████████████████         ████████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████████████                              ████    ████\n████████████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ████                              ████    ████\n████    ██████████████████████████████████████    ████\n████    ██████████████████████████████████████    ████\n████                     ████                     ████\n████                     ████                     ████\n█████████████████████████████     ████████████████████\n█████████████████████████████     ████████████████████\n"
  },
  {
    "path": "install/config/all.sh",
    "content": "run_logged $OMARCHY_INSTALL/config/config.sh\nrun_logged $OMARCHY_INSTALL/config/theme.sh\nrun_logged $OMARCHY_INSTALL/config/branding.sh\nrun_logged $OMARCHY_INSTALL/config/git.sh\nrun_logged $OMARCHY_INSTALL/config/gpg.sh\nrun_logged $OMARCHY_INSTALL/config/timezones.sh\nrun_logged $OMARCHY_INSTALL/config/increase-sudo-tries.sh\nrun_logged $OMARCHY_INSTALL/config/increase-lockout-limit.sh\nrun_logged $OMARCHY_INSTALL/config/ssh-flakiness.sh\nrun_logged $OMARCHY_INSTALL/config/increase-file-watchers.sh\nrun_logged $OMARCHY_INSTALL/config/detect-keyboard-layout.sh\nrun_logged $OMARCHY_INSTALL/config/xcompose.sh\nrun_logged $OMARCHY_INSTALL/config/mise-work.sh\nrun_logged $OMARCHY_INSTALL/config/fix-powerprofilesctl-shebang.sh\nrun_logged $OMARCHY_INSTALL/config/docker.sh\nrun_logged $OMARCHY_INSTALL/config/mimetypes.sh\nrun_logged $OMARCHY_INSTALL/config/remove-fcitx5-autostart.sh\nrun_logged $OMARCHY_INSTALL/config/localdb.sh\nrun_logged $OMARCHY_INSTALL/config/walker-elephant.sh\nrun_logged $OMARCHY_INSTALL/config/fast-shutdown.sh\nrun_logged $OMARCHY_INSTALL/config/unmount-fuse.sh\nrun_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh\nrun_logged $OMARCHY_INSTALL/config/input-group.sh\nrun_logged $OMARCHY_INSTALL/config/omarchy-ai-skill.sh\nrun_logged $OMARCHY_INSTALL/config/kernel-modules-hook.sh\nrun_logged $OMARCHY_INSTALL/config/powerprofilesctl-rules.sh\nrun_logged $OMARCHY_INSTALL/config/wifi-powersave-rules.sh\nrun_logged $OMARCHY_INSTALL/config/plocate-ac-only.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/network.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/set-wireless-regdom.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-fkeys.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/bluetooth.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/printer.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/usb-autosuspend.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/ignore-power-button.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/nvidia.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/intel.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/intel-thermald.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/vulkan.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-intel-panther-lake-display.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-f13-amd-audio-input.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-bcm43xx.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-apple-spi-keyboard.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-apple-suspend-nvme.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-apple-t2.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-surface-keyboard.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-asus-rog-audio-mixer.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-asus-rog-mic.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-yt6801-ethernet-adapter.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-dell-xps-audio.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-synaptic-touchpad.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/fix-tuxedo-backlight.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/framework16-qmk-hid.sh\nrun_logged $OMARCHY_INSTALL/config/hardware/intel-ipu7-camera.sh\n"
  },
  {
    "path": "install/config/branding.sh",
    "content": "# Allow the user to change the branding for fastfetch and screensaver\nmkdir -p ~/.config/omarchy/branding\ncp ~/.local/share/omarchy/icon.txt ~/.config/omarchy/branding/about.txt\ncp ~/.local/share/omarchy/logo.txt ~/.config/omarchy/branding/screensaver.txt\n"
  },
  {
    "path": "install/config/config.sh",
    "content": "# Copy over Omarchy configs\nmkdir -p ~/.config\ncp -R ~/.local/share/omarchy/config/* ~/.config/\n\n# Use default bashrc from Omarchy\ncp ~/.local/share/omarchy/default/bashrc ~/.bashrc\n"
  },
  {
    "path": "install/config/detect-keyboard-layout.sh",
    "content": "# Copy over the keyboard layout that's been set in Arch during install to Hyprland\nconf=\"/etc/vconsole.conf\"\nhyprconf=\"$HOME/.config/hypr/input.conf\"\n\nif grep -q '^XKBLAYOUT=' \"$conf\"; then\n  layout=$(grep '^XKBLAYOUT=' \"$conf\" | cut -d= -f2 | tr -d '\"')\n  sed -i \"/^[[:space:]]*kb_options *=/i\\  kb_layout = $layout\" \"$hyprconf\"\nfi\n\nif grep -q '^XKBVARIANT=' \"$conf\"; then\n  variant=$(grep '^XKBVARIANT=' \"$conf\" | cut -d= -f2 | tr -d '\"')\n  sed -i \"/^[[:space:]]*kb_options *=/i\\  kb_variant = $variant\" \"$hyprconf\"\nfi\n"
  },
  {
    "path": "install/config/docker.sh",
    "content": "# Configure Docker daemon:\n# - limit log size to avoid running out of disk\n# - use host's DNS resolver\nsudo mkdir -p /etc/docker\nsudo tee /etc/docker/daemon.json >/dev/null <<'EOF'\n{\n    \"log-driver\": \"json-file\",\n    \"log-opts\": { \"max-size\": \"10m\", \"max-file\": \"5\" },\n    \"dns\": [\"172.17.0.1\"],\n    \"bip\": \"172.17.0.1/16\"\n}\nEOF\n\n# Expose systemd-resolved to our Docker network\nsudo mkdir -p /etc/systemd/resolved.conf.d\necho -e '[Resolve]\\nDNSStubListenerExtra=172.17.0.1' | sudo tee /etc/systemd/resolved.conf.d/20-docker-dns.conf >/dev/null\nsudo systemctl restart systemd-resolved\n\n# Start Docker on-demand\nsudo systemctl enable docker.socket\n\n# Give this user privileged Docker access\nsudo usermod -aG docker ${USER}\n\n# Prevent Docker from preventing boot for network-online.target\nsudo mkdir -p /etc/systemd/system/docker.service.d\nsudo tee /etc/systemd/system/docker.service.d/no-block-boot.conf <<'EOF'\n[Unit]\nDefaultDependencies=no\nEOF\n\nsudo systemctl daemon-reload\n"
  },
  {
    "path": "install/config/fast-shutdown.sh",
    "content": "sudo mkdir -p /etc/systemd/system.conf.d\nsudo cp \"$OMARCHY_PATH/default/systemd/faster-shutdown.conf\" /etc/systemd/system.conf.d/10-faster-shutdown.conf\nsudo mkdir -p /etc/systemd/system/user@.service.d\nsudo cp \"$OMARCHY_PATH/default/systemd/user@.service.d/faster-shutdown.conf\" /etc/systemd/system/user@.service.d/faster-shutdown.conf\nsudo systemctl daemon-reload\n"
  },
  {
    "path": "install/config/fix-powerprofilesctl-shebang.sh",
    "content": "# Ensure we use system python3 and not mise's python3\nsudo sed -i '/env python3/ c\\#!/bin/python3' /usr/bin/powerprofilesctl\n"
  },
  {
    "path": "install/config/git.sh",
    "content": "# Set identification from install inputs\nif [[ -n ${OMARCHY_USER_NAME//[[:space:]]/} ]]; then\n  git config --global user.name \"$OMARCHY_USER_NAME\"\nfi\n\nif [[ -n ${OMARCHY_USER_EMAIL//[[:space:]]/} ]]; then\n  git config --global user.email \"$OMARCHY_USER_EMAIL\"\nfi\n"
  },
  {
    "path": "install/config/gpg.sh",
    "content": "# Setup GPG configuration with multiple keyservers for better reliability\nsudo mkdir -p /etc/gnupg\nsudo cp ~/.local/share/omarchy/default/gpg/dirmngr.conf /etc/gnupg/\nsudo chmod 644 /etc/gnupg/dirmngr.conf\nsudo gpgconf --kill dirmngr || true\nsudo gpgconf --launch dirmngr || true\n"
  },
  {
    "path": "install/config/hardware/bluetooth.sh",
    "content": "# Turn on bluetooth by default\nchrootable_systemctl_enable bluetooth.service\n"
  },
  {
    "path": "install/config/hardware/fix-apple-spi-keyboard.sh",
    "content": "# Detect MacBook models that need SPI keyboard modules\nproduct_name=\"$(cat /sys/class/dmi/id/product_name 2>/dev/null)\"\nif [[ $product_name =~ MacBook[89],1|MacBook1[02],1|MacBookPro13,[123]|MacBookPro14,[123] ]]; then\n  echo \"Detected MacBook with SPI keyboard\"\n\n  omarchy-pkg-add macbook12-spi-driver-dkms\n  if [[ $product_name == \"MacBook8,1\" ]]; then\n    echo \"MODULES=(applespi spi_pxa2xx_platform spi_pxa2xx_pci)\" | sudo tee /etc/mkinitcpio.conf.d/macbook_spi_modules.conf >/dev/null\n  else\n    echo \"MODULES=(applespi intel_lpss_pci spi_pxa2xx_platform)\" | sudo tee /etc/mkinitcpio.conf.d/macbook_spi_modules.conf >/dev/null\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-apple-suspend-nvme.sh",
    "content": "# Fix NVMe suspend issues on MacBook models\n# This prevents NVMe drives from failing to wake from sleep properly\nMACBOOK_MODEL=$(cat /sys/class/dmi/id/product_name 2>/dev/null || true)\n\nif [[ $MACBOOK_MODEL =~ MacBook(8,1|9,1|10,1)|MacBookPro13,[123]|MacBookPro14,[123] ]]; then\n  echo \"Detected MacBook model: $MACBOOK_MODEL\"\n\n  NVME_DEVICE=\"/sys/bus/pci/devices/0000:01:00.0/d3cold_allowed\"\n\n  if [[ -f $NVME_DEVICE ]]; then\n    echo \"Applying NVMe suspend fix...\"\n\n    cat <<EOF | sudo tee /etc/systemd/system/omarchy-nvme-suspend-fix.service >/dev/null\n[Unit]\nDescription=Omarchy NVMe Suspend Fix for MacBook\n\n[Service]\nExecStart=/bin/bash -c 'echo 0 > /sys/bus/pci/devices/0000\\:01\\:00.0/d3cold_allowed'\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\n    chrootable_systemctl_enable omarchy-nvme-suspend-fix.service\n    sudo systemctl daemon-reload\n  else\n    echo \"Warning: NVMe device not found at expected PCI address (0000:01:00.0)\"\n    echo \"This fix may not be needed for this MacBook model\"\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-apple-t2.sh",
    "content": "# Detect T2 MacBook models using PCI IDs\n# Vendor: 106b (Apple), Device IDs: 1801 or 1802 (T2 Security Chip)\nif lspci -nn | grep -q \"106b:180[12]\"; then\n  echo \"Detected MacBook with T2 chip. Installing support items...\"\n\n  omarchy-pkg-add \\\n    linux-t2 \\\n    linux-t2-headers \\\n    apple-t2-audio-config \\\n    apple-bcm-firmware \\\n    t2fanrd \\\n    tiny-dfr\n\n  # Add user to video group (required for tiny-dfr to access /dev/dri devices)\n  sudo usermod -aG video ${USER}\n\n  # Enable T2 services\n  sudo systemctl enable t2fanrd.service\n  sudo systemctl enable tiny-dfr.service\n\n  echo \"apple-bce\" | sudo tee /etc/modules-load.d/t2.conf >/dev/null\n\n  echo \"MODULES+=(apple-bce usbhid hid_apple hid_generic xhci_pci xhci_hcd)\" | sudo tee /etc/mkinitcpio.conf.d/apple-t2.conf >/dev/null\n\n  cat <<EOF | sudo tee /etc/modprobe.d/brcmfmac.conf >/dev/null\n# Fix for T2 MacBook WiFi connectivity issues\noptions brcmfmac feature_disable=0x82000\nEOF\n\n  sudo mkdir -p /etc/limine-entry-tool.d\n  cat <<EOF | sudo tee /etc/limine-entry-tool.d/t2-mac.conf >/dev/null\n# Generated by Omarchy installer for T2 Mac support\nKERNEL_CMDLINE[default]+=\" intel_iommu=on iommu=pt pcie_ports=compat\"\nEOF\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-asus-rog-audio-mixer.sh",
    "content": "# Fix audio volume on Asus ROG laptops by using a soft mixer.\n\nif omarchy-hw-asus-rog; then\n  mkdir -p ~/.config/wireplumber/wireplumber.conf.d/\n  cp $OMARCHY_PATH/default/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf ~/.config/wireplumber/wireplumber.conf.d/\n  rm -rf ~/.local/state/wireplumber/default-routes\n\n  # Unmute the Master control on the ALC285 card (often muted by default)\n  card=$(aplay -l 2>/dev/null | grep -i \"ALC285\" | head -1 | sed 's/card \\([0-9]*\\).*/\\1/')\n  if [[ -n $card ]]; then\n    amixer -c \"$card\" set Master 80% unmute 2>/dev/null\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-asus-rog-mic.sh",
    "content": "# Fix internal mic gain on ASUS ROG laptops with Realtek ALC285.\n# The mic boost is way too high by default, causing clipping.\n# Sets levels and stores ALSA state so it persists across reboots.\n\nif omarchy-hw-asus-rog; then\n  for card in /proc/asound/card*/codec*; do\n    if grep -q \"ALC285\" \"$card\" 2>/dev/null; then\n      cardnum=$(echo \"$card\" | grep -oP 'card\\K\\d+')\n      amixer -c \"$cardnum\" set 'Internal Mic Boost' 0 >/dev/null 2>&1 || true\n      amixer -c \"$cardnum\" set 'Capture' 70% unmute >/dev/null 2>&1 || true\n      sudo alsactl store \"$cardnum\" 2>/dev/null || true\n      break\n    fi\n  done\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-bcm43xx.sh",
    "content": "# Install Wi-Fi drivers for Broadcom chips found in some MacBooks, as well as other systems:\n# - BCM4360 (2013–2015 MacBooks)\n# - BCM4331 (2012, early 2013 MacBooks)\n\npci_info=$(lspci -nnv)\n\nif (echo \"$pci_info\" | grep -q \"14e4:43a0\" || echo \"$pci_info\" | grep -q \"14e4:4331\"); then\n  echo \"BCM4360 / BCM4331 detected\"\n  omarchy-pkg-add broadcom-wl dkms linux-headers\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-dell-xps-audio.sh",
    "content": "# Fix audio on Dell XPS 2026 (Panther Lake) by blacklisting SOF audio modules\n# that conflict with standard HDA drivers. This turns off audio, but allows boot.\n# This is meant to be removed as soon as its fixed upstream.\n\nif lspci | grep -iE 'vga|3d|display' | grep -qi 'panther lake'; then\n  sudo tee /etc/modprobe.d/blacklist-audio.conf << 'EOF'\nblacklist snd_sof_pci_intel_ptl\nblacklist snd_sof_pci_intel_lnl\nblacklist snd_sof_pci_intel_mtl\nblacklist snd_sof_intel_hda_generic\nblacklist snd_sof_intel_hda_common\nblacklist snd_sof_intel_hda\nblacklist snd_sof_pci\nblacklist snd_sof\nblacklist soundwire_intel\nblacklist snd_soc_cs35l56_sdw\nblacklist snd_soc_cs35l56\nblacklist snd_soc_skl_hda_dsp\nEOF\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-dell-xps-haptic-touchpad.sh",
    "content": "# Fix Dell XPS haptic touchpad losing haptic feedback after suspend/resume.\n# The I2C controller's runtime power management aggressively suspends the touchpad,\n# and on resume the haptic engine sometimes fails to reinitialize.\n# This udev rule keeps the I2C controller always on to prevent that.\n# Applies to any Dell XPS with the Synaptics haptic touchpad (06CB:D01A).\n\nif cat /sys/class/dmi/id/product_name 2>/dev/null | grep -qi \"XPS\" \\\n  && ls /sys/bus/i2c/devices/i2c-VEN_06CB:00 2>/dev/null; then\n\n  # Disable runtime PM for I2C controller so haptic state isn't lost\n  sudo tee /etc/udev/rules.d/99-dell-xps-haptic-touchpad.rules << 'EOF'\nACTION==\"add\", SUBSYSTEM==\"pci\", KERNEL==\"0000:00:19.0\", ATTR{power/control}=\"on\"\nACTION==\"add\", SUBSYSTEM==\"platform\", KERNEL==\"i2c_designware.0\", ATTR{power/control}=\"on\"\nEOF\n  sudo udevadm control --reload-rules\n\n  # Rebind the I2C HID touchpad on boot and resume to reinitialize haptic engine\n  sudo tee /etc/systemd/system/dell-xps-haptic-touchpad.service << 'SVC'\n[Unit]\nDescription=Rebind Dell XPS haptic touchpad\nAfter=systemd-udev-settle.service\n\n[Service]\nType=oneshot\nExecStart=/bin/bash -c 'if [[ -d /sys/bus/i2c/devices/i2c-VEN_06CB:00 ]]; then echo \"i2c-VEN_06CB:00\" | tee /sys/bus/i2c/drivers/i2c_hid_acpi/unbind > /dev/null 2>&1; sleep 1; echo \"i2c-VEN_06CB:00\" | tee /sys/bus/i2c/drivers/i2c_hid_acpi/bind > /dev/null 2>&1; fi'\n\n[Install]\nWantedBy=multi-user.target suspend.target hibernate.target\nSVC\n  sudo systemctl daemon-reload\n  sudo systemctl enable dell-xps-haptic-touchpad.service\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-f13-amd-audio-input.sh",
    "content": "AMD_AUDIO_CARD=$(pactl list cards 2>/dev/null | grep -B20 \"Family 17h/19h\" | grep \"Name: \" | awk '{print $2}' || true)\n\nif [[ -n $AMD_AUDIO_CARD ]]; then\n  pactl set-card-profile \"$AMD_AUDIO_CARD\" \"HiFi (Mic1, Mic2, Speaker)\" 2>/dev/null || true\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-fkeys.sh",
    "content": "# Ensure that F-keys on Apple-like keyboards (such as Lofree Flow84) are always F-keys\nif [[ ! -f /etc/modprobe.d/hid_apple.conf ]]; then\n  echo \"options hid_apple fnmode=2\" | sudo tee /etc/modprobe.d/hid_apple.conf\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-intel-panther-lake-display.sh",
    "content": "# Fix display issues on Intel Panther Lake (Xe3) GPUs by disabling power-saving\n# features that cause screen to run at 10hz (e.g. Dell XPS 2026).\nif lspci | grep -iE 'vga|3d|display' | grep -qi 'panther lake'; then\n  echo \"Detected Intel Panther Lake GPU, applying display fixes...\"\n\n  PANTHER_LAKE_CMDLINE='KERNEL_CMDLINE[default]+=\" xe.enable_psr=0 xe.enable_panel_replay=0 xe.enable_fbc=0 xe.enable_dc=0\"'\n\n  sudo mkdir -p /etc/limine-entry-tool.d\n  cat <<EOF | sudo tee /etc/limine-entry-tool.d/intel-panther-lake-display.conf >/dev/null\n# Fix Panther Lake display issues by disabling Xe power-saving features\n$PANTHER_LAKE_CMDLINE\nEOF\n\n  # Also append to /etc/default/limine if it exists, since it overrides drop-in configs\n  if [ -f /etc/default/limine ] && ! grep -q 'xe.enable_psr' /etc/default/limine; then\n    echo \"$PANTHER_LAKE_CMDLINE\" | sudo tee -a /etc/default/limine >/dev/null\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-surface-keyboard.sh",
    "content": "# Detect Surface devices which require additional modules for the keyboard to work.\n# Module list derived from Chris McLeod's manual install instructions\n# https://chrismcleod.dev/blog/installing-arch-linux-with-secure-boot-on-a-microsoft-surface-laptop-studio/\nif omarchy-hw-surface; then\n  product_name=\"$(cat /sys/class/dmi/id/product_name 2>/dev/null)\"\n  echo \"Detected Surface Device\"\n\n  # Modules already exist in the rootfs for the default kernel.\n  if [[ $product_name != \"Surface Laptop 3\" ]]; then\n    echo \"Untested Surface Device: $product_name, additional modules may be required for your device.\"\n  fi\n\n  echo \"Attempting to autodetect required pinctrl module\"\n  pinctrl_module=$(lsmod | grep pinctrl_ | cut -f 1 -d\" \")\n  if [[ -z $pinctrl_module ]]; then\n    echo \"Failed to autodetect pinctrl module.\"\n  else\n    echo \"Detected pinctrl module: $pinctrl_module\"\n  fi\n\n  echo \"MODULES=(${pinctrl_module} surface_aggregator surface_aggregator_registry surface_aggregator_hub surface_hid_core surface_hid surface_kbd intel_lpss_pci 8250_dw)\" | sudo tee /etc/mkinitcpio.conf.d/surface_device_modules.conf >/dev/null\n\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-synaptic-touchpad.sh",
    "content": "# Enable Synaptics InterTouch for confirmed touchpads if not already loaded\n\nif grep -qi synaptics /proc/bus/input/devices \\\n   && ! lsmod | grep -q '^psmouse'; then\n    modprobe psmouse synaptics_intertouch=1\nfi"
  },
  {
    "path": "install/config/hardware/fix-tuxedo-backlight.sh",
    "content": "# Install Tuxedo drivers for keyboard backlighting on Tuxedo laptops and\n# compatible devices like the Slimbook Executive (Clevo/Tuxedo chassis).\nif cat /sys/class/dmi/id/sys_vendor 2>/dev/null | grep -qi \"TUXEDO\\|Slimbook\"; then\n  omarchy-pkg-add linux-headers tuxedo-drivers-nocompatcheck-dkms\n\n  # Blacklist the legacy clevo_xsm_wmi module which conflicts with the tuxedo-drivers\n  # clevo_wmi module. When clevo_xsm_wmi loads first, it grabs the Clevo WMI GUIDs,\n  # preventing tuxedo-drivers from initializing the keyboard backlight properly.\n  echo \"blacklist clevo_xsm_wmi\" | sudo tee /etc/modprobe.d/blacklist-clevo-xsm-wmi.conf > /dev/null\n\n  # Remove any orphaned clevo_xsm_wmi module files not managed by a package\n  for f in /lib/modules/*/extra/clevo-xsm-wmi.ko; do\n    [ -f \"$f\" ] && sudo rm \"$f\"\n  done\nfi\n"
  },
  {
    "path": "install/config/hardware/fix-yt6801-ethernet-adapter.sh",
    "content": "# Install drivers for Motorcomm YT6801 ethernet adapter used by the Slimbook Executive\nif lspci | grep -i \"YT6801\\|Motorcomm.*Ethernet\"; then\n  omarchy-pkg-add linux-headers yt6801-dkms\nfi\n"
  },
  {
    "path": "install/config/hardware/framework16-qmk-hid.sh",
    "content": "# Allow unprivileged access to the Framework 16 keyboard for RGB control via qmk_hid.\n\nif omarchy-hw-framework16; then\n  if [[ ! -f /etc/udev/rules.d/50-framework16-qmk-hid.rules ]]; then\n    sudo cp \"$OMARCHY_PATH/default/udev/framework16-qmk-hid.rules\" /etc/udev/rules.d/50-framework16-qmk-hid.rules\n    sudo udevadm control --reload-rules\n    sudo udevadm trigger\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/ignore-power-button.sh",
    "content": "# Disable shutting system down on power button to bind it to power menu afterwards\nsudo sed -i 's/.*HandlePowerKey=.*/HandlePowerKey=ignore/' /etc/systemd/logind.conf\n"
  },
  {
    "path": "install/config/hardware/intel-ipu7-camera.sh",
    "content": "# Install MIPI camera support for Intel IPU7 hardware\n\nif grep -q \"OVTI08F4\" /sys/bus/acpi/devices/*/hid 2>/dev/null; then\n  omarchy-pkg-add intel-ipu7-camera\nfi\n"
  },
  {
    "path": "install/config/hardware/intel-thermald.sh",
    "content": "# Enable thermald for Intel laptops (Sandy Bridge and newer)\n# Thermald is useful for Intel Sandy Bridge (2nd gen Core, model 42/45) and newer CPUs.\n\nif omarchy-hw-intel; then\n  # Check if Sandy Bridge or newer (model >= 42). Sandy Bridge: model 42 (mobile), 45 (desktop)\n  cpu_model=$(grep -m1 \"^model\\s*:\" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | tr -d ' ')\n  if ((cpu_model >= 42)) && omarchy-battery-present; then\n    omarchy-pkg-add thermald\n    sudo systemctl enable thermald\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/intel.sh",
    "content": "# This installs hardware video acceleration for Intel GPUs\n# Check if we have an Intel GPU at all\nif INTEL_GPU=$(lspci | grep -iE 'vga|3d|display' | grep -i 'intel'); then\n  # HD Graphics / Iris / Xe / Arc use intel-media-driver\n  if [[ ${INTEL_GPU,,} =~ (hd\\ graphics|uhd\\ graphics|xe|iris|arc) ]]; then\n    omarchy-pkg-add intel-media-driver\n  elif [[ ${INTEL_GPU,,} =~ \"gma\" ]]; then\n    # Older generations from 2008 to ~2014-2017 use libva-intel-driver\n    omarchy-pkg-add libva-intel-driver\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/network.sh",
    "content": "# Ensure iwd service will be started\nsudo systemctl enable iwd.service\n\n# Prevent systemd-networkd-wait-online timeout on boot\nsudo systemctl disable systemd-networkd-wait-online.service\nsudo systemctl mask systemd-networkd-wait-online.service\n"
  },
  {
    "path": "install/config/hardware/nvidia.sh",
    "content": "NVIDIA=\"$(lspci | grep -i 'nvidia')\"\n\nif [[ -n $NVIDIA ]]; then\n  # Check which kernel is installed and set appropriate headers package\n  KERNEL_HEADERS=\"$(pacman -Qqs '^linux(-zen|-lts|-hardened)?$' | head -1)-headers\"\n\n  # Turing+ (GTX 16xx, RTX 20xx-50xx, RTX Pro, Quadro RTX, datacenter A/H/T/L series) have GSP firmware\n  if echo \"$NVIDIA\" | grep -qE \"GTX 16[0-9]{2}|RTX [2-5][0-9]{3}|RTX PRO [0-9]{4}|Quadro RTX|RTX A[0-9]{4}|A[1-9][0-9]{2}|H[1-9][0-9]{2}|T4|L[0-9]+\"; then\n    PACKAGES=(nvidia-open-dkms nvidia-utils lib32-nvidia-utils libva-nvidia-driver)\n    GPU_ARCH=\"turing_plus\"\n  # Maxwell (GTX 9xx), Pascal (GT/GTX 10xx, Quadro P, MX series), Volta (Titan V, Tesla V100, Quadro GV100) lack GSP\n  elif echo \"$NVIDIA\" | grep -qE \"GTX (9[0-9]{2}|10[0-9]{2})|GT 10[0-9]{2}|Quadro [PM][0-9]{3,4}|Quadro GV100|MX *[0-9]+|Titan (X|Xp|V)|Tesla V100\"; then\n    PACKAGES=(nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils)\n    GPU_ARCH=\"maxwell_pascal_volta\"\n  fi\n  # Bail if no supported GPU\n  if [[ -z ${PACKAGES+x} ]]; then\n    echo \"No compatible driver for your NVIDIA GPU. See: https://wiki.archlinux.org/title/NVIDIA\"\n    exit 0\n  fi\n\n  omarchy-pkg-add \"$KERNEL_HEADERS\" \"${PACKAGES[@]}\"\n\n  # Configure modprobe for early KMS\n  sudo tee /etc/modprobe.d/nvidia.conf <<EOF >/dev/null\noptions nvidia_drm modeset=1\nEOF\n\n  # Configure mkinitcpio for early loading\n  sudo tee /etc/mkinitcpio.conf.d/nvidia.conf <<EOF >/dev/null\nMODULES+=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)\nEOF\n\n  # Add NVIDIA environment variables based on GPU architecture\n  if [[ $GPU_ARCH = \"turing_plus\" ]]; then\n    # Turing+ (RTX 20xx, GTX 16xx, and newer) with GSP firmware support\n    cat >>\"$HOME/.config/hypr/envs.conf\" <<'EOF'\n\n# NVIDIA (Turing+ with GSP firmware)\nenv = NVD_BACKEND,direct\nenv = LIBVA_DRIVER_NAME,nvidia\nenv = __GLX_VENDOR_LIBRARY_NAME,nvidia\nEOF\n  elif [[ $GPU_ARCH = \"maxwell_pascal_volta\" ]]; then\n    # Maxwell/Pascal/Volta (GTX 9xx/10xx, GT 10xx, Quadro P/M/GV, MX series, Titan X/Xp/V) lack GSP firmware\n    cat >>\"$HOME/.config/hypr/envs.conf\" <<'EOF'\n\n# NVIDIA (Maxwell/Pascal/Volta without GSP firmware)\nenv = NVD_BACKEND,egl\nenv = __GLX_VENDOR_LIBRARY_NAME,nvidia\nEOF\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/printer.sh",
    "content": "chrootable_systemctl_enable cups.service\n\n# Disable multicast dns in resolved. Avahi will provide this for better network printer discovery\nsudo mkdir -p /etc/systemd/resolved.conf.d\necho -e \"[Resolve]\\nMulticastDNS=no\" | sudo tee /etc/systemd/resolved.conf.d/10-disable-multicast.conf\nchrootable_systemctl_enable avahi-daemon.service\n\n# Enable mDNS resolution for .local domains\nsudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns/' /etc/nsswitch.conf\n\n# Enable automatically adding remote printers\nif ! grep -q '^CreateRemotePrinters Yes' /etc/cups/cups-browsed.conf; then\n  echo 'CreateRemotePrinters Yes' | sudo tee -a /etc/cups/cups-browsed.conf\nfi\n\nchrootable_systemctl_enable cups-browsed.service\n"
  },
  {
    "path": "install/config/hardware/set-wireless-regdom.sh",
    "content": "# First check that wireless-regdb is there\nif [[ -f \"/etc/conf.d/wireless-regdom\" ]]; then\n  unset WIRELESS_REGDOM\n  . /etc/conf.d/wireless-regdom\nfi\n\n# If the region is already set, we're done\nif [[ ! -n ${WIRELESS_REGDOM} ]]; then\n  # Get the current timezone\n  if [[ -e \"/etc/localtime\" ]]; then\n    TIMEZONE=$(readlink -f /etc/localtime)\n    TIMEZONE=${TIMEZONE#/usr/share/zoneinfo/}\n\n    # Some timezones are formatted with the two letter country code at the start\n    COUNTRY=\"${TIMEZONE%%/*}\"\n\n    # If we don't have a two letter country, get it from the timezone table\n    if [[ ! $COUNTRY =~ ^[A-Z]{2}$ ]] && [[ -f /usr/share/zoneinfo/zone.tab ]]; then\n      COUNTRY=$(awk -v tz=\"$TIMEZONE\" '$3 == tz {print $1; exit}' /usr/share/zoneinfo/zone.tab)\n    fi\n\n    # Check if we have a two letter country code\n    if [[ $COUNTRY =~ ^[A-Z]{2}$ ]]; then\n      # Append it to the wireless-regdom conf file that is used at boot\n      echo \"WIRELESS_REGDOM=\\\"$COUNTRY\\\"\" | sudo tee -a /etc/conf.d/wireless-regdom >/dev/null\n\n      # Also set it one off now\n      if command -v iw &>/dev/null; then\n        sudo iw reg set ${COUNTRY}\n      fi\n    fi\n  fi\nfi\n"
  },
  {
    "path": "install/config/hardware/usb-autosuspend.sh",
    "content": "# Disable USB autosuspend to prevent peripheral disconnection issues\nif [[ ! -f /etc/modprobe.d/disable-usb-autosuspend.conf ]]; then\n  echo \"options usbcore autosuspend=-1\" | sudo tee /etc/modprobe.d/disable-usb-autosuspend.conf\nfi\n\n"
  },
  {
    "path": "install/config/hardware/vulkan.sh",
    "content": "# Install Vulkan drivers matching detected GPU hardware\n# (NVIDIA Vulkan is handled by nvidia.sh via nvidia-utils)\n\ndeclare -A VULKAN_DRIVERS=(\n  [Intel]=vulkan-intel\n  [AMD]=vulkan-radeon\n  [Apple]=vulkan-asahi\n)\n\nPACKAGES=()\n\nfor vendor in \"${!VULKAN_DRIVERS[@]}\"; do\n  if lspci | grep -iE \"(VGA|Display).*$vendor\" > /dev/null; then\n    PACKAGES+=(\"${VULKAN_DRIVERS[$vendor]}\")\n  fi\ndone\n\nif (( ${#PACKAGES[@]} > 0 )); then\n  omarchy-pkg-add \"${PACKAGES[@]}\"\nfi\n"
  },
  {
    "path": "install/config/increase-file-watchers.sh",
    "content": "# Increase inotify file watchers for VS Code, webpack, and other dev tools (default 8192 is too low)\necho \"fs.inotify.max_user_watches=524288\" | sudo tee /etc/sysctl.d/90-omarchy-file-watchers.conf >/dev/null\nsudo sysctl --system >/dev/null 2>&1\n"
  },
  {
    "path": "install/config/increase-lockout-limit.sh",
    "content": "# Increase lockout limit to 10 and decrease timeout to 2 minutes\nsudo sed -i 's|^\\(auth\\s\\+required\\s\\+pam_faillock.so\\)\\s\\+preauth.*$|\\1 preauth silent deny=10 unlock_time=120|' \"/etc/pam.d/system-auth\"\nsudo sed -i 's|^\\(auth\\s\\+\\[default=die\\]\\s\\+pam_faillock.so\\)\\s\\+authfail.*$|\\1 authfail deny=10 unlock_time=120|' \"/etc/pam.d/system-auth\"\n\n# Ensure lockout limit is reset on restart\nsudo sed -i '/pam_faillock\\.so preauth/d' /etc/pam.d/sddm-autologin\nsudo sed -i '/auth.*pam_permit\\.so/a auth        required    pam_faillock.so authsucc' /etc/pam.d/sddm-autologin\n"
  },
  {
    "path": "install/config/increase-sudo-tries.sh",
    "content": "# Give the user 10 instead of 3 tries to fat finger their password before lockout\necho \"Defaults passwd_tries=10\" | sudo tee /etc/sudoers.d/passwd-tries\nsudo chmod 440 /etc/sudoers.d/passwd-tries\n\n# Set for hyprlock too\nsudo sed -i 's/^# *deny = .*/deny = 10/' /etc/security/faillock.conf\n"
  },
  {
    "path": "install/config/input-group.sh",
    "content": "# Give this user privileged input access for dictation tools + xbox controllers to work\nsudo usermod -aG input ${USER}\n"
  },
  {
    "path": "install/config/kernel-modules-hook.sh",
    "content": "chrootable_systemctl_enable linux-modules-cleanup.service\n"
  },
  {
    "path": "install/config/localdb.sh",
    "content": "# Update localdb so that locate will find everything installed\nsudo updatedb\n"
  },
  {
    "path": "install/config/mimetypes.sh",
    "content": "omarchy-refresh-applications\nupdate-desktop-database ~/.local/share/applications\n\n# Open directories in file manager\nxdg-mime default org.gnome.Nautilus.desktop inode/directory\n\n# Open all images with imv\nxdg-mime default imv.desktop image/png\nxdg-mime default imv.desktop image/jpeg\nxdg-mime default imv.desktop image/gif\nxdg-mime default imv.desktop image/webp\nxdg-mime default imv.desktop image/bmp\nxdg-mime default imv.desktop image/tiff\n\n# Open PDFs with the Document Viewer\nxdg-mime default org.gnome.Evince.desktop application/pdf\n\n# Use Chromium as the default browser\nxdg-settings set default-web-browser chromium.desktop\nxdg-mime default chromium.desktop x-scheme-handler/http\nxdg-mime default chromium.desktop x-scheme-handler/https\n\n# Open video files with mpv\nxdg-mime default mpv.desktop video/mp4\nxdg-mime default mpv.desktop video/x-msvideo\nxdg-mime default mpv.desktop video/x-matroska\nxdg-mime default mpv.desktop video/x-flv\nxdg-mime default mpv.desktop video/x-ms-wmv\nxdg-mime default mpv.desktop video/mpeg\nxdg-mime default mpv.desktop video/ogg\nxdg-mime default mpv.desktop video/webm\nxdg-mime default mpv.desktop video/quicktime\nxdg-mime default mpv.desktop video/3gpp\nxdg-mime default mpv.desktop video/3gpp2\nxdg-mime default mpv.desktop video/x-ms-asf\nxdg-mime default mpv.desktop video/x-ogm+ogg\nxdg-mime default mpv.desktop video/x-theora+ogg\nxdg-mime default mpv.desktop application/ogg\n\n# Use Hey for mailto: links\nxdg-mime default HEY.desktop x-scheme-handler/mailto\n\n# Open text files with nvim\nxdg-mime default nvim.desktop text/plain\nxdg-mime default nvim.desktop text/english\nxdg-mime default nvim.desktop text/x-makefile\nxdg-mime default nvim.desktop text/x-c++hdr\nxdg-mime default nvim.desktop text/x-c++src\nxdg-mime default nvim.desktop text/x-chdr\nxdg-mime default nvim.desktop text/x-csrc\nxdg-mime default nvim.desktop text/x-java\nxdg-mime default nvim.desktop text/x-moc\nxdg-mime default nvim.desktop text/x-pascal\nxdg-mime default nvim.desktop text/x-tcl\nxdg-mime default nvim.desktop text/x-tex\nxdg-mime default nvim.desktop application/x-shellscript\nxdg-mime default nvim.desktop text/x-c\nxdg-mime default nvim.desktop text/x-c++\nxdg-mime default nvim.desktop application/xml\nxdg-mime default nvim.desktop text/xml\n"
  },
  {
    "path": "install/config/mise-work.sh",
    "content": "# Setup default work directory (and tries)\nmkdir -p \"$HOME/Work\"\nmkdir -p \"$HOME/Work/tries\"\n\n# Add ./bin to path for all items in ~/Work\ncat >\"$HOME/Work/.mise.toml\" <<'EOF'\n[env]\n_.path = \"{{ cwd }}/bin\"\nEOF\n\nmise trust ~/Work/.mise.toml\n\nif [[ -n ${OMARCHY_CHROOT_INSTALL:-} ]]; then\n  NODE_TARBALL=$(find /opt/packages -name \"node-v*-linux-x64.tar.gz\" -type f 2>/dev/null | head -n1)\n\n  NODE_VERSION=$(basename \"$NODE_TARBALL\" | sed 's/node-v\\(.*\\)-linux-x64.tar.gz/\\1/')\n  NODE_INSTALL_DIR=\"$HOME/.local/share/mise/installs/node/$NODE_VERSION\"\n\n  mkdir -p \"$NODE_INSTALL_DIR\"\n  tar -xzf \"$NODE_TARBALL\" \\\n      --strip-components=1 \\\n      -C \"$NODE_INSTALL_DIR\"\n\n  mise use -g node@\"$NODE_VERSION\"\nelse\n  mise use -g node@latest\nfi\n"
  },
  {
    "path": "install/config/omarchy-ai-skill.sh",
    "content": "# Place in ~/.claude/skills since all tools populate from there as well as their own sources\nmkdir -p ~/.claude/skills\nln -s $OMARCHY_PATH/default/omarchy-skill ~/.claude/skills/omarchy\n"
  },
  {
    "path": "install/config/plocate-ac-only.sh",
    "content": "sudo install -d /etc/systemd/system/plocate-updatedb.service.d\nprintf '%s\\n' '[Unit]' 'ConditionACPower=true' | sudo tee /etc/systemd/system/plocate-updatedb.service.d/ac-only.conf >/dev/null\nsudo systemctl daemon-reload\n"
  },
  {
    "path": "install/config/powerprofilesctl-rules.sh",
    "content": "if omarchy-battery-present; then\n  mapfile -t profiles < <(omarchy-powerprofiles-list)\n\n  if (( ${#profiles[@]} > 1 )); then\n\n    # Default AC profile:\n    # 3 profiles → performance\n    # 2 profiles → balanced\n    ac_profile=\"${profiles[2]:-${profiles[1]}}\"\n\n    # Default Battery profile (balanced)\n    battery_profile=\"${profiles[1]}\"\n\n    cat <<EOF | sudo tee \"/etc/udev/rules.d/99-power-profile.rules\"\nSUBSYSTEM==\"power_supply\", ATTR{type}==\"Mains\", ATTR{online}==\"0\", RUN+=\"/usr/bin/powerprofilesctl set $battery_profile\"\nSUBSYSTEM==\"power_supply\", ATTR{type}==\"Mains\", ATTR{online}==\"1\", RUN+=\"/usr/bin/powerprofilesctl set $ac_profile\"\nEOF\n\n    sudo udevadm control --reload\n    sudo udevadm trigger --subsystem-match=power_supply\n  fi\nfi\n"
  },
  {
    "path": "install/config/remove-fcitx5-autostart.sh",
    "content": "sudo rm -f /etc/xdg/autostart/org.fcitx.Fcitx5.desktop\n"
  },
  {
    "path": "install/config/ssh-flakiness.sh",
    "content": "# Solve common flakiness with SSH\necho \"net.ipv4.tcp_mtu_probing=1\" | sudo tee -a /etc/sysctl.d/99-sysctl.conf\n"
  },
  {
    "path": "install/config/sudoless-asdcontrol.sh",
    "content": "# Setup sudo-less controls for controlling brightness on Apple Displays\necho \"$USER ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol\" | sudo tee /etc/sudoers.d/asdcontrol\nsudo chmod 440 /etc/sudoers.d/asdcontrol\n"
  },
  {
    "path": "install/config/theme.sh",
    "content": "# Set links for Nautilus action icons\nsudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-previous-symbolic.svg /usr/share/icons/Yaru/scalable/actions/go-previous-symbolic.svg\nsudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-next-symbolic.svg /usr/share/icons/Yaru/scalable/actions/go-next-symbolic.svg\n\n# Setup user theme folder\nmkdir -p ~/.config/omarchy/themes\n\n# Set initial theme\nomarchy-theme-set \"Tokyo Night\"\nrm -rf ~/.config/chromium/SingletonLock # otherwise archiso will own the chromium singleton\n\n# Set specific app links for current theme\nmkdir -p ~/.config/btop/themes\nln -snf ~/.config/omarchy/current/theme/btop.theme ~/.config/btop/themes/current.theme\n\nmkdir -p ~/.config/mako\nln -snf ~/.config/omarchy/current/theme/mako.ini ~/.config/mako/config\n\n# Add managed policy directories for Chromium and Brave for theme changes\nsudo mkdir -p /etc/chromium/policies/managed\nsudo chmod a+rw /etc/chromium/policies/managed\n\nsudo mkdir -p /etc/brave/policies/managed\nsudo chmod a+rw /etc/brave/policies/managed\n"
  },
  {
    "path": "install/config/timezones.sh",
    "content": "# Ensure timezone can be updated without needing to sudo\nsudo tee /etc/sudoers.d/omarchy-tzupdate >/dev/null <<EOF\n%wheel ALL=(root) NOPASSWD: /usr/bin/tzupdate, /usr/bin/timedatectl\nEOF\nsudo chmod 0440 /etc/sudoers.d/omarchy-tzupdate\n"
  },
  {
    "path": "install/config/unmount-fuse.sh",
    "content": "sudo mkdir -p /usr/lib/systemd/system-sleep\nsudo install -m 0755 -o root -g root \"$OMARCHY_PATH/default/systemd/system-sleep/unmount-fuse\" /usr/lib/systemd/system-sleep/\n"
  },
  {
    "path": "install/config/walker-elephant.sh",
    "content": "#!/bin/bash\n\n# Ensure Walker service is started automatically on boot\nmkdir -p ~/.config/autostart/\ncp $OMARCHY_PATH/default/walker/walker.desktop ~/.config/autostart/\n\n# And is restarted if it crashes or is killed\nmkdir -p ~/.config/systemd/user/app-walker@autostart.service.d/\ncp $OMARCHY_PATH/default/walker/restart.conf ~/.config/systemd/user/app-walker@autostart.service.d/restart.conf\n\n# Create pacman hook to restart walker after updates\nsudo mkdir -p /etc/pacman.d/hooks\nsudo tee /etc/pacman.d/hooks/walker-restart.hook > /dev/null << EOF\n[Trigger]\nType = Package\nOperation = Upgrade\nTarget = walker\nTarget = walker-debug\nTarget = elephant*\n\n[Action]\nDescription = Restarting Walker services after system update\nWhen = PostTransaction\nExec = $OMARCHY_PATH/bin/omarchy-restart-walker\nEOF\n\n# Link the visual theme menu config\nmkdir -p ~/.config/elephant/menus\nln -snf $OMARCHY_PATH/default/elephant/omarchy_themes.lua ~/.config/elephant/menus/omarchy_themes.lua\nln -snf $OMARCHY_PATH/default/elephant/omarchy_background_selector.lua ~/.config/elephant/menus/omarchy_background_selector.lua\n"
  },
  {
    "path": "install/config/wifi-powersave-rules.sh",
    "content": "if omarchy-battery-present; then\n  cat <<EOF | sudo tee \"/etc/udev/rules.d/99-wifi-powersave.rules\"\nSUBSYSTEM==\"power_supply\", ATTR{type}==\"Mains\", ATTR{online}==\"0\", RUN+=\"$HOME/.local/share/omarchy/bin/omarchy-wifi-powersave on\"\nSUBSYSTEM==\"power_supply\", ATTR{type}==\"Mains\", ATTR{online}==\"1\", RUN+=\"$HOME/.local/share/omarchy/bin/omarchy-wifi-powersave off\"\nEOF\n\n  sudo udevadm control --reload\n  sudo udevadm trigger --subsystem-match=power_supply\nfi\n"
  },
  {
    "path": "install/config/xcompose.sh",
    "content": "# Set default XCompose that is triggered with CapsLock\ntee ~/.XCompose >/dev/null <<EOF\n# Run omarchy-restart-xcompose to apply changes\n\n# Include fast emoji access\ninclude \"%H/.local/share/omarchy/default/xcompose\"\n\n# Identification\n<Multi_key> <space> <n> : \"$OMARCHY_USER_NAME\"\n<Multi_key> <space> <e> : \"$OMARCHY_USER_EMAIL\"\nEOF\n"
  },
  {
    "path": "install/first-run/battery-monitor.sh",
    "content": "if omarchy-battery-present; then\n  powerprofilesctl set balanced || true\n\n  # Enable battery monitoring timer for low battery notifications\n  systemctl --user enable --now omarchy-battery-monitor.timer\nelse\n  powerprofilesctl set performance || true\nfi\n"
  },
  {
    "path": "install/first-run/cleanup-reboot-sudoers.sh",
    "content": "if sudo test -f /etc/sudoers.d/99-omarchy-installer-reboot; then\n  sudo rm -f /etc/sudoers.d/99-omarchy-installer-reboot\nfi\n"
  },
  {
    "path": "install/first-run/dns-resolver.sh",
    "content": "# https://wiki.archlinux.org/title/Systemd-resolved\necho \"Symlink resolved stub-resolv to /etc/resolv.conf\"\n\nsudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf\n"
  },
  {
    "path": "install/first-run/elephant.sh",
    "content": "elephant service enable\nsystemctl --user start elephant.service\n"
  },
  {
    "path": "install/first-run/firewall.sh",
    "content": "# Allow nothing in, everything out\nsudo ufw default deny incoming\nsudo ufw default allow outgoing\n\n# Allow ports for LocalSend\nsudo ufw allow 53317/udp\nsudo ufw allow 53317/tcp\n\n# Allow Docker containers to use DNS on host\nsudo ufw allow in proto udp from 172.16.0.0/12 to 172.17.0.1 port 53 comment 'allow-docker-dns'\n\n# Turn on the firewall\nsudo ufw --force enable\n\n# Enable UFW systemd service to start on boot\nsudo systemctl enable ufw\n\n# Turn on Docker protections\nsudo ufw-docker install\nsudo ufw reload\n"
  },
  {
    "path": "install/first-run/gnome-theme.sh",
    "content": "gsettings set org.gnome.desktop.interface gtk-theme \"Adwaita-dark\"\ngsettings set org.gnome.desktop.interface color-scheme \"prefer-dark\"\ngsettings set org.gnome.desktop.interface icon-theme \"Yaru-blue\"\n\nsudo gtk-update-icon-cache /usr/share/icons/Yaru\n"
  },
  {
    "path": "install/first-run/welcome.sh",
    "content": "notify-send \"    Learn Keybindings\" \"Super + K for cheatsheet.\\nSuper + Space for application launcher.\\nSuper + Alt + Space for Omarchy Menu.\" -u critical\n"
  },
  {
    "path": "install/first-run/wifi.sh",
    "content": "if ! ping -c3 -W1 1.1.1.1 >/dev/null 2>&1; then\n  notify-send \"    Update System\" \"When you have internet, click to update the system.\" -u critical\n  notify-send \"󰖩    Click to Setup Wi-Fi\" \"Tab to navigate, Space to select, ? for help.\" -u critical\nelse\n  notify-send \"    Update System\" \"Click to update the system.\" -u critical\nfi\n"
  },
  {
    "path": "install/helpers/all.sh",
    "content": "source $OMARCHY_INSTALL/helpers/chroot.sh\nsource $OMARCHY_INSTALL/helpers/presentation.sh\nsource $OMARCHY_INSTALL/helpers/errors.sh\nsource $OMARCHY_INSTALL/helpers/logging.sh\n"
  },
  {
    "path": "install/helpers/chroot.sh",
    "content": "# Starting the installer with OMARCHY_CHROOT_INSTALL=1 will put it into chroot mode\nchrootable_systemctl_enable() {\n  if [[ -n ${OMARCHY_CHROOT_INSTALL:-} ]]; then\n    sudo systemctl enable $1\n  else\n    sudo systemctl enable --now $1\n  fi\n}\n\n# Export the function so it's available in subshells\nexport -f chrootable_systemctl_enable\n"
  },
  {
    "path": "install/helpers/errors.sh",
    "content": "# Directs user to Omarchy Discord\nQR_CODE='\n█▀▀▀▀▀█ ▄ ▄ ▀▄▄▄█ █▀▀▀▀▀█\n█ ███ █ ▄▄▄▄▀▄▀▄▀ █ ███ █\n█ ▀▀▀ █ ▄█  ▄█▄▄▀ █ ▀▀▀ █\n▀▀▀▀▀▀▀ ▀▄█ █ █ █ ▀▀▀▀▀▀▀\n▀▀█▀▀▄▀▀▀▀▄█▀▀█  ▀ █ ▀ █\n█▄█ ▄▄▀▄▄ ▀ ▄ ▀█▄▄▄▄ ▀ ▀█\n▄ ▄▀█ ▀▄▀▀▀▄ ▄█▀▄█▀▄▀▄▀█▀\n█ ▄▄█▄▀▄█ ▄▄▄  ▀ ▄▀██▀ ▀█\n▀ ▀   ▀ █ ▀▄  ▀▀█▀▀▀█▄▀\n█▀▀▀▀▀█ ▀█  ▄▀▀ █ ▀ █▄▀██\n█ ███ █ █▀▄▄▀ █▀███▀█▄██▄\n█ ▀▀▀ █ ██  ▀ █▄█ ▄▄▄█▀ █\n▀▀▀▀▀▀▀ ▀ ▀ ▀▀▀  ▀ ▀▀▀▀▀▀'\n\n# Track if we're already handling an error to prevent double-trapping\nERROR_HANDLING=false\n\n# Cursor is usually hidden while we install\nshow_cursor() {\n  printf \"\\033[?25h\"\n}\n\n# Display truncated log lines from the install log\nshow_log_tail() {\n  if [[ -f $OMARCHY_INSTALL_LOG_FILE ]]; then\n    local log_lines=$((TERM_HEIGHT - LOGO_HEIGHT - 35))\n    local max_line_width=$((LOGO_WIDTH - 4))\n\n    tail -n $log_lines \"$OMARCHY_INSTALL_LOG_FILE\" | while IFS= read -r line; do\n      if ((${#line} > max_line_width)); then\n        local truncated_line=\"${line:0:$max_line_width}...\"\n      else\n        local truncated_line=\"$line\"\n      fi\n\n      gum style \"$truncated_line\"\n    done\n\n    echo\n  fi\n}\n\n# Display the failed command or script name\nshow_failed_script_or_command() {\n  if [[ -n ${CURRENT_SCRIPT:-} ]]; then\n    gum style \"Failed script: $CURRENT_SCRIPT\"\n  else\n    # Truncate long command lines to fit the display\n    local cmd=\"$BASH_COMMAND\"\n    local max_cmd_width=$((LOGO_WIDTH - 4))\n\n    if ((${#cmd} > max_cmd_width)); then\n      cmd=\"${cmd:0:$max_cmd_width}...\"\n    fi\n\n    gum style \"$cmd\"\n  fi\n}\n\n# Save original stdout and stderr for trap to use\nsave_original_outputs() {\n  exec 3>&1 4>&2\n}\n\n# Restore stdout and stderr to original (saved in FD 3 and 4)\n# This ensures output goes to screen, not log file\nrestore_outputs() {\n  if [[ -e /proc/self/fd/3 ]] && [[ -e /proc/self/fd/4 ]]; then\n    exec 1>&3 2>&4\n  fi\n}\n\n# Error handler\ncatch_errors() {\n  # Prevent recursive error handling\n  if [[ $ERROR_HANDLING == \"true\" ]]; then\n    return\n  else\n    ERROR_HANDLING=true\n  fi\n\n  # Store exit code immediately before it gets overwritten\n  local exit_code=$?\n\n  stop_log_output\n  restore_outputs\n\n  clear_logo\n  show_cursor\n\n  gum style --foreground 1 --padding \"1 0 1 $PADDING_LEFT\" \"Omarchy installation stopped!\"\n  show_log_tail\n\n  gum style \"This command halted with exit code $exit_code:\"\n  show_failed_script_or_command\n\n  gum style \"$QR_CODE\"\n  echo\n  gum style \"Get help from the community via QR code or at https://discord.gg/tXFUdasqhY\"\n\n  # Offer options menu\n  while true; do\n    options=()\n\n    # If online install, show retry first\n    if [[ -n ${OMARCHY_ONLINE_INSTALL:-} ]]; then\n      options+=(\"Retry installation\")\n    fi\n\n    # Add upload option if internet is available\n    if ping -c 1 -W 1 1.1.1.1 >/dev/null 2>&1; then\n      options+=(\"Upload log for support\")\n    fi\n\n    # Add remaining options\n    options+=(\"View full log\")\n    options+=(\"Exit\")\n\n    choice=$(gum choose \"${options[@]}\" --header \"What would you like to do?\" --height 6 --padding \"1 $PADDING_LEFT\")\n\n    case \"$choice\" in\n    \"Retry installation\")\n      bash ~/.local/share/omarchy/install.sh\n      break\n      ;;\n    \"View full log\")\n      if command -v less &>/dev/null; then\n        less \"$OMARCHY_INSTALL_LOG_FILE\"\n      else\n        tail \"$OMARCHY_INSTALL_LOG_FILE\"\n      fi\n      ;;\n    \"Upload log for support\")\n      omarchy-upload-log\n      ;;\n    \"Exit\" | \"\")\n      exit 1\n      ;;\n    esac\n  done\n}\n\n# Exit handler - ensures cleanup happens on any exit\nexit_handler() {\n  local exit_code=$?\n\n  # Only run if we're exiting with an error and haven't already handled it\n  if (( exit_code != 0 )) && [[ $ERROR_HANDLING != \"true\" ]]; then\n    catch_errors\n  else\n    stop_log_output\n    show_cursor\n  fi\n}\n\n# Set up traps\ntrap catch_errors ERR INT TERM\ntrap exit_handler EXIT\n\n# Save original outputs in case we trap\nsave_original_outputs\n"
  },
  {
    "path": "install/helpers/logging.sh",
    "content": "start_log_output() {\n  local ANSI_SAVE_CURSOR=\"\\033[s\"\n  local ANSI_RESTORE_CURSOR=\"\\033[u\"\n  local ANSI_CLEAR_LINE=\"\\033[2K\"\n  local ANSI_HIDE_CURSOR=\"\\033[?25l\"\n  local ANSI_RESET=\"\\033[0m\"\n  local ANSI_GRAY=\"\\033[90m\"\n\n  # Save cursor position and hide cursor\n  printf $ANSI_SAVE_CURSOR\n  printf $ANSI_HIDE_CURSOR\n\n  (\n    local log_lines=20\n    local max_line_width=$((LOGO_WIDTH - 4))\n\n    while true; do\n      # Read the last N lines into an array\n      mapfile -t current_lines < <(tail -n $log_lines \"$OMARCHY_INSTALL_LOG_FILE\" 2>/dev/null)\n\n      # Build complete output buffer with escape sequences\n      output=\"\"\n      for ((i = 0; i < log_lines; i++)); do\n        line=\"${current_lines[i]:-}\"\n\n        # Truncate if needed\n        if (( ${#line} > max_line_width )); then\n          line=\"${line:0:$max_line_width}...\"\n        fi\n\n        # Add clear line escape and formatted output for each line\n        if [[ -n $line ]]; then\n          output+=\"${ANSI_CLEAR_LINE}${ANSI_GRAY}${PADDING_LEFT_SPACES}  → ${line}${ANSI_RESET}\\n\"\n        else\n          output+=\"${ANSI_CLEAR_LINE}${PADDING_LEFT_SPACES}\\n\"\n        fi\n      done\n\n      printf \"${ANSI_RESTORE_CURSOR}%b\" \"$output\"\n\n      sleep 0.1\n    done\n  ) &\n  monitor_pid=$!\n}\n\nstop_log_output() {\n  if [[ -n ${monitor_pid:-} ]]; then\n    kill $monitor_pid 2>/dev/null || true\n    wait $monitor_pid 2>/dev/null || true\n    unset monitor_pid\n  fi\n}\n\nstart_install_log() {\n  sudo touch \"$OMARCHY_INSTALL_LOG_FILE\"\n  sudo chmod 666 \"$OMARCHY_INSTALL_LOG_FILE\"\n\n  export OMARCHY_START_TIME=$(date '+%Y-%m-%d %H:%M:%S')\n\n  echo \"=== Omarchy Installation Started: $OMARCHY_START_TIME ===\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n  start_log_output\n}\n\nstop_install_log() {\n  stop_log_output\n  show_cursor\n\n  if [[ -n ${OMARCHY_INSTALL_LOG_FILE:-} ]]; then\n    OMARCHY_END_TIME=$(date '+%Y-%m-%d %H:%M:%S')\n    echo \"=== Omarchy Installation Completed: $OMARCHY_END_TIME ===\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n    echo \"\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n    echo \"=== Installation Time Summary ===\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n\n    if [[ -f \"/var/log/archinstall/install.log\" ]]; then\n      ARCHINSTALL_START=$(grep -m1 '^\\[' /var/log/archinstall/install.log 2>/dev/null | sed 's/^\\[\\([^]]*\\)\\].*/\\1/' || true)\n      ARCHINSTALL_END=$(grep 'Installation completed without any errors' /var/log/archinstall/install.log 2>/dev/null | sed 's/^\\[\\([^]]*\\)\\].*/\\1/' || true)\n\n      if [[ -n $ARCHINSTALL_START ]] && [[ -n $ARCHINSTALL_END ]]; then\n        ARCH_START_EPOCH=$(date -d \"$ARCHINSTALL_START\" +%s)\n        ARCH_END_EPOCH=$(date -d \"$ARCHINSTALL_END\" +%s)\n        ARCH_DURATION=$((ARCH_END_EPOCH - ARCH_START_EPOCH))\n\n        ARCH_MINS=$((ARCH_DURATION / 60))\n        ARCH_SECS=$((ARCH_DURATION % 60))\n\n        echo \"Archinstall: ${ARCH_MINS}m ${ARCH_SECS}s\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n      fi\n    fi\n\n    if [[ -n $OMARCHY_START_TIME ]]; then\n      OMARCHY_START_EPOCH=$(date -d \"$OMARCHY_START_TIME\" +%s)\n      OMARCHY_END_EPOCH=$(date -d \"$OMARCHY_END_TIME\" +%s)\n      OMARCHY_DURATION=$((OMARCHY_END_EPOCH - OMARCHY_START_EPOCH))\n\n      OMARCHY_MINS=$((OMARCHY_DURATION / 60))\n      OMARCHY_SECS=$((OMARCHY_DURATION % 60))\n\n      echo \"Omarchy:     ${OMARCHY_MINS}m ${OMARCHY_SECS}s\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n\n      if [[ -n $ARCH_DURATION ]]; then\n        TOTAL_DURATION=$((ARCH_DURATION + OMARCHY_DURATION))\n        TOTAL_MINS=$((TOTAL_DURATION / 60))\n        TOTAL_SECS=$((TOTAL_DURATION % 60))\n        echo \"Total:       ${TOTAL_MINS}m ${TOTAL_SECS}s\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n      fi\n    fi\n    echo \"=================================\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n\n    echo \"Rebooting system...\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n  fi\n}\n\nrun_logged() {\n  local script=\"$1\"\n\n  export CURRENT_SCRIPT=\"$script\"\n\n  echo \"[$(date '+%Y-%m-%d %H:%M:%S')] Starting: $script\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n\n  # Use bash -c to create a clean subshell\n  bash -c \"source '$script'\" </dev/null >>\"$OMARCHY_INSTALL_LOG_FILE\" 2>&1\n\n  local exit_code=$?\n\n  if (( exit_code == 0 )); then\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] Completed: $script\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n    unset CURRENT_SCRIPT\n  else\n    echo \"[$(date '+%Y-%m-%d %H:%M:%S')] Failed: $script (exit code: $exit_code)\" >>\"$OMARCHY_INSTALL_LOG_FILE\"\n  fi\n\n  return $exit_code\n}\n"
  },
  {
    "path": "install/helpers/presentation.sh",
    "content": "# Ensure we have gum available\nif ! command -v gum &>/dev/null; then\n  omarchy-pkg-add gum\nfi\n\n# Get terminal size from /dev/tty (works in all scenarios: direct, sourced, or piped)\nif [[ -e /dev/tty ]]; then\n  TERM_SIZE=$(stty size 2>/dev/null </dev/tty)\n\n  if [[ -n $TERM_SIZE ]]; then\n    export TERM_HEIGHT=$(echo \"$TERM_SIZE\" | cut -d' ' -f1)\n    export TERM_WIDTH=$(echo \"$TERM_SIZE\" | cut -d' ' -f2)\n  else\n    # Fallback to reasonable defaults if stty fails\n    export TERM_WIDTH=80\n    export TERM_HEIGHT=24\n  fi\nelse\n  # No terminal available (e.g., non-interactive environment)\n  export TERM_WIDTH=80\n  export TERM_HEIGHT=24\nfi\n\nexport LOGO_PATH=\"$OMARCHY_PATH/logo.txt\"\nexport LOGO_WIDTH=$(awk '{ if (length > max) max = length } END { print max+0 }' \"$LOGO_PATH\" 2>/dev/null || echo 0)\nexport LOGO_HEIGHT=$(wc -l <\"$LOGO_PATH\" 2>/dev/null || echo 0)\n\nexport PADDING_LEFT=$(((TERM_WIDTH - LOGO_WIDTH) / 2))\nexport PADDING_LEFT_SPACES=$(printf \"%*s\" $PADDING_LEFT \"\")\n\n# Tokyo Night theme for gum confirm\nexport GUM_CONFIRM_PROMPT_FOREGROUND=\"6\"     # Cyan for prompt\nexport GUM_CONFIRM_SELECTED_FOREGROUND=\"0\"   # Black text on selected\nexport GUM_CONFIRM_SELECTED_BACKGROUND=\"2\"   # Green background for selected\nexport GUM_CONFIRM_UNSELECTED_FOREGROUND=\"7\" # White for unselected\nexport GUM_CONFIRM_UNSELECTED_BACKGROUND=\"0\" # Black background for unselected\nexport PADDING=\"0 0 0 $PADDING_LEFT\"         # Gum Style\nexport GUM_CHOOSE_PADDING=\"$PADDING\"\nexport GUM_FILTER_PADDING=\"$PADDING\"\nexport GUM_INPUT_PADDING=\"$PADDING\"\nexport GUM_SPIN_PADDING=\"$PADDING\"\nexport GUM_TABLE_PADDING=\"$PADDING\"\nexport GUM_CONFIRM_PADDING=\"$PADDING\"\n\nclear_logo() {\n  printf \"\\033[H\\033[2J\" # Clear screen and move cursor to top-left\n  gum style --foreground 2 --padding \"1 0 0 $PADDING_LEFT\" \"$(<\"$LOGO_PATH\")\"\n}\n"
  },
  {
    "path": "install/login/all.sh",
    "content": "run_logged $OMARCHY_INSTALL/login/plymouth.sh\nrun_logged $OMARCHY_INSTALL/login/default-keyring.sh\nrun_logged $OMARCHY_INSTALL/login/sddm.sh\nrun_logged $OMARCHY_INSTALL/login/limine-snapper.sh\n"
  },
  {
    "path": "install/login/default-keyring.sh",
    "content": "KEYRING_DIR=\"$HOME/.local/share/keyrings\"\nKEYRING_FILE=\"$KEYRING_DIR/Default_keyring.keyring\"\nDEFAULT_FILE=\"$KEYRING_DIR/default\"\n\nmkdir -p \"$KEYRING_DIR\"\n\ncat << EOF > \"$KEYRING_FILE\"\n[keyring]\ndisplay-name=Default keyring\nctime=$(date +%s)\nmtime=0\nlock-on-idle=false\nlock-after=false\nEOF\n\ncat << EOF > \"$DEFAULT_FILE\"\nDefault_keyring\nEOF\n\nchmod 700 \"$KEYRING_DIR\"\nchmod 600 \"$KEYRING_FILE\"\nchmod 644 \"$DEFAULT_FILE\"\n"
  },
  {
    "path": "install/login/limine-snapper.sh",
    "content": "if command -v limine &>/dev/null; then\n  sudo pacman -S --noconfirm --needed limine-snapper-sync limine-mkinitcpio-hook\n\n  sudo tee /etc/mkinitcpio.conf.d/omarchy_hooks.conf <<EOF >/dev/null\nHOOKS=(base udev plymouth keyboard autodetect microcode modconf kms keymap consolefont block encrypt filesystems fsck btrfs-overlayfs)\nEOF\n  sudo tee /etc/mkinitcpio.conf.d/thunderbolt_module.conf <<EOF >/dev/null\nMODULES+=(thunderbolt)\nEOF\n\n  # Detect boot mode\n  [[ -d /sys/firmware/efi ]] && EFI=true\n\n  # Find config location\n  if [[ -f /boot/EFI/arch-limine/limine.conf ]]; then\n    limine_config=\"/boot/EFI/arch-limine/limine.conf\"\n  elif [[ -f /boot/EFI/BOOT/limine.conf ]]; then\n    limine_config=\"/boot/EFI/BOOT/limine.conf\"\n  elif [[ -f /boot/EFI/limine/limine.conf ]]; then\n    limine_config=\"/boot/EFI/limine/limine.conf\"\n  elif [[ -f /boot/limine/limine.conf ]]; then\n    limine_config=\"/boot/limine/limine.conf\"\n  elif [[ -f /boot/limine.conf ]]; then\n    limine_config=\"/boot/limine.conf\"\n  else\n    echo \"Error: Limine config not found\" >&2\n    exit 1\n  fi\n\n  CMDLINE=$(grep \"^[[:space:]]*cmdline:\" \"$limine_config\" | head -1 | sed 's/^[[:space:]]*cmdline:[[:space:]]*//')\n\n  sudo cp $OMARCHY_PATH/default/limine/default.conf /etc/default/limine\n  sudo sed -i \"s|@@CMDLINE@@|$CMDLINE|g\" /etc/default/limine\n\n  # Append any drop-in kernel cmdline configs (from hardware fix scripts, etc.)\n  for dropin in /etc/limine-entry-tool.d/*.conf; do\n    [ -f \"$dropin\" ] && cat \"$dropin\" | sudo tee -a /etc/default/limine >/dev/null\n  done\n\n  # UKI and EFI fallback are EFI only\n  if [[ -z $EFI ]]; then\n    sudo sed -i '/^ENABLE_UKI=/d; /^ENABLE_LIMINE_FALLBACK=/d' /etc/default/limine\n  fi\n\n  # Remove the original config file if it's not /boot/limine.conf\n  if [[ $limine_config != \"/boot/limine.conf\" ]] && [[ -f $limine_config ]]; then\n    sudo rm \"$limine_config\"\n  fi\n\n  # We overwrite the whole thing knowing the limine-update will add the entries for us\n  sudo cp $OMARCHY_PATH/default/limine/limine.conf /boot/limine.conf\n\n  # Match Snapper configs if not installing from the ISO\n  if [[ -z ${OMARCHY_CHROOT_INSTALL:-} ]]; then\n    if ! sudo snapper list-configs 2>/dev/null | grep -q \"root\"; then\n      sudo snapper -c root create-config /\n    fi\n\n    if ! sudo snapper list-configs 2>/dev/null | grep -q \"home\"; then\n      sudo snapper -c home create-config /home\n    fi\n  fi\n\n  # Enable quota to allow space-aware algorithms to work\n  sudo btrfs quota enable /\n\n  # Tweak default Snapper configs\n  sudo sed -i 's/^TIMELINE_CREATE=\"yes\"/TIMELINE_CREATE=\"no\"/' /etc/snapper/configs/{root,home}\n  sudo sed -i 's/^NUMBER_LIMIT=\"50\"/NUMBER_LIMIT=\"5\"/' /etc/snapper/configs/{root,home}\n  sudo sed -i 's/^NUMBER_LIMIT_IMPORTANT=\"10\"/NUMBER_LIMIT_IMPORTANT=\"5\"/' /etc/snapper/configs/{root,home}\n  sudo sed -i 's/^SPACE_LIMIT=\"0.5\"/SPACE_LIMIT=\"0.3\"/' /etc/snapper/configs/{root,home}\n  sudo sed -i 's/^FREE_LIMIT=\"0.2\"/FREE_LIMIT=\"0.3\"/' /etc/snapper/configs/{root,home}\n\n  chrootable_systemctl_enable limine-snapper-sync.service\nfi\n\necho \"Re-enabling mkinitcpio hooks...\"\n\n# Restore the specific mkinitcpio pacman hooks\nif [[ -f /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled ]]; then\n  sudo mv /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled /usr/share/libalpm/hooks/90-mkinitcpio-install.hook\nfi\n\nif [[ -f /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled ]]; then\n  sudo mv /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook\nfi\n\necho \"mkinitcpio hooks re-enabled\"\n\nsudo limine-update\n\n# Verify that limine-update actually added boot entries\nif ! grep -q \"^/+\" /boot/limine.conf; then\n  echo \"Error: limine-update failed to add boot entries to /boot/limine.conf\" >&2\n  exit 1\nfi\n\nif [[ -n $EFI ]] && efibootmgr &>/dev/null; then\n  # Remove the archinstall-created Limine entry\n  while IFS= read -r bootnum; do\n    sudo efibootmgr -b \"$bootnum\" -B >/dev/null 2>&1\n  done < <(efibootmgr | grep -E \"^Boot[0-9]{4}\\*? Arch Linux Limine\" | sed 's/^Boot\\([0-9]\\{4\\}\\).*/\\1/')\nfi\n"
  },
  {
    "path": "install/login/plymouth.sh",
    "content": "if [[ $(plymouth-set-default-theme) != \"omarchy\" ]]; then\n  sudo cp -r \"$HOME/.local/share/omarchy/default/plymouth\" /usr/share/plymouth/themes/omarchy/\n  sudo plymouth-set-default-theme omarchy\nfi\n"
  },
  {
    "path": "install/login/sddm.sh",
    "content": "# Install omarchy SDDM theme\nomarchy-refresh-sddm\n\n# Setup SDDM login service\nsudo mkdir -p /etc/sddm.conf.d\nif [[ ! -f /etc/sddm.conf.d/autologin.conf ]]; then\n  cat <<EOF | sudo tee /etc/sddm.conf.d/autologin.conf\n[Autologin]\nUser=$USER\nSession=hyprland-uwsm\n\n[Theme]\nCurrent=omarchy\nEOF\nfi\n\n# Prevent password-based SDDM logins from creating an encrypted login keyring\n# (which conflicts with the passwordless Default_keyring used for auto-unlock)\nsudo sed -i '/-auth.*pam_gnome_keyring\\.so/d' /etc/pam.d/sddm\nsudo sed -i '/-password.*pam_gnome_keyring\\.so/d' /etc/pam.d/sddm\n\n# Don't use chrootable here as --now will cause issues for manual installs\nsudo systemctl enable sddm.service\n"
  },
  {
    "path": "install/omarchy-base.packages",
    "content": "# Omarchy core package list installed via install/packaging/base.sh\n# This file is also used by the ISO builder when determining needs\n\n1password-beta\n1password-cli\naether\nalacritty\nalsa-utils\nasdcontrol\navahi\nbash-completion\nbat\nbluetui\nbolt\nbrightnessctl\nbtop\nchromium\nclang\ncups\ncups-browsed\ncups-filters\ncups-pdf\ndocker\ndocker-buildx\ndocker-compose\ndotnet-runtime-9.0\ndust\nevince\nexfatprogs\nexpac\neza\nfastfetch\nfcitx5\nfcitx5-gtk\nfcitx5-qt\nfd\nffmpegthumbnailer\nfontconfig\nfzf\ngithub-cli\ngnome-calculator\ngnome-keyring\ngnome-themes-extra\ngrim\ngpu-screen-recorder\ngum\ngvfs-mtp\ngvfs-nfs\ngvfs-smb\nhypridle\nhyprland\nhyprland-guiutils\nhyprland-preview-share-picker\nhyprlock\nhyprpicker\nhyprsunset\nimagemagick\nimpala\nimv\ninetutils\ninxi\niwd\njq\nkdenlive\nkernel-modules-hook\nkvantum-qt5\nlazydocker\nlazygit\nless\nlibsecret\nlibyaml\nlibqalculate\nlibreoffice-fresh\nllvm\nlocalsend\nluarocks\nmako\nman-db\nmariadb-libs\nmise\nmpv\nnautilus\nnautilus-python\ngnome-disk-utility\nnoto-fonts\nnoto-fonts-cjk\nnoto-fonts-emoji\nnss-mdns\nnvim\nobs-studio\nobsidian\nomarchy-nvim\nomarchy-walker\npamixer\npinta\nplayerctl\nplocate\nplymouth\npolkit-gnome\npostgresql-libs\npower-profiles-daemon\npython-gobject\npython-poetry-core\npython-terminaltexteffects\nqt5-wayland\nripgrep\nruby\nrust\nsatty\nsddm\nsignal-desktop\nslurp\nspotify\nstarship\nsushi\nswaybg\nswayosd\nsystem-config-printer\ntldr\ntree-sitter-cli\ntmux\ntobi-try\nttf-ia-writer\nttf-jetbrains-mono-nerd\ntypora\ntzupdate\nufw\nufw-docker\nunzip\nusage\nuwsm\nwaybar\nwhois\nwireless-regdb\nwiremix\nwireplumber\nwl-clipboard\nwoff2-font-awesome\nxdg-desktop-portal-gtk\nxdg-desktop-portal-hyprland\nxdg-terminal-exec\nxmlstarlet\nxournalpp\nyaru-icon-theme\nyay\nzoxide\n"
  },
  {
    "path": "install/omarchy-other.packages",
    "content": "# Packages installed outside of install/packages.sh or optional packages\n# Utilized by ISO builder to ensure package availability in the ISO\n\nautoconf-archive\nasusctl\nbase\nbase-devel\nbroadcom-wl\nbtrfs-progs\ndart\ndkms\negl-wayland\ngit\ngst-plugin-pipewire\ngtk4-layer-shell\nhtop\nintltool\niwd\njdk-openjdk\nlibpulse\nlibsass\nintel-ipu7-camera\nintel-media-driver\nlibva-intel-driver\nlibva-nvidia-driver\nlimine\nlimine-mkinitcpio-hook\nlimine-snapper-sync\nlinux\nlinux-firmware\nlinux-headers\nmacbook12-spi-driver-dkms\nnvidia-580xx-dkms\nnvidia-dkms\nnvidia-open-dkms\nnvidia-580xx-utils\nnvidia-utils\nlib32-nvidia-580xx-utils\nlib32-nvidia-utils\npipewire\npipewire-alsa\npipewire-jack\npipewire-pulse\nqt6-wayland\nsassc\nsnapper\nthermald\nwebp-pixbuf-loader\nwget\nyay-debug\ntuxedo-drivers-nocompatcheck-dkms\nyt6801-dkms\nzram-generator\n\n# Vulkan drivers (auto-detected by hardware)\nvulkan-intel\nvulkan-radeon\nvulkan-asahi\n\n# Surface laptop support packages\nlinux-firmware-marvell\n\n# T2 MacBook support packages\napple-bcm-firmware\napple-t2-audio-config\nlinux-t2\nlinux-t2-headers\nt2fanrd\ntiny-dfr\n"
  },
  {
    "path": "install/packaging/all.sh",
    "content": "run_logged $OMARCHY_INSTALL/packaging/base.sh\nrun_logged $OMARCHY_INSTALL/packaging/fonts.sh\nrun_logged $OMARCHY_INSTALL/packaging/nvim.sh\nrun_logged $OMARCHY_INSTALL/packaging/icons.sh\nrun_logged $OMARCHY_INSTALL/packaging/webapps.sh\nrun_logged $OMARCHY_INSTALL/packaging/tuis.sh\nrun_logged $OMARCHY_INSTALL/packaging/npx.sh\nrun_logged $OMARCHY_INSTALL/packaging/asus-rog.sh\nrun_logged $OMARCHY_INSTALL/packaging/framework16.sh\nrun_logged $OMARCHY_INSTALL/packaging/surface.sh\n"
  },
  {
    "path": "install/packaging/asus-rog.sh",
    "content": "if omarchy-hw-asus-rog; then\n  omarchy-pkg-add asusctl\nfi\n"
  },
  {
    "path": "install/packaging/base.sh",
    "content": "# Install all base packages\nmapfile -t packages < <(grep -v '^#' \"$OMARCHY_INSTALL/omarchy-base.packages\" | grep -v '^$')\nomarchy-pkg-add \"${packages[@]}\"\n"
  },
  {
    "path": "install/packaging/fonts.sh",
    "content": "# Omarchy logo in a font for Waybar use\nmkdir -p ~/.local/share/fonts\ncp ~/.local/share/omarchy/config/omarchy.ttf ~/.local/share/fonts/\nfc-cache\n"
  },
  {
    "path": "install/packaging/framework16.sh",
    "content": "if omarchy-hw-framework16; then\n  omarchy-pkg-add qmk-hid\nfi\n"
  },
  {
    "path": "install/packaging/icons.sh",
    "content": "# Copy all bundled icons to the applications/icons directory\nICON_DIR=\"$HOME/.local/share/applications/icons\"\nmkdir -p \"$ICON_DIR\"\ncp ~/.local/share/omarchy/applications/icons/*.png \"$ICON_DIR/\"\n"
  },
  {
    "path": "install/packaging/npx.sh",
    "content": "omarchy-npx-install @anthropic-ai/claude-code claude\nomarchy-npx-install @openai/codex codex\nomarchy-npx-install @google/gemini-cli gemini\nomarchy-npx-install @github/copilot copilot\nomarchy-npx-install opencode-ai opencode\nomarchy-npx-install playwright playwright-cli\n"
  },
  {
    "path": "install/packaging/nvim.sh",
    "content": "# Includes lazyvim and the themes\nomarchy-nvim-setup\n"
  },
  {
    "path": "install/packaging/surface.sh",
    "content": "if omarchy-hw-surface; then\n  omarchy-pkg-add linux-firmware-marvell\nfi\n"
  },
  {
    "path": "install/packaging/tuis.sh",
    "content": "ICON_DIR=\"$HOME/.local/share/applications/icons\"\n\nomarchy-tui-install \"Disk Usage\" \"bash -c 'dust -r; read -n 1 -s'\" float \"$ICON_DIR/Disk Usage.png\"\nomarchy-tui-install \"Docker\" \"lazydocker\" tile \"$ICON_DIR/Docker.png\"\n"
  },
  {
    "path": "install/packaging/webapps.sh",
    "content": "omarchy-webapp-install \"HEY\" https://app.hey.com HEY.png \"omarchy-webapp-handler-hey %u\" \"x-scheme-handler/mailto\"\nomarchy-webapp-install \"Basecamp\" https://launchpad.37signals.com Basecamp.png\nomarchy-webapp-install \"WhatsApp\" https://web.whatsapp.com/ WhatsApp.png\nomarchy-webapp-install \"Google Photos\" https://photos.google.com/ \"Google Photos.png\"\nomarchy-webapp-install \"Google Contacts\" https://contacts.google.com/ \"Google Contacts.png\"\nomarchy-webapp-install \"Google Messages\" https://messages.google.com/web/conversations \"Google Messages.png\"\nomarchy-webapp-install \"Google Maps\" https://maps.google.com \"Google Maps.png\"\nomarchy-webapp-install \"ChatGPT\" https://chatgpt.com/ ChatGPT.png\nomarchy-webapp-install \"YouTube\" https://youtube.com/ YouTube.png\nomarchy-webapp-install \"GitHub\" https://github.com/ GitHub.png\nomarchy-webapp-install \"X\" https://x.com/ X.png\nomarchy-webapp-install \"Figma\" https://figma.com/ Figma.png\nomarchy-webapp-install \"Discord\" https://discord.com/channels/@me Discord.png\nomarchy-webapp-install \"Zoom\" https://app.zoom.us/wc/home Zoom.png \"omarchy-webapp-handler-zoom %u\" \"x-scheme-handler/zoommtg;x-scheme-handler/zoomus\"\nomarchy-webapp-install \"Fizzy\" https://app.fizzy.do/ Fizzy.png\n"
  },
  {
    "path": "install/post-install/all.sh",
    "content": "run_logged $OMARCHY_INSTALL/post-install/hibernation.sh\nrun_logged $OMARCHY_INSTALL/post-install/pacman.sh\nsource $OMARCHY_INSTALL/post-install/allow-reboot.sh\nsource $OMARCHY_INSTALL/post-install/finished.sh\n"
  },
  {
    "path": "install/post-install/allow-reboot.sh",
    "content": "# Allow passwordless reboot for the installer - removed in first-run\nsudo tee /etc/sudoers.d/99-omarchy-installer-reboot >/dev/null <<EOF\n$USER ALL=(ALL) NOPASSWD: /usr/bin/reboot\nEOF\nsudo chmod 440 /etc/sudoers.d/99-omarchy-installer-reboot\n"
  },
  {
    "path": "install/post-install/finished.sh",
    "content": "stop_install_log\n\necho_in_style() {\n  echo \"$1\" | tte --canvas-width 0 --anchor-text c --frame-rate 640 print\n}\n\nclear\necho\ntte -i ~/.local/share/omarchy/logo.txt --canvas-width 0 --anchor-text c --frame-rate 920 laseretch\necho\n\n# Display installation time if available\nif [[ -f $OMARCHY_INSTALL_LOG_FILE ]] && grep -q \"Total:\" \"$OMARCHY_INSTALL_LOG_FILE\" 2>/dev/null; then\n  echo\n  TOTAL_TIME=$(tail -n 20 \"$OMARCHY_INSTALL_LOG_FILE\" | grep \"^Total:\" | sed 's/^Total:[[:space:]]*//')\n  if [[ -n $TOTAL_TIME ]]; then\n    echo_in_style \"Installed in $TOTAL_TIME\"\n  fi\nelse\n  echo_in_style \"Finished installing\"\nfi\n\nif sudo test -f /etc/sudoers.d/99-omarchy-installer; then\n  sudo rm -f /etc/sudoers.d/99-omarchy-installer &>/dev/null\nfi\n\n# Exit gracefully if user chooses not to reboot\nif gum confirm --padding \"0 0 0 $((PADDING_LEFT + 32))\" --show-help=false --default --affirmative \"Reboot Now\" --negative \"\" \"\"; then\n  # Clear screen to hide any shutdown messages\n  clear\n\n  if [[ -n ${OMARCHY_CHROOT_INSTALL:-} ]]; then\n    touch /var/tmp/omarchy-install-completed\n    exit 0\n  else\n    sudo reboot 2>/dev/null\n  fi\nfi\n"
  },
  {
    "path": "install/post-install/hibernation.sh",
    "content": "# Enable hibernation\nomarchy-hibernation-setup --force\n"
  },
  {
    "path": "install/post-install/pacman.sh",
    "content": "# Configure pacman\nsudo cp -f ~/.local/share/omarchy/default/pacman/pacman-${OMARCHY_MIRROR:-stable}.conf /etc/pacman.conf\nsudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist-${OMARCHY_MIRROR:-stable} /etc/pacman.d/mirrorlist\n\nif lspci -nn | grep -q \"106b:180[12]\"; then\n  cat <<EOF | sudo tee -a /etc/pacman.conf >/dev/null\n\n[arch-mact2]\nServer = https://github.com/NoaHimesaka1873/arch-mact2-mirror/releases/download/release\nSigLevel = Never\nEOF\nfi\n"
  },
  {
    "path": "install/preflight/all.sh",
    "content": "source $OMARCHY_INSTALL/preflight/guard.sh\nsource $OMARCHY_INSTALL/preflight/begin.sh\nrun_logged $OMARCHY_INSTALL/preflight/show-env.sh\nrun_logged $OMARCHY_INSTALL/preflight/pacman.sh\nrun_logged $OMARCHY_INSTALL/preflight/migrations.sh\nrun_logged $OMARCHY_INSTALL/preflight/first-run-mode.sh\nrun_logged $OMARCHY_INSTALL/preflight/disable-mkinitcpio.sh\n"
  },
  {
    "path": "install/preflight/begin.sh",
    "content": "clear_logo\ngum style --foreground 3 --padding \"1 0 0 $PADDING_LEFT\" \"Installing...\"\necho\nstart_install_log\n"
  },
  {
    "path": "install/preflight/disable-mkinitcpio.sh",
    "content": "# Temporarily disable mkinitcpio hooks to prevent multiple regenerations during package installation\n# This speeds up installation significantly\n\necho \"Temporarily disabling mkinitcpio hooks during installation...\"\n\n# Move the specific mkinitcpio pacman hooks out of the way if they exist\nif [[ -f /usr/share/libalpm/hooks/90-mkinitcpio-install.hook ]]; then\n  sudo mv /usr/share/libalpm/hooks/90-mkinitcpio-install.hook /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled\nfi\n\nif [[ -f /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook ]]; then\n  sudo mv /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled\nfi\n\necho \"mkinitcpio hooks disabled\"\n\n"
  },
  {
    "path": "install/preflight/first-run-mode.sh",
    "content": "# Set first-run mode marker so we can install stuff post-installation\nmkdir -p ~/.local/state/omarchy\ntouch ~/.local/state/omarchy/first-run.mode\n\n# Setup sudo-less access for first-run\nsudo tee /etc/sudoers.d/first-run >/dev/null <<EOF\nCmnd_Alias FIRST_RUN_CLEANUP = /bin/rm -f /etc/sudoers.d/first-run\nCmnd_Alias SYMLINK_RESOLVED = /usr/bin/ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf\n$USER ALL=(ALL) NOPASSWD: /usr/bin/systemctl\n$USER ALL=(ALL) NOPASSWD: /usr/bin/ufw\n$USER ALL=(ALL) NOPASSWD: /usr/bin/ufw-docker\n$USER ALL=(ALL) NOPASSWD: /usr/bin/gtk-update-icon-cache\n$USER ALL=(ALL) NOPASSWD: SYMLINK_RESOLVED\n$USER ALL=(ALL) NOPASSWD: FIRST_RUN_CLEANUP\nEOF\nsudo chmod 440 /etc/sudoers.d/first-run\n"
  },
  {
    "path": "install/preflight/guard.sh",
    "content": "abort() {\n  echo -e \"\\e[31mOmarchy install requires: $1\\e[0m\"\n  echo\n  gum confirm \"Proceed anyway on your own accord and without assistance?\" || exit 1\n}\n\n# Must be an Arch distro\nif [[ ! -f /etc/arch-release ]]; then\n  abort \"Vanilla Arch\"\nfi\n\n# Must not be an Arch derivative distro\nfor marker in /etc/cachyos-release /etc/eos-release /etc/garuda-release /etc/manjaro-release; do\n  if [[ -f $marker ]]; then\n    abort \"Vanilla Arch\"\n  fi\ndone\n\n# Must not be running as root\nif (( EUID == 0 )); then\n  abort \"Running as root (not user)\"\nfi\n\n# Must be x86 only to fully work\nif [[ $(uname -m) != \"x86_64\" ]]; then\n  abort \"x86_64 CPU\"\nfi\n\n# Must have secure boot disabled\nif bootctl status 2>/dev/null | grep -q 'Secure Boot: enabled'; then\n  abort \"Secure Boot disabled\"\nfi\n\n# Must not have Gnome or KDE already install\nif pacman -Qe gnome-shell &>/dev/null || pacman -Qe plasma-desktop &>/dev/null; then\n  abort \"Fresh + Vanilla Arch\"\nfi\n\n# Must have limine installed\ncommand -v limine &>/dev/null || abort \"Limine bootloader\"\n\n# Must have btrfs root filesystem\n[[ $(findmnt -n -o FSTYPE /) = \"btrfs\" ]] || abort \"Btrfs root filesystem\" \n\n# Cleared all guards\necho \"Guards: OK\"\n"
  },
  {
    "path": "install/preflight/migrations.sh",
    "content": "OMARCHY_MIGRATIONS_STATE_PATH=~/.local/state/omarchy/migrations\nmkdir -p $OMARCHY_MIGRATIONS_STATE_PATH\n\nfor file in ~/.local/share/omarchy/migrations/*.sh; do\n  touch \"$OMARCHY_MIGRATIONS_STATE_PATH/$(basename \"$file\")\"\ndone\n"
  },
  {
    "path": "install/preflight/pacman.sh",
    "content": "if [[ -n ${OMARCHY_ONLINE_INSTALL:-} ]]; then\n  # Install build tools\n  omarchy-pkg-add base-devel\n\n  # Configure pacman\n  sudo cp -f ~/.local/share/omarchy/default/pacman/pacman-${OMARCHY_MIRROR:-stable}.conf /etc/pacman.conf\n  sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist-${OMARCHY_MIRROR:-stable} /etc/pacman.d/mirrorlist\n\n  sudo pacman-key --recv-keys 40DFB630FF42BCFFB047046CF0134EE680CAC571 --keyserver keys.openpgp.org\n  sudo pacman-key --lsign-key 40DFB630FF42BCFFB047046CF0134EE680CAC571\n\n  sudo pacman -Sy\n  omarchy-pkg-add omarchy-keyring\n\n  # Refresh all repos\n  sudo pacman -Syyuu --noconfirm\nfi\n"
  },
  {
    "path": "install/preflight/show-env.sh",
    "content": "# Show installation environment variables\ngum log --level info \"Installation Environment:\"\n\nenv | grep -E \"^(OMARCHY_CHROOT_INSTALL|OMARCHY_ONLINE_INSTALL|OMARCHY_USER_NAME|OMARCHY_USER_EMAIL|USER|HOME|OMARCHY_REPO|OMARCHY_REF|OMARCHY_PATH)=\" | sort | while IFS= read -r var; do\n  gum log --level info \"  $var\"\ndone\n"
  },
  {
    "path": "install.sh",
    "content": "#!/bin/bash\n\n# Exit immediately if a command exits with a non-zero status\nset -eEo pipefail\n\n# Define Omarchy locations\nexport OMARCHY_PATH=\"$HOME/.local/share/omarchy\"\nexport OMARCHY_INSTALL=\"$OMARCHY_PATH/install\"\nexport OMARCHY_INSTALL_LOG_FILE=\"/var/log/omarchy-install.log\"\nexport PATH=\"$OMARCHY_PATH/bin:$PATH\"\n\n# Install\nsource \"$OMARCHY_INSTALL/helpers/all.sh\"\nsource \"$OMARCHY_INSTALL/preflight/all.sh\"\nsource \"$OMARCHY_INSTALL/packaging/all.sh\"\nsource \"$OMARCHY_INSTALL/config/all.sh\"\nsource \"$OMARCHY_INSTALL/login/all.sh\"\nsource \"$OMARCHY_INSTALL/post-install/all.sh\"\n"
  },
  {
    "path": "logo.txt",
    "content": "                 ▄▄▄\n ▄█████▄    ▄███████████▄    ▄███████   ▄███████   ▄███████   ▄█   █▄    ▄█   █▄\n███   ███  ███   ███   ███  ███   ███  ███   ███  ███   ███  ███   ███  ███   ███\n███   ███  ███   ███   ███  ███   ███  ███   ███  ███   █▀   ███   ███  ███   ███\n███   ███  ███   ███   ███ ▄███▄▄▄███ ▄███▄▄▄██▀  ███       ▄███▄▄▄███▄ ███▄▄▄███\n███   ███  ███   ███   ███ ▀███▀▀▀███ ▀███▀▀▀▀    ███      ▀▀███▀▀▀███  ▀▀▀▀▀▀███\n███   ███  ███   ███   ███  ███   ███ ██████████  ███   █▄   ███   ███  ▄██   ███\n███   ███  ███   ███   ███  ███   ███  ███   ███  ███   ███  ███   ███  ███   ███\n ▀█████▀    ▀█   ███   █▀   ███   █▀   ███   ███  ███████▀   ███   █▀    ▀█████▀\n                                       ███   █▀\n"
  },
  {
    "path": "migrations/1751134560.sh",
    "content": "echo \"Add UWSM env\"\n\nexport OMARCHY_PATH=\"$HOME/.local/share/omarchy\"\nexport PATH=\"$OMARCHY_PATH/bin:$PATH\"\n\nmkdir -p \"$HOME/.config/uwsm/\"\ncat <<EOF | tee \"$HOME/.config/uwsm/env\"\nexport OMARCHY_PATH=$HOME/.local/share/omarchy\nexport PATH=$OMARCHY_PATH/bin/:$PATH\nEOF\n\n# Ensure we have the latest repos and are ready to pull\nomarchy-update-keyring\nomarchy-refresh-pacman\nsudo systemctl restart systemd-timesyncd\nsudo pacman -Sy # Normally not advisable, but we'll do a full -Syu before finishing\n\nmkdir -p ~/.local/state/omarchy/migrations\ntouch ~/.local/state/omarchy/migrations/1751134560.sh\n\n# Remove old AUR packages to prevent a super lengthy build on old Omarchy installs\nomarchy-pkg-drop zoom qt5-remoteobjects wf-recorder wl-screenrec\n\n# Get rid of old AUR packages\nbash $OMARCHY_PATH/migrations/1756060611.sh\ntouch ~/.local/state/omarchy/migrations/1756060611.sh\n\nbash omarchy-update-perform\n"
  },
  {
    "path": "migrations/1751134562.sh",
    "content": "echo \"Ensure all indexes and packages are up to date\"\n\nomarchy-update-keyring\nomarchy-refresh-pacman\nsudo pacman -Syu --noconfirm\n"
  },
  {
    "path": "migrations/1751134563.sh",
    "content": "echo \"Remove obsolete gcc14 AUR package that takes eons to update\"\n\nomarchy-pkg-drop gcc14\n"
  },
  {
    "path": "migrations/1751134564.sh",
    "content": "echo \"Ensure the Arch keyring is up to date\"\n\nomarchy-update-keyring\n"
  },
  {
    "path": "migrations/1751134568.sh",
    "content": "# Turn on bluetooth service so blueberry or bluetui works out the box\necho \"Let's turn on Bluetooth service so the controls work\"\nif systemctl is-enabled --quiet bluetooth.service && systemctl is-active --quiet bluetooth.service; then\n  # Bluetooth is already enabled, nothing to change\n  :\nelse\n  sudo systemctl enable --now bluetooth.service\nfi\n"
  },
  {
    "path": "migrations/1751135253.sh",
    "content": "echo \"Add missing installation of bat (used by the ff alias)\"\n\nomarchy-pkg-add bat\n"
  },
  {
    "path": "migrations/1751510848.sh",
    "content": "echo \"Installing missing fd terminal tool for finding files\"\n\nomarchy-pkg-add fd\n"
  },
  {
    "path": "migrations/1751667620.sh",
    "content": "echo \"Switching from vlc to mpv for the default video player\"\nif omarchy-cmd-missing mpv; then\n  omarchy-pkg-drop vlc\n  rm ~/.local/share/applications/vlc.desktop\n\n  omarchy-pkg-add mpv\n  xdg-mime default mpv.desktop video/mp4\n  xdg-mime default mpv.desktop video/x-msvideo\n  xdg-mime default mpv.desktop video/x-matroska\n  xdg-mime default mpv.desktop video/x-flv\n  xdg-mime default mpv.desktop video/x-ms-wmv\n  xdg-mime default mpv.desktop video/mpeg\n  xdg-mime default mpv.desktop video/ogg\n  xdg-mime default mpv.desktop video/webm\n  xdg-mime default mpv.desktop video/quicktime\n  xdg-mime default mpv.desktop video/3gpp\n  xdg-mime default mpv.desktop video/3gpp2\n  xdg-mime default mpv.desktop video/x-ms-asf\n  xdg-mime default mpv.desktop video/x-ogm+ogg\n  xdg-mime default mpv.desktop video/x-theora+ogg\n  xdg-mime default mpv.desktop application/ogg\nfi\n"
  },
  {
    "path": "migrations/1751669258.sh",
    "content": "echo \"Ensure Docker config is set\"\nif [[ ! -f /etc/docker/daemon.json ]]; then\n  sudo mkdir -p /etc/docker\n  echo '{\"log-driver\":\"json-file\",\"log-opts\":{\"max-size\":\"10m\",\"max-file\":\"5\"}}' | sudo tee /etc/docker/daemon.json\nfi\n"
  },
  {
    "path": "migrations/1751672984.sh",
    "content": "echo \"Add LocalSend as new default application\"\n\nomarchy-pkg-drop localsend-bin\nomarchy-pkg-add localsend\n"
  },
  {
    "path": "migrations/1751679069.sh",
    "content": "echo \"Install ffmpegthumbnailer for video thumbnails in the file manager\"\n\nomarchy-pkg-add ffmpegthumbnailer\n"
  },
  {
    "path": "migrations/1751821819.sh",
    "content": "echo \"Install bash-completion\"\n\nomarchy-pkg-add bash-completion\n"
  },
  {
    "path": "migrations/1751887718.sh",
    "content": "echo \"Install Impala as new wifi selection TUI\"\n\nif omarchy-cmd-missing impala; then\n  omarchy-pkg-add impala\n  omarchy-refresh-waybar\nfi\n"
  },
  {
    "path": "migrations/1752081088.sh",
    "content": "echo \"Permanently fix F-keys on Apple-mode keyboards (like Lofree Flow84)\"\n\nsource $OMARCHY_PATH/install/config/hardware/fix-fkeys.sh\n"
  },
  {
    "path": "migrations/1752082381.sh",
    "content": "echo \"Adding gnome-keyring to make 1password work with 2FA codes\"\n\nomarchy-pkg-add gnome-keyring\n"
  },
  {
    "path": "migrations/1752091783.sh",
    "content": "echo \"Install Plymouth splash screen\"\n\nomarchy-pkg-add uwsm plymouth\nsource \"$OMARCHY_PATH/install/login/plymouth.sh\"\n"
  },
  {
    "path": "migrations/1752104271.sh",
    "content": "echo \"Switching to polkit-gnome for better fingerprint authentication compatibility\"\n\nif ! command -v /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &>/dev/null; then\n  sudo pacman -S --noconfirm --needed polkit-gnome\n  systemctl --user stop hyprpolkitagent\n  systemctl --user disable hyprpolkitagent\n  sudo pacman -Rns --noconfirm hyprpolkitagent\n  setsid /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &\nfi\n"
  },
  {
    "path": "migrations/1752168292.sh",
    "content": "echo \"Enable battery low notifications for laptops\"\n\nif ls /sys/class/power_supply/BAT* &>/dev/null && [[ ! -f ~/.local/share/omarchy/config/systemd/user/omarchy-battery-monitor.service ]]; then\n  mkdir -p ~/.config/systemd/user\n\n  cp ~/.local/share/omarchy/config/systemd/user/omarchy-battery-monitor.* ~/.config/systemd/user/\n\n  systemctl --user daemon-reload\n  systemctl --user enable --now omarchy-battery-monitor.timer || true\nfi\n"
  },
  {
    "path": "migrations/1752188554.sh",
    "content": "echo \"Update chromium.desktop to ensure we are always using wayland\"\n\nxdg-settings set default-web-browser chromium.desktop\nxdg-mime default chromium.desktop x-scheme-handler/http\nxdg-mime default chromium.desktop x-scheme-handler/https\n"
  },
  {
    "path": "migrations/1752292967.sh",
    "content": "echo \"Update to use UWSM and seamless login\"\n\nif omarchy-cmd-missing uwsm; then\n  sudo rm -f /etc/systemd/system/getty@tty1.service.d/override.conf\n  sudo rmdir /etc/systemd/system/getty@tty1.service.d/ 2>/dev/null || true\n\n  if [[ -f $HOME/.bash_profile ]]; then\n    # Remove the specific line\n    sed -i '/^\\[\\[ -z \\$DISPLAY && \\$(tty) == \\/dev\\/tty1 \\]\\] && exec Hyprland$/d' \"$HOME/.bash_profile\"\n    echo \"Cleaned up .bash_profile\"\n  fi\n\n  if [[ -f $HOME/.config/environment.d/fcitx.conf ]]; then\n    echo \"Removing GTK_IM_MODULE from fcitx config for Wayland...\"\n    sed -i 's/^GTK_IM_MODULE=fcitx$//' \"$HOME/.config/environment.d/fcitx.conf\"\n  fi\n\n  source $OMARCHY_PATH/install/login/plymouth.sh\nfi\n"
  },
  {
    "path": "migrations/1752535084.sh",
    "content": "echo \"Set a default fontconfig\"\n\nif [[ ! -f $HOME/.config/fontconfig/fonts.conf ]]; then\n  mkdir -p ~/.config/fontconfig\n  cp ~/.local/share/omarchy/config/fontconfig/fonts.conf ~/.config/fontconfig/\n  fc-cache -fv\nfi\n"
  },
  {
    "path": "migrations/1752535341.sh",
    "content": "echo \"Setting up GPG configuration with multiple keyservers for better reliability\"\n\nif [[ ! -f /etc/gnupg/dirmngr.conf ]]; then\n  sudo mkdir -p /etc/gnupg\n  sudo cp ~/.local/share/omarchy/default/gpg/dirmngr.conf /etc/gnupg/\n  sudo chmod 644 /etc/gnupg/dirmngr.conf\n  sudo gpgconf --kill dirmngr || true\n  sudo gpgconf --launch dirmngr || true\nfi\n"
  },
  {
    "path": "migrations/1752543801.sh",
    "content": "echo \"Add color and animation to pacman installs\"\n\ngrep -q '^Color' /etc/pacman.conf || sudo sed -i '/^\\[options\\]/a Color' /etc/pacman.conf\ngrep -q '^ILoveCandy' /etc/pacman.conf || sudo sed -i '/^\\[options\\]/a ILoveCandy' /etc/pacman.conf\n"
  },
  {
    "path": "migrations/1752643269.sh",
    "content": "echo \"Add new matte black theme\"\n\nif [[ ! -L $HOME/.config/omarchy/themes/matte-black ]]; then\n  ln -snf ~/.local/share/omarchy/themes/matte-black ~/.config/omarchy/themes/\nfi\n"
  },
  {
    "path": "migrations/1752678932.sh",
    "content": "echo \"Install missing docker-buildx package for out-of-the-box Kamal compatibility\"\n\nomarchy-pkg-add docker-buildx\n"
  },
  {
    "path": "migrations/1752725616.sh",
    "content": "echo \"Make light themes possible\"\n\nif [[ -f ~/.local/share/applications/blueberry.desktop ]]; then\n  rm -f ~/.local/share/applications/blueberry.desktop\n  rm -f ~/.local/share/applications/org.pulseaudio.pavucontrol.desktop\n  update-desktop-database ~/.local/share/applications/\n\n  gsettings set org.gnome.desktop.interface color-scheme \"prefer-dark\"\n  gsettings set org.gnome.desktop.interface gtk-theme \"Adwaita-dark\"\n\n  omarchy-refresh-waybar\nfi\n\nif [[ ! -L $HOME/.config/omarchy/themes/rose-pine ]]; then\n  ln -snf ~/.local/share/omarchy/themes/rose-pine ~/.config/omarchy/themes/\nfi\n"
  },
  {
    "path": "migrations/1752793122.sh",
    "content": "echo \"Rename waybar config file for syntax highlighting\"\n\nif [[ -f ~/.config/waybar/config ]]; then\n  mv ~/.config/waybar/config ~/.config/waybar/config.jsonc\nfi\n"
  },
  {
    "path": "migrations/1752797704.sh",
    "content": "echo \"Prevent docker from requiring network readiness on boot\"\n\nif [[ ! -f /etc/systemd/system/docker.service.d/no-block-boot.conf ]]; then\n  sudo mkdir -p /etc/systemd/system/docker.service.d/\n  sudo tee /etc/systemd/system/docker.service.d/no-block-boot.conf <<'EOF'\n[Unit]\nDefaultDependencies=no\nEOF\n\n  sudo mkdir -p /etc/systemd/system/plymouth-quit.service.d/\n  sudo tee /etc/systemd/system/plymouth-quit.service.d/wait-for-graphical.conf <<'EOF'\n[Unit]\nAfter=multi-user.target\nEOF\n\n  sudo systemctl daemon-reload\n  sudo systemctl mask plymouth-quit-wait.service\nfi\n"
  },
  {
    "path": "migrations/1752874371.sh",
    "content": "echo \"Add Catppuccin Latte light theme\"\n\nif [[ ! -L $HOME/.config/omarchy/themes/catppuccin-latte ]]; then\n  ln -snf ~/.local/share/omarchy/themes/catppuccin-latte ~/.config/omarchy/themes/\nfi\n"
  },
  {
    "path": "migrations/1752896442.sh",
    "content": "echo \"Replace volume control GUI with a TUI\"\n\nif omarchy-cmd-missing wiremix; then\n  omarchy-pkg-add wiremix\n  omarchy-pkg-drop pavucontrol\n  omarchy-refresh-applications\n  omarchy-refresh-waybar\nfi\n"
  },
  {
    "path": "migrations/1752897642.sh",
    "content": "echo \"Remove needless fcitx5-configtool package\"\n\nomarchy-pkg-drop fcitx5-configtool\n"
  },
  {
    "path": "migrations/1752955912.sh",
    "content": "echo \"Install satty for the new screenshot flow\"\n\nomarchy-pkg-add satty\n"
  },
  {
    "path": "migrations/1752981883.sh",
    "content": "echo \"Replace wofi with walker as the default launcher\"\n\nif omarchy-cmd-missing walker; then\n  omarchy-pkg-add walker-bin libqalculate\n\n  omarchy-pkg-drop wofi\n  rm -rf ~/.config/wofi\n\n  mkdir -p ~/.config/walker\n  cp -r ~/.local/share/omarchy/config/walker/* ~/.config/walker/\nfi\n"
  },
  {
    "path": "migrations/1753138691.sh",
    "content": "echo \"Install swayOSD to show volume status\"\n\nif omarchy-cmd-missing swayosd-server; then\n  omarchy-pkg-add swayosd\n  setsid uwsm-app -- swayosd-server &>/dev/null &\nfi\n"
  },
  {
    "path": "migrations/1753224615.sh",
    "content": "echo \"Adding SwayOSD theming\"\n\nif [[ ! -d ~/.config/swayosd ]]; then\n  mkdir -p ~/.config/swayosd\n  cp -r ~/.local/share/omarchy/config/swayosd/* ~/.config/swayosd/\n\n  pkill swayosd-server\n  setsid uwsm-app -- swayosd-server &>/dev/null &\nfi\n"
  },
  {
    "path": "migrations/1753495989.sh",
    "content": "echo \"Allow updating of timezone by right-clicking on the clock (or running omarchy-cmd-tzupdate)\"\n\nif omarchy-cmd-missing tzupdate; then\n  bash \"$OMARCHY_PATH/install/config/timezones.sh\"\n  omarchy-refresh-waybar\nfi\n"
  },
  {
    "path": "migrations/1753689791.sh",
    "content": "echo \"Add the new ristretto theme as an option\"\n\nif [[ ! -L ~/.config/omarchy/themes/ristretto ]]; then\n  ln -nfs ~/.local/share/omarchy/themes/ristretto ~/.config/omarchy/themes/\nfi\n"
  },
  {
    "path": "migrations/1753908454.sh",
    "content": "echo \"Migrate from manually downloaded fonts to font packages\"\nif ! pacman -Q ttf-cascadia-mono-nerd &>/dev/null; then\n  sudo pacman -S --noconfirm ttf-cascadia-mono-nerd\n  rm -rf ~/.local/share/fonts/Caskaydia*\n  fc-cache\nfi\n\nif ! pacman -Q ttf-ia-writer &>/dev/null; then\n  sudo pacman -S --noconfirm ttf-ia-writer\n  rm -rf ~/.local/share/fonts/iAWriterMonoS*\n  fc-cache\nfi\n"
  },
  {
    "path": "migrations/1754047941.sh",
    "content": "echo \"Add icon theme coloring\"\n\nif ! pacman -Q yaru-icon-theme &>/dev/null; then\n  sudo pacman -S --noconfirm yaru-icon-theme\n\n  if [[ -f ~/.config/omarchy/current/theme/icons.theme ]]; then\n    gsettings set org.gnome.desktop.interface icon-theme \"$(<~/.config/omarchy/current/theme/icons.theme)\"\n  fi\nfi\n"
  },
  {
    "path": "migrations/1754109724.sh",
    "content": "echo \"Add hyprsunset blue light filter\"\nif ! command -v hyprsunset &>/dev/null; then\n  sudo pacman -S --noconfirm --needed hyprsunset\nfi\n\nomarchy-refresh-hyprsunset\n"
  },
  {
    "path": "migrations/1754215533.sh",
    "content": "echo \"Enable auto-discovery of network printers\"\n\nif [[ ! -f /etc/systemd/resolved.conf.d/10-disable-multicast.conf ]]; then\n  omarchy-pkg-add avahi nss-mdns\n\n  # Disable multicast dns in resolved. Avahi will provide this for better network printer discovery\n  sudo mkdir -p /etc/systemd/resolved.conf.d\n  echo \"[Resolve]\\nMulticastDNS=no\" | sudo tee /etc/systemd/resolved.conf.d/10-disable-multicast.conf\n  sudo systemctl enable --now avahi-daemon.service\nfi\n\nif ! grep -q '^CreateRemotePrinters Yes' /etc/cups/cups-browsed.conf; then\n  omarchy-pkg-add cups-browsed\n  # Enable automatically adding remote printers\n  echo 'CreateRemotePrinters Yes' | sudo tee -a /etc/cups/cups-browsed.conf\n  sudo systemctl enable --now cups-browsed.service\nfi\n"
  },
  {
    "path": "migrations/1754221967.sh",
    "content": "echo \"Add support for accessing Android phone data via file manager\"\n\nomarchy-pkg-add gvfs-mtp\n"
  },
  {
    "path": "migrations/1754228071.sh",
    "content": "echo \"Add auto-update icon to waybar when update available\"\n\nif ! grep -q \"custom/update\" ~/.config/waybar/config.jsonc; then\n  omarchy-refresh-waybar\nfi\n"
  },
  {
    "path": "migrations/1754331529.sh",
    "content": "echo \"Update Waybar for new Omarchy menu\"\n\nif ! grep -q \"\" ~/.config/waybar/config.jsonc; then\n  omarchy-refresh-waybar\nfi\n"
  },
  {
    "path": "migrations/1754332200.sh",
    "content": "echo \"Remove old Omarchy TUI app now that we have the Omarchy Menu\"\n\nrm -f ~/.local/share/applications/omarchy.desktop\n"
  },
  {
    "path": "migrations/1754389057.sh",
    "content": "echo \"Offer to reorganize hyprland.conf as per new defaults\"\n\nif [[ ! -f ~/.config/hypr/autostarts.conf ]]; then\n  echo -e \"\\nOmarchy now splits default .config/hypr/hyprland.conf into sub-configs.\"\n  echo -e \"Resetting to defaults will overwrite your configuration, but save it as .bak.\\n\"\n  if gum confirm \"Use new default hyprland.conf config?\"; then\n    omarchy-refresh-hyprland || true\n  else\n    echo \"Left your existing configuration in place!\"\n  fi\nfi\n"
  },
  {
    "path": "migrations/1754390772.sh",
    "content": "echo \"Set SwayOSD max volume back to 100\"\n\nif ! grep -q \"max_volume = 100\" ~/.config/swayosd/config.toml; then\n  sed -i 's/max_volume = 150/max_volume = 100/' ~/.config/swayosd/config.toml\n  omarchy-restart-swayosd\nfi\n"
  },
  {
    "path": "migrations/1754509222.sh",
    "content": "echo \"Add xmlstarlet needed for updating fonts via Omarchy menu\"\n\nomarchy-pkg-add xmlstarlet\n"
  },
  {
    "path": "migrations/1754514972.sh",
    "content": "echo \"Fix multicast dns config for printers\"\n\necho -e \"[Resolve]\\nMulticastDNS=no\" | sudo tee /etc/systemd/resolved.conf.d/10-disable-multicast.conf\n"
  },
  {
    "path": "migrations/1754566681.sh",
    "content": "echo \"Make new Osaka Jade theme available as new default\"\n\nif [[ ! -L ~/.config/omarchy/themes/osaka-jade ]]; then\n  rm -rf ~/.config/omarchy/themes/osaka-jade\n  git -C ~/.local/share/omarchy checkout -f themes/osaka-jade\n  ln -nfs ~/.local/share/omarchy/themes/osaka-jade ~/.config/omarchy/themes/osaka-jade\nfi\n"
  },
  {
    "path": "migrations/1754668999.sh",
    "content": "echo \"Tune MTU probing for more reliable SSH\"\n\necho \"net.ipv4.tcp_mtu_probing=1\" | sudo tee -a /etc/sysctl.d/99-sysctl.conf\n"
  },
  {
    "path": "migrations/1754856741.sh",
    "content": "echo \"Disable systemd-networkd-wait-online\"\n\nsudo rm -rf /etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf\nsudo systemctl disable systemd-networkd-wait-online.service\nsudo systemctl mask systemd-networkd-wait-online.service\n"
  },
  {
    "path": "migrations/1754860578.sh",
    "content": "echo \"Update polkit policy to yield to fingerprint and fido2\"\n\n# If fprint exists in polkit, it was wrong and needs reset\nif [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then\n  sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'\nauth      sufficient pam_fprintd.so\nauth      required pam_unix.so\n\naccount   required pam_unix.so\npassword  required pam_unix.so\nsession   required pam_unix.so\nEOF\nfi\n\n# If fido2 is in sudo, it won't be in polkit either way\nif grep -q pam_u2f.so /etc/pam.d/sudo && [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then\n  sudo sed -i '1i auth      sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/polkit-1\nelif grep -q pam_u2f.so /etc/pam.d/sudo && [[ ! -f /etc/pam.d/polkit-1 ]]; then\n  sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'\nauth      sufficient pam_u2f.so cue authfile=/etc/fido2/fido2\nauth      required pam_unix.so\n\naccount   required pam_unix.so\npassword  required pam_unix.so\nsession   required pam_unix.so\nEOF\nfi\n"
  },
  {
    "path": "migrations/1754984734.sh",
    "content": "echo \"Configure Docker to use the host's DNS resolver\"\n\nif omarchy-cmd-present docker; then\n  # If the daemon configuration has been changed since we wrote it, leave it as-is\n  ORIGINAL_CONFIG='{\"log-driver\":\"json-file\",\"log-opts\":{\"max-size\":\"10m\",\"max-file\":\"5\"}}'\n\n  NEW_CONFIG='{\n      \"log-driver\": \"json-file\",\n      \"log-opts\": { \"max-size\": \"10m\", \"max-file\": \"5\" },\n      \"dns\": [\"172.17.0.1\"],\n      \"bip\": \"172.17.0.1/16\"\n  }'\n\n  if grep -Fq \"$ORIGINAL_CONFIG\" /etc/docker/daemon.json 2>/dev/null; then\n    echo \"$NEW_CONFIG\" | sudo tee /etc/docker/daemon.json >/dev/null\n  fi\n\n  # Expose systemd-resolved to our Docker network\n  echo -e '[Resolve]\\nDNSStubListenerExtra=172.17.0.1' | sudo tee /etc/systemd/resolved.conf.d/20-docker-dns.conf >/dev/null\n\n  sudo systemctl restart systemd-resolved\n  sudo systemctl restart docker\nfi\n"
  },
  {
    "path": "migrations/1754996869.sh",
    "content": "echo \"Increase sudo attempts limit to 10\"\n\nsource $OMARCHY_PATH/install/config/increase-sudo-tries.sh\n"
  },
  {
    "path": "migrations/1755109182.sh",
    "content": "echo \"Reset DNS configuration to DHCP (remove forced Cloudflare DNS)\"\n\n# Reset DNS to use DHCP by default instead of forcing Cloudflare\n# This preserves local development environments (.local domains, etc.)\n# Users can still opt-in to Cloudflare DNS using: omarchy-setup-dns cloudflare\n\nif [[ -f /etc/systemd/resolved.conf ]]; then\n  # Backup current config with timestamp\n  backup_timestamp=$(date +\"%Y%m%d%H%M%S\")\n  sudo cp /etc/systemd/resolved.conf \"/etc/systemd/resolved.conf.bak.${backup_timestamp}\"\n\n  # Remove explicit DNS entries to use DHCP\n  sudo sed -i '/^DNS=/d' /etc/systemd/resolved.conf\n  sudo sed -i '/^FallbackDNS=/d' /etc/systemd/resolved.conf\n\n  # Add empty DNS entries to ensure DHCP is used\n  echo \"DNS=\" | sudo tee -a /etc/systemd/resolved.conf >/dev/null\n  echo \"FallbackDNS=\" | sudo tee -a /etc/systemd/resolved.conf >/dev/null\n\n  # Remove any forced DNS config from systemd-networkd\n  if [[ -f /etc/systemd/network/99-omarchy-dns.network ]]; then\n    sudo rm -f /etc/systemd/network/99-omarchy-dns.network\n    sudo systemctl restart systemd-networkd\n  fi\n\n  # Restart systemd-resolved to apply changes\n  sudo systemctl restart systemd-resolved\n\n  echo \"DNS configuration reset to use DHCP (router DNS)\"\n  echo \"To use Cloudflare DNS, run: omarchy-setup-dns Cloudflare\"\nfi"
  },
  {
    "path": "migrations/1755139080.sh",
    "content": "echo \"Ensure fcitx5 does not overwrite xkb layout\"\n\nFCITX5_CONF_DIR=\"$HOME/.config/fcitx5/conf\"\nFCITX5_XCB_CONF=\"$FCITX5_CONF_DIR/xcb.conf\"\n\nif [[ ! -f $FCITX5_XCB_CONF ]]; then\n  mkdir -p \"$FCITX5_CONF_DIR\"\n  cp \"$OMARCHY_PATH/config/fcitx5/conf/xcb.conf\" \"$FCITX5_XCB_CONF\"\nfi\n"
  },
  {
    "path": "migrations/1755208929.sh",
    "content": "echo \"Change behaviour of XF86PowerOff button to show omarchy system menu insead of shutting down immediately\"\n\nsource $OMARCHY_PATH/install/config/hardware/ignore-power-button.sh\nsetsid systemd-inhibit --what=handle-power-key --why=\"Temporary disable power button before restart\" sleep infinity &\n"
  },
  {
    "path": "migrations/1755340533.sh",
    "content": "echo \"Add .config/brave-flags.conf by default to ensure Brave runs under Wayland\"\n\nif [[ ! -f ~/.config/brave-flags.conf ]]; then\n  cp $OMARCHY_PATH/config/brave-flags.conf ~/.config/\nfi\n"
  },
  {
    "path": "migrations/1755436367.sh",
    "content": "echo \"Add minimal starship prompt to terminal\"\n\nif omarchy-cmd-missing starship; then\n  omarchy-pkg-add starship\n  cp $OMARCHY_PATH/config/starship.toml ~/.config/starship.toml\nfi\n"
  },
  {
    "path": "migrations/1755455095.sh",
    "content": "echo \"Ensure TTE and dependencies are installed\"\n\nomarchy-pkg-add python-poetry-core python-terminaltexteffects\n"
  },
  {
    "path": "migrations/1755459930.sh",
    "content": "echo \"Add potentially missing dependency for power profile controls\"\n\nomarchy-pkg-add python-gobject\n"
  },
  {
    "path": "migrations/1755494432.sh",
    "content": "echo \"Disable USB autosuspend\"\n\nbash \"$OMARCHY_PATH/install/config/hardware/usb-autosuspend.sh\"\n"
  },
  {
    "path": "migrations/1755507891.sh",
    "content": "#!/bin/bash\n\necho \"Migrating to use omarchy-launch-webapp and omarchy-launch-browser\"\nfor desktop_file in ~/.local/share/applications/*.desktop; do\n  if grep -q 'Exec=chromium --new-window --ozone-platform=wayland --app=' \"$desktop_file\"; then\n    url=$(grep '^Exec=' \"$desktop_file\" | sed -n 's/.*--app=\"\\?\\([^\"]*\\)\"\\?.*/\\1/p')\n\n    if [[ -n $url ]]; then\n      sed -i \"s|^Exec=.*|Exec=omarchy-launch-webapp \\\"$url\\\"|\" \"$desktop_file\"\n    fi\n  fi\ndone\n\necho \"Updating Hyprland bindings\"\nHYPR_BINDINGS_FILE=\"$HOME/.config/hypr/bindings.conf\"\nif [[ -f $HYPR_BINDINGS_FILE ]]; then\n  sed -i 's/\\$browser =.*chromium.*$/\\$browser = omarchy-launch-browser/' \"$HYPR_BINDINGS_FILE\"\n  sed -i 's/\\$webapp=\"/omarchy-launch-webapp \"/g' \"$HYPR_BINDINGS_FILE\"\n  sed -i '/^\\$webapp = \\$browser --app/d' \"$HYPR_BINDINGS_FILE\"\nfi\n\n"
  },
  {
    "path": "migrations/1755795450.sh",
    "content": "echo \"Ensure latest uwsm is installed\"\n\nsudo pacman -Syu --noconfirm uwsm\n"
  },
  {
    "path": "migrations/1755865046.sh",
    "content": "echo \"Switch from lazydocker-bin to lazydocker official\"\n\nomarchy-pkg-drop lazydocker-bin\nomarchy-pkg-add lazydocker\n"
  },
  {
    "path": "migrations/1755867743.sh",
    "content": "echo \"Copy Omarchy logo to ~/.config/omarchy/branding/screensaver.txt so screensaver can be personalized\"\n\nmkdir -p ~/.config/omarchy/branding\ncp $OMARCHY_PATH/logo.txt ~/.config/omarchy/branding/screensaver.txt\n"
  },
  {
    "path": "migrations/1755870033.sh",
    "content": "echo \"Use current terminal shell cwd for new terminal working directories\"\n\nif ! grep -q \"working-directory\" ~/.config/hypr/bindings.conf; then\n  sed -i '/bindd = SUPER, RETURN, Terminal, exec, \\$terminal/ s|$| --working-directory=$(omarchy-cmd-terminal-cwd)|' ~/.config/hypr/bindings.conf\nfi\n"
  },
  {
    "path": "migrations/1755904244.sh",
    "content": "echo \"Update fastfetch config with new Omarchy logo\"\n\nomarchy-refresh-config fastfetch/config.jsonc\n\nmkdir -p ~/.config/omarchy/branding\ncp $OMARCHY_PATH/icon.txt ~/.config/omarchy/branding/about.txt\n"
  },
  {
    "path": "migrations/1755920552.sh",
    "content": "echo \"Use verbose package lists for pacman\"\n\nsudo sed -i '/^ILoveCandy$/a VerbosePkgLists' /etc/pacman.conf\n"
  },
  {
    "path": "migrations/1755930114.sh",
    "content": "echo \"Add new Omarchy Menu icon to Waybar\"\n\nmkdir -p ~/.local/share/fonts\ncp ~/.local/share/omarchy/config/omarchy.ttf ~/.local/share/fonts/\nfc-cache\n"
  },
  {
    "path": "migrations/1756060611.sh",
    "content": "echo \"Migrate AUR packages to official repos where possible\"\n\nreinstall_package_opr() {\n  if omarchy-pkg-present $1; then\n    sudo pacman -Rns --noconfirm $1\n    sudo pacman -S --noconfirm ${2:-$1}\n  fi\n}\n\nomarchy-pkg-drop yay-bin-debug\n\nreinstall_package_opr yay-bin yay\nreinstall_package_opr obsidian-bin obsidian\nreinstall_package_opr localsend-bin localsend\nreinstall_package_opr omarchy-chromium-bin omarchy-chromium\nreinstall_package_opr python-terminaltexteffects\nreinstall_package_opr tzupdate\nreinstall_package_opr typora\nreinstall_package_opr ttf-ia-writer\n"
  },
  {
    "path": "migrations/1756115364.sh",
    "content": "echo \"Replace buggy native Zoom client with webapp\"\n\nif omarchy-pkg-present zoom; then\n  omarchy-pkg-drop zoom\n  omarchy-webapp-install \"Zoom\" https://app.zoom.us/wc/home https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/zoom.png\nfi\n"
  },
  {
    "path": "migrations/1756153445.sh",
    "content": "echo \"Checking and correcting Snapper configs if needed\"\nif command -v snapper &>/dev/null; then\n  if ! sudo snapper list-configs 2>/dev/null | grep -q \"root\"; then\n    sudo snapper -c root create-config /\n  fi\n\n  if ! sudo snapper list-configs 2>/dev/null | grep -q \"home\"; then\n    sudo snapper -c home create-config /home\n  fi\nfi\n"
  },
  {
    "path": "migrations/1756203383.sh",
    "content": "echo \"Remove old About, Activity, Audio Settings apps that are in Omarchy Menu or hotkey\"\n\nrm -f ~/.local/share/applications/About.desktop\nrm -f ~/.local/share/applications/Activity.desktop\nrm -f ~/.local/share/applications/wiremix.desktop\n"
  },
  {
    "path": "migrations/1756205202.sh",
    "content": "echo \"Symlink files needed for Nautilus navigation icons\"\n\nsudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-previous-symbolic.svg /usr/share/icons/Yaru/scalable/actions/go-previous-symbolic.svg\nsudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-next-symbolic.svg /usr/share/icons/Yaru/scalable/actions/go-next-symbolic.svg\nsudo gtk-update-icon-cache /usr/share/icons/Yaru\npkill -x nautilus || true\n\n"
  },
  {
    "path": "migrations/1756300740.sh",
    "content": "echo \"Remove no-longer-needed sudoless package listing updates\"\n\nsudo rm -f /etc/sudoers.d/repositories\n"
  },
  {
    "path": "migrations/1756360552.sh",
    "content": "echo \"Move Omarchy Package Repository after Arch core/extra/multilib and remove AUR\"\n\nomarchy-refresh-pacman\nsudo pacman -Syu --noconfirm\n"
  },
  {
    "path": "migrations/1756371020.sh",
    "content": "echo \"Stop restarting waybar on unlock to see if we have solved the stacking problem for good\"\n\nomarchy-refresh-hypridle\n"
  },
  {
    "path": "migrations/1756410649.sh",
    "content": "echo \"Remove any Chaotic-AUR infrastructure packages\"\n\nomarchy-pkg-drop chaotic-keyring chaotic-mirrorlist\n\nif sudo pacman-key --list-keys 3056513887B78AEB >/dev/null 2>&1; then\n  sudo pacman-key --delete 3056513887B78AEB\nfi\n"
  },
  {
    "path": "migrations/1756411333.sh",
    "content": "echo \"Use new Omarchy mirror as default\"\n\nomarchy-refresh-pacman\n"
  },
  {
    "path": "migrations/1756411865.sh",
    "content": "echo \"Add back ttf-ia-writer if it was missing\"\n\nomarchy-pkg-add ttf-ia-writer\n"
  },
  {
    "path": "migrations/1756491748.sh",
    "content": "echo \"Removing UseDNS=no from network files to fix DNS issue\"\n\nfor file in /etc/systemd/network/*.network; do\n  [[ -f $file ]] || continue\n  sudo sed -i '/^UseDNS=no/d' \"$file\"\ndone"
  },
  {
    "path": "migrations/1756494998.sh",
    "content": "echo \"Remove opacity from alacritty.toml so Hyprland can control fully\"\n\nif [[ -f ~/.config/alacritty/alacritty.toml ]]; then\n  sed -i '/opacity = 0.98/d' ~/.config/alacritty/alacritty.toml\nfi\n"
  },
  {
    "path": "migrations/1756507384.sh",
    "content": "echo \"Replace JetBrains Mono font with the Nerd Font edition\"\n\nomarchy-pkg-add ttf-jetbrains-mono-nerd\nomarchy-pkg-drop ttf-jetbrains-mono\n"
  },
  {
    "path": "migrations/1756556731.sh",
    "content": "echo \"Add Samba network drive support to the file manager\"\n\nomarchy-pkg-add gvfs-smb\n"
  },
  {
    "path": "migrations/1756629295.sh",
    "content": "echo \"Ensure qt5-wayland is installed so KeepassXC, Nextcloud, Sqlite Browser, and other apps display correctly\"\n\nomarchy-pkg-add qt5-wayland\n"
  },
  {
    "path": "migrations/1756642681.sh",
    "content": "echo \"Fix audio input on AMD Framework laptops\"\n\nsource $OMARCHY_PATH/install/config/hardware/fix-f13-amd-audio-input.sh || true\n"
  },
  {
    "path": "migrations/1756650507.sh",
    "content": "echo \"Fix JetBrains font setting\"\n\nif [[ $(omarchy-font-current) == JetBrains* ]]; then\n  omarchy-font-set \"JetBrainsMono Nerd Font\"\nfi\n"
  },
  {
    "path": "migrations/1756911131.sh",
    "content": "echo \"Enable UFW systemd service for existing installations\"\n\nif omarchy-cmd-present ufw; then\n    if sudo ufw status | grep -q \"Status: active\\|22/tcp\\|53317\"; then\n        if ! systemctl is-enabled ufw >/dev/null 2>&1; then\n            sudo systemctl enable ufw --now\n            echo \"UFW systemd service enabled\"\n        fi\n    fi\nfi\n\n"
  },
  {
    "path": "migrations/1757021485.sh",
    "content": "echo \"Install Copy URL extension for Chromium\"\n\nomarchy-refresh-chromium\n"
  },
  {
    "path": "migrations/1757147211.sh",
    "content": "echo \"Create managed policy directories for Chromium and Brave for theme switching\"\n\nsudo mkdir -p /etc/chromium/policies/managed\nsudo chmod a+rw /etc/chromium/policies/managed\n\nsudo mkdir -p /etc/brave/policies/managed\nsudo chmod a+rw /etc/brave/policies/managed\n"
  },
  {
    "path": "migrations/1757279511.sh",
    "content": "echo \"Add locale to the waybar clock format\"\n\nsed -i \\\n  -e 's/{:%A %H:%M}/{:L%A %H:%M}/' \\\n  -e 's/{:%d %B W%V %Y}/{:L%d %B W%V %Y}/' \\\n  \"$HOME/.config/waybar/config.jsonc\""
  },
  {
    "path": "migrations/1757361127.sh",
    "content": "echo \"Fix DHCP DNS to allow VPN DNS override\"\n\nif [[ -f /etc/systemd/resolved.conf ]]; then\n  if grep -q \"^DNS=$\" /etc/systemd/resolved.conf && grep -q \"^FallbackDNS=$\" /etc/systemd/resolved.conf; then\n    sudo sed -i '/^DNS=$/d; /^FallbackDNS=$/d' /etc/systemd/resolved.conf\n    sudo systemctl restart systemd-resolved\n  fi\nfi"
  },
  {
    "path": "migrations/1757361128.sh",
    "content": "echo \"Enable mDNS resolution for existing Avahi installations\"\n\nif systemctl is-enabled avahi-daemon.service >/dev/null 2>&1; then\n  if ! grep -q \"mdns_minimal\" /etc/nsswitch.conf; then\n    sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns/' /etc/nsswitch.conf\n  fi\nfi"
  },
  {
    "path": "migrations/1757435811.sh",
    "content": "echo \"Copy Omarchy default app icons to .local/share/icons\"\n\nsource $OMARCHY_PATH/install/packaging/icons.sh\n"
  },
  {
    "path": "migrations/1757435812.sh",
    "content": "echo \"Update Zoom webapp to handle zoommtg:// and zoomus:// protocol links\"\n\nif [[ -f ~/.local/share/applications/Zoom.desktop ]]; then\n  omarchy-webapp-remove Zoom\n  omarchy-webapp-install Zoom https://app.zoom.us/wc/home Zoom.png \"omarchy-webapp-handler-zoom %u\" \"x-scheme-handler/zoommtg;x-scheme-handler/zoomus\"\nfi\n"
  },
  {
    "path": "migrations/1757483378.sh",
    "content": "echo \"6Ghz Wi-Fi + Intel graphics acceleration for existing installations\"\n\nbash \"$OMARCHY_PATH/install/config/hardware/set-wireless-regdom.sh\"\nbash \"$OMARCHY_PATH/install/config/hardware/intel.sh\"\n"
  },
  {
    "path": "migrations/1757511571.sh",
    "content": "echo \"Add screen recording indicator to Waybar\"\n\ngum confirm \"Replace current Waybar config (backup will be made)?\" && omarchy-refresh-waybar\n"
  },
  {
    "path": "migrations/1757515650.sh",
    "content": "echo \"Update plymouth theme to avoid freetype2 issue that broke the styled login screen\"\nomarchy-refresh-plymouth\n"
  },
  {
    "path": "migrations/1757535736.sh",
    "content": "echo \"Enabling vim keys in btop\"\n\nCONFIG_FILE=~/.config/btop/btop.conf\n\nif [[ -f $CONFIG_FILE ]]; then\n  if grep -q \"^vim_keys = \" \"$CONFIG_FILE\"; then\n    sed -i 's/^vim_keys = False/vim_keys = True/' \"$CONFIG_FILE\"\n  fi\nfi\n"
  },
  {
    "path": "migrations/1757783204.sh",
    "content": "echo \"Create ~/Work with ./bin in the path for contained projects\"\n\nmise_config=\"$HOME/Work/.mise.toml\"\n\nif [[ -f $mise_config ]]; then\n  cp $mise_config \"$mise_config.bak.$(date +%s)\"\nfi\n\nsource \"$OMARCHY_PATH/install/config/mise-work.sh\"\n"
  },
  {
    "path": "migrations/1757861484.sh",
    "content": "echo \"Add a blurred background to the lock screen\"\n\nomarchy-refresh-hyprlock\n"
  },
  {
    "path": "migrations/1757866485.sh",
    "content": "echo \"Add SUPER + SHIFT + B to start browser in private mode\"\n\nif [[ -f ~/.config/hypr/bindings.conf ]] && grep -q \"SUPER, B, Browser, exec\" ~/.config/hypr/bindings.conf; then\n  sed -i '/^bindd = SUPER, B, Browser, exec, \\$browser$/a\\\nbindd = SUPER SHIFT, B, Browser (private), exec, $browser --private' ~/.config/hypr/bindings.conf\nfi\n"
  },
  {
    "path": "migrations/1757877123.sh",
    "content": "echo \"Obsidian should be using Wayland IME for better compatibility with fcitx5 and other languages\"\n\nif [[ -f ~/.config/hypr/bindings.conf ]]; then\n  sed -i '/^bindd = SUPER, O, Obsidian, exec, uwsm app -- obsidian -disable-gpu/{\n    /--enable-wayland-ime/! s/$/ --enable-wayland-ime/\n  }' ~/.config/hypr/bindings.conf\nfi\n"
  },
  {
    "path": "migrations/1757877852.sh",
    "content": "echo \"Switch select bindings to launch or focus mode\"\n\nif [[ -f ~/.config/hypr/bindings.conf ]]; then\n  sed -i '/SUPER, M, Music, exec/ c\\bindd = SUPER, M, Music, exec, omarchy-launch-or-focus spotify' ~/.config/hypr/bindings.conf\n  sed -i '/SUPER, O, Obsidian, exec/ c\\bindd = SUPER, O, Obsidian, exec, omarchy-launch-or-focus obsidian \"uwsm-app -- obsidian -disable-gpu --enable-wayland-ime\"' ~/.config/hypr/bindings.conf\n\n  sed -i '/SUPER, G, Signal, exec/ c\\bindd = SUPER, G, Signal, exec, omarchy-launch-or-focus signal \"uwsm-app -- signal-desktop\"' ~/.config/hypr/bindings.conf\n  sed -i '/SUPER SHIFT, G, WhatsApp, exec/ c\\bindd = SUPER SHIFT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp \"https://web.whatsapp.com/\"' ~/.config/hypr/bindings.conf\n  sed -i '/SUPER ALT, G, Google Messages, exec/ c\\bindd = SUPER ALT, G, Google Messages, exec, omarchy-launch-or-focus-webapp \"Google Messages\" \"https://messages.google.com/web/conversations\"' ~/.config/hypr/bindings.conf\nfi\n"
  },
  {
    "path": "migrations/1757879836.sh",
    "content": "echo \"Ensure .config/hypr/looknfeel.conf is available and included\"\n\nif [[ ! -f ~/.config/hypr/looknfeel.conf ]]; then\n  cp $OMARCHY_PATH/config/hypr/looknfeel.conf ~/.config/hypr/looknfeel.conf\nfi\n\nif [[ -f ~/.config/hypr/hyprland.conf ]]; then\n  grep -qx 'source = ~/.config/hypr/looknfeel.conf' ~/.config/hypr/hyprland.conf ||\n    sed -i '/^source = ~\\/.config\\/hypr\\/envs\\.conf$/a source = ~/.config/hypr/looknfeel.conf' ~/.config/hypr/hyprland.conf\nfi\n"
  },
  {
    "path": "migrations/1758019332.sh",
    "content": "echo \"Set \\$TERMINAL and \\$EDITOR in ~/.config/uwsm/default so entire system can rely on it\"\n\n# Set terminal and editor default in uwsm\nomarchy-refresh-config uwsm/default\nomarchy-refresh-config uwsm/env\nomarchy-state set reboot-required\n\n# Ensure scrolltouchpad setting applies to all terminals\nif grep -q \"scrolltouchpad 1.5, class:Alacritty\" ~/.config/hypr/input.conf; then\n  sed -i 's/windowrule = scrolltouchpad 1\\.5, class:Alacritty/windowrule = scrolltouchpad 1.5, tag:terminal/' ~/.config/hypr/input.conf\nfi\n\n# Use default editor for keybinding\nif grep -q \"bindd = SUPER, N, Neovim\" ~/.config/hypr/bindings.conf; then\n  sed -i '/SUPER, N, Neovim, exec/ c\\bindd = SUPER, N, Editor, exec, omarchy-launch-editor' ~/.config/hypr/bindings.conf\nfi\n\n# Use default terminal for keybinding\nif grep -q \"terminal = uwsm app\" ~/.config/hypr/bindings.conf; then\n  sed -Ei '/terminal = uwsm[- ]app -- alacritty/ c\\$terminal = uwsm-app -- $TERMINAL' ~/.config/hypr/bindings.conf\nfi\n"
  },
  {
    "path": "migrations/1758051607.sh",
    "content": "echo \"Copy configs for ghostty + kitty so they're available as alternative terminal options\"\n\nif [[ ! -f ~/.config/ghostty/config ]]; then\n  mkdir -p ~/.config/ghostty\n  cp -Rpf $OMARCHY_PATH/config/ghostty/config ~/.config/ghostty/config\nfi\n\nif [[ ! -f ~/.config/kitty/kitty.conf ]]; then\n  mkdir -p ~/.config/kitty\n  cp -Rpf $OMARCHY_PATH/config/kitty/kitty.conf ~/.config/kitty/kitty.conf\nfi\n"
  },
  {
    "path": "migrations/1758104201.sh",
    "content": "echo \"Prevent powerprofilesctl from using Mise python and not working\"\n\nbash $OMARCHY_PATH/install/config/fix-powerprofilesctl-shebang.sh\n"
  },
  {
    "path": "migrations/1758107879.sh",
    "content": "echo \"Migrate to Walker 2.0.0\"\n\nNEEDS_MIGRATION=false\n\nPACKAGES=(\n  \"elephant\"\n  \"elephant-calc\"\n  \"elephant-clipboard\"\n  \"elephant-bluetooth\"\n  \"elephant-desktopapplications\"\n  \"elephant-files\"\n  \"elephant-menus\"\n  \"elephant-providerlist\"\n  \"elephant-runner\"\n  \"elephant-symbols\"\n  \"elephant-unicode\"\n  \"elephant-websearch\"\n  \"elephant-todo\"\n  \"walker\"\n  \"libqalculate\"\n)\n\nfor pkg in \"${PACKAGES[@]}\"; do\n  if ! omarchy-pkg-present \"$pkg\"; then\n    NEEDS_MIGRATION=true\n    break\n  fi\ndone\n\nWALKER_MAJOR=$(walker -v 2>&1 | grep -oP '^\\d+' || echo \"0\")\nif (( WALKER_MAJOR < 2 )); then\n  NEEDS_MIGRATION=true\nfi\n\n# Ensure basic config is present\nmkdir -p ~/.config/walker\ncp -r ~/.local/share/omarchy/config/walker/* ~/.config/walker/\n\nif $NEEDS_MIGRATION; then\n  kill -9 $(pgrep -x walker) 2>/dev/null || true\n\n  omarchy-pkg-drop walker-bin walker-bin-debug\n\n  omarchy-pkg-add \"${PACKAGES[@]}\"\n\n  source $OMARCHY_PATH/install/config/walker-elephant.sh\n\n  rm -rf ~/.config/walker/themes\n\n  omarchy-refresh-config walker/config.toml\n  omarchy-refresh-config elephant/calc.toml\n  omarchy-refresh-config elephant/desktopapplications.toml\nfi\n\necho # Assure final success\n"
  },
  {
    "path": "migrations/1758111304.sh",
    "content": "echo \"Remove Ruby build options to force GCC14 now that GCC15 is compatible\"\n\nmise settings unset ruby.ruby_build_opts\n"
  },
  {
    "path": "migrations/1758142943.sh",
    "content": "echo \"Turn off VSCode's own auto-update feature (we rely on pacman)\"\n\n# Note: We cannot use `jq` to update settings.json because it’s JSONC (allows comments),\n# which jq doesn’t support.\n\nVS_CODE_SETTINGS=\"$HOME/.config/Code/User/settings.json\"\n\n# If VSCode is installed, ensure that the \"update.mode\" setting is set to \"none\"\nif omarchy-cmd-present code; then\n  mkdir -p \"$(dirname \"$VS_CODE_SETTINGS\")\"\n\n  if [[ ! -f $VS_CODE_SETTINGS ]]; then\n    # If settings.json doesn't exist, create it with just the update.mode setting\n    printf '{\\n  \"update.mode\": \"none\"\\n}\\n' > \"$VS_CODE_SETTINGS\"\n elif ! grep -q '\"update.mode\"' \"$VS_CODE_SETTINGS\"; then\n    # Insert \"update.mode\": \"none\", immediately after the first \"{\"\n    # Use sed's first-match range (0,/{/) to only replace the first \"{\n    sed -i --follow-symlinks -E '0,/\\{/{s/\\{/{\\\n  \"update.mode\": \"none\",/}' \"$VS_CODE_SETTINGS\"\n  fi\nfi\n"
  },
  {
    "path": "migrations/1758436991.sh",
    "content": "echo \"Fix Disk Usage and Docker TUIs\"\n\nAPP_DIR=\"$HOME/.local/share/applications\"\nICON_DIR=\"$APP_DIR/icons\"\n\n# Don't use omarchy-tui-remove to preserve icons\n\nif [[ -f $APP_DIR/Docker.desktop ]]; then\n  rm \"$APP_DIR/Docker.desktop\"\n  omarchy-tui-install \"Docker\" \"lazydocker\" tile \"$ICON_DIR/Docker.png\"\nfi\n\nif [[ -f $APP_DIR/\"Disk Usage.desktop\" ]]; then\n  rm \"$APP_DIR/Disk Usage.desktop\" \n  omarchy-tui-install \"Disk Usage\" \"bash -c 'dust -r; read -n 1 -s'\" float \"$ICON_DIR/Disk Usage.png\"\nfi\n"
  },
  {
    "path": "migrations/1758455816.sh",
    "content": "echo \"Add thunderbolt support to boot image\"\n\nomarchy-pkg-add bolt\n\nif [[ ! -f /etc/mkinitcpio.conf.d/thunderbolt_module.conf ]]; then\n  sudo tee /etc/mkinitcpio.conf.d/thunderbolt_module.conf <<EOF >/dev/null\nMODULES+=(thunderbolt)\nEOF\nfi\n\nif omarchy-cmd-present limine-update; then\n  sudo limine-update\nfi\n"
  },
  {
    "path": "migrations/1758487660_change_dm_to_sddm.sh",
    "content": "#!/bin/bash\nset -e\n\nerror_exit() {\n  echo -e \"\\033[31mERROR: Migration failed! Manual intervention required.\\033[0m\" >&2\n  echo -e \"\\033[31mDO NOT REBOOT - System may be in inconsistent state until the error is fixed.\\033[0m\" >&2\n  exit 1\n}\n\ntrap error_exit ERR\n\necho \"Change display manager to SDDM\"\n\nomarchy-pkg-add sddm libsecret gnome-keyring || error_exit\n\nsudo mkdir -p /etc/sddm.conf.d\n\ncat <<EOF | sudo tee /etc/sddm.conf.d/autologin.conf\n[Autologin]\nUser=$USER\nSession=hyprland-uwsm\n\n[Theme]\nCurrent=breeze\nEOF\n\nsudo systemctl disable omarchy-seamless-login.service\nsudo systemctl unmask plymouth-quit-wait.service\nsudo systemctl enable getty@tty1.service\nsudo systemctl enable sddm.service\nsudo systemctl daemon-reload\n\nif systemctl is-enabled omarchy-seamless-login.service >/dev/null 2>&1; then\n  echo -e \"\\033[31mError: omarchy-seamless-login.service is still enabled\\033[0m\" >&2\n  error_exit\nfi\n\nif systemctl is-masked plymouth-quit-wait.service >/dev/null 2>&1; then\n  echo -e \"\\033[31mError: plymouth-quit-wait.service is still masked\\033[0m\" >&2\n  error_exit\nfi\n\nif ! systemctl is-enabled getty@tty1.service >/dev/null 2>&1; then\n  echo -e \"\\033[31mError: getty@tty1.service is not enabled\\033[0m\" >&2\n  error_exit\nfi\n\nif ! systemctl is-enabled sddm.service >/dev/null 2>&1; then\n  echo -e \"\\033[31mError: sddm.service is not enabled\\033[0m\" >&2\n  error_exit\nfi\n\nsudo rm -f /usr/local/bin/seamless-login\nsudo rm -f /etc/systemd/system/plymouth-quit.service.d/wait-for-graphical.conf\nsudo rm -f /etc/systemd/system/omarchy-seamless-login.service\n"
  },
  {
    "path": "migrations/1758487662_move_to_custom_uki.sh",
    "content": "echo \"Update UKI to custom named entry\"\n\nif command -v limine &>/dev/null && [[ -f /etc/default/limine ]]; then\n  if grep -q \"^ENABLE_UKI=yes\" /etc/default/limine; then\n    if ! grep -q \"^CUSTOM_UKI_NAME=\" /etc/default/limine; then\n      sudo sed -i '/^ENABLE_UKI=yes/a CUSTOM_UKI_NAME=\"omarchy\"' /etc/default/limine\n    fi\n\n    # Remove the archinstall-created Limine entry\n    while IFS= read -r bootnum; do\n      sudo efibootmgr -b \"$bootnum\" -B >/dev/null 2>&1\n    done < <(efibootmgr | grep -E \"^Boot[0-9]{4}\\*? Arch Linux Limine\" | sed 's/^Boot\\([0-9]\\{4\\}\\).*/\\1/')\n\n    sudo limine-update\n\n    uki_file=$(find /boot/EFI/Linux/ -name \"omarchy*.efi\" -printf \"%f\\n\" 2>/dev/null | head -1)\n\n    if [[ -n $uki_file ]]; then\n      while IFS= read -r bootnum; do\n        sudo efibootmgr -b \"$bootnum\" -B >/dev/null 2>&1\n      done < <(efibootmgr | grep -E \"^Boot[0-9]{4}\\*? Omarchy\" | sed 's/^Boot\\([0-9]\\{4\\}\\).*/\\1/')\n\n      # Skip EFI entry creation on Apple hardware\n      if ! cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi \"Apple\"; then\n        sudo efibootmgr --create \\\n          --disk \"$(findmnt -n -o SOURCE /boot | sed 's/p\\?[0-9]*$//')\" \\\n          --part \"$(findmnt -n -o SOURCE /boot | grep -o 'p\\?[0-9]*$' | sed 's/^p//')\" \\\n          --label \"Omarchy\" \\\n          --loader \"\\\\EFI\\\\Linux\\\\$uki_file\"\n      fi\n    fi\n  else\n    echo \"Not using UKI. Not making any changes.\"\n  fi\nelse\n  echo \"Boot config is non-standard. Not making any changes.\"\nfi\n\n"
  },
  {
    "path": "migrations/1758562032.sh",
    "content": "echo \"Fix Tailscale split DNS compatibility by removing [!UNAVAIL=return] from nsswitch.conf\"\n\nif grep -q '\\[!UNAVAIL=return\\]' /etc/nsswitch.conf; then\n  sudo sed -i 's/resolve \\[!UNAVAIL=return\\]/resolve/g' /etc/nsswitch.conf\nfi"
  },
  {
    "path": "migrations/1758564460.sh",
    "content": "echo \"Enable fast shutdown\"\nsource $OMARCHY_PATH/install/config/fast-shutdown.sh \n"
  },
  {
    "path": "migrations/1759093827.sh",
    "content": "echo \"Adding hidden entries for electron apps\"\n\ncp $OMARCHY_PATH/applications/hidden/electron*.desktop ~/.local/share/applications/\n"
  },
  {
    "path": "migrations/1759270604.sh",
    "content": "echo \"Update Hyprlock with better placeholder position and show all fail text\"\n\nomarchy-refresh-hyprlock\n"
  },
  {
    "path": "migrations/1759355846.sh",
    "content": "echo \"Symlink systemd-resolved to /etc/resolv.conf\"\n\n# Backup if /etc/resolv.conf was modified after system birth\nsystem_birth=$(stat -c %W /)\nresolvconf_modified=$(stat -c %Y /etc/resolv.conf)\n\n# Run a backup if resolv.conf isn't a symlink and was modified after install\nif [[ -s /etc/resolv.conf ]] && [[ ! -L /etc/resolv.conf ]] && [[ $resolvconf_modified > $system_birth ]]; then\n  # Backup the destination file (with timestamp) to avoid clobbering (Ex: resolv.conf.bak.1753817951)\n  backup_file=\"/etc/resolv.conf.bak.$(date +%s)\"\n\n  # Create backup\n  sudo cp -f /etc/resolv.conf \"$backup_file\" 2>/dev/null\n\n  # Inform users\n  echo -e \"\\e[31mReplaced /etc/resolv.conf with symlink to systemd-resolved. \\nSaved backup as ${backup_file}.\\e[0m\"\n  echo -e \"\\e[31mSee https://wiki.archlinux.org/title/Systemd-resolved.\\e[0m\"\nfi\n\n# Write the symlink\nsudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf\n"
  },
  {
    "path": "migrations/1759691413.sh",
    "content": "echo \"Correct path for sudoless asdcontrol for working Apple Display hotkeys\"\n\nif [[ $(command -v asdcontrol) == \"/usr/bin/asdcontrol\" ]]; then\n  echo \"$USER ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol\" | sudo tee /etc/sudoers.d/asdcontrol\nfi\n"
  },
  {
    "path": "migrations/1759694076.sh",
    "content": "echo \"Hide OpenJDK applications from app launcher\"\n\ncp $OMARCHY_PATH/applications/hidden/*openjdk.desktop ~/.local/share/applications/\n\n"
  },
  {
    "path": "migrations/1759895423.sh",
    "content": "echo \"Make shift+insert paste and ctrl+insert copy from clipboard in terminal\"\n\n# Add keybindings to Alacritty\nsed -i 's/{ key = \"F11\", action = \"ToggleFullscreen\" }/{ key = \"F11\", action = \"ToggleFullscreen\" },\\n{ key = \"Insert\", mods = \"Shift\", action = \"Paste\" },\\n{ key = \"Insert\", mods = \"Control\", action = \"Copy\" }/' ~/.config/alacritty/alacritty.toml\n\n# Add keybindings to Ghostty\nsed -i '/keybind = f11=toggle_fullscreen/a keybind = shift+insert=paste_from_clipboard\\nkeybind = control+insert=copy_to_clipboard' ~/.config/ghostty/config\n\n# Add keybindings to Kitty\nsed -i '/map F11 toggle_fullscreen/a map ctrl+insert copy_to_clipboard' ~/.config/kitty/kitty.conf\n"
  },
  {
    "path": "migrations/1759913695.sh",
    "content": "echo \"Fix NVMe suspend issues on MacBook models\"\n\nbash $OMARCHY_PATH/install/config/hardware/fix-apple-suspend-nvme.sh\n"
  },
  {
    "path": "migrations/1760144906.sh",
    "content": "echo \"Change omarchy-screenrecord to use gpu-screen-recorder\"\nomarchy-pkg-drop wf-recorder wl-screenrec\n\n# Add slurp in case it hadn't been picked up from an old migration\nomarchy-pkg-add slurp gpu-screen-recorder\n"
  },
  {
    "path": "migrations/1760301290.sh",
    "content": "echo \"Add the new Flexoki Light theme\"\n\nif [[ ! -L ~/.config/omarchy/themes/flexoki-light ]]; then\n  ln -nfs ~/.local/share/omarchy/themes/flexoki-light ~/.config/omarchy/themes/\nfi\n"
  },
  {
    "path": "migrations/1760304963.sh",
    "content": "echo \"Add a default keyring for gnome-keyring that unlocks on login\"\n\nif [[ -f $HOME/.local/share/keyrings/Default_keyring.keyring ]] || [[ -f $HOME/.local/share/keyrings/default ]]; then\n    if gum confirm \"Do you want to replace existing keyring with one that's auto-unlocked on login?\"; then\n        bash \"$OMARCHY_PATH/install/login/default-keyring.sh\"\n    fi\nelse\n    bash \"$OMARCHY_PATH/install/login/default-keyring.sh\"\nfi\n"
  },
  {
    "path": "migrations/1760434895.sh",
    "content": "echo \"Change to omarchy-nvim package\"\nomarchy-pkg-drop omarchy-lazyvim\nomarchy-pkg-add omarchy-nvim\n\n# Will trigger to overwrite configs or not to pickup new hot-reload themes\nomarchy-nvim-setup\n"
  },
  {
    "path": "migrations/1760441237.sh",
    "content": "echo \"Install Omarchy theme on Obsidian vaults\"\n\nomarchy-theme-set-obsidian\n"
  },
  {
    "path": "migrations/1760462260.sh",
    "content": "echo -e \"Offer new Omarchy hotkeys\\n\"\n\ncat <<EOF\n* Add SUPER + C / V for unified clipboard in both terminal and other apps\n* Add SUPER + CTRL + V for clipboard manager\n* Move fullscreen from F11 to SUPER + F\n* Keep terminal on SUPER + RETURN\n* Move app keys from SUPER + [LETTER] to SHIFT + SUPER + [LETTER]\n* Move toggling tiling/floating to SUPER + T\nEOF\n\necho -e \"\\nSwitching to new hotkeys will change your existing bindings.\\nThe old ones will be backed up as ~/.config/hypr/bindings.conf.bak\\n\"\n\nif gum confirm \"Switch to new hotkeys?\"; then\n  cp ~/.config/hypr/bindings.conf ~/.config/hypr/bindings.conf.bak\n\n  sed -i 's/SUPER SHIFT,/SUPER SHIFT ALT,/g' ~/.config/hypr/bindings.conf\n  sed -i 's/SUPER,/SUPER SHIFT,/g' ~/.config/hypr/bindings.conf\n  sed -i 's/SUPER SHIFT, return, Terminal/SUPER, RETURN, Terminal/gI' ~/.config/hypr/bindings.conf\n  sed -i 's/SUPER ALT,/SUPER SHIFT ALT,/g' ~/.config/hypr/bindings.conf\n  sed -i 's/SUPER CTRL,/SUPER SHIFT CTRL,/g' ~/.config/hypr/bindings.conf\n  sed -i 's/SUPER SHIFT ALT, G, Google Messages/SUPER SHIFT CTRL, G, Google Messages/g' ~/.config/hypr/bindings.conf\n\n  sed -i 's|source = ~/.local/share/omarchy/default/hypr/bindings/tiling\\.conf|source = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf\\\nsource = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf|' ~/.config/hypr/hyprland.conf\nfi\n"
  },
  {
    "path": "migrations/1760471009.sh",
    "content": "echo \"Copy over updated application icons\"\n\ncp -f $OMARCHY_PATH/applications/icons/GitHub.png ~/.local/share/applications/icons/\ncp -f $OMARCHY_PATH/applications/icons/ChatGPT.png ~/.local/share/applications/icons/\ncp -f $OMARCHY_PATH/applications/icons/X.png ~/.local/share/applications/icons/\n"
  },
  {
    "path": "migrations/1760684828.sh",
    "content": "echo \"Remove any active eza theme\"\n\nrm -f ~/.config/eza/theme.yml\n"
  },
  {
    "path": "migrations/1760693222.sh",
    "content": "echo \"Use explicit timezone selector when right-clicking on clock\"\n\nsed -i 's/omarchy-cmd-tzupdate/omarchy-launch-floating-terminal-with-presentation omarchy-tz-select/g' ~/.config/waybar/config.jsonc\n"
  },
  {
    "path": "migrations/1760724934.sh",
    "content": "# Handles changes since 3.1.0-RC\n\necho \"Add shift+insert for kitty\"\n# Add shift+insert paste keybinding to kitty.conf if it doesn't exist\nKITTY_CONF=\"$HOME/.config/kitty/kitty.conf\"\n\nif ! grep -q \"map shift+insert paste_from_clipboard\" \"$KITTY_CONF\"; then\n  sed -i '/map ctrl+insert copy_to_clipboard/a map shift+insert paste_from_clipboard' \"$KITTY_CONF\"\nfi\n\necho \"Copy hooks examples\"\ncp -r $OMARCHY_PATH/config/omarchy/* $HOME/.config/omarchy/\n\necho \"Add packages for updated omarchy-cmd-screenshot\"\nomarchy-pkg-add grim slurp\n\necho \"Add nfs support by default to Nautilus\"\nomarchy-pkg-add gvfs-nfs\n\nif [[ ! -d $HOME/.config/nvim ]]; then\n  echo \"Add missing nvim config\"\n  omarchy-nvim-setup\nfi\n"
  },
  {
    "path": "migrations/1760730253.sh",
    "content": "echo \"Install Aether for Omarchy theme creation\"\n\nomarchy-pkg-add aether\n"
  },
  {
    "path": "migrations/1760787158.sh",
    "content": "echo \"Update Waybar styles for better spacing between icons\"\n\nomarchy-refresh-config waybar/style.css\n"
  },
  {
    "path": "migrations/1761180745.sh",
    "content": "echo \"Ensure interactive shell check is at the top of .bashrc\"\n\nBASHRC=\"$HOME/.bashrc\"\n\nif [[ -f $BASHRC ]] && ! grep -q '\\[\\[ $- != \\*i\\* \\]\\] && return' \"$BASHRC\"; then\n  sed -i '1i# If not running interactively, don'\\''t do anything (leave this at the top of this file)\\n[[ $- != *i* ]] && return\\n' \"$BASHRC\"\nfi\n"
  },
  {
    "path": "migrations/1761241493.sh",
    "content": "echo \"Cleanup extra UKI if needed to prevent errors\"\nif [[ -f /boot/EFI/linux/omarchy_linux.efi ]] && [[ -f /boot/EFI/linux/$(cat /etc/machine-id)_linux.efi ]]; then\n  sudo rm -f /boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi\n\n  if grep -q \"/boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi\" /boot/limine.conf; then\n    echo -e \"Resetting limine config\\n(you may need to re-add other entries via sudo limine-update)\"\n\n    sudo mv /boot/limine.conf /boot/limine.conf.bak\n  sudo tee /boot/limine.conf <<EOF >/dev/null\n### Read more at config document: https://github.com/limine-bootloader/limine/blob/trunk/CONFIG.md\n#timeout: 3\ndefault_entry: 2\ninterface_branding: Omarchy Bootloader\ninterface_branding_color: 2\nhash_mismatch_panic: no\n\nterm_background: 1a1b26\nbackdrop: 1a1b26\n\n# Terminal colors (Tokyo Night palette)\nterm_palette: 15161e;f7768e;9ece6a;e0af68;7aa2f7;bb9af7;7dcfff;a9b1d6\nterm_palette_bright: 414868;f7768e;9ece6a;e0af68;7aa2f7;bb9af7;7dcfff;c0caf5\n\n# Text colors\nterm_foreground: c0caf5\nterm_foreground_bright: c0caf5\nterm_background_bright: 24283b\n\nEOF\n    sudo limine-update\n    sudo limine-snapper-sync\n  fi\nfi\n"
  },
  {
    "path": "migrations/1761247569.sh",
    "content": "echo \"Install expac and inxi for omarchy-debug\"\nomarchy-pkg-add expac inxi\n"
  },
  {
    "path": "migrations/1761269603.sh",
    "content": "echo \"Add right-click terminal action to waybar omarchy menu icon\"\n\nWAYBAR_CONFIG=\"$HOME/.config/waybar/config.jsonc\"\n\nif [[ -f $WAYBAR_CONFIG ]] && ! grep -A5 '\"custom/omarchy\"' \"$WAYBAR_CONFIG\" | grep -q '\"on-click-right\"'; then\n  sed -i '/\"on-click\": \"omarchy-menu\",/a\\    \"on-click-right\": \"omarchy-launch-terminal\",' \"$WAYBAR_CONFIG\"\nfi\n"
  },
  {
    "path": "migrations/1761274806.sh",
    "content": "echo \"Ensure node is available via mise (for treesitter cli)\"\n\nif omarchy-cmd-missing node; then\n  mise use -g node@latest\nfi\n"
  },
  {
    "path": "migrations/1761274980.sh",
    "content": "echo \"Migrate to proper packages for localsend and asdcontrol\"\n\nif omarchy-pkg-present localsend-bin; then\n  omarchy-pkg-drop localsend-bin\n  omarchy-pkg-add localsend\nfi\n\nif omarchy-pkg-present asdcontrol-git; then\n  omarchy-pkg-drop asdcontrol-git\n  omarchy-pkg-add asdcontrol\nfi\n"
  },
  {
    "path": "migrations/1761569743.sh",
    "content": "echo \"Add default Ctrl+P binding for imv; backup existing config if present\"\n\nif [[ -f ~/.config/imv/config ]]; then\n  cp ~/.config/imv/config ~/.config/imv/config.bak.$(date +%s)\nelse\n  mkdir -p ~/.config/imv\nfi\n\ncp ~/.local/share/omarchy/config/imv/config ~/.config/imv/config\n"
  },
  {
    "path": "migrations/1761585764.sh",
    "content": "echo \"Disable Nvim news alerts box\"\n\ncp /usr/share/omarchy-nvim/config/lua/plugins/disable-news-alert.lua ~/.config/nvim/lua/plugins/disable-news-alert.lua\n"
  },
  {
    "path": "migrations/1761638377.sh",
    "content": "echo \"Turn off fcitx5 clipboard that is interferring with other applications\"\n\nmkdir -p ~/.config/fcitx5/conf\ncp $OMARCHY_PATH/config/fcitx5/conf/clipboard.conf ~/.config/fcitx5/conf/\n\nomarchy-restart-xcompose\n"
  },
  {
    "path": "migrations/1761758552.sh",
    "content": "echo \"Set nvim as default via xdg-mime\"\n\nrm ~/.local/share/applications/nvim.desktop || true\n\nxdg-mime default nvim.desktop text/plain\nxdg-mime default nvim.desktop text/english\nxdg-mime default nvim.desktop text/x-makefile\nxdg-mime default nvim.desktop text/x-c++hdr\nxdg-mime default nvim.desktop text/x-c++src\nxdg-mime default nvim.desktop text/x-chdr\nxdg-mime default nvim.desktop text/x-csrc\nxdg-mime default nvim.desktop text/x-java\nxdg-mime default nvim.desktop text/x-moc\nxdg-mime default nvim.desktop text/x-pascal\nxdg-mime default nvim.desktop text/x-tcl\nxdg-mime default nvim.desktop text/x-tex\nxdg-mime default nvim.desktop application/x-shellscript\nxdg-mime default nvim.desktop text/x-c\nxdg-mime default nvim.desktop text/x-c++\nxdg-mime default nvim.desktop application/xml\nxdg-mime default nvim.desktop text/xml\n"
  },
  {
    "path": "migrations/1761897226.sh",
    "content": "echo \"Install Copy URL extension for Brave\"\n\nomarchy-refresh-config brave-flags.conf\n"
  },
  {
    "path": "migrations/1762121828.sh",
    "content": "echo \"Setting up xdg-terminal-exec for gtk-launch terminal support\"\n# Solve for hardcoded glib terminals\n# https://github.com/basecamp/omarchy/issues/1852\n\n# Remove old symlink if it exists -- if someone ran the previous migration early\nif [[ -L /usr/local/bin/xdg-terminal-exec ]]; then\n  sudo rm /usr/local/bin/xdg-terminal-exec\nfi\n\nomarchy-pkg-add xdg-terminal-exec\n\n# Set up xdg-terminals.list based on current $TERMINAL\nif [[ -n $TERMINAL ]]; then\n  case \"$TERMINAL\" in\n  alacritty) desktop_id=\"Alacritty.desktop\" ;;\n  ghostty) desktop_id=\"com.mitchellh.ghostty.desktop\" ;;\n  kitty) desktop_id=\"kitty.desktop\" ;;\n  esac\n\n  if [[ -n $desktop_id ]]; then\n    mkdir -p ~/.config\n    cat > ~/.config/xdg-terminals.list << EOF\n# Terminal emulator preference order for xdg-terminal-exec\n# The first found and valid terminal will be used\n$desktop_id\nEOF\n  fi\nfi\n\n# Copy custom desktop entries with proper X-TerminalArg* keys\nif command -v alacritty > /dev/null 2>&1; then\n  cp \"$OMARCHY_PATH/applications/Alacritty.desktop\" ~/.local/share/applications/\nfi\n\n# Update hyprland bindings to use xdg-terminal-exec\nsed -i 's/\\$terminal = uwsm-app -- \\$TERMINAL/$terminal = uwsm-app -- xdg-terminal-exec/' ~/.config/hypr/bindings.conf\n# Update --working-directory to --dir for xdg-terminal-exec\nsed -i 's/--working-directory=/--dir=/g' ~/.config/hypr/bindings.conf\n\n# Update TERMINAL variable in uwsm config\nsed -i 's/export TERMINAL=.*/export TERMINAL=xdg-terminal-exec/' ~/.config/uwsm/default\n\n# Update waybar config to use xdg-terminal-exec\nwaybar_config=~/.config/waybar/config.jsonc\nif [[ -f $waybar_config ]]; then\n  sed -i 's|\"on-click-right\": \"omarchy-launch-terminal\"|\"on-click-right\": \"xdg-terminal-exec\"|' \"$waybar_config\"\n  sed -i 's|\"on-click\": \"\\$TERMINAL -e btop\"|\"on-click\": \"xdg-terminal-exec btop\"|' \"$waybar_config\"\n  sed -i 's|\"on-click\": \"\\$TERMINAL --class=Wiremix -e wiremix\"|\"on-click\": \"xdg-terminal-exec --app-id=com.omarchy.Wiremix -e wiremix\"|' \"$waybar_config\"\n  omarchy-state set restart-waybar-required\nfi\n\n# Update hyprland window rules to use DNS-format class names\nsystem_conf=~/.config/hypr/apps/system.conf\nif [[ -f $system_conf ]]; then\n  if grep -q 'class:(.*|Impala|' \"$system_conf\" || grep -q 'class:(.*|Wiremix|' \"$system_conf\" || grep -q '|Omarchy|' \"$system_conf\"; then\n    sed -i 's/\\bImpala\\b/com.omarchy.Impala/g; s/\\bWiremix\\b/com.omarchy.Wiremix/g; s/|Omarchy|/|com.omarchy.Omarchy|/g' \"$system_conf\"\n  fi\nfi\n"
  },
  {
    "path": "migrations/1762150269.sh",
    "content": "echo \"Install omarchy-walker meta package\"\nomarchy-pkg-add omarchy-walker\n"
  },
  {
    "path": "migrations/1762156000.sh",
    "content": "echo \"Drop wayfreeze as hyprpicker replaces its function\"\n\nomarchy-pkg-drop wayfreeze-git wayfreeze\n"
  },
  {
    "path": "migrations/1762352101.sh",
    "content": "echo \"Increase Walker limit on how many entries can be shown to 256\"\n\nif ! grep -q \"max_results\" ~/.config/walker/config.toml; then\n  sed -i '/^\\[providers\\]$/a max_results = 256' ~/.config/walker/config.toml\nfi\n"
  },
  {
    "path": "migrations/1762417304.sh",
    "content": "echo \"Replace bluetooth GUI with TUI\"\n\nomarchy-pkg-add bluetui\nomarchy-pkg-drop blueberry\n\nif ! grep -q \"omarchy-launch-bluetooth\" ~/.config/waybar/config.jsonc; then\n  sed -i 's/blueberry/omarchy-launch-bluetooth/' ~/.config/waybar/config.jsonc\nfi\n"
  },
  {
    "path": "migrations/1762446739.sh",
    "content": "echo \"Remove alternative limine.conf files\"\n\nif omarchy-cmd-present limine; then\n  if [[ ! -f /boot/limine.conf ]]; then\n    echo \"Error: /boot/limine.conf does not exist. Do not reboot without resolving this issue!\"\n    exit 1\n  fi\n\n  sudo rm -f /boot/EFI/limine/limine.conf\n  sudo rm -f /boot/EFI/BOOT/limine.conf\n  sudo rm -f /boot/limine/limine.conf\nfi\n"
  },
  {
    "path": "migrations/1762684663.sh",
    "content": "echo \"Update hyprlock font to match current system font\"\n\nfont_name=$(omarchy-font-current)\n\nif [[ -n $font_name ]]; then\n  cp ~/.config/hypr/hyprlock.conf ~/.config/hypr/hyprlock.conf.bak.$(date +%s)\n\n  echo \"Found font '$font_name', updating hyprlock\"\n  sed -i \"s/font_family = .*/font_family = $font_name/g\" ~/.config/hypr/hyprlock.conf\nelse\n  echo \"No font found, skipping migration\"\nfi\n"
  },
  {
    "path": "migrations/1762685081.sh",
    "content": "echo \"Update hyprlock placeholder text based on fingerprint setup status\"\n\ncp ~/.config/hypr/hyprlock.conf ~/.config/hypr/hyprlock.conf.bak.$(date +%s)\n\n# Check if fprintd is installed and has enrolled fingerprints\nif command -v fprintd-list &>/dev/null && fprintd-list \"$USER\" 2>/dev/null | grep -q \"Fingerprints for user\"; then\n  echo \"Fingerprint detected, updating placeholder text with fingerprint icon\"\n  sed -i 's/placeholder_text = .*/placeholder_text = <span> Enter Password 󰈷 <\\/span>/' ~/.config/hypr/hyprlock.conf\nelse\n  echo \"No fingerprint enrolled, updating placeholder text without fingerprint icon\"\n  sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf\nfi\n"
  },
  {
    "path": "migrations/1762711005.sh",
    "content": "echo \"Add usage package to provide tab completion for mise\"\n\nomarchy-pkg-add usage\n"
  },
  {
    "path": "migrations/1762768186.sh",
    "content": "echo \"Ensure config/uwsm/default uses generic terminal exec\"\n\nsed -i 's/export TERMINAL=.*/export TERMINAL=xdg-terminal-exec/' ~/.config/uwsm/default\n"
  },
  {
    "path": "migrations/1762770442.sh",
    "content": "echo \"Slow down Ghostty mouse scrolling to match Alacritty\"\n\nif ! grep -q \"mouse-scroll-multiplier\" ~/.config/ghostty/config; then\n  echo -e \"\\n# Slowdown mouse scrolling\\nmouse-scroll-multiplier = 0.95\" >> ~/.config/ghostty/config\nfi\n"
  },
  {
    "path": "migrations/1762770815.sh",
    "content": "echo \"Pull packages from stable Arch mirror\"\n\nomarchy-refresh-pacman\n"
  },
  {
    "path": "migrations/1762781907.sh",
    "content": "echo \"Add try command for managing quick code experiments\"\n\nomarchy-pkg-add ruby tobi-try\nmkdir -p ~/Work/tries\n"
  },
  {
    "path": "migrations/1762802472.sh",
    "content": "echo \"Update imv config with new keybindings\"\n\nmkdir -p ~/.config/imv\ncp $OMARCHY_PATH/config/imv/config ~/.config/imv/\n"
  },
  {
    "path": "migrations/1762873545.sh",
    "content": "echo \"Switch Elephant to run as a systemd service and walker to be autostarted on login\"\n\npkill elephant\nelephant service enable\nsystemctl --user start elephant.service\n\npkill walker\nmkdir -p ~/.config/autostart/\ncp $OMARCHY_PATH/default/walker/walker.desktop ~/.config/autostart/\nsetsid walker --gapplication-service &\n"
  },
  {
    "path": "migrations/1763386443.sh",
    "content": "echo \"Uniquely identify terminal apps with custom app-ids using omarchy-launch-tui\"\n\n# Replace terminal -e calls with omarchy-launch-tui in bindings\nsed -i 's/\\$terminal -e \\([^ ]*\\)/omarchy-launch-tui \\1/g' ~/.config/hypr/bindings.conf\n\n# Update waybar to use omarchy-launch-or-focus with omarchy-launch-tui for TUI apps\nsed -i 's|xdg-terminal-exec btop|omarchy-launch-or-focus-tui btop|' ~/.config/waybar/config.jsonc\nsed -i 's|xdg-terminal-exec --app-id=com\\.omarchy\\.Wiremix -e wiremix|omarchy-launch-or-focus-tui wiremix|' ~/.config/waybar/config.jsonc\n"
  },
  {
    "path": "migrations/1763393133.sh",
    "content": "echo \"Link new theme picker config\"\n\nmkdir -p ~/.config/elephant/menus\nln -snf $OMARCHY_PATH/default/elephant/omarchy_themes.lua ~/.config/elephant/menus/omarchy_themes.lua\nsed -i '/\"menus\",/d' ~/.config/walker/config.toml\nomarchy-restart-walker\n"
  },
  {
    "path": "migrations/1763409182.sh",
    "content": "echo \"Install exfatprogs to support exfat in format-drive\"\n\nomarchy-pkg-add exfatprogs\n"
  },
  {
    "path": "migrations/1763409505.sh",
    "content": "echo \"Add 10th workspace option to waybar config\"\n\nif ! grep -q '\"10\": \"0\",' ~/.config/waybar/config.jsonc; then\n  sed -i '/\"9\": \"9\",/a\\      \"10\": \"0\",' ~/.config/waybar/config.jsonc\nfi\n"
  },
  {
    "path": "migrations/1763478660.sh",
    "content": "echo \"Configure XDPH config for screensharing to remember token selection\"\n\ncp $OMARCHY_PATH/config/hypr/xdph.conf ~/.config/hypr/\nsystemctl --user restart xdg-desktop-portal-hyprland\n"
  },
  {
    "path": "migrations/1763558828.sh",
    "content": "echo \"Make Alacritty compatible with X-TerminalArgs\"\n\nif omarchy-pkg-present alacritty; then\n  mkdir -p ~/.local/share/applications\n  cat > ~/.local/share/applications/Alacritty.desktop << EOF\n[Desktop Entry]\nType=Application\nTryExec=alacritty\nExec=alacritty\nIcon=Alacritty\nTerminal=false\nCategories=System;TerminalEmulator;\nName=Alacritty\nGenericName=Terminal\nComment=A fast, cross-platform, OpenGL terminal emulator\nStartupNotify=true\nStartupWMClass=Alacritty\nActions=New;\nX-TerminalArgExec=-e\nX-TerminalArgAppId=--class=\nX-TerminalArgTitle=--title=\nX-TerminalArgDir=--working-directory=\n\n[Desktop Action New]\nName=New Terminal\nExec=alacritty\nEOF\nfi\n"
  },
  {
    "path": "migrations/1763560161.sh",
    "content": "echo \"Hide Bluetooth module in waybar if there's no BT controller\"\n\nsed -i '/format-connected\": \"\",/a\\    \"format-no-controller\": \"\",' ~/.config/waybar/config.jsonc\n"
  },
  {
    "path": "migrations/1763561396.sh",
    "content": "echo \"Switch to stable Omarchy Package Repository builds\"\n\nomarchy-refresh-pacman\n"
  },
  {
    "path": "migrations/1763583093.sh",
    "content": "echo \"Make ethereal available as new theme\"\n\nif [[ ! -L ~/.config/omarchy/themes/ethereal ]]; then\n  rm -rf ~/.config/omarchy/themes/ethereal\n  ln -nfs ~/.local/share/omarchy/themes/ethereal ~/.config/omarchy/themes/\nfi\n"
  },
  {
    "path": "migrations/1763626772.sh",
    "content": "echo \"Make hackerman available as new theme\"\n\nif [[ ! -L ~/.config/omarchy/themes/hackerman ]]; then\n  rm -rf ~/.config/omarchy/themes/hackerman\n  ln -nfs ~/.local/share/omarchy/themes/hackerman ~/.config/omarchy/themes/\nfi\n"
  },
  {
    "path": "migrations/1763633307.sh",
    "content": "echo \"Add 100-line split resizing keybindings to Ghostty\"\n\nif ! grep -q \"resize_split:down,100\" ~/.config/ghostty/config; then\n  sed -i \"/keybind = control+insert=copy_to_clipboard/a\\keybind = super+control+shift+alt+arrow_down=resize_split:down,100\\nkeybind = super+control+shift+alt+arrow_up=resize_split:up,100\\nkeybind = super+control+shift+alt+arrow_left=resize_split:left,100\\nkeybind = super+control+shift+alt+arrow_right=resize_split:right,100\" ~/.config/ghostty/config\nfi\n"
  },
  {
    "path": "migrations/1763634099.sh",
    "content": "echo \"Using 󰂱 icon for bluetooth when connected\"\n\nsed -i 's/\"format-connected\": \"\",/\"format-connected\": \"󰂱\",/' ~/.config/waybar/config.jsonc\n"
  },
  {
    "path": "migrations/1763653692.sh",
    "content": "echo \"Replace Waybar dock icon with something more obvious\"\n\nsed -i 's/\"format\": \"\"/\"format\": \"\"/' ~/.config/waybar/config.jsonc\nsed -i '/#custom-expand-icon {/,/}/ s/margin-right: 20px;/margin-right: 18px;/' ~/.config/waybar/style.css\nomarchy-restart-waybar\n"
  },
  {
    "path": "migrations/1763743755.sh",
    "content": "echo \"Refresh Walker config to ensure compatibility with latest version\"\n\nomarchy-refresh-walker\n"
  },
  {
    "path": "migrations/1763753641.sh",
    "content": "echo \"Include pacman mirror and OPR upstreams (edge vs stable) in About\"\n\nomarchy-refresh-fastfetch\n"
  },
  {
    "path": "migrations/1764067068.sh",
    "content": "echo \"Use Bluetooth off icon in the waybar when BlueTUI has turned off the adapter\"\n\nif ! grep -q '\"format-off\": \"󰂲\"' ~/.config/waybar/config.jsonc; then\n  sed -i '/\"format-disabled\": \"󰂲\",/a\\    \"format-off\": \"󰂲\",' ~/.config/waybar/config.jsonc\n  omarchy-restart-waybar\nfi\n"
  },
  {
    "path": "migrations/1764067963.sh",
    "content": "echo \"Ensure lockout limit is reset on reboot\"\n\nsudo sed -i '/pam_faillock\\.so preauth/d' /etc/pam.d/sddm-autologin\nsudo sed -i '/auth.*pam_permit\\.so/a auth        required    pam_faillock.so authsucc' /etc/pam.d/sddm-autologin\n"
  },
  {
    "path": "migrations/1764332115.sh",
    "content": "echo \"Ensure emoji menu (Super + Ctrl + E) uses single column design\"\n\nomarchy-refresh-walker\n"
  },
  {
    "path": "migrations/1764333665.sh",
    "content": "echo \"Ensure you have package repository indexes matching your channel\"\n\nsudo pacman -Syyu --noconfirm\n"
  },
  {
    "path": "migrations/1764378788.sh",
    "content": "echo \"Ignore empty passwords on lock screen\"\n\nif ! grep -q \"ignore_empty_input\" ~/.config/hypr/hyprlock.conf; then\n  sed -i \"/source =/a\\ \\ngeneral {\\n    ignore_empty_input = true\\n}\" ~/.config/hypr/hyprlock.conf\nfi\n"
  },
  {
    "path": "migrations/1765587218.sh",
    "content": "echo \"Add custom share portal picker\"\nomarchy-pkg-add hyprland-preview-share-picker\n\nmkdir -p ~/.config/hyprland-preview-share-picker\nomarchy-refresh-config hyprland-preview-share-picker/config.yaml\n\nif ! grep -q \"custom_picker_binary\" ~/.config/hypr/xdph.conf; then\n  sed -i '/screencopy {/a\\    custom_picker_binary = hyprland-preview-share-picker' ~/.config/hypr/xdph.conf\nfi\n\nsleep 1\nkillall -e xdg-desktop-portal-hyprland\nkillall -e xdg-desktop-portal-wlr\nkillall xdg-desktop-portal\n/usr/lib/xdg-desktop-portal-hyprland &\nsleep 2\n/usr/lib/xdg-desktop-portal &\n"
  },
  {
    "path": "migrations/1765729055.sh",
    "content": "echo \"Add emergency entry for Walker\"\nCONFIG_FILE=\"$HOME/.config/walker/config.toml\"\n\nif [[ -f $CONFIG_FILE ]] && ! grep -q 'command = \"omarchy-restart-walker\"' \"$CONFIG_FILE\"; then\n    cat >> \"$CONFIG_FILE\" << 'EOF'\n\n[[emergencies]]\ntext = \"Restart Walker\"\ncommand = \"omarchy-restart-walker\"\nEOF\nfi\n"
  },
  {
    "path": "migrations/1765739892.sh",
    "content": "if omarchy-cmd-present btrfs && omarchy-cmd-present snapper; then\n  echo \"Adjust snapper space limits & enable btrfs quota\"\n\n  sudo sed -i 's/^SPACE_LIMIT=\"0.5\"/SPACE_LIMIT=\"0.3\"/' /etc/snapper/configs/{root,home} 2>/dev/null\n  sudo sed -i 's/^FREE_LIMIT=\"0.2\"/FREE_LIMIT=\"0.3\"/' /etc/snapper/configs/{root,home} 2>/dev/null\n  sudo btrfs quota enable /\nfi\n"
  },
  {
    "path": "migrations/1765744321.sh",
    "content": "echo \"Increase faillock attempts to 10\"\nsudo sed -i 's/^# *deny = .*/deny = 10/' /etc/security/faillock.conf\n"
  },
  {
    "path": "migrations/1765846739.sh",
    "content": "echo \"Add missing dotnet 9.0 for Pinta\"\n\nomarchy-pkg-add dotnet-runtime-9.0\n"
  },
  {
    "path": "migrations/1765884267.sh",
    "content": "echo \"Change to openai-codex instead of openai-codex-bin\"\n\nif omarchy-pkg-present openai-codex-bin; then\n    omarchy-pkg-drop openai-codex-bin\n    omarchy-pkg-add openai-codex\nfi\n"
  },
  {
    "path": "migrations/1766942230.sh",
    "content": "echo \"Migrate legacy NVIDIA GPUs to nvidia-580xx driver (if needed)\"\n\n# Only migrate GTX 9xx or 10xx (Pascal/Maxwell)\nNVIDIA=\"$(lspci | grep -i 'nvidia')\"\nif echo \"$NVIDIA\" | grep -qE \"GTX 9|GTX 10\"; then\n  if ! pacman -Qq | grep -qE '^linux(-[a-z0-9]+)?-headers$'; then\n    echo \"Error: no linux headers package installed (required for DKMS drivers). Please install the appropriate headers and re-run this migration.\"\n    exit 1\n  fi\n\n  # Piping yes to override existing packages\n  yes | sudo pacman -S nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils\n\n  # Verify packages were installed\n  if ! pacman -Qq nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils &>/dev/null; then\n    echo \"Error: NVIDIA 580xx driver packages failed to install\"\n    exit 1\n  fi\nfi\n"
  },
  {
    "path": "migrations/1767138576.sh",
    "content": "echo \"Update terminal scrolltouchpad setting to Hyprland 0.53 style\"\n\nif grep -q \"scrolltouchpad\" ~/.config/hypr/input.conf; then\n  sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), class:\\(([^)]+)\\)\\s*$/windowrule = match:class (\\2), scroll_touchpad \\1/' ~/.config/hypr/input.conf\n  sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), class:([^ ]+)\\s*$/windowrule = match:class \\2, scroll_touchpad \\1/' ~/.config/hypr/input.conf\n  sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), tag:terminal\\s*$/windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5\\nwindowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2/' ~/.config/hypr/input.conf\nfi\n\n# Ensure we restart to pair new Hyprland settings with new version\nomarchy-state set reboot-required\n"
  },
  {
    "path": "migrations/1767227973.sh",
    "content": "echo \"Replace Waybar omarchy-launch-or-focus-tui wiremix with omarchy-launch-audio\"\n\nsed -i 's/omarchy-launch-or-focus-tui wiremix/omarchy-launch-audio/g' ~/.config/waybar/config.jsonc\n"
  },
  {
    "path": "migrations/1767306902.sh",
    "content": "echo \"Migrate to new theme setup\"\n\n# Move user-added backgrounds from Omarchy theme folders to user config\nOMARCHY_DIR=\"$HOME/.local/share/omarchy\"\nUSER_BACKGROUNDS_DIR=\"$HOME/.config/omarchy/backgrounds\"\n\nif [[ -d $OMARCHY_DIR/themes ]]; then\n  cd \"$OMARCHY_DIR\"\n\n  # Get list of git-tracked background files (relative to omarchy dir)\n  mapfile -t TRACKED_BACKGROUNDS < <(git ls-files --cached 'themes/*/backgrounds/*' 2>/dev/null)\n\n  # Find all background files and check if they're untracked (user-added)\n  for theme_dir in themes/*/; do\n    theme_name=$(basename \"$theme_dir\")\n    backgrounds_dir=\"themes/$theme_name/backgrounds\"\n\n    [[ -d $backgrounds_dir ]] || continue\n\n    for bg_file in \"$backgrounds_dir\"/*; do\n      [[ -f $bg_file ]] || continue\n\n      # Check if this file is tracked by git\n      is_tracked=false\n      for tracked in \"${TRACKED_BACKGROUNDS[@]}\"; do\n        if [[ $tracked == $bg_file ]]; then\n          is_tracked=true\n          break\n        fi\n      done\n\n      if [[ $is_tracked == \"false\" ]]; then\n        # This is a user-added background, move it to user config\n        user_theme_bg_dir=\"$USER_BACKGROUNDS_DIR/$theme_name\"\n        mkdir -p \"$user_theme_bg_dir\"\n        mv \"$bg_file\" \"$user_theme_bg_dir/\"\n        echo \"Moved user background: $bg_file -> $user_theme_bg_dir/\"\n      fi\n    done\n  done\nfi\n\nTHEMES_DIR=\"$HOME/.config/omarchy/themes\"\nCURRENT_THEME_LINK=\"$HOME/.config/omarchy/current/theme\"\n\n# Get current theme name before removing anything\nCURRENT_THEME_NAME=\"\"\nif [[ -L $CURRENT_THEME_LINK ]]; then\n  CURRENT_THEME_NAME=$(basename \"$(readlink \"$CURRENT_THEME_LINK\")\")\nelif [[ -d $CURRENT_THEME_LINK ]]; then\n  CURRENT_THEME_NAME=$(basename \"$CURRENT_THEME_LINK\")\nelif [[ -f $HOME/.config/omarchy/current/theme.name ]]; then\n  CURRENT_THEME_NAME=$(cat \"$HOME/.config/omarchy/current/theme.name\")\nfi\n\n# Remove all symlinks from ~/.config/omarchy/themes\nfind \"$THEMES_DIR\" -mindepth 1 -maxdepth 1 -type l -delete\n\n# Re-apply the current theme with the new system\nif [[ -n $CURRENT_THEME_NAME ]]; then\n  omarchy-theme-set \"$CURRENT_THEME_NAME\"\nelse\n  # Backup to ensure a theme is set if we can't deduce the name\n  omarchy-theme-set \"Tokyo Night\"\nfi\n"
  },
  {
    "path": "migrations/1767414310.sh",
    "content": "echo \"Use correct idle-timer sensitive timeouts for lock screen\"\n\nsed -i 's/timeout = 300/timeout = 151/' ~/.config/hypr/hypridle.conf\n"
  },
  {
    "path": "migrations/1767478141.sh",
    "content": "echo \"Add Omarchy AI skill for assistance tailoring the system\"\n\nsource $OMARCHY_PATH/install/config/omarchy-ai-skill.sh\n"
  },
  {
    "path": "migrations/1767478687.sh",
    "content": "echo \"Add opencode with system themeing\"\n\nomarchy-pkg-add opencode\n\n# Add config using omarchy theme by default\nif [[ ! -f ~/.config/opencode/opencode.json ]]; then\n  mkdir -p ~/.config/opencode\n  cp $OMARCHY_PATH/config/opencode/opencode.json ~/.config/opencode/opencode.json\nfi\n"
  },
  {
    "path": "migrations/1767685679.sh",
    "content": "echo \"Add Voxtype to Waybar\"\n\nSTYLE_FILE=~/.config/waybar/style.css\nCONFIG_FILE=~/.config/waybar/config.jsonc\n\n# Add voxtype CSS if not present\nif ! grep -q \"#custom-voxtype\" \"$STYLE_FILE\"; then\n  sed -i 's/margin-left: 8\\.75px;/margin-left: 5px;/' \"$STYLE_FILE\"\n  sed -i '/#custom-screenrecording-indicator {/,/}/ s/font-size: 10px;/font-size: 10px;\\n  padding-bottom: 1px;/' \"$STYLE_FILE\"\n  cat >> \"$STYLE_FILE\" << 'EOF'\n\n#custom-voxtype {\n  min-width: 12px;\n  margin: 0 0 0 7.5px;\n}\n\n#custom-voxtype.recording {\n  color: #a55555;\n}\nEOF\nfi\n\n# Add voxtype to modules-center if not present\nif ! grep -q \"custom/voxtype\" \"$CONFIG_FILE\"; then\n  # Add to modules-center array\n  sed -i 's/\"custom\\/screenrecording-indicator\"]/\"custom\\/voxtype\", \"custom\\/screenrecording-indicator\"]/' \"$CONFIG_FILE\"\n\n  # Add voxtype config block before tray config\n  sed -i '/\"tray\": {/i\\  \"custom/voxtype\": {\\n    \"exec\": \"omarchy-voxtype-status\",\\n    \"return-type\": \"json\",\\n    \"format\": \"{icon}\",\\n    \"format-icons\": {\\n      \"idle\": \"\",\\n      \"recording\": \"󰍬\",\\n      \"transcribing\": \"󰔟\"\\n    },\\n    \"tooltip\": true,\\n    \"on-click-right\": \"omarchy-voxtype-config\",\\n    \"on-click\": \"omarchy-voxtype-model\"\\n  },' \"$CONFIG_FILE\"\nfi\n\nomarchy-restart-waybar\n"
  },
  {
    "path": "migrations/1767716691.sh",
    "content": "echo \"Add icons for additional audio profiles in Waybar\"\n\nif ! grep -q '\"headphone\": \"\"' \"$HOME/.config/waybar/config.jsonc\"; then\n  sed -i '\n    /\"pulseaudio\": {/,/^[ ]*}/{\n      /\"format-icons\": {/,/^[ ]*}/{\n        /\"default\":/i\\\n\\      \"headphone\": \"\",\n      }\n    }\n  ' \"$HOME/.config/waybar/config.jsonc\"\n\n  omarchy-restart-waybar\nfi\n"
  },
  {
    "path": "migrations/1767865784.sh",
    "content": "echo \"Ensure Chromium is able to start on first run after ISO 3.3.0 install\"\n\nrm -rf ~/.config/chromium/SingletonLock\n"
  },
  {
    "path": "migrations/1768236764.sh",
    "content": "echo \"Prevent kernel upgrades from making current modules unavailable\"\n\nomarchy-pkg-add kernel-modules-hook\nsudo systemctl enable --now linux-modules-cleanup.service\n"
  },
  {
    "path": "migrations/1768270644.sh",
    "content": "echo \"Add icon for headset audio profile in Waybar\"\n\nif ! grep -q '\"headset\": \"\"' \"$HOME/.config/waybar/config.jsonc\"; then\n  sed -i '\n    /\"pulseaudio\": {/,/^[ ]*}/{\n      /\"format-icons\": {/,/^[ ]*}/{\n        /\"default\":/i\\\n\\      \"headset\": \"\",\n      }\n    }\n  ' \"$HOME/.config/waybar/config.jsonc\"\n\n  omarchy-restart-waybar\nfi\n"
  },
  {
    "path": "migrations/1768906440.sh",
    "content": "echo \"Migrate legacy mobile NVIDIA GPUs to nvidia-580xx driver (if needed)\"\n\n# Only migrate MX1xx, 2xx or 3xx (Pascal/Maxwell)\nNVIDIA=\"$(lspci | grep -i 'nvidia')\"\nif echo \"$NVIDIA\" | grep -qE \"MX1|MX2|MX3\"; then\n  if ! pacman -Qq | grep -qE '^linux(-[a-z0-9]+)?-headers$'; then\n    echo \"Error: no linux headers package installed (required for DKMS drivers). Please install the appropriate headers and re-run this migration.\"\n    exit 1\n  fi\n\n  # Piping yes to override existing packages\n  yes | sudo pacman -S nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils\n\n  # Verify packages were installed\n  if ! pacman -Qq nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils &>/dev/null; then\n    echo \"Error: NVIDIA 580xx driver packages failed to install\"\n    exit 1\n  fi\nfi\n"
  },
  {
    "path": "migrations/1768916735.sh",
    "content": "echo \"Fix microphone gain and audio mixing on Asus ROG laptops\"\n\nsource \"$OMARCHY_PATH/install/config/hardware/fix-asus-rog-mic.sh\"\nsource \"$OMARCHY_PATH/install/config/hardware/fix-asus-rog-audio-mixer.sh\"\n\nif omarchy-hw-asus-rog; then\n  omarchy-restart-pipewire\nfi\n"
  },
  {
    "path": "migrations/1769182209.sh",
    "content": "echo \"Enable auto-pasting for the emoji picker\"\n\nomarchy-refresh-config elephant/symbols.toml\nomarchy-restart-walker\n"
  },
  {
    "path": "migrations/1769183359.sh",
    "content": "echo \"Add nautilus-python package for 'Open in Ghostty' shortcut in Nautilus\"\n\nomarchy-pkg-add nautilus-python\n"
  },
  {
    "path": "migrations/1769510847.sh",
    "content": "echo \"Switch back to mainline chromium now that it supports full live themeing\"\n\nif omarchy-pkg-present omarchy-chromium; then\n  if gum confirm \"Ready to switch to mainstream chromium? (Will close Chromium + reset settings)\"; then\n    pkill -x chromium\n    omarchy-pkg-drop omarchy-chromium\n    omarchy-pkg-add chromium\n    omarchy-theme-set-browser\n  fi\nfi\n"
  },
  {
    "path": "migrations/1769543550.sh",
    "content": "echo \"Add SUPER+ALT+SHIFT+F shortcut to open nautilus in cwd\"\n\n# Add the new CWD binding if it doesn't exist\nif ! grep -q \"SUPER ALT SHIFT, F\" ~/.config/hypr/bindings.conf; then\n  sed -i '/bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window/a bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window \"$(omarchy-cmd-terminal-cwd)\"' ~/.config/hypr/bindings.conf\nfi\n"
  },
  {
    "path": "migrations/1769566732.sh",
    "content": "echo \"Set power profile based on source switching (AC or Battery)\"\n\nsource $OMARCHY_PATH/install/config/powerprofilesctl-rules.sh\n"
  },
  {
    "path": "migrations/1769616857.sh",
    "content": "echo \"Turn off opencode's own auto-update feature (we rely on pacman)\"\n\nomarchy-refresh-config opencode/opencode.json\n"
  },
  {
    "path": "migrations/1769619823.sh",
    "content": "echo \"Open directories in file manager using the shell open command\"\n\nxdg-mime default org.gnome.Nautilus.desktop inode/directory\n"
  },
  {
    "path": "migrations/1769964367.sh",
    "content": "echo \"Improve audio controls icon for default selection\"\n\nif [[ ! -f ~/.config/wiremix/wiremix.toml ]]; then\n  mkdir -p ~/.config/wiremix\n  cp -f $OMARCHY_PATH/config/wiremix/wiremix.toml ~/.config/wiremix/\nfi\n"
  },
  {
    "path": "migrations/1770159912.sh",
    "content": "echo \"Fix NVIDIA environment variables for Maxwell/Pascal/Volta GPUs\"\n\n# Detect if user has Maxwell/Pascal/Volta GPU (pre-Turing cards without GSP firmware)\n# Maxwell (GTX 9xx), Pascal (GT/GTX 10xx, Quadro P, MX series), Volta (Titan V, Tesla V100, Quadro GV100)\nNVIDIA=\"$(lspci | grep -i 'nvidia')\"\nif echo \"$NVIDIA\" | grep -qE \"GTX (9[0-9]{2}|10[0-9]{2})|GT 10[0-9]{2}|Quadro [PM][0-9]{3,4}|Quadro GV100|MX *[0-9]+|Titan (X|Xp|V)|Tesla V100\"; then\n  ENVS_CONF=\"$HOME/.config/hypr/envs.conf\"\n\n  if [[ -f $ENVS_CONF ]]; then\n    # Check if file contains problematic variables\n    if grep -qE \"env = (NVD_BACKEND,direct|LIBVA_DRIVER_NAME,nvidia)\" \"$ENVS_CONF\"; then\n      echo \"Removing incompatible NVIDIA environment variables for legacy GPU...\"\n\n      # Create backup\n      cp \"$ENVS_CONF\" \"$ENVS_CONF.bak.$(date +%s)\"\n\n      # Remove all NVIDIA env lines and section headers (we re-add the correct ones below)\n      sed -i '/^env = \\(NVD_BACKEND\\|LIBVA_DRIVER_NAME\\|__GLX_VENDOR_LIBRARY_NAME\\),/d; /^# NVIDIA/d' \"$ENVS_CONF\"\n\n      # Add correct environment variables for legacy GPUs\n      cat >>\"$ENVS_CONF\" <<'EOF'\n\n# NVIDIA (Maxwell/Pascal/Volta without GSP firmware)\nenv = NVD_BACKEND,egl\nenv = __GLX_VENDOR_LIBRARY_NAME,nvidia\nEOF\n\n      echo \"NVIDIA environment variables updated. A backup was saved to $ENVS_CONF.bak.*\"\n      echo \"Please restart Hyprland for changes to take effect.\"\n    fi\n  fi\nfi\n"
  },
  {
    "path": "migrations/1770372978.sh",
    "content": "echo \"Disable fingerprint in hyprlock if fingerprint auth is not configured\"\n\nif omarchy-cmd-missing fprintd-list || ! fprintd-list \"$USER\" 2>/dev/null | grep -q \"finger\"; then\n  sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf\nfi\n"
  },
  {
    "path": "migrations/1770375655.sh",
    "content": "echo \"Add Super+Shift+Return binding for browser\"\n\nif [[ -f ~/.config/hypr/bindings.conf ]] && ! grep -q \"SUPER SHIFT, RETURN.*Browser\" ~/.config/hypr/bindings.conf; then\n  sed -i '/^bindd = SUPER, RETURN, Terminal/a bindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser' ~/.config/hypr/bindings.conf\nfi\n"
  },
  {
    "path": "migrations/1770375817.sh",
    "content": "echo \"Ensure walker service is restarted if it's killed or crashes\"\n\nmkdir -p ~/.config/systemd/user/app-walker@autostart.service.d/\ncp $OMARCHY_PATH/default/walker/restart.conf ~/.config/systemd/user/app-walker@autostart.service.d/restart.conf\nsystemctl --user daemon-reload\n\n"
  },
  {
    "path": "migrations/1770380577.sh",
    "content": "echo \"Use interactive background selector menu\"\n\nmkdir -p ~/.config/elephant/menus\nln -snf $OMARCHY_PATH/default/elephant/omarchy_background_selector.lua ~/.config/elephant/menus/omarchy_background_selector.lua\nomarchy-restart-walker\n"
  },
  {
    "path": "migrations/1770393078.sh",
    "content": "echo \"Add async-backend = epoll to ghostty config to fix high IO pressure\"\n\nif [[ -f ~/.config/ghostty/config ]] && ! grep -q \"^async-backend\" ~/.config/ghostty/config; then\n  echo \"\" >> ~/.config/ghostty/config\n  echo \"# Fix general slowness on hyprland (https://github.com/ghostty-org/ghostty/discussions/3224)\" >> ~/.config/ghostty/config\n  echo \"async-backend = epoll\" >> ~/.config/ghostty/config\nfi\n"
  },
  {
    "path": "migrations/1770483021.sh",
    "content": "echo \"Install Framework 16 keyboard RGB support\"\n\nsource $OMARCHY_PATH/install/packaging/framework16.sh\nsource $OMARCHY_PATH/install/config/hardware/framework16-qmk-hid.sh\n"
  },
  {
    "path": "migrations/1770638893.sh",
    "content": "echo \"Add Tmux as an option with themed styling\"\n\nomarchy-pkg-add tmux\n\nif [[ ! -f ~/.config/tmux/tmux.conf ]]; then\n  mkdir -p ~/.config/tmux\n  cp $OMARCHY_PATH/config/tmux/tmux.conf ~/.config/tmux/tmux.conf\n  omarchy-theme-refresh\nfi\n"
  },
  {
    "path": "migrations/1770811646.sh",
    "content": "echo \"Disable WiFi power save on AC power\"\n\nsource $OMARCHY_PATH/install/config/wifi-powersave-rules.sh\n"
  },
  {
    "path": "migrations/1771002522.sh",
    "content": "echo \"Add full OSC 52 support to Alacritty\"\n\nALACRITTY_CONFIG=~/.config/alacritty/alacritty.toml\n\nif [[ -f $ALACRITTY_CONFIG ]] && ! grep -q 'osc52' \"$ALACRITTY_CONFIG\"; then\n  cat >> \"$ALACRITTY_CONFIG\" << 'EOF'\n\n[terminal]\nosc52 = \"CopyPaste\"\nEOF\nfi\n"
  },
  {
    "path": "migrations/1771188969.sh",
    "content": "echo \"Remove temporary Wayland color manager disabling flag from existing Chromium configs\"\n\n# This reverts the workaround originally added by migration 1760401344.sh\n# Remove flag and comment from chromium-flags.conf only if found\nif [[ -f ~/.config/chromium-flags.conf ]]; then\n    sed -i '/--disable-features=WaylandWpColorManagerV1/d' ~/.config/chromium-flags.conf\n    sed -i '/# Chromium crash workaround for Wayland color management on Hyprland/d' ~/.config/chromium-flags.conf\nfi\n\n# Remove flag and comment from brave-flags.conf only if found\nif [[ -f ~/.config/brave-flags.conf ]]; then\n    sed -i '/--disable-features=WaylandWpColorManagerV1/d' ~/.config/brave-flags.conf\n    sed -i '/# Chromium crash workaround for Wayland color management on Hyprland/d' ~/.config/brave-flags.conf\nfi\n"
  },
  {
    "path": "migrations/1771345870.sh",
    "content": "echo \"Switch lmstudio -> lmstudio-bin\"\n\nif pacman -Q lmstudio &>/dev/null; then\n  omarchy-pkg-drop lmstudio\n  omarchy-pkg-add lmstudio-bin\nfi\n"
  },
  {
    "path": "migrations/1771403119.sh",
    "content": "echo \"Cure Chromium crash bug caused by mixing 145 and 144 sync logs\"\n\nrm -f ~/.config/chromium/Default/\"Sync Data\"/LevelDB/*.log\n"
  },
  {
    "path": "migrations/1771602477.sh",
    "content": "echo \"Add idle lock indicator to Waybar\"\n\nSTYLE_FILE=~/.config/waybar/style.css\nCONFIG_FILE=~/.config/waybar/config.jsonc\n\n# Add idle-indicator to modules-center if not present\nif ! grep -q \"custom/idle-indicator\" \"$CONFIG_FILE\"; then\n  sed -i 's/\"custom\\/screenrecording-indicator\"]/\"custom\\/screenrecording-indicator\", \"custom\\/idle-indicator\"]/' \"$CONFIG_FILE\"\n\n  sed -i '/\"tray\": {/i\\  \"custom/idle-indicator\": {\\n    \"on-click\": \"omarchy-toggle-idle\",\\n    \"exec\": \"$OMARCHY_PATH/default/waybar/indicators/idle.sh\",\\n    \"signal\": 9,\\n    \"return-type\": \"json\"\\n  },' \"$CONFIG_FILE\"\nfi\n\n# Add idle-indicator CSS if not present\nif ! grep -q \"#custom-idle-indicator\" \"$STYLE_FILE\"; then\n  # Remove screenrecording-indicator from shared margin block and pair it with idle-indicator instead\n  sed -i 's/^#custom-screenrecording-indicator,$//' \"$STYLE_FILE\"\n\n  # Add shared rule for both indicators and idle-indicator active state\n  sed -i '/#custom-screenrecording-indicator.active {/i\\#custom-screenrecording-indicator,\\n#custom-idle-indicator {\\n  min-width: 12px;\\n  margin-left: 5px;\\n  margin-right: 0;\\n  font-size: 10px;\\n  padding-bottom: 1px;\\n}\\n' \"$STYLE_FILE\"\n\n  # Remove the now-duplicated properties from the standalone screenrecording block\n  sed -i '/#custom-screenrecording-indicator {/,/^}/ {\n    /min-width:/d\n    /margin-left:/d\n    /font-size:/d\n    /padding-bottom:/d\n    /^#custom-screenrecording-indicator {/d\n    /^}$/d\n  }' \"$STYLE_FILE\"\n\n  cat >> \"$STYLE_FILE\" << 'EOF'\n\n#custom-idle-indicator.active {\n  color: #a55555;\n}\nEOF\nfi\n"
  },
  {
    "path": "migrations/1771602647.sh",
    "content": "echo \"Add notification silencing indicator to Waybar\"\n\nSTYLE_FILE=~/.config/waybar/style.css\nCONFIG_FILE=~/.config/waybar/config.jsonc\n\n# Add notification-silencing-indicator to modules-center if not present\nif ! grep -q \"custom/notification-silencing-indicator\" \"$CONFIG_FILE\"; then\n  sed -i 's/\"custom\\/idle-indicator\"]/\"custom\\/idle-indicator\", \"custom\\/notification-silencing-indicator\"]/' \"$CONFIG_FILE\"\n\n  sed -i '/\"tray\": {/i\\  \"custom/notification-silencing-indicator\": {\\n    \"on-click\": \"omarchy-toggle-notification-silencing\",\\n    \"exec\": \"$OMARCHY_PATH/default/waybar/indicators/notification-silencing.sh\",\\n    \"signal\": 10,\\n    \"return-type\": \"json\"\\n  },' \"$CONFIG_FILE\"\nfi\n\n# Add notification-silencing-indicator CSS if not present\nif ! grep -q \"#custom-notification-silencing-indicator\" \"$STYLE_FILE\"; then\n  # Add to the shared indicator rule\n  sed -i 's/#custom-idle-indicator {/#custom-idle-indicator,\\n#custom-notification-silencing-indicator {/' \"$STYLE_FILE\"\n\n  # Add to the shared active color rule\n  sed -i 's/#custom-idle-indicator.active {/#custom-idle-indicator.active,\\n#custom-notification-silencing-indicator.active {/' \"$STYLE_FILE\"\nfi\n\nomarchy-restart-waybar\n"
  },
  {
    "path": "migrations/1771606080.sh",
    "content": "echo \"Increase inotify file watchers for dev tools\"\n\nbash $OMARCHY_PATH/install/config/increase-file-watchers.sh\n"
  },
  {
    "path": "migrations/1771606249.sh",
    "content": "echo \"Re-run scrolltouchpad migration for configs with trailing whitespace\"\n\nif grep -q \"scrolltouchpad\" ~/.config/hypr/input.conf; then\n  sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), class:\\(([^)]+)\\)\\s*$/windowrule = match:class (\\2), scroll_touchpad \\1/' ~/.config/hypr/input.conf\n  sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), class:([^ ]+)\\s*$/windowrule = match:class \\2, scroll_touchpad \\1/' ~/.config/hypr/input.conf\n  sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), tag:terminal\\s*$/windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5\\nwindowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2/' ~/.config/hypr/input.conf\n\n  omarchy-state set reboot-required\nfi\n"
  },
  {
    "path": "migrations/1771615907.sh",
    "content": "echo \"Add emoji font fallback to fontconfig\"\ncp $OMARCHY_PATH/config/fontconfig/fonts.conf ~/.config/fontconfig/fonts.conf\nfc-cache -f\n"
  },
  {
    "path": "migrations/1771618300.sh",
    "content": "echo \"Turn off keyboard backlight when idle\"\ncp $OMARCHY_PATH/config/hypr/hypridle.conf ~/.config/hypr/hypridle.conf\n"
  },
  {
    "path": "migrations/1771651931.sh",
    "content": "echo \"Hide wiremix and limine-snapper-restore from app launcher\"\n\ncp $OMARCHY_PATH/applications/hidden/wiremix.desktop ~/.local/share/applications/\ncp $OMARCHY_PATH/applications/hidden/limine-snapper-restore.desktop ~/.local/share/applications/\n"
  },
  {
    "path": "migrations/1771667323.sh",
    "content": "echo \"Fix colored gutter in nvim by making line numbers transparent\"\n\nTRANSPARENCY_FILE=\"$HOME/.config/nvim/plugin/after/transparency.lua\"\n\nif [[ -f $TRANSPARENCY_FILE ]] && ! grep -q \"LineNr\" \"$TRANSPARENCY_FILE\"; then\n  sed -i '/SignColumn/a vim.api.nvim_set_hl(0, \"LineNr\", { bg = \"none\" })\\nvim.api.nvim_set_hl(0, \"CursorLineNr\", { bg = \"none\" })' \"$TRANSPARENCY_FILE\"\nfi\n"
  },
  {
    "path": "migrations/1771670389.sh",
    "content": "echo \"Add Logout option to system menu\"\n\nomarchy-refresh-sddm\n\nif [[ -f /etc/sddm.conf.d/autologin.conf ]]; then\n  sudo sed -i 's/^Current=.*/Current=omarchy/' /etc/sddm.conf.d/autologin.conf\nfi\n"
  },
  {
    "path": "migrations/1771682500.sh",
    "content": "echo \"Prevent SDDM password login from creating encrypted login keyring\"\n\n# Rename the encrypted login keyring if it exists (it conflicts with the passwordless Default_keyring)\nif [[ -f $HOME/.local/share/keyrings/login.keyring ]]; then\n  mv \"$HOME/.local/share/keyrings/login.keyring\" \"$HOME/.local/share/keyrings/login.keyring.bak\"\nfi\n\n# Remove gnome-keyring auth/password lines from sddm PAM so password-based logins\n# don't create an encrypted login keyring. Keep the session line to start the daemon,\n# which will auto-unlock the passwordless Default_keyring.\nsudo sed -i '/-auth.*pam_gnome_keyring\\.so/d' /etc/pam.d/sddm\nsudo sed -i '/-password.*pam_gnome_keyring\\.so/d' /etc/pam.d/sddm\n"
  },
  {
    "path": "migrations/1771683168.sh",
    "content": "echo \"Fix User Manager hanging on shutdown\"\nsource $OMARCHY_PATH/install/config/fast-shutdown.sh\n"
  },
  {
    "path": "migrations/1771683296.sh",
    "content": "echo \"Migrate suspend toggle from opt-in to opt-out\"\n\nSUSPEND_ON=~/.local/state/omarchy/toggles/suspend-on\nSUSPEND_OFF=~/.local/state/omarchy/toggles/suspend-off\n\nif [[ -f $SUSPEND_ON ]]; then\n  # User had suspend enabled, remove old file (suspend is now on by default)\n  rm -f $SUSPEND_ON\nelse\n  # User had suspend disabled, create opt-out file to preserve their choice\n  mkdir -p \"$(dirname $SUSPEND_OFF)\"\n  touch $SUSPEND_OFF\nfi\n"
  },
  {
    "path": "migrations/1771847961.sh",
    "content": "echo \"Add Tmux binding (Super+Alt+Return) to hypr/bindings.conf\"\n\nbindings_file=\"$HOME/.config/hypr/bindings.conf\"\n\nif [[ -f $bindings_file ]] && ! grep -qE '^bindd?\\s*=\\s*SUPER\\s+ALT\\s*,\\s*RETURN' \"$bindings_file\"; then\n  sed -i '1a bindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec --dir=\"$(omarchy-cmd-terminal-cwd)\" tmux new' \"$bindings_file\"\nfi\n"
  },
  {
    "path": "migrations/1772051864.sh",
    "content": "echo \"Disable Ruby compilation in mise (if mise and ruby are installed)\"\n\nif omarchy-cmd-present mise && mise which ruby &>/dev/null; then\n  mise settings set ruby.compile false\nfi\n"
  },
  {
    "path": "migrations/1772120972.sh",
    "content": "echo \"Remove Fcitx5 XDG autostart desktop entry\"\n\nsource $OMARCHY_PATH/install/config/remove-fcitx5-autostart.sh\n"
  },
  {
    "path": "migrations/1772211023.sh",
    "content": "echo \"Ensure password field doesn't overflow on SDDM login screen\"\n\nomarchy-refresh-sddm\n"
  },
  {
    "path": "migrations/1772293693.sh",
    "content": "echo \"Move single_window_aspect_ratio from dwindle to layout in user looknfeel.conf\"\n\nlooknfeel=\"$HOME/.config/hypr/looknfeel.conf\"\n\nif [[ -f $looknfeel ]] && grep -q 'single_window_aspect_ratio' \"$looknfeel\"; then\n  sed -i \\\n    -e 's|# https://wiki.hypr.land/Configuring/Dwindle-Layout/|# https://wiki.hypr.land/Configuring/Variables/#layout|' \\\n    -e 's|^dwindle {|layout {|' \\\n    \"$looknfeel\"\nfi\n"
  },
  {
    "path": "migrations/1772294096.sh",
    "content": "echo \"Add Alt+Arrow keybindings for tmux window and session navigation\"\n\nTMUX_CONF=~/.config/tmux/tmux.conf\n\nif [[ -f $TMUX_CONF ]]; then\n  # Add M-Left/M-Right after M-9 if not present\n  if ! grep -q \"bind -n M-Left select-window\" \"$TMUX_CONF\"; then\n    sed -i '/bind -n M-9 select-window -t 9/a\\\nbind -n M-Left select-window -t -1\\\nbind -n M-Right select-window -t +1' \"$TMUX_CONF\"\n  fi\n\n  # Add M-Up/M-Down after \"bind N switch-client -n\" if not present\n  if ! grep -q \"bind -n M-Up switch-client\" \"$TMUX_CONF\"; then\n    sed -i '/^bind N switch-client -n$/a\\\nbind -n M-Up switch-client -p\\\nbind -n M-Down switch-client -n' \"$TMUX_CONF\"\n  fi\n\n  omarchy-restart-tmux\nfi\n"
  },
  {
    "path": "migrations/1772379119.sh",
    "content": "echo \"Add Alt+Shift+Arrow keybindings for swapping tmux windows\"\n\nTMUX_CONF=~/.config/tmux/tmux.conf\n\nif [[ -f $TMUX_CONF ]]; then\n  if ! grep -q \"bind -n M-S-Left swap-window\" \"$TMUX_CONF\"; then\n    sed -i '/bind -n M-Right select-window -t +1/a\\\nbind -n M-S-Left swap-window -t -1 \\\\; select-window -t -1\\\nbind -n M-S-Right swap-window -t +1 \\\\; select-window -t +1' \"$TMUX_CONF\"\n  fi\n\n  omarchy-restart-tmux\nfi\n"
  },
  {
    "path": "migrations/1772389838.sh",
    "content": "echo \"Fix nvim transparency to preserve highlight foreground colors\"\n\nTRANSPARENCY_FILE=\"$HOME/.config/nvim/plugin/after/transparency.lua\"\n\nif [[ -f \"$TRANSPARENCY_FILE\" ]]; then\n  cat > \"$TRANSPARENCY_FILE\" << 'EOF'\n-- Make highlight groups transparent while preserving their other attributes\nlocal function make_transparent(name)\n\tlocal ok, hl = pcall(vim.api.nvim_get_hl, 0, { name = name, link = false })\n\tif ok then\n\t\thl.bg = nil\n\t\tvim.api.nvim_set_hl(0, name, hl)\n\tend\nend\n\nlocal groups = {\n\t-- transparent background\n\t\"Normal\",\n\t\"NormalFloat\",\n\t\"FloatBorder\",\n\t\"Pmenu\",\n\t\"Terminal\",\n\t\"EndOfBuffer\",\n\t\"FoldColumn\",\n\t\"Folded\",\n\t\"SignColumn\",\n\t\"LineNr\",\n\t\"CursorLineNr\",\n\t\"NormalNC\",\n\t\"WhichKeyFloat\",\n\t\"TelescopeBorder\",\n\t\"TelescopeNormal\",\n\t\"TelescopePromptBorder\",\n\t\"TelescopePromptTitle\",\n\t-- neotree\n\t\"NeoTreeNormal\",\n\t\"NeoTreeNormalNC\",\n\t\"NeoTreeVertSplit\",\n\t\"NeoTreeWinSeparator\",\n\t\"NeoTreeEndOfBuffer\",\n\t-- nvim-tree\n\t\"NvimTreeNormal\",\n\t\"NvimTreeVertSplit\",\n\t\"NvimTreeEndOfBuffer\",\n\t-- notify\n\t\"NotifyINFOBody\",\n\t\"NotifyERRORBody\",\n\t\"NotifyWARNBody\",\n\t\"NotifyTRACEBody\",\n\t\"NotifyDEBUGBody\",\n\t\"NotifyINFOTitle\",\n\t\"NotifyERRORTitle\",\n\t\"NotifyWARNTitle\",\n\t\"NotifyTRACETitle\",\n\t\"NotifyDEBUGTitle\",\n\t\"NotifyINFOBorder\",\n\t\"NotifyERRORBorder\",\n\t\"NotifyWARNBorder\",\n\t\"NotifyTRACEBorder\",\n\t\"NotifyDEBUGBorder\",\n}\n\nfor _, name in ipairs(groups) do\n\tmake_transparent(name)\nend\nEOF\nfi\n"
  },
  {
    "path": "migrations/1772632144.sh",
    "content": "echo \"Use mise shims in ~/.config/uwsm/env\"\n\nUWSM_ENV=\"$HOME/.config/uwsm/env\"\n\nif [[ -f $UWSM_ENV ]] && grep -q 'mise activate bash)' \"$UWSM_ENV\"; then\n  sed -i 's/mise activate bash)/mise activate bash --shims)/g' \"$UWSM_ENV\"\nfi\n"
  },
  {
    "path": "migrations/1772907198.sh",
    "content": "echo \"Add automatic-rename settings to tmux configuration\"\n\nif [[ -f ~/.config/tmux/tmux.conf ]]; then\n  if ! grep -q \"set -gw automatic-rename on\" ~/.config/tmux/tmux.conf; then\n    sed -i '/set -g window-status-separator \"\"/a\\\nset -gw automatic-rename on\\\nset -gw automatic-rename-format '\\''#{b:pane_current_path}'\\''\\\n' ~/.config/tmux/tmux.conf\n    omarchy-restart-tmux\n  fi\nfi\n"
  },
  {
    "path": "migrations/1772964511.sh",
    "content": "echo \"Only run plocate indexing on AC power to prevent hangs after sleep\"\n\nsource $OMARCHY_PATH/install/config/plocate-ac-only.sh\n"
  },
  {
    "path": "migrations/1772981555.sh",
    "content": "echo \"Update hyprland-preview-share-picker config to default to outputs page\"\n\nCONFIG_FILE=~/.config/hyprland-preview-share-picker/config.yaml\n\nif [[ -f $CONFIG_FILE ]]; then\n  sed -i 's/^default_page: windows$/default_page: outputs/' \"$CONFIG_FILE\"\nfi\n"
  },
  {
    "path": "migrations/1772981757.sh",
    "content": "echo \"Install Intel GPU hardware acceleration drivers if missing\"\n\nif lspci | grep -iE 'vga|3d|display' | grep -qi 'intel'; then\n  source \"$OMARCHY_PATH/install/config/hardware/intel.sh\"\nfi\n"
  },
  {
    "path": "migrations/1772988614.sh",
    "content": "echo \"Add Shift+Return keyboard binding for multi-line as used by Claude Code to Alacritty\"\n\nALACRITTY_CONFIG=~/.config/alacritty/alacritty.toml\n\nif [[ -f $ALACRITTY_CONFIG ]] && ! grep -q 'key = \"Return\"' \"$ALACRITTY_CONFIG\"; then\n  sed -i 's/{ key = \"Insert\", mods = \"Control\", action = \"Copy\" }/{ key = \"Insert\", mods = \"Control\", action = \"Copy\" },\\n  { key = \"Return\", mods = \"Shift\", chars = \"\\\\u001B\\\\r\" }/' \"$ALACRITTY_CONFIG\"\nfi\n"
  },
  {
    "path": "migrations/1772990935.sh",
    "content": "echo \"Add sample low battery notification hook\"\n\nmkdir -p ~/.config/omarchy/hooks\n\nif [[ ! -f ~/.config/omarchy/hooks/battery-low.sample ]]; then\n  cp \"$OMARCHY_PATH/config/omarchy/hooks/battery-low.sample\" ~/.config/omarchy/hooks/battery-low.sample\nfi\n"
  },
  {
    "path": "migrations/1773012889.sh",
    "content": "echo \"Install system-sleep hook to unmount gvfsd-fuse before suspend/hibernate\"\n\nsudo mkdir -p /usr/lib/systemd/system-sleep\nsudo install -m 0755 -o root -g root \"$OMARCHY_PATH/default/systemd/system-sleep/unmount-fuse\" /usr/lib/systemd/system-sleep/\n"
  },
  {
    "path": "migrations/1773505447.sh",
    "content": "echo \"Enable thermald for Intel Sandy Bridge and newer laptops\"\n\nsource \"$OMARCHY_PATH/install/config/hardware/intel-thermald.sh\"\n"
  },
  {
    "path": "migrations/1773598247.sh",
    "content": "echo \"Install npx wrappers for AI CLI tools and playwright\"\n\nsource \"$OMARCHY_PATH/install/packaging/npx.sh\"\n"
  },
  {
    "path": "migrations/1773599943.sh",
    "content": "echo \"Add COPY mode indicator to tmux status bar\"\n\nif [[ -f ~/.config/tmux/tmux.conf ]]; then\n  if ! grep -q \"pane_in_mode\" ~/.config/tmux/tmux.conf; then\n    sed -i 's/#{?client_prefix/#{?pane_in_mode,COPY ,}#{?client_prefix/' ~/.config/tmux/tmux.conf\n    omarchy-restart-tmux\n  fi\nfi\n"
  },
  {
    "path": "themes/catppuccin/btop.theme",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#1E1E2E\"\n\n# Main text color\ntheme[main_fg]=\"#c6d0f5\"\n\n# Title color for boxes\ntheme[title]=\"#c6d0f5\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#8caaee\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#51576d\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#8caaee\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#838ba7\"\n\n# Color of text appearing on top of graphs, i.e uptime and current network graph scaling\ntheme[graph_text]=\"#f2d5cf\"\n\n# Background color of the percentage meters\ntheme[meter_bg]=\"#51576d\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#f2d5cf\"\n\n# CPU, Memory, Network, Proc box outline colors\ntheme[cpu_box]=\"#ca9ee6\" #Mauve\ntheme[mem_box]=\"#a6d189\" #Green\ntheme[net_box]=\"#ea999c\" #Maroon\ntheme[proc_box]=\"#8caaee\" #Blue\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#737994\"\n\n# Temperature graph color (Green -> Yellow -> Red)\ntheme[temp_start]=\"#a6d189\"\ntheme[temp_mid]=\"#e5c890\"\ntheme[temp_end]=\"#e78284\"\n\n# CPU graph colors (Teal -> Lavender)\ntheme[cpu_start]=\"#81c8be\"\ntheme[cpu_mid]=\"#85c1dc\"\ntheme[cpu_end]=\"#babbf1\"\n\n# Mem/Disk free meter (Mauve -> Lavender -> Blue)\ntheme[free_start]=\"#ca9ee6\"\ntheme[free_mid]=\"#babbf1\"\ntheme[free_end]=\"#8caaee\"\n\n# Mem/Disk cached meter (Sapphire -> Lavender)\ntheme[cached_start]=\"#85c1dc\"\ntheme[cached_mid]=\"#8caaee\"\ntheme[cached_end]=\"#babbf1\"\n\n# Mem/Disk available meter (Peach -> Red)\ntheme[available_start]=\"#ef9f76\"\ntheme[available_mid]=\"#ea999c\"\ntheme[available_end]=\"#e78284\"\n\n# Mem/Disk used meter (Green -> Sky)\ntheme[used_start]=\"#a6d189\"\ntheme[used_mid]=\"#81c8be\"\ntheme[used_end]=\"#99d1db\"\n\n# Download graph colors (Peach -> Red)\ntheme[download_start]=\"#ef9f76\"\ntheme[download_mid]=\"#ea999c\"\ntheme[download_end]=\"#e78284\"\n\n# Upload graph colors (Green -> Sky)\ntheme[upload_start]=\"#a6d189\"\ntheme[upload_mid]=\"#81c8be\"\ntheme[upload_end]=\"#99d1db\"\n\n# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)\ntheme[process_start]=\"#85c1dc\"\ntheme[process_mid]=\"#babbf1\"\ntheme[process_end]=\"#ca9ee6\"\n"
  },
  {
    "path": "themes/catppuccin/colors.toml",
    "content": "accent = \"#89b4fa\"\ncursor = \"#f5e0dc\"\nforeground = \"#cdd6f4\"\nbackground = \"#1e1e2e\"\nselection_foreground = \"#1e1e2e\"\nselection_background = \"#f5e0dc\"\n\ncolor0 = \"#45475a\"\ncolor1 = \"#f38ba8\"\ncolor2 = \"#a6e3a1\"\ncolor3 = \"#f9e2af\"\ncolor4 = \"#89b4fa\"\ncolor5 = \"#f5c2e7\"\ncolor6 = \"#94e2d5\"\ncolor7 = \"#bac2de\"\ncolor8 = \"#585b70\"\ncolor9 = \"#f38ba8\"\ncolor10 = \"#a6e3a1\"\ncolor11 = \"#f9e2af\"\ncolor12 = \"#89b4fa\"\ncolor13 = \"#f5c2e7\"\ncolor14 = \"#94e2d5\"\ncolor15 = \"#a6adc8\"\n"
  },
  {
    "path": "themes/catppuccin/icons.theme",
    "content": "Yaru-purple\n"
  },
  {
    "path": "themes/catppuccin/neovim.lua",
    "content": "return {\n\t{\n\t\t\"catppuccin/nvim\",\n\t\tname = \"catppuccin\",\n\t\tpriority = 1000,\n\t},\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"catppuccin\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/catppuccin/vscode.json",
    "content": "{\n  \"name\": \"Catppuccin Mocha\",\n  \"extension\": \"catppuccin.catppuccin-vsc\"\n}\n"
  },
  {
    "path": "themes/catppuccin/waybar.css",
    "content": "@define-color foreground #cdd6f4;\n@define-color background #181824;\n"
  },
  {
    "path": "themes/catppuccin-latte/btop.theme",
    "content": "# https://github.com/catppuccin/btop/blob/main/themes/catppuccin_latte.theme\n# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#eff1f5\"\n\n# Main text color\ntheme[main_fg]=\"#4c4f69\"\n\n# Title color for boxes\ntheme[title]=\"#4c4f69\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#1e66f5\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#bcc0cc\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#1e66f5\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#8c8fa1\"\n\n# Color of text appearing on top of graphs, i.e uptime and current network graph scaling\ntheme[graph_text]=\"#dc8a78\"\n\n# Background color of the percentage meters\ntheme[meter_bg]=\"#bcc0cc\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#dc8a78\"\n\n# CPU, Memory, Network, Proc box outline colors\ntheme[cpu_box]=\"#8839ef\" #Mauve\ntheme[mem_box]=\"#40a02b\" #Green\ntheme[net_box]=\"#e64553\" #Maroon\ntheme[proc_box]=\"#1e66f5\" #Blue\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#9ca0b0\"\n\n# Temperature graph color (Green -> Yellow -> Red)\ntheme[temp_start]=\"#40a02b\"\ntheme[temp_mid]=\"#df8e1d\"\ntheme[temp_end]=\"#d20f39\"\n\n# CPU graph colors (Teal -> Lavender)\ntheme[cpu_start]=\"#179299\"\ntheme[cpu_mid]=\"#209fb5\"\ntheme[cpu_end]=\"#7287fd\"\n\n# Mem/Disk free meter (Mauve -> Lavender -> Blue)\ntheme[free_start]=\"#8839ef\"\ntheme[free_mid]=\"#7287fd\"\ntheme[free_end]=\"#1e66f5\"\n\n# Mem/Disk cached meter (Sapphire -> Lavender)\ntheme[cached_start]=\"#209fb5\"\ntheme[cached_mid]=\"#1e66f5\"\ntheme[cached_end]=\"#7287fd\"\n\n# Mem/Disk available meter (Peach -> Red)\ntheme[available_start]=\"#fe640b\"\ntheme[available_mid]=\"#e64553\"\ntheme[available_end]=\"#d20f39\"\n\n# Mem/Disk used meter (Green -> Sky)\ntheme[used_start]=\"#40a02b\"\ntheme[used_mid]=\"#179299\"\ntheme[used_end]=\"#04a5e5\"\n\n# Download graph colors (Peach -> Red)\ntheme[download_start]=\"#fe640b\"\ntheme[download_mid]=\"#e64553\"\ntheme[download_end]=\"#d20f39\"\n\n# Upload graph colors (Green -> Sky)\ntheme[upload_start]=\"#40a02b\"\ntheme[upload_mid]=\"#179299\"\ntheme[upload_end]=\"#04a5e5\"\n\n# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)\ntheme[process_start]=\"#209fb5\"\ntheme[process_mid]=\"#7287fd\"\ntheme[process_end]=\"#8839ef\"\n"
  },
  {
    "path": "themes/catppuccin-latte/colors.toml",
    "content": "accent = \"#1e66f5\"\ncursor = \"#dc8a78\"\nforeground = \"#4c4f69\"\nbackground = \"#eff1f5\"\nselection_foreground = \"#eff1f5\"\nselection_background = \"#dc8a78\"\n\ncolor0 = \"#bcc0cc\"\ncolor1 = \"#d20f39\"\ncolor2 = \"#40a02b\"\ncolor3 = \"#df8e1d\"\ncolor4 = \"#1e66f5\"\ncolor5 = \"#ea76cb\"\ncolor6 = \"#179299\"\ncolor7 = \"#5c5f77\"\ncolor8 = \"#acb0be\"\ncolor9 = \"#d20f39\"\ncolor10 = \"#40a02b\"\ncolor11 = \"#df8e1d\"\ncolor12 = \"#1e66f5\"\ncolor13 = \"#ea76cb\"\ncolor14 = \"#179299\"\ncolor15 = \"#6c6f85\"\n"
  },
  {
    "path": "themes/catppuccin-latte/icons.theme",
    "content": "Yaru-blue\n"
  },
  {
    "path": "themes/catppuccin-latte/light.mode",
    "content": "# This will set \"prefer-light\" and use \"Adwaita\" as the theme\n"
  },
  {
    "path": "themes/catppuccin-latte/neovim.lua",
    "content": "return {\n\t{\n\t\t\"catppuccin/nvim\",\n\t\tname = \"catppuccin\",\n\t\tpriority = 1000,\n\t\topts = {\n\t\t\tflavour = \"latte\",\n\t\t},\n\t},\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"catppuccin-latte\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/catppuccin-latte/vscode.json",
    "content": "{\n  \"name\": \"Catppuccin Latte\",\n  \"extension\": \"catppuccin.catppuccin-vsc\"\n}\n"
  },
  {
    "path": "themes/ethereal/btop.theme",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#060B1E\"\n\n# Main text color\ntheme[main_fg]=\"#ffcead\"\n\n# Title color for boxes\ntheme[title]=\"#c89dc1\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#a3bfd1\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#6d7db6\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#ffcead\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#6d7db6\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#c89dc1\"\n\n# Box outline and divider line color\ntheme[cpu_box]=\"#92a593\"\ntheme[mem_box]=\"#92a593\"\ntheme[net_box]=\"#92a593\"\ntheme[proc_box]=\"#92a593\"\ntheme[div_line]=\"#6d7db6\"\n\n# Gradient for all meters and graphs\ntheme[temp_start]=\"#a3bfd1\"\ntheme[temp_mid]=\"#7d82d9\"\ntheme[temp_end]=\"#92a593\"\n\n\ntheme[cpu_start]=\"#a3bfd1\"\ntheme[cpu_mid]=\"#7d82d9\"\ntheme[cpu_end]=\"#92a593\"\n\n\ntheme[free_start]=\"#7d82d9\"\ntheme[free_mid]=\"#E9BB4F\"\ntheme[free_end]=\"#E9BB4F\"\n\n\ntheme[cached_start]=\"#E9BB4F\"\ntheme[cached_mid]=\"#E9BB4F\"\ntheme[cached_end]=\"#E9BB4F\"\n\n\ntheme[available_start]=\"#a3bfd1\"\ntheme[available_mid]=\"#a3bfd1\"\ntheme[available_end]=\"#a3bfd1\"\n\n\ntheme[used_start]=\"#92a593\"\ntheme[used_mid]=\"#92a593\"\ntheme[used_end]=\"#92a593\"\n\n\ntheme[download_start]=\"#E9BB4F\"\ntheme[download_mid]=\"#a3bfd1\"\ntheme[download_end]=\"#7d82d9\"\n\n\ntheme[upload_start]=\"#E9BB4F\"\ntheme[upload_mid]=\"#a3bfd1\"\ntheme[upload_end]=\"#7d82d9\""
  },
  {
    "path": "themes/ethereal/colors.toml",
    "content": "accent = \"#7d82d9\"\ncursor = \"#ffcead\"\nforeground = \"#ffcead\"\nbackground = \"#060B1E\"\nselection_foreground = \"#060B1E\"\nselection_background = \"#ffcead\"\n\ncolor0 = \"#060B1E\"\ncolor1 = \"#ED5B5A\"\ncolor2 = \"#92a593\"\ncolor3 = \"#E9BB4F\"\ncolor4 = \"#7d82d9\"\ncolor5 = \"#c89dc1\"\ncolor6 = \"#a3bfd1\"\ncolor7 = \"#F99957\"\ncolor8 = \"#6d7db6\"\ncolor9 = \"#faaaa9\"\ncolor10 = \"#c4cfc4\"\ncolor11 = \"#f7dc9c\"\ncolor12 = \"#c2c4f0\"\ncolor13 = \"#ead7e7\"\ncolor14 = \"#dfeaf0\"\ncolor15 = \"#ffcead\"\n"
  },
  {
    "path": "themes/ethereal/icons.theme",
    "content": "Yaru-blue\n"
  },
  {
    "path": "themes/ethereal/neovim.lua",
    "content": "return {\n  {\n    \"bjarneo/ethereal.nvim\",\n    priority = 1000,\n  },\n  {\n    \"LazyVim/LazyVim\",\n    opts = {\n      colorscheme = \"ethereal\",\n    },\n  },\n}\n"
  },
  {
    "path": "themes/ethereal/vscode.json",
    "content": "{\n  \"name\": \"Ethereal\",\n  \"extension\": \"Bjarne.ethereal-omarchy\"\n}\n"
  },
  {
    "path": "themes/everforest/btop.theme",
    "content": "# All graphs and meters can be gradients\n# For single color graphs leave \"mid\" and \"end\" variable empty.\n# Use \"start\" and \"end\" variables for two color gradient\n# Use \"start\", \"mid\" and \"end\" for three color gradient\n\n# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#2d353b\"\n\n# Main text color\ntheme[main_fg]=\"#d3c6aa\"\n\n# Title color for boxes\ntheme[title]=\"#d3c6aa\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#e67e80\"\n\n# Background color of selected items\ntheme[selected_bg]=\"#3d484d\"\n\n# Foreground color of selected items\ntheme[selected_fg]=\"#dbbc7f\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#2d353b\"\n\n# Color of text appearing on top of graphs, i.e uptime and current network graph scaling\ntheme[graph_text]=\"#d3c6aa\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#a7c080\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#3d484d\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#3d484d\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#3d484d\"\n\n# Processes box outline color\ntheme[proc_box]=\"#3d484d\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#3d484d\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#a7c080\"\ntheme[temp_mid]=\"#dbbc7f\"\ntheme[temp_end]=\"#f85552\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#a7c080\"\ntheme[cpu_mid]=\"#dbbc7f\"\ntheme[cpu_end]=\"#f85552\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#f85552\"\ntheme[free_mid]=\"#dbbc7f\"\ntheme[free_end]=\"#a7c080\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#7fbbb3\"\ntheme[cached_mid]=\"#83c092\"\ntheme[cached_end]=\"#a7c080\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#f85552\"\ntheme[available_mid]=\"#dbbc7f\"\ntheme[available_end]=\"#a7c080\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#a7c080\"\ntheme[used_mid]=\"#dbbc7f\"\ntheme[used_end]=\"#f85552\"\n\n# Download graph colors\ntheme[download_start]=\"#a7c080\"\ntheme[download_mid]=\"#83c092\"\ntheme[download_end]=\"#7fbbb3\"\n\n# Upload graph colors\ntheme[upload_start]=\"#dbbc7f\"\ntheme[upload_mid]=\"#e69875\"\ntheme[upload_end]=\"#e67e80\"\n\n# Process box color gradient for threads, mem and cpu usage\ntheme[process_start]=\"#a7c080\"\ntheme[process_mid]=\"#e67e80\"\ntheme[process_end]=\"#f85552\"\n\n"
  },
  {
    "path": "themes/everforest/colors.toml",
    "content": "accent = \"#7fbbb3\"\ncursor = \"#d3c6aa\"\nforeground = \"#d3c6aa\"\nbackground = \"#2d353b\"\nselection_foreground = \"#2d353b\"\nselection_background = \"#d3c6aa\"\n\ncolor0 = \"#475258\"\ncolor1 = \"#e67e80\"\ncolor2 = \"#a7c080\"\ncolor3 = \"#dbbc7f\"\ncolor4 = \"#7fbbb3\"\ncolor5 = \"#d699b6\"\ncolor6 = \"#83c092\"\ncolor7 = \"#d3c6aa\"\ncolor8 = \"#475258\"\ncolor9 = \"#e67e80\"\ncolor10 = \"#a7c080\"\ncolor11 = \"#dbbc7f\"\ncolor12 = \"#7fbbb3\"\ncolor13 = \"#d699b6\"\ncolor14 = \"#83c092\"\ncolor15 = \"#d3c6aa\"\n"
  },
  {
    "path": "themes/everforest/icons.theme",
    "content": "Yaru-sage\n"
  },
  {
    "path": "themes/everforest/neovim.lua",
    "content": "return {\n\t{ \"neanias/everforest-nvim\" },\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"everforest\",\n\t\t\tbackground = \"soft\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/everforest/vscode.json",
    "content": "{\n  \"name\": \"Everforest Dark\",\n  \"extension\": \"sainnhe.everforest\"\n}\n"
  },
  {
    "path": "themes/flexoki-light/btop.theme",
    "content": "# Main bg\ntheme[main_bg]=\"#FFFCF0\"\n\n# Main text color\ntheme[main_fg]=\"#100F0F\"\n\n# Title color for boxes\ntheme[title]=\"#100F0F\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#205EA6\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#414868\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#100F0F\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#6F6E69\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#205EA6\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#6F6E69\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#6F6E69\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#6F6E69\"\n\n# Processes box outline color\ntheme[proc_box]=\"#6F6E69\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#6F6E69\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#66800B\"\ntheme[temp_mid]=\"#BC5215\"\ntheme[temp_end]=\"#AF3029\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#66800B\"\ntheme[cpu_mid]=\"#BC5215\"\ntheme[cpu_end]=\"#AF3029\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#66800B\"\ntheme[free_mid]=\"#BC5215\"\ntheme[free_end]=\"#AF3029\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#66800B\"\ntheme[cached_mid]=\"#BC5215\"\ntheme[cached_end]=\"#AF3029\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#66800B\"\ntheme[available_mid]=\"#BC5215\"\ntheme[available_end]=\"#AF3029\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#66800B\"\ntheme[used_mid]=\"#BC5215\"\ntheme[used_end]=\"#AF3029\"\n\n# Download graph colors\ntheme[download_start]=\"#66800B\"\ntheme[download_mid]=\"#BC5215\"\ntheme[download_end]=\"#AF3029\"\n\n# Upload graph colors\ntheme[upload_start]=\"#66800B\"\ntheme[upload_mid]=\"#BC5215\"\ntheme[upload_end]=\"#AF3029\"\n"
  },
  {
    "path": "themes/flexoki-light/chromium.theme",
    "content": "242,240,229"
  },
  {
    "path": "themes/flexoki-light/colors.toml",
    "content": "accent = \"#205EA6\"\ncursor = \"#100F0F\"\nforeground = \"#100F0F\"\nbackground = \"#FFFCF0\"\nselection_foreground = \"#100F0F\"\nselection_background = \"#CECDC3\"\n\ncolor0 = \"#100F0F\"\ncolor1 = \"#D14D41\"\ncolor2 = \"#879A39\"\ncolor3 = \"#D0A215\"\ncolor4 = \"#205EA6\"\ncolor5 = \"#CE5D97\"\ncolor6 = \"#3AA99F\"\ncolor7 = \"#FFFCF0\"\ncolor8 = \"#100F0F\"\ncolor9 = \"#D14D41\"\ncolor10 = \"#879A39\"\ncolor11 = \"#D0A215\"\ncolor12 = \"#4385BE\"\ncolor13 = \"#CE5D97\"\ncolor14 = \"#3AA99F\"\ncolor15 = \"#FFFCF0\"\n"
  },
  {
    "path": "themes/flexoki-light/icons.theme",
    "content": "Yaru-blue\n"
  },
  {
    "path": "themes/flexoki-light/light.mode",
    "content": "# This will set \"prefer-light\" and use \"Adwaita\" as the theme"
  },
  {
    "path": "themes/flexoki-light/neovim.lua",
    "content": "return {\n  {\n    \"kepano/flexoki-neovim\",\n    priority = 1000,\n  },\n  {\n    \"LazyVim/LazyVim\",\n    opts = {\n      colorscheme = \"flexoki-light\",\n    },\n  },\n}\n"
  },
  {
    "path": "themes/flexoki-light/vscode.json",
    "content": "{\n  \"name\": \"flexoki-light\",\n  \"extension\": \"shadesOfBuntu.flexoki-light\"\n}\n"
  },
  {
    "path": "themes/gruvbox/btop.theme",
    "content": "#Bashtop gruvbox (https://github.com/morhetz/gruvbox) theme\n#by BachoSeven\n\n# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: \"#RRGGBB\", \"#BW\" or \"0-255 0-255 0-255\"\n# example for white: \"#FFFFFF\", \"#ff\" or \"255 255 255\".\n\n# All graphs and meters can be gradients\n# For single color graphs leave \"mid\" and \"end\" variable empty.\n# Use \"start\" and \"end\" variables for two color gradient\n# Use \"start\", \"mid\" and \"end\" for three color gradient\n\n# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#282828\"\n\n# Main text color\ntheme[main_fg]=\"#a89984\"\n\n# Title color for boxes\ntheme[title]=\"#ebdbb2\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#d79921\"\n\n# Background color of selected items\ntheme[selected_bg]=\"#282828\"\n\n# Foreground color of selected items\ntheme[selected_fg]=\"#fabd2f\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#282828\"\n\n# Color of text appearing on top of graphs, i.e uptime and current network graph scaling\ntheme[graph_text]=\"#585858\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#98971a\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#a89984\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#a89984\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#a89984\"\n\n# Processes box outline color\ntheme[proc_box]=\"#a89984\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#a89984\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#458588\"\ntheme[temp_mid]=\"#d3869b\"\ntheme[temp_end]=\"#fb4394\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#b8bb26\"\ntheme[cpu_mid]=\"#d79921\"\ntheme[cpu_end]=\"#fb4934\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#4e5900\"\ntheme[free_mid]=\"\"\ntheme[free_end]=\"#98971a\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#458588\"\ntheme[cached_mid]=\"\"\ntheme[cached_end]=\"#83a598\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#d79921\"\ntheme[available_mid]=\"\"\ntheme[available_end]=\"#fabd2f\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#cc241d\"\ntheme[used_mid]=\"\"\ntheme[used_end]=\"#fb4934\"\n\n# Download graph colors\ntheme[download_start]=\"#3d4070\"\ntheme[download_mid]=\"#6c71c4\"\ntheme[download_end]=\"#a3a8f7\"\n\n# Upload graph colors\ntheme[upload_start]=\"#701c45\"\ntheme[upload_mid]=\"#b16286\"\ntheme[upload_end]=\"#d3869b\"\n"
  },
  {
    "path": "themes/gruvbox/colors.toml",
    "content": "accent = \"#7daea3\"\ncursor = \"#bdae93\"\nforeground = \"#d4be98\"\nbackground = \"#282828\"\nselection_foreground = \"#ebdbb2\"\nselection_background = \"#d65d0e\"\n\ncolor0 = \"#3c3836\"\ncolor1 = \"#ea6962\"\ncolor2 = \"#a9b665\"\ncolor3 = \"#d8a657\"\ncolor4 = \"#7daea3\"\ncolor5 = \"#d3869b\"\ncolor6 = \"#89b482\"\ncolor7 = \"#d4be98\"\ncolor8 = \"#3c3836\"\ncolor9 = \"#ea6962\"\ncolor10 = \"#a9b665\"\ncolor11 = \"#d8a657\"\ncolor12 = \"#7daea3\"\ncolor13 = \"#d3869b\"\ncolor14 = \"#89b482\"\ncolor15 = \"#d4be98\"\n"
  },
  {
    "path": "themes/gruvbox/icons.theme",
    "content": "Yaru-olive\n"
  },
  {
    "path": "themes/gruvbox/neovim.lua",
    "content": "return {\n\t{ \"ellisonleao/gruvbox.nvim\" },\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"gruvbox\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/gruvbox/vscode.json",
    "content": "{\n  \"name\": \"Gruvbox Dark Medium\",\n  \"extension\": \"jdinhlife.gruvbox\"\n}\n"
  },
  {
    "path": "themes/hackerman/btop.theme",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#0B0C16\"\n\n# Main text color\ntheme[main_fg]=\"#ddf7ff\"\n\n# Title color for boxes\ntheme[title]=\"#86a7df\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#7cf8f7\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#6a6e95\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#ddf7ff\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#6a6e95\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#86a7df\"\n\n# Box outline and divider line color\ntheme[cpu_box]=\"#4fe88f\"\ntheme[mem_box]=\"#4fe88f\"\ntheme[net_box]=\"#4fe88f\"\ntheme[proc_box]=\"#4fe88f\"\ntheme[div_line]=\"#6a6e95\"\n\n# Gradient for all meters and graphs\ntheme[temp_start]=\"#7cf8f7\"\ntheme[temp_mid]=\"#829dd4\"\ntheme[temp_end]=\"#4fe88f\"\n\n\ntheme[cpu_start]=\"#7cf8f7\"\ntheme[cpu_mid]=\"#829dd4\"\ntheme[cpu_end]=\"#4fe88f\"\n\n\ntheme[free_start]=\"#829dd4\"\ntheme[free_mid]=\"#50f7d4\"\ntheme[free_end]=\"#50f7d4\"\n\n\ntheme[cached_start]=\"#50f7d4\"\ntheme[cached_mid]=\"#50f7d4\"\ntheme[cached_end]=\"#50f7d4\"\n\n\ntheme[available_start]=\"#7cf8f7\"\ntheme[available_mid]=\"#7cf8f7\"\ntheme[available_end]=\"#7cf8f7\"\n\n\ntheme[used_start]=\"#4fe88f\"\ntheme[used_mid]=\"#4fe88f\"\ntheme[used_end]=\"#4fe88f\"\n\n\ntheme[download_start]=\"#50f7d4\"\ntheme[download_mid]=\"#7cf8f7\"\ntheme[download_end]=\"#829dd4\"\n\n\ntheme[upload_start]=\"#50f7d4\"\ntheme[upload_mid]=\"#7cf8f7\"\ntheme[upload_end]=\"#829dd4\""
  },
  {
    "path": "themes/hackerman/colors.toml",
    "content": "accent = \"#82FB9C\"\ncursor = \"#ddf7ff\"\nforeground = \"#ddf7ff\"\nbackground = \"#0B0C16\"\nselection_foreground = \"#0B0C16\"\nselection_background = \"#ddf7ff\"\n\ncolor0 = \"#0B0C16\"\ncolor1 = \"#50f872\"\ncolor2 = \"#4fe88f\"\ncolor3 = \"#50f7d4\"\ncolor4 = \"#829dd4\"\ncolor5 = \"#86a7df\"\ncolor6 = \"#7cf8f7\"\ncolor7 = \"#85E1FB\"\ncolor8 = \"#6a6e95\"\ncolor9 = \"#85ff9d\"\ncolor10 = \"#9cf7c2\"\ncolor11 = \"#a4ffec\"\ncolor12 = \"#c4d2ed\"\ncolor13 = \"#cddbf4\"\ncolor14 = \"#d1fffe\"\ncolor15 = \"#ddf7ff\"\n"
  },
  {
    "path": "themes/hackerman/icons.theme",
    "content": "Yaru-blue"
  },
  {
    "path": "themes/hackerman/neovim.lua",
    "content": "return {\n\t{\n\t\t\"bjarneo/hackerman.nvim\",\n\t\tdependencies = { \"bjarneo/aether.nvim\" }, -- Ensure aether is loaded first\n\t\tpriority = 1000,\n\t},\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"hackerman\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/hackerman/vscode.json",
    "content": "{\n  \"name\": \"Hackerman\",\n  \"extension\": \"Bjarne.hackerman-omarchy\"\n}\n"
  },
  {
    "path": "themes/kanagawa/btop.theme",
    "content": "# Bashtop Kanagawa-wave (https://github.com/rebelot/kanagawa.nvim) theme\n# By: philikarus\n\n# Main bg\ntheme[main_bg]=\"#1f1f28\"\n\n# Main text color\ntheme[main_fg]=\"#dcd7ba\"\n\n# Title color for boxes\ntheme[title]=\"#dcd7ba\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#C34043\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#223249\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#dca561\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#727169\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#7aa89f\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#727169\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#727169\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#727169\"\n\n# Processes box outline color\ntheme[proc_box]=\"#727169\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#727169\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#98BB6C\"\ntheme[temp_mid]=\"#DCA561\"\ntheme[temp_end]=\"#E82424\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#98BB6C\"\ntheme[cpu_mid]=\"#DCA561\"\ntheme[cpu_end]=\"#E82424\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#E82424\"\ntheme[free_mid]=\"#C34043\"\ntheme[free_end]=\"#FF5D62\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#C0A36E\"\ntheme[cached_mid]=\"#DCA561\"\ntheme[cached_end]=\"#FF9E3B\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#938AA9\"\ntheme[available_mid]=\"#957FBB\"\ntheme[available_end]=\"#9CABCA\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#658594\"\ntheme[used_mid]=\"#7E9CDB\"\ntheme[used_end]=\"#7FB4CA\"\n\n# Download graph colors\ntheme[download_start]=\"#7E9CDB\"\ntheme[download_mid]=\"#938AA9\"\ntheme[download_end]=\"#957FBB\"\n\n# Upload graph colors\ntheme[upload_start]=\"#DCA561\"\ntheme[upload_mid]=\"#E6C384\"\ntheme[upload_end]=\"#E82424\"\n\n# Process box color gradient for threads, mem and cpu usage\ntheme[process_start]=\"#98BB6C\"\ntheme[process_mid]=\"#DCA561\"\ntheme[process_end]=\"#C34043\"\n"
  },
  {
    "path": "themes/kanagawa/colors.toml",
    "content": "accent = \"#7e9cd8\"\ncursor = \"#c8c093\"\nforeground = \"#dcd7ba\"\nbackground = \"#1f1f28\"\nselection_foreground = \"#c8c093\"\nselection_background = \"#2d4f67\"\n\ncolor0 = \"#090618\"\ncolor1 = \"#c34043\"\ncolor2 = \"#76946a\"\ncolor3 = \"#c0a36e\"\ncolor4 = \"#7e9cd8\"\ncolor5 = \"#957fb8\"\ncolor6 = \"#6a9589\"\ncolor7 = \"#c8c093\"\ncolor8 = \"#727169\"\ncolor9 = \"#e82424\"\ncolor10 = \"#98bb6c\"\ncolor11 = \"#e6c384\"\ncolor12 = \"#7fb4ca\"\ncolor13 = \"#938aa9\"\ncolor14 = \"#7aa89f\"\ncolor15 = \"#dcd7ba\"\n"
  },
  {
    "path": "themes/kanagawa/hyprland.conf",
    "content": "$activeBorderColor = rgb(dcd7ba)\n\ngeneral {\n    col.active_border = $activeBorderColor\n}\n\ngroup {\n    col.border_active = $activeBorderColor\n}\n\n# Kanagawa backdrop is too strong for detault opacity\nwindowrule = opacity 0.98 0.95, match:tag terminal\n"
  },
  {
    "path": "themes/kanagawa/icons.theme",
    "content": "Yaru-blue\n"
  },
  {
    "path": "themes/kanagawa/neovim.lua",
    "content": "return {\n\t{ \"rebelot/kanagawa.nvim\" },\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"kanagawa\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/kanagawa/vscode.json",
    "content": "{\n  \"name\": \"Kanagawa\",\n  \"extension\": \"qufiwefefwoyn.kanagawa\"\n}\n"
  },
  {
    "path": "themes/lumon/btop.theme",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"\"\ntheme_background=false\n\n# Main text color\ntheme[main_fg]=\"#c7d2de\"\n\n# Title color for boxes\ntheme[title]=\"#9fcfe9\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#b5deef\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#355066\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#c7d2de\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#355066\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#9fcfe9\"\n\n# Box outline and divider line color\ntheme[cpu_box]=\"#79abd2\"\ntheme[mem_box]=\"#79abd2\"\ntheme[net_box]=\"#79abd2\"\ntheme[proc_box]=\"#79abd2\"\ntheme[div_line]=\"#355066\"\n\n# Gradient for all meters and graphs\ntheme[temp_start]=\"#b5deef\"\ntheme[temp_mid]=\"#92c7e7\"\ntheme[temp_end]=\"#79abd2\"\n\ntheme[cpu_start]=\"#b5deef\"\ntheme[cpu_mid]=\"#92c7e7\"\ntheme[cpu_end]=\"#79abd2\"\n\ntheme[free_start]=\"#92c7e7\"\ntheme[free_mid]=\"#86b6da\"\ntheme[free_end]=\"#86b6da\"\n\ntheme[cached_start]=\"#86b6da\"\ntheme[cached_mid]=\"#86b6da\"\ntheme[cached_end]=\"#86b6da\"\n\ntheme[available_start]=\"#b5deef\"\ntheme[available_mid]=\"#b5deef\"\ntheme[available_end]=\"#b5deef\"\n\ntheme[used_start]=\"#79abd2\"\ntheme[used_mid]=\"#79abd2\"\ntheme[used_end]=\"#79abd2\"\n\ntheme[download_start]=\"#86b6da\"\ntheme[download_mid]=\"#b5deef\"\ntheme[download_end]=\"#92c7e7\"\n\ntheme[upload_start]=\"#86b6da\"\ntheme[upload_mid]=\"#b5deef\"\ntheme[upload_end]=\"#92c7e7\"\n"
  },
  {
    "path": "themes/lumon/chromium.theme",
    "content": "14,31,41\n"
  },
  {
    "path": "themes/lumon/colors.toml",
    "content": "# Accent and UI colors\naccent = \"#f2fcff\"\nactive_border_color = \"#f2fcff\"\nactive_tab_background = \"#6fb8e3\"\n\n# Cursor colors\ncursor = \"#f2fcff\"\n\n# Primary colors\nforeground = \"#d6e2ee\"\nbackground = \"#16242d\"\n\n# Selection colors\nselection_foreground = \"#1b2d40\"\nselection_background = \"#4d9ed3\"\n\n# Normal colors (ANSI 0-7)\ncolor0  = \"#1b2d40\"\ncolor1  = \"#4d86b0\"\ncolor2  = \"#5e95bc\"\ncolor3  = \"#6fa4c9\"\ncolor4  = \"#6fb8e3\"\ncolor5  = \"#8bc9eb\"\ncolor6  = \"#b4e4f6\"\ncolor7  = \"#d6e2ee\"\n\n# Bright colors (ANSI 8-15)\ncolor8  = \"#304860\"\ncolor9  = \"#73a6cb\"\ncolor10 = \"#86b7d8\"\ncolor11 = \"#9dcae5\"\ncolor12 = \"#f2fcff\"\ncolor13 = \"#b1d8ee\"\ncolor14 = \"#d1eef8\"\ncolor15 = \"#ffffff\"\n"
  },
  {
    "path": "themes/lumon/hyprland.conf",
    "content": "$activeBorderColor = rgb(f2fcff)\n$activeShadowColor = rgb(6fb8e3)\n$inactiveBorderColor = rgba(30486099)\n$inactiveShadowColor = rgba(30486077)\n\ngeneral {\n    col.active_border = $activeBorderColor\n    col.inactive_border = $inactiveBorderColor\n    gaps_in = 8\n    gaps_out = 16\n}\n\ngroup {\n    col.border_active = $activeBorderColor\n    col.border_inactive = $inactiveBorderColor\n}\n\ndecoration {\n    shadow {\n      enabled = true\n      range = 16\n      render_power = 4\n      color = $activeShadowColor\n      color_inactive = $inactiveShadowColor\n    }\n}\n"
  },
  {
    "path": "themes/lumon/icons.theme",
    "content": "Yaru-blue"
  },
  {
    "path": "themes/lumon/neovim.lua",
    "content": "return {\n  {\n    \"omacom-io/lumon.nvim\",\n    name = \"lumon\",\n    priority = 1000,\n  },\n  {\n    \"LazyVim/LazyVim\",\n    opts = {\n      colorscheme = \"lumon\",\n    },\n  },\n}\n"
  },
  {
    "path": "themes/lumon/swayosd.css",
    "content": "@define-color background-color #1b2d40;\n@define-color border-color #304860;\n@define-color label #d6e2ee;\n@define-color image #d6e2ee;\n@define-color progress #6fb8e3;\n@define-color edge-light #f2fcff;\n\n/* Cancel out Omarchy defaults */\nwindow:not(:backdrop),\nwindow:backdrop {\n    border: none;\n    border-width: 0;\n    background-color: transparent;\n    box-shadow: none;\n    padding: 12px;\n}\n\n/* Draw the Lumon OSD shell */\nwindow:not(:backdrop) #container,\nwindow:backdrop #container {\n    border: 2px solid alpha(@border-color, 0.92);\n    background-color: alpha(@background-color, 0.95);\n    padding: 12px 16px;\n    background-clip: padding-box;\n}\n\nimage,\nlabel {\n    color: @label;\n}\n\nprogressbar {\n    min-height: 8px;\n}\n\nprogressbar trough {\n    background: alpha(@border-color, 0.24);\n    box-shadow: inset 0 1px rgba(242, 252, 255, 0.03);\n}\n\nprogressbar progress {\n    background: linear-gradient(90deg, @progress, @edge-light);\n    box-shadow: 0 0 10px rgba(111, 184, 227, 0.18);\n}\n"
  },
  {
    "path": "themes/lumon/waybar.css",
    "content": "@define-color foreground #d6e2ee;\n@define-color background #213442;\n"
  },
  {
    "path": "themes/matte-black/btop.theme",
    "content": "# ────────────────────────────────────────────────────────────\n# Bashtop theme - Omarchy Matte Black\n# by tahayvr\n# https://github.com/tahayvr\n# ────────────────────────────────────────────────────────────\n\n# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: \"#RRGGBB\", \"#BW\" or \"0-255 0-255 0-255\"\n# example for white: \"#ffffff\", \"#ff\" or \"255 255 255\".\n\n# All graphs and meters can be gradients\n# For single color graphs leave \"mid\" and \"end\" variable empty.\n# Use \"start\" and \"end\" variables for two color gradient\n# Use \"start\", \"mid\" and \"end\" for three color gradient\n\n# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"\"\n\n# Main text color\ntheme[main_fg]=\"#EAEAEA\"\n\n# Title color for boxes\ntheme[title]=\"#8a8a8d\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#f59e0b\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#f59e0b\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#EAEAEA\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#333333\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#8a8a8d\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#8a8a8d\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#8a8a8d\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#8a8a8d\"\n\n# Processes box outline color\ntheme[proc_box]=\"#8a8a8d\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#8a8a8d\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#8a8a8d\"\ntheme[temp_mid]=\"#f59e0b\"\ntheme[temp_end]=\"#b91c1c\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#8a8a8d\"\ntheme[cpu_mid]=\"#f59e0b\"\ntheme[cpu_end]=\"#b91c1c\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#8a8a8d\"\ntheme[free_mid]=\"#f59e0b\"\ntheme[free_end]=\"#b91c1c\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#8a8a8d\"\ntheme[cached_mid]=\"#f59e0b\"\ntheme[cached_end]=\"#b91c1c\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#8a8a8d\"\ntheme[available_mid]=\"#f59e0b\"\ntheme[available_end]=\"#b91c1c\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#8a8a8d\"\ntheme[used_mid]=\"#f59e0b\"\ntheme[used_end]=\"#b91c1c\"\n\n# Download graph colors\ntheme[download_start]=\"#8a8a8d\"\ntheme[download_mid]=\"#f59e0b\"\ntheme[download_end]=\"#b91c1c\"\n\n# Upload graph colors\ntheme[upload_start]=\"#8a8a8d\"\ntheme[upload_mid]=\"#f59e0b\"\ntheme[upload_end]=\"#b91c1c\"\n"
  },
  {
    "path": "themes/matte-black/colors.toml",
    "content": "accent = \"#e68e0d\"\ncursor = \"#eaeaea\"\nforeground = \"#bebebe\"\nbackground = \"#121212\"\nselection_foreground = \"#bebebe\"\nselection_background = \"#333333\"\n\ncolor0 = \"#333333\"\ncolor1 = \"#D35F5F\"\ncolor2 = \"#FFC107\"\ncolor3 = \"#b91c1c\"\ncolor4 = \"#e68e0d\"\ncolor5 = \"#D35F5F\"\ncolor6 = \"#bebebe\"\ncolor7 = \"#bebebe\"\ncolor8 = \"#8a8a8d\"\ncolor9 = \"#B91C1C\"\ncolor10 = \"#FFC107\"\ncolor11 = \"#b90a0a\"\ncolor12 = \"#f59e0b\"\ncolor13 = \"#B91C1C\"\ncolor14 = \"#eaeaea\"\ncolor15 = \"#ffffff\"\n"
  },
  {
    "path": "themes/matte-black/icons.theme",
    "content": "Yaru-red\n"
  },
  {
    "path": "themes/matte-black/neovim.lua",
    "content": "return {\n  { \"tahayvr/matteblack.nvim\", lazy = false, priority = 1000 },\n  {\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"matteblack\",\n\t\t},\n\t},\n}"
  },
  {
    "path": "themes/matte-black/vscode.json",
    "content": "{\n  \"name\": \"Matte Black\",\n  \"extension\": \"TahaYVR.matteblack\"\n}\n"
  },
  {
    "path": "themes/miasma/btop.theme",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#222222\"\n\n# Main text color\ntheme[main_fg]=\"#c2c2b0\"\n\n# Title color for boxes\ntheme[title]=\"#bb7744\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#c9a554\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#e4c47a\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#000000\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#666666\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#bb7744\"\n\n# Box outline and divider line color\ntheme[cpu_box]=\"#5f875f\"\ntheme[mem_box]=\"#5f875f\"\ntheme[net_box]=\"#5f875f\"\ntheme[proc_box]=\"#5f875f\"\ntheme[div_line]=\"#666666\"\n\n# Gradient for all meters and graphs\ntheme[temp_start]=\"#c9a554\"\ntheme[temp_mid]=\"#78824b\"\ntheme[temp_end]=\"#5f875f\"\n\n\ntheme[cpu_start]=\"#c9a554\"\ntheme[cpu_mid]=\"#78824b\"\ntheme[cpu_end]=\"#5f875f\"\n\n\ntheme[free_start]=\"#78824b\"\ntheme[free_mid]=\"#b36d43\"\ntheme[free_end]=\"#b36d43\"\n\n\ntheme[cached_start]=\"#b36d43\"\ntheme[cached_mid]=\"#b36d43\"\ntheme[cached_end]=\"#b36d43\"\n\n\ntheme[available_start]=\"#c9a554\"\ntheme[available_mid]=\"#c9a554\"\ntheme[available_end]=\"#c9a554\"\n\n\ntheme[used_start]=\"#5f875f\"\ntheme[used_mid]=\"#5f875f\"\ntheme[used_end]=\"#5f875f\"\n\n\ntheme[download_start]=\"#b36d43\"\ntheme[download_mid]=\"#c9a554\"\ntheme[download_end]=\"#78824b\"\n\n\ntheme[upload_start]=\"#b36d43\"\ntheme[upload_mid]=\"#c9a554\"\ntheme[upload_end]=\"#78824b\"\n"
  },
  {
    "path": "themes/miasma/colors.toml",
    "content": "accent = \"#78824b\"\ncursor = \"#c7c7c7\"\nforeground = \"#c2c2b0\"\nbackground = \"#222222\"\nselection_foreground = \"#c2c2b0\"\nselection_background = \"#78824b\"\n\ncolor0 = \"#000000\"\ncolor1 = \"#685742\"\ncolor2 = \"#5f875f\"\ncolor3 = \"#b36d43\"\ncolor4 = \"#78824b\"\ncolor5 = \"#bb7744\"\ncolor6 = \"#c9a554\"\ncolor7 = \"#d7c483\"\ncolor8 = \"#666666\"\ncolor9 = \"#685742\"\ncolor10 = \"#5f875f\"\ncolor11 = \"#b36d43\"\ncolor12 = \"#78824b\"\ncolor13 = \"#bb7744\"\ncolor14 = \"#c9a554\"\ncolor15 = \"#d7c483\"\n"
  },
  {
    "path": "themes/miasma/icons.theme",
    "content": "Yaru-wartybrown"
  },
  {
    "path": "themes/miasma/neovim.lua",
    "content": "return {\n  {\n    \"xero/miasma.nvim\",\n    priority = 1000,\n  },\n  {\n    \"LazyVim/LazyVim\",\n    opts = {\n      colorscheme = \"miasma\",\n    },\n  },\n}\n"
  },
  {
    "path": "themes/miasma/vscode.json",
    "content": "{\n  \"name\": \"In The Fog Dark\",\n  \"extension\": \"ganevru.in-the-fog-theme\"\n}\n"
  },
  {
    "path": "themes/nord/btop.theme",
    "content": "#Bashtop theme with nord palette (https://www.nordtheme.com)\n#by Justin Zobel <justin.zobel@gmail.com>\n\n# Colors should be in 6 or 2 character hexadecimal or single spaced rgb decimal: \"#RRGGBB\", \"#BW\" or \"0-255 0-255 0-255\"\n# example for white: \"#ffffff\", \"#ff\" or \"255 255 255\".\n\n# All graphs and meters can be gradients\n# For single color graphs leave \"mid\" and \"end\" variable empty.\n# Use \"start\" and \"end\" variables for two color gradient\n# Use \"start\", \"mid\" and \"end\" for three color gradient\n\n# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#2E3440\"\n\n# Main text color\ntheme[main_fg]=\"#D8DEE9\"\n\n# Title color for boxes\ntheme[title]=\"#8FBCBB\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#5E81AC\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#4C566A\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#ECEFF4\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#4C566A\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#5E81AC\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#4C566A\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#4C566A\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#4C566A\"\n\n# Processes box outline color\ntheme[proc_box]=\"#4C566A\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#4C566A\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#81A1C1\"\ntheme[temp_mid]=\"#88C0D0\"\ntheme[temp_end]=\"#ECEFF4\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#81A1C1\"\ntheme[cpu_mid]=\"#88C0D0\"\ntheme[cpu_end]=\"#ECEFF4\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#81A1C1\"\ntheme[free_mid]=\"#88C0D0\"\ntheme[free_end]=\"#ECEFF4\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#81A1C1\"\ntheme[cached_mid]=\"#88C0D0\"\ntheme[cached_end]=\"#ECEFF4\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#81A1C1\"\ntheme[available_mid]=\"#88C0D0\"\ntheme[available_end]=\"#ECEFF4\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#81A1C1\"\ntheme[used_mid]=\"#88C0D0\"\ntheme[used_end]=\"#ECEFF4\"\n\n# Download graph colors\ntheme[download_start]=\"#81A1C1\"\ntheme[download_mid]=\"#88C0D0\"\ntheme[download_end]=\"#ECEFF4\"\n\n# Upload graph colors\ntheme[upload_start]=\"#81A1C1\"\ntheme[upload_mid]=\"#88C0D0\"\ntheme[upload_end]=\"#ECEFF4\"\n"
  },
  {
    "path": "themes/nord/colors.toml",
    "content": "accent = \"#81a1c1\"\ncursor = \"#d8dee9\"\nforeground = \"#d8dee9\"\nbackground = \"#2e3440\"\nselection_foreground = \"#d8dee9\"\nselection_background = \"#4c566a\"\n\ncolor0 = \"#3b4252\"\ncolor1 = \"#bf616a\"\ncolor2 = \"#a3be8c\"\ncolor3 = \"#ebcb8b\"\ncolor4 = \"#81a1c1\"\ncolor5 = \"#b48ead\"\ncolor6 = \"#88c0d0\"\ncolor7 = \"#e5e9f0\"\ncolor8 = \"#4c566a\"\ncolor9 = \"#bf616a\"\ncolor10 = \"#a3be8c\"\ncolor11 = \"#ebcb8b\"\ncolor12 = \"#81a1c1\"\ncolor13 = \"#b48ead\"\ncolor14 = \"#8fbcbb\"\ncolor15 = \"#eceff4\"\n"
  },
  {
    "path": "themes/nord/icons.theme",
    "content": "Yaru-blue\n"
  },
  {
    "path": "themes/nord/neovim.lua",
    "content": "return {\n\t{ \"EdenEast/nightfox.nvim\" },\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"nordfox\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/nord/vscode.json",
    "content": "{\n  \"name\": \"Nord\",\n  \"extension\": \"arcticicestudio.nord-visual-studio-code\"\n}\n"
  },
  {
    "path": "themes/osaka-jade/btop.theme",
    "content": "# Main background\ntheme[main_bg]=\"#111c18\"\n\n# Main text color\ntheme[main_fg]=\"#F7E8B2\"\n\n# Title color for boxes\ntheme[title]=\"#D6D5BC\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#E67D64\"\n\n# Background color of selected items\ntheme[selected_bg]=\"#364538\"\n\n# Foreground color of selected items\ntheme[selected_fg]=\"#DEB266\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#32473B\"  \n\n# Color of text appearing on top of graphs\ntheme[graph_text]=\"#E6D8BA\"\n\n# Misc colors for processes box\ntheme[proc_misc]=\"#E6D8BA\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#81B8A8\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#81B8A8\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#81B8A8\"\n\n# Processes box outline color\ntheme[proc_box]=\"#81B8A8\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#81B8A8\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#BFD99A\"\ntheme[temp_mid]=\"#E1B55E\"\ntheme[temp_end]=\"#DBB05C\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#5F8C86\"\ntheme[cpu_mid]=\"#629C89\"\ntheme[cpu_end]=\"#76AD98\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#5F8C86\"\ntheme[free_mid]=\"#629C89\"\ntheme[free_end]=\"#76AD98\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#5F8C86\"\ntheme[cached_mid]=\"#629C89\"\ntheme[cached_end]=\"#76AD98\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#5F8C86\"\ntheme[available_mid]=\"#629C89\"\ntheme[available_end]=\"#76AD98\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#5F8C86\"\ntheme[used_mid]=\"#629C89\"\ntheme[used_end]=\"#76AD98\"\n\n# Download graph colors\ntheme[download_start]=\"#75BBB3\"\ntheme[download_mid]=\"#61949A\"\ntheme[download_end]=\"#215866\"\n\n# Upload graph colors\ntheme[upload_start]=\"#215866\"\ntheme[upload_mid]=\"#91C080\"\ntheme[upload_end]=\"#549E6A\"\n\n# Process box color gradient for threads, mem and cpu usage\ntheme[process_start]=\"#72CFA3\"\ntheme[process_mid]=\"#D0D494\"\ntheme[process_end]=\"#DB9F9C\"\n\n"
  },
  {
    "path": "themes/osaka-jade/colors.toml",
    "content": "accent = \"#509475\"\ncursor = \"#D7C995\"\nforeground = \"#C1C497\"\nbackground = \"#111c18\"\nselection_foreground = \"#111C18\"\nselection_background = \"#C1C497\"\n\ncolor0 = \"#23372B\"\ncolor1 = \"#FF5345\"\ncolor2 = \"#549e6a\"\ncolor3 = \"#459451\"\ncolor4 = \"#509475\"\ncolor5 = \"#D2689C\"\ncolor6 = \"#2DD5B7\"\ncolor7 = \"#F6F5DD\"\ncolor8 = \"#53685B\"\ncolor9 = \"#db9f9c\"\ncolor10 = \"#63b07a\"\ncolor11 = \"#E5C736\"\ncolor12 = \"#ACD4CF\"\ncolor13 = \"#75bbb3\"\ncolor14 = \"#8CD3CB\"\ncolor15 = \"#9eebb3\"\n"
  },
  {
    "path": "themes/osaka-jade/icons.theme",
    "content": "Yaru-sage\n"
  },
  {
    "path": "themes/osaka-jade/neovim.lua",
    "content": "return {\n  {\n    \"ribru17/bamboo.nvim\",\n    priority = 1000,\n  },\n  {\n    \"LazyVim/LazyVim\",\n    opts = {\n      colorscheme = \"bamboo\",\n    },\n  },\n}\n"
  },
  {
    "path": "themes/osaka-jade/vscode.json",
    "content": "{\n  \"name\": \"Ocean Green: Dark\",\n  \"extension\": \"jovejonovski.ocean-green\"\n}\n"
  },
  {
    "path": "themes/ristretto/btop.theme",
    "content": "#Btop monokai pro ristretto theme\n#Reconfigured from monokai theme\n\n# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#2c2421\"\n\n# Main text color\ntheme[main_fg]=\"#e6d9db\"\n\n# Title color for boxes\ntheme[title]=\"#e6d9db\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#fd6883\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#3d2f2a\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#e6d9db\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#72696a\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#adda78\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#5b4a45\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#5b4a45\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#5b4a45\"\n\n# Processes box outline color\ntheme[proc_box]=\"#5b4a45\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#72696a\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#a8a9eb\"\ntheme[temp_mid]=\"#f38d70\"\ntheme[temp_end]=\"#fd6a85\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#adda78\"\ntheme[cpu_mid]=\"#f9cc6c\"\ntheme[cpu_end]=\"#fd6883\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#5b4a45\"\ntheme[free_mid]=\"#adda78\"\ntheme[free_end]=\"#c5e2a3\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#5b4a45\"\ntheme[cached_mid]=\"#85dacc\"\ntheme[cached_end]=\"#b3e8dd\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#5b4a45\"\ntheme[available_mid]=\"#f9cc6c\"\ntheme[available_end]=\"#fce2a3\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#5b4a45\"\ntheme[used_mid]=\"#fd6a85\"\ntheme[used_end]=\"#feb5c7\"\n\n# Download graph colors\ntheme[download_start]=\"#3d2f2a\"\ntheme[download_mid]=\"#a8a9eb\"\ntheme[download_end]=\"#c5c6f0\"\n\n# Upload graph colors\ntheme[upload_start]=\"#3d2f2a\"\ntheme[upload_mid]=\"#fd6a85\"\ntheme[upload_end]=\"#feb5c7\"\n\n"
  },
  {
    "path": "themes/ristretto/colors.toml",
    "content": "accent = \"#f38d70\"\ncursor = \"#c3b7b8\"\nforeground = \"#e6d9db\"\nbackground = \"#2c2525\"\nselection_foreground = \"#e6d9db\"\nselection_background = \"#403e41\"\n\ncolor0 = \"#72696a\"\ncolor1 = \"#fd6883\"\ncolor2 = \"#adda78\"\ncolor3 = \"#f9cc6c\"\ncolor4 = \"#f38d70\"\ncolor5 = \"#a8a9eb\"\ncolor6 = \"#85dacc\"\ncolor7 = \"#e6d9db\"\ncolor8 = \"#948a8b\"\ncolor9 = \"#ff8297\"\ncolor10 = \"#c8e292\"\ncolor11 = \"#fcd675\"\ncolor12 = \"#f8a788\"\ncolor13 = \"#bebffd\"\ncolor14 = \"#9bf1e1\"\ncolor15 = \"#f1e5e7\"\n"
  },
  {
    "path": "themes/ristretto/icons.theme",
    "content": "Yaru-yellow\n"
  },
  {
    "path": "themes/ristretto/neovim.lua",
    "content": "return {\n  {\n    \"gthelding/monokai-pro.nvim\",\n    config = function()\n      require(\"monokai-pro\").setup({\n        filter = \"ristretto\",\n        override = function()\n          return {\n            NonText = { fg = \"#948a8b\" },\n            MiniIconsGrey = { fg = \"#948a8b\" },\n            MiniIconsRed = { fg = \"#fd6883\" },\n            MiniIconsBlue = { fg = \"#85dacc\" },\n            MiniIconsGreen = { fg = \"#adda78\" },\n            MiniIconsYellow = { fg = \"#f9cc6c\" },\n            MiniIconsOrange = { fg = \"#f38d70\" },\n            MiniIconsPurple = { fg = \"#a8a9eb\" },\n            MiniIconsAzure = { fg = \"#a8a9eb\" },\n            MiniIconsCyan = { fg = \"#85dacc\" }, -- same value as MiniIconsBlue for consistency\n          }\n        end,\n      })\n      vim.cmd([[colorscheme monokai-pro]])\n    end,\n  },\n  {\n    \"LazyVim/LazyVim\",\n    opts = {\n      colorscheme = \"monokai-pro\",\n    },\n  },\n}\n"
  },
  {
    "path": "themes/ristretto/vscode.json",
    "content": "{\n  \"name\": \"Monokai Pro (Filter Ristretto)\",\n  \"extension\": \"monokai.theme-monokai-pro-vscode\"\n}\n"
  },
  {
    "path": "themes/rose-pine/btop.theme",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#faf4ed\"\n# Base\n\n# Main text color\ntheme[main_fg]=\"#575279\"\n# Text\n\n# Title color for boxes\ntheme[title]=\"#908caa\"\n# Subtle\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#e0def4\"\n# Text\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#524f67\"\n# HL High\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#f6c177\"\n# Gold\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#403d52\"\n# HL Med\n\n# Color of text appearing on top of graphs, i.e uptime and current network graph scaling\ntheme[graph_text]=\"#9ccfd8\"\n# Foam\n\n# Background color of the percentage meters\ntheme[meter_bg]=\"#9ccfd8\"\n# Foam\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#c4a7e7\"\n# Iris\n\n# Cpu box outline color\ntheme[cpu_box]=\"#ebbcba\"\n# Rose\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#31748f\"\n# Pine\n\n# Net up/down box outline color\ntheme[net_box]=\"#c4a7e7\"\n# Iris\n\n# Processes box outline color\ntheme[proc_box]=\"#eb6f92\"\n# Love\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#6e6a86\"\n# Muted\n\n# Temperature graph colors\ntheme[temp_start]=\"#ebbcba\"\n# Rose\ntheme[temp_mid]=\"#f6c177\"\n# Gold\ntheme[temp_end]=\"#eb6f92\"\n# Love\n\n# CPU graph colors\ntheme[cpu_start]=\"#f6c177\"\n# Gold\ntheme[cpu_mid]=\"#ebbcba\"\n# Rose\ntheme[cpu_end]=\"#eb6f92\"\n# Love\n\n# Mem/Disk free meter\n# all love\ntheme[free_start]=\"#eb6f92\"\ntheme[free_mid]=\"#eb6f92\"\ntheme[free_end]=\"#eb6f92\"\n\n# Mem/Disk cached meter\n# all iris\ntheme[cached_start]=\"#c4a7e7\"\ntheme[cached_mid]=\"#c4a7e7\"\ntheme[cached_end]=\"#c4a7e7\"\n\n# Mem/Disk available meter\n# all pine\ntheme[available_start]=\"#31748f\"\ntheme[available_mid]=\"#31748f\"\ntheme[available_end]=\"#31748f\"\n\n# Mem/Disk used meter\n# all rose\ntheme[used_start]=\"#ebbcba\"\ntheme[used_mid]=\"#ebbcba\"\ntheme[used_end]=\"#ebbcba\"\n\n# Download graph colors\n# Pine for start, foam for the rest\ntheme[download_start]=\"#31748f\"\ntheme[download_mid]=\"#9ccfd8\"\ntheme[download_end]=\"#9ccfd8\"\n\n# Upload graph colors\ntheme[upload_start]=\"#ebbcba\"\n# Rose for start\ntheme[upload_mid]=\"#eb6f92\"\n# Love for mid and end\ntheme[upload_end]=\"#eb6f92\"\n\n# Process box color gradient for threads, mem and cpu usage\ntheme[process_start]=\"#31748f\"\n# Pine\ntheme[process_mid]=\"#9ccfd8\"\n# Foam for mid and end\ntheme[process_end]=\"#9ccfd8\"\n"
  },
  {
    "path": "themes/rose-pine/chromium.theme",
    "content": "210,196,219\n"
  },
  {
    "path": "themes/rose-pine/colors.toml",
    "content": "accent = \"#56949f\"\ncursor = \"#cecacd\"\nforeground = \"#575279\"\nbackground = \"#faf4ed\"\nselection_foreground = \"#575279\"\nselection_background = \"#dfdad9\"\n\ncolor0 = \"#f2e9e1\"\ncolor1 = \"#b4637a\"\ncolor2 = \"#286983\"\ncolor3 = \"#ea9d34\"\ncolor4 = \"#56949f\"\ncolor5 = \"#907aa9\"\ncolor6 = \"#d7827e\"\ncolor7 = \"#575279\"\ncolor8 = \"#9893a5\"\ncolor9 = \"#b4637a\"\ncolor10 = \"#286983\"\ncolor11 = \"#ea9d34\"\ncolor12 = \"#56949f\"\ncolor13 = \"#907aa9\"\ncolor14 = \"#d7827e\"\ncolor15 = \"#575279\"\n"
  },
  {
    "path": "themes/rose-pine/icons.theme",
    "content": "Yaru-blue\n"
  },
  {
    "path": "themes/rose-pine/light.mode",
    "content": "# This will set \"prefer-light\" and use \"Adwaita\" as the theme\n"
  },
  {
    "path": "themes/rose-pine/neovim.lua",
    "content": "return {\n\t{ \"rose-pine/neovim\", name = \"rose-pine\" },\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"rose-pine-dawn\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/rose-pine/vscode.json",
    "content": "{\n  \"name\": \"Rosé Pine Dawn\",\n  \"extension\": \"mvllow.rose-pine\"\n}\n"
  },
  {
    "path": "themes/tokyo-night/btop.theme",
    "content": "# Theme: tokyo-night\n# By: Pascal Jaeger\n\n# Main bg\ntheme[main_bg]=\"#1a1b26\"\n\n# Main text color\ntheme[main_fg]=\"#cfc9c2\"\n\n# Title color for boxes\ntheme[title]=\"#cfc9c2\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#7dcfff\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#414868\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#cfc9c2\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#565f89\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#7dcfff\"\n\n# Cpu box outline color\ntheme[cpu_box]=\"#565f89\"\n\n# Memory/disks box outline color\ntheme[mem_box]=\"#565f89\"\n\n# Net up/down box outline color\ntheme[net_box]=\"#565f89\"\n\n# Processes box outline color\ntheme[proc_box]=\"#565f89\"\n\n# Box divider line and small boxes line color\ntheme[div_line]=\"#565f89\"\n\n# Temperature graph colors\ntheme[temp_start]=\"#9ece6a\"\ntheme[temp_mid]=\"#e0af68\"\ntheme[temp_end]=\"#f7768e\"\n\n# CPU graph colors\ntheme[cpu_start]=\"#9ece6a\"\ntheme[cpu_mid]=\"#e0af68\"\ntheme[cpu_end]=\"#f7768e\"\n\n# Mem/Disk free meter\ntheme[free_start]=\"#9ece6a\"\ntheme[free_mid]=\"#e0af68\"\ntheme[free_end]=\"#f7768e\"\n\n# Mem/Disk cached meter\ntheme[cached_start]=\"#9ece6a\"\ntheme[cached_mid]=\"#e0af68\"\ntheme[cached_end]=\"#f7768e\"\n\n# Mem/Disk available meter\ntheme[available_start]=\"#9ece6a\"\ntheme[available_mid]=\"#e0af68\"\ntheme[available_end]=\"#f7768e\"\n\n# Mem/Disk used meter\ntheme[used_start]=\"#9ece6a\"\ntheme[used_mid]=\"#e0af68\"\ntheme[used_end]=\"#f7768e\"\n\n# Download graph colors\ntheme[download_start]=\"#9ece6a\"\ntheme[download_mid]=\"#e0af68\"\ntheme[download_end]=\"#f7768e\"\n\n# Upload graph colors\ntheme[upload_start]=\"#9ece6a\"\ntheme[upload_mid]=\"#e0af68\"\ntheme[upload_end]=\"#f7768e\"\n\n"
  },
  {
    "path": "themes/tokyo-night/colors.toml",
    "content": "accent = \"#7aa2f7\"\ncursor = \"#c0caf5\"\nforeground = \"#a9b1d6\"\nbackground = \"#1a1b26\"\nselection_foreground = \"#c0caf5\"\nselection_background = \"#7aa2f7\"\n\ncolor0 = \"#32344a\"\ncolor1 = \"#f7768e\"\ncolor2 = \"#9ece6a\"\ncolor3 = \"#e0af68\"\ncolor4 = \"#7aa2f7\"\ncolor5 = \"#ad8ee6\"\ncolor6 = \"#449dab\"\ncolor7 = \"#787c99\"\ncolor8 = \"#444b6a\"\ncolor9 = \"#ff7a93\"\ncolor10 = \"#b9f27c\"\ncolor11 = \"#ff9e64\"\ncolor12 = \"#7da6ff\"\ncolor13 = \"#bb9af7\"\ncolor14 = \"#0db9d7\"\ncolor15 = \"#acb0d0\"\n"
  },
  {
    "path": "themes/tokyo-night/icons.theme",
    "content": "Yaru-magenta\n"
  },
  {
    "path": "themes/tokyo-night/keyboard.rgb",
    "content": "ff00ff\n"
  },
  {
    "path": "themes/tokyo-night/neovim.lua",
    "content": "return {\n\t{\n\t\t\"folke/tokyonight.nvim\",\n\t\tpriority = 1000,\n\t},\n\t{\n\t\t\"LazyVim/LazyVim\",\n\t\topts = {\n\t\t\tcolorscheme = \"tokyonight-night\",\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "themes/tokyo-night/vscode.json",
    "content": "{\n  \"name\": \"Tokyo Night\",\n  \"extension\": \"enkia.tokyo-night\"\n}\n"
  },
  {
    "path": "themes/vantablack/btop.theme",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#0d0d0d\"\n\n# Main text color\ntheme[main_fg]=\"#ffffff\"\n\n# Title color for boxes\ntheme[title]=\"#9b9b9b\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#b0b0b0\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#fdfdfd\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#ffffff\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#fdfdfd\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#9b9b9b\"\n\n# Box outline and divider line color\ntheme[cpu_box]=\"#b6b6b6\"\ntheme[mem_box]=\"#b6b6b6\"\ntheme[net_box]=\"#b6b6b6\"\ntheme[proc_box]=\"#b6b6b6\"\ntheme[div_line]=\"#fdfdfd\"\n\n# Gradient for all meters and graphs\ntheme[temp_start]=\"#b0b0b0\"\ntheme[temp_mid]=\"#8d8d8d\"\ntheme[temp_end]=\"#b6b6b6\"\n\n\ntheme[cpu_start]=\"#b0b0b0\"\ntheme[cpu_mid]=\"#8d8d8d\"\ntheme[cpu_end]=\"#b6b6b6\"\n\n\ntheme[free_start]=\"#8d8d8d\"\ntheme[free_mid]=\"#cecece\"\ntheme[free_end]=\"#cecece\"\n\n\ntheme[cached_start]=\"#cecece\"\ntheme[cached_mid]=\"#cecece\"\ntheme[cached_end]=\"#cecece\"\n\n\ntheme[available_start]=\"#b0b0b0\"\ntheme[available_mid]=\"#b0b0b0\"\ntheme[available_end]=\"#b0b0b0\"\n\n\ntheme[used_start]=\"#b6b6b6\"\ntheme[used_mid]=\"#b6b6b6\"\ntheme[used_end]=\"#b6b6b6\"\n\n\ntheme[download_start]=\"#cecece\"\ntheme[download_mid]=\"#b0b0b0\"\ntheme[download_end]=\"#8d8d8d\"\n\n\ntheme[upload_start]=\"#cecece\"\ntheme[upload_mid]=\"#b0b0b0\"\ntheme[upload_end]=\"#8d8d8d\""
  },
  {
    "path": "themes/vantablack/colors.toml",
    "content": "# UI Colors (extended)\naccent = \"#8d8d8d\"\ncursor = \"#ffffff\"\n\n# Primary colors\nforeground = \"#ffffff\"\nbackground = \"#0d0d0d\"\n\n# Selection colors\nselection_foreground = \"#0d0d0d\"\nselection_background = \"#ffffff\"\n\n# Normal colors (ANSI 0-7)\ncolor0 = \"#0d0d0d\"\ncolor1 = \"#a4a4a4\"\ncolor2 = \"#b6b6b6\"\ncolor3 = \"#cecece\"\ncolor4 = \"#8d8d8d\"\ncolor5 = \"#9b9b9b\"\ncolor6 = \"#b0b0b0\"\ncolor7 = \"#ececec\"\n\n# Bright colors (ANSI 8-15)\ncolor8 = \"#fdfdfd\"\ncolor9 = \"#a4a4a4\"\ncolor10 = \"#b6b6b6\"\ncolor11 = \"#cecece\"\ncolor12 = \"#8d8d8d\"\ncolor13 = \"#9b9b9b\"\ncolor14 = \"#b0b0b0\"\ncolor15 = \"#ffffff\"\n"
  },
  {
    "path": "themes/vantablack/icons.theme",
    "content": "Yaru-gray\n"
  },
  {
    "path": "themes/vantablack/neovim.lua",
    "content": "return {\n  {\n    \"bjarneo/vantablack.nvim\",\n    priority = 1000,\n  },\n  {\n    \"LazyVim/LazyVim\",\n    opts = {\n      colorscheme = \"vantablack\",\n    },\n  },\n}\n"
  },
  {
    "path": "themes/vantablack/vscode.json",
    "content": "{\n  \"name\": \"Vantablack\",\n  \"extension\": \"Bjarne.vantablack-omarchy\"\n}\n"
  },
  {
    "path": "themes/white/btop.theme",
    "content": "# Main background, empty for terminal default, need to be empty if you want transparent background\ntheme[main_bg]=\"#ffffff\"\n\n# Main text color\ntheme[main_fg]=\"#000000\"\n\n# Title color for boxes\ntheme[title]=\"#2e2e2e\"\n\n# Highlight color for keyboard shortcuts\ntheme[hi_fg]=\"#3e3e3e\"\n\n# Background color of selected item in processes box\ntheme[selected_bg]=\"#c0c0c0\"\n\n# Foreground color of selected item in processes box\ntheme[selected_fg]=\"#000000\"\n\n# Color of inactive/disabled text\ntheme[inactive_fg]=\"#c0c0c0\"\n\n# Misc colors for processes box including mini cpu graphs, details memory graph and details status text\ntheme[proc_misc]=\"#2e2e2e\"\n\n# Box outline and divider line color\ntheme[cpu_box]=\"#3a3a3a\"\ntheme[mem_box]=\"#3a3a3a\"\ntheme[net_box]=\"#3a3a3a\"\ntheme[proc_box]=\"#3a3a3a\"\ntheme[div_line]=\"#c0c0c0\"\n\n# Gradient for all meters and graphs\ntheme[temp_start]=\"#3e3e3e\"\ntheme[temp_mid]=\"#1a1a1a\"\ntheme[temp_end]=\"#3a3a3a\"\n\n\ntheme[cpu_start]=\"#3e3e3e\"\ntheme[cpu_mid]=\"#1a1a1a\"\ntheme[cpu_end]=\"#3a3a3a\"\n\n\ntheme[free_start]=\"#1a1a1a\"\ntheme[free_mid]=\"#4a4a4a\"\ntheme[free_end]=\"#4a4a4a\"\n\n\ntheme[cached_start]=\"#4a4a4a\"\ntheme[cached_mid]=\"#4a4a4a\"\ntheme[cached_end]=\"#4a4a4a\"\n\n\ntheme[available_start]=\"#3e3e3e\"\ntheme[available_mid]=\"#3e3e3e\"\ntheme[available_end]=\"#3e3e3e\"\n\n\ntheme[used_start]=\"#3a3a3a\"\ntheme[used_mid]=\"#3a3a3a\"\ntheme[used_end]=\"#3a3a3a\"\n\n\ntheme[download_start]=\"#4a4a4a\"\ntheme[download_mid]=\"#3e3e3e\"\ntheme[download_end]=\"#1a1a1a\"\n\n\ntheme[upload_start]=\"#4a4a4a\"\ntheme[upload_mid]=\"#3e3e3e\"\ntheme[upload_end]=\"#1a1a1a\""
  },
  {
    "path": "themes/white/colors.toml",
    "content": "# UI Colors (extended)\naccent = \"#6e6e6e\"\ncursor = \"#000000\"\n\n# Primary colors\nforeground = \"#000000\"\nbackground = \"#ffffff\"\n\n# Selection colors\nselection_foreground = \"#ffffff\"\nselection_background = \"#1a1a1a\"\n\n# Normal colors (ANSI 0-7)\ncolor0 = \"#ffffff\"\ncolor1 = \"#2a2a2a\"\ncolor2 = \"#3a3a3a\"\ncolor3 = \"#4a4a4a\"\ncolor4 = \"#1a1a1a\"\ncolor5 = \"#2e2e2e\"\ncolor6 = \"#3e3e3e\"\ncolor7 = \"#000000\"\n\n# Bright colors (ANSI 8-15)\ncolor8 = \"#c0c0c0\"\ncolor9 = \"#2a2a2a\"\ncolor10 = \"#3a3a3a\"\ncolor11 = \"#4a4a4a\"\ncolor12 = \"#1a1a1a\"\ncolor13 = \"#2e2e2e\"\ncolor14 = \"#3e3e3e\"\ncolor15 = \"#000000\"\n"
  },
  {
    "path": "themes/white/icons.theme",
    "content": "Yaru-blue\n"
  },
  {
    "path": "themes/white/light.mode",
    "content": "# This will set \"prefer-light\" and use \"Adwaita\" as the theme\n"
  },
  {
    "path": "themes/white/neovim.lua",
    "content": "return {\n  {\n    \"bjarneo/white.nvim\",\n    priority = 1000,\n  },\n  {\n    \"LazyVim/LazyVim\",\n    opts = {\n      colorscheme = \"white\",\n    },\n  },\n}\n"
  },
  {
    "path": "themes/white/vscode.json",
    "content": "{\n  \"name\": \"White\",\n  \"extension\": \"Bjarne.white-theme\"\n}\n"
  },
  {
    "path": "version",
    "content": "3.4.2\n"
  }
]