diff --git a/README.md b/README.md
index 236376e..150af3d 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
+
@@ -15,7 +15,7 @@
My current setup is built around these core components:
- **[Hyprland](https://hyprland.org/):** A highly customizable dynamic tiling Wayland compositor.
-- **[Waybar](https://github.com/Alexays/Waybar):** A customizable, modular status bar.
+- **Omarchy shell:** The Quickshell-based bar, notifications, and lock screen that ships with Omarchy 4, configured through `omarchy/shell.json`.
- **[AGS](https://github.com/Aylur/ags):** Aylur's Gtk Shell, used for creating custom, scriptable desktop widgets.
- **Dynamic Theming:** Seamlessly integrated with Pywal to extract color palettes from wallpapers and apply them instantly across the entire system (widgets, terminal, status bar).
- **[kitty](https://sw.kovidgoyal.net/kitty/):** The terminal, with its own checked-in color theme — see [`kitty/`](kitty/README.md).
@@ -23,12 +23,11 @@ My current setup is built around these core components:
### Directory Structure
- **`hypr/`**: Hyprland configurations (keybindings, window rules, animations, monitor layout, lid-close display handling, and autostart). See [`hypr/keybinds.md`](hypr/keybinds.md) for custom keybindings.
-- **`waybar/`**: Status bar layout, CSS styling, and custom interactive modules.
+- **`omarchy/`**: Omarchy 4 configuration — `shell.json` (bar layout and idle/lock timings), `extensions/` (entries added to the Omarchy menu), `hooks/` (event hooks such as retinting AGS on theme change), and `themed/` (extra theme templates).
- **`ags/`**: Custom desktop widgets built with TypeScript and GTK — media player, notification hub, quick settings, system monitor, wallpaper picker, and theme picker.
- **`scripts/`**: Global utility scripts seamlessly exposed as commands by the installer. See [`commands.md`](commands.md).
- **`wallpapers/`**: A collection of local custom wallpapers for dynamic theming. See [`wallpaper-gallery/`](wallpaper-gallery/index.md) for the full gallery (split alphabetically across multiple pages).
- **`themes/`**: Drop-in local color themes (one `colors.toml` per theme) that `install.sh` deploys into Omarchy's theme directory. See [`themes/README.md`](themes/README.md).
-- **`omarchy/hooks/`**: Event hooks for the Omarchy system (e.g. automatically applying dynamic themes when changing wallpapers).
- **`branding/`**: Custom ASCII art and system branding assets.
- **`kitty/`**: kitty terminal config and its color theme, applied by hand rather than by `install.sh`. See [`kitty/README.md`](kitty/README.md).
@@ -42,7 +41,7 @@ My current setup is built around these core components:
## Installation
-An automated installer script (`install.sh`) is provided to safely apply these configurations to your system. It targets Arch — `kitty/` is applied by hand, see [`kitty/README.md`](kitty/README.md).
+An automated installer script (`install.sh`) is provided to safely apply these configurations to your system. It targets Arch running Omarchy 4 — `kitty/` is applied by hand, see [`kitty/README.md`](kitty/README.md).
```bash
# Run the standard installer
diff --git a/ags/widget/Notifications.tsx b/ags/widget/Notifications.tsx
index d31fc8f..0c3df14 100644
--- a/ags/widget/Notifications.tsx
+++ b/ags/widget/Notifications.tsx
@@ -7,44 +7,62 @@ import { sh, shell } from "../lib/utils"
export const NOTIFICATION_WINDOW = "notification-center"
type Notification = {
- id: number
+ file: string
appName: string
summary: string
body: string
+ timestamp: number
}
+const NOTIFICATION_DIR = "$HOME/.local/state/omarchy/notifications"
+
+const listCommand =
+ `for file in "${NOTIFICATION_DIR}"/*.json "${NOTIFICATION_DIR}"/history/*.json; do ` +
+ "[ -f \"$file\" ] || continue; " +
+ "printf '%s\\t%s\\n' \"$file\" \"$(head -n 1 \"$file\")\"; " +
+ "done"
+
function parseNotifications(stdout: string): Notification[] {
- try {
- const parsed = JSON.parse(stdout)
- const group = parsed?.data?.[0] ?? []
- return group.map((item: any) => ({
- id: item.id?.value ?? 0,
- appName: item["app-name"]?.value ?? "",
- summary: item.summary?.value ?? "",
- body: item.body?.value ?? "",
- }))
- } catch {
- return []
- }
+ return stdout
+ .split("\n")
+ .filter((line) => line.includes("\t"))
+ .map((line) => {
+ const separator = line.indexOf("\t")
+ const file = line.slice(0, separator)
+ try {
+ const entry = JSON.parse(line.slice(separator + 1))
+ return {
+ file,
+ appName: String(entry.app ?? ""),
+ summary: String(entry.summary ?? ""),
+ body: String(entry.body ?? ""),
+ timestamp: Number(entry.timestamp ?? 0),
+ }
+ } catch {
+ return null
+ }
+ })
+ .filter((item): item is Notification => item !== null)
+ .sort((left, right) => right.timestamp - left.timestamp)
}
const notifications = createPoll(
[],
1000,
- shell("makoctl list -j 2>/dev/null || echo '{}'"),
+ shell(listCommand),
(stdout) => parseNotifications(stdout),
)
const doNotDisturb = createPoll(
false,
1000,
- shell("makoctl mode 2>/dev/null"),
- (stdout) => stdout.split("\n").includes("do-not-disturb"),
+ shell("omarchy-shell notifications dndState 2>/dev/null"),
+ (stdout) => stdout.trim() === "on",
)
-const dismiss = (id: number) => sh(`makoctl dismiss -n ${id}`)
-const clearAll = () => sh("makoctl dismiss -a")
-const toggleDoNotDisturb = () => sh("makoctl mode -t do-not-disturb")
+const dismiss = (file: string) => sh(`rm -f '${file.replace(/'/g, "'\\''")}'`)
+const clearAll = () => sh("omarchy-shell notifications dismissAll; omarchy-shell notifications clear")
+const toggleDoNotDisturb = () => sh("omarchy-shell notifications toggleDnd")
function NotificationItem({ item }: { item: Notification }) {
return (
@@ -60,7 +78,7 @@ function NotificationItem({ item }: { item: Notification }) {
@@ -126,7 +144,7 @@ export default function NotificationCenter() {
vscroll={Gtk.PolicyType.AUTOMATIC}
>
- item.id}>
+ item.file}>
{(item: Notification) => }
diff --git a/ags/widget/QuickSettings.tsx b/ags/widget/QuickSettings.tsx
index 8800843..97baea5 100644
--- a/ags/widget/QuickSettings.tsx
+++ b/ags/widget/QuickSettings.tsx
@@ -43,12 +43,12 @@ const [bluetoothOn] = pollBool(
)
const [doNotDisturb, setDoNotDisturb] = pollBool(
- "makoctl mode 2>/dev/null | grep -qx do-not-disturb && echo on || echo off",
+ "omarchy-shell notifications dndState 2>/dev/null",
2000,
)
const [nightLight, setNightLight] = pollBool(
- "pgrep -x hyprsunset >/dev/null && echo on || echo off",
+ "omarchy-toggle-nightlight --status 2>/dev/null | grep -q '\"enabled\":true' && echo on || echo off",
2000,
)
@@ -134,14 +134,14 @@ function Toggles() {
return (
- { closePanel(); sh("omarchy-launch-wifi") }} />
+ { closePanel(); sh("omarchy-shell shell toggle omarchy.network") }} />
{
closePanel()
- sh("omarchy-launch-bluetooth")
+ sh("omarchy-shell shell toggle omarchy.bluetooth")
}}
/>
{
setDoNotDisturb(!doNotDisturb.get())
- sh("makoctl mode -t do-not-disturb")
+ sh("omarchy-shell notifications toggleDnd")
}}
/>
(
const currentThemeName = createPoll(
"",
2000,
- shell("cat \"$HOME/.config/omarchy/current/theme.name\" 2>/dev/null"),
+ shell("cat \"$HOME/.local/state/omarchy/current/theme.name\" 2>/dev/null"),
(stdout) => stdout.trim(),
)
diff --git a/commands.md b/commands.md
index 418232e..256ea01 100644
--- a/commands.md
+++ b/commands.md
@@ -4,9 +4,9 @@ The installer automatically exposes scripts from [`scripts/`](scripts/) as globa
| Command | Description |
| --- | --- |
-| `blob_wallpaper [path]` | Sets your background using Omarchy's background system. If used with an image from `~/wallpapers/` or a valid path, it leverages Pywal to generate a full system color palette into the `blob-dynamic` theme and always updates the desktop background — but only switches your active color theme to it if you're already in dynamic mode (see `blob_theme --mode`), so it won't pull you out of a static theme. With no argument, it opens the AGS wallpaper picker. |
-| `blob_theme [name\|--dynamic\|--mode\|--print\|share-link-or-id]` | Manages color themes. With no argument, opens the AGS theme picker. `--dynamic` recolors from the current wallpaper without changing it; `--mode` prints `static` or `dynamic`; `--print` dumps the currently active theme's `colors.toml` to stdout, e.g. `blob_theme --print > themes/my-theme/colors.toml` to save a dynamically-generated palette you like. A `name` applies a local theme (see [`themes/`](themes/README.md)) or, if no local theme matches, falls back to pulling a shared palette from the wall-styles site by link or id (e.g. `blob_theme "https://wall-styles.vercel.app/?id=ab12cd34ef"`). |
-| `blob_glass [on\|off\|toggle]` | A quick toggle to enable or disable window transparency on the fly. |
+| `blob_wallpaper [path]` | Sets your background using Omarchy's background system. If used with an image from `~/wallpapers/` or a valid path, it leverages Pywal to generate a full system color palette into the `blob-dynamic` theme and always updates the desktop background — but only switches your active color theme to it if you're already in dynamic mode (see `blob_theme --mode`), so it won't pull you out of a static theme. With no argument, it opens the AGS wallpaper picker; `--menu` opens the same list in the Omarchy menu (also reachable from Blob > Wallpaper). |
+| `blob_theme [name\|--dynamic\|--mode\|--print\|share-link-or-id]` | Manages color themes. With no argument, opens the AGS theme picker; `--menu` opens the same list in the Omarchy menu (also reachable from Blob > Theme). `--dynamic` recolors from the current wallpaper without changing it; `--mode` prints `static` or `dynamic`; `--print` dumps the currently active theme's `colors.toml` to stdout, e.g. `blob_theme --print > themes/my-theme/colors.toml` to save a dynamically-generated palette you like. A `name` applies a local theme (see [`themes/`](themes/README.md)) or, if no local theme matches, falls back to pulling a shared palette from the wall-styles site by link or id (e.g. `blob_theme "https://wall-styles.vercel.app/?id=ab12cd34ef"`). |
+| `blob_glass [on\|off\|toggle]` | A quick toggle to enable or disable window transparency on the fly. It writes a Hyprland flag into `~/.local/state/omarchy/toggles/hypr/`, which Omarchy loads after `hypr/looknfeel.lua`, so no config file is rewritten. |
| `blob_boot [path]` | Safely updates your Plymouth boot splash image (defaults to `branding/boot_flash.png`) and rebuilds the `initramfs` (GRUB compatible via `mkinitcpio`). |
| `blob_wifi` | A streamlined script to connect to the GMU Eduroam Wi-Fi network using `iwd` and `systemd-resolved` (replaces NetworkManager). |
| `blob_key [NAME] [VALUE]` | Stores secrets/env values for widgets and services, e.g. `blob_key set SOME_TOKEN value`. |
diff --git a/elephant/menus/blob_background_selector.lua b/elephant/menus/blob_background_selector.lua
deleted file mode 100644
index f7b4f17..0000000
--- a/elephant/menus/blob_background_selector.lua
+++ /dev/null
@@ -1,57 +0,0 @@
-Name = "blobBackgroundSelector"
-NamePretty = "Blob's Background Selector"
-Cache = false
-HideFromProviderlist = true
-SearchName = true
-
-local function ShellEscape(s)
- return "'" .. s:gsub("'", "'\\''") .. "'"
-end
-
-function FormatName(filename)
- local name = filename:gsub("^%d+", ""):gsub("^%-", "")
- name = name:gsub("%.[^%.]+$", "")
- name = name:gsub("-", " ")
- name = name:gsub("%S+", function(word)
- return word:sub(1, 1):upper() .. word:sub(2):lower()
- end)
- return name
-end
-
-function GetEntries()
- local entries = {}
- local home = os.getenv("HOME")
-
- local dirs = {
- home .. "/wallpapers",
- }
-
- local seen = {}
-
- for _, wallpaper_dir in ipairs(dirs) do
- local handle = io.popen(
- "find " .. ShellEscape(wallpaper_dir)
- .. " -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"
- )
- if handle then
- for background in handle:lines() do
- local filename = background:match("([^/]+)$")
- if filename and not seen[filename] then
- seen[filename] = true
- table.insert(entries, {
- Text = FormatName(filename),
- Value = filename,
- Actions = {
- activate = "blob_wallpaper " .. ShellEscape(background),
- },
- Preview = background,
- PreviewType = "file",
- })
- end
- end
- handle:close()
- end
- end
-
- return entries
-end
\ No newline at end of file
diff --git a/elephant/menus/blob_theme_selector.lua b/elephant/menus/blob_theme_selector.lua
deleted file mode 100644
index 977e138..0000000
--- a/elephant/menus/blob_theme_selector.lua
+++ /dev/null
@@ -1,76 +0,0 @@
-Name = "blobThemeSelector"
-NamePretty = "Blob's Theme Selector"
-Cache = false
-HideFromProviderlist = true
-SearchName = true
-
-local function ShellEscape(s)
- return "'" .. s:gsub("'", "'\\''") .. "'"
-end
-
-function FormatName(slug)
- local name = slug:gsub("-", " ")
- name = name:gsub("%S+", function(word)
- return word:sub(1, 1):upper() .. word:sub(2):lower()
- end)
- return name
-end
-
-function GetEntries()
- local entries = {}
- local home = os.getenv("HOME")
- local omarchy_path = os.getenv("OMARCHY_PATH") or ""
-
- entries[1] = {
- Text = "Dynamic (from wallpaper)",
- Value = "dynamic",
- Actions = {
- activate = "blob_theme --dynamic",
- },
- }
-
- local dirs = {
- home .. "/.config/omarchy/themes",
- omarchy_path .. "/themes",
- }
-
- local seen = { ["blob-dynamic"] = true }
-
- for _, themes_dir in ipairs(dirs) do
- local handle = io.popen(
- "find " .. ShellEscape(themes_dir) .. " -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort"
- )
- if handle then
- for theme_dir in handle:lines() do
- local slug = theme_dir:match("([^/]+)$")
- if slug and not seen[slug] then
- local colors_file = io.open(theme_dir .. "/colors.toml", "r")
- if colors_file then
- colors_file:close()
- seen[slug] = true
-
- local entry = {
- Text = FormatName(slug),
- Value = slug,
- Actions = {
- activate = "blob_theme " .. ShellEscape(slug),
- },
- }
-
- local preview_file = io.open(theme_dir .. "/preview.png", "r")
- if preview_file then
- preview_file:close()
- entry.Preview = theme_dir .. "/preview.png"
- entry.PreviewType = "file"
- end
-
- table.insert(entries, entry)
- end
- end
- end
- handle:close()
- end
- end
-
- return entries
-end
diff --git a/hypr/autostart.conf b/hypr/autostart.conf
deleted file mode 100644
index 1741929..0000000
--- a/hypr/autostart.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-# Extra autostart processes
-# exec-once = uwsm-app -- my-service
-exec-once = ags run
diff --git a/hypr/autostart.lua b/hypr/autostart.lua
new file mode 100644
index 0000000..c2add57
--- /dev/null
+++ b/hypr/autostart.lua
@@ -0,0 +1,2 @@
+-- Extra autostart processes.
+o.launch_on_start("ags run")
diff --git a/hypr/bindings.conf b/hypr/bindings.conf
deleted file mode 100644
index fffa17c..0000000
--- a/hypr/bindings.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-# Application bindings
-bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)"
-bindd = SUPER ALT, RETURN, Tmux, exec, uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)" bash -c "tmux attach || tmux new -s Work"
-bindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser
-bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
-bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)"
-bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser
-bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private
-bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify
-bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor
-bindd = SUPER SHIFT, D, Docker, exec, omarchy-launch-tui lazydocker
-bindd = SUPER SHIFT, G, Signal, exec, omarchy-launch-or-focus ^signal$ "uwsm-app -- signal-desktop"
-bindd = SUPER SHIFT, O, Obsidian, exec, omarchy-launch-or-focus ^obsidian$ "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime"
-
-# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment
-bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"
-bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com"
-bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/"
-bindd = SUPER SHIFT ALT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"
-bindd = SUPER SHIFT CTRL, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations"
-bindd = SUPER SHIFT, P, Google Photos, exec, omarchy-launch-or-focus-webapp "Google Photos" "https://photos.google.com/"
-
-# Add extra bindings
-bindd = SUPER ALT, W, Wallpaper picker, exec, ags toggle wall-picker
-# bind = SUPER SHIFT, R, exec, alacritty -e ssh your-server
-
-# Overwrite existing bindings, like putting Omarchy Menu on Super + Space
-# unbind = SUPER, SPACE
-# bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu
diff --git a/hypr/bindings.lua b/hypr/bindings.lua
new file mode 100644
index 0000000..0efd264
--- /dev/null
+++ b/hypr/bindings.lua
@@ -0,0 +1,4 @@
+-- Personal keybinding overrides on top of Omarchy's defaults.
+-- See current bindings and descriptions: omarchy menu keybindings --print
+
+o.bind("SUPER + ALT + W", "Wallpaper picker", "ags toggle wall-picker")
diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf
deleted file mode 100644
index 25e6bc4..0000000
--- a/hypr/hypridle.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-general {
- lock_cmd = omarchy-system-lock # lock screen and 1password
- before_sleep_cmd = loginctl lock-session # lock before suspend.
- after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on # delay for PAM readiness, then turn on display.
- inhibit_sleep = 3 # wait until screen is locked
-}
-
-listener {
- timeout = 300 # 5min
- on-timeout = pidof hyprlock || omarchy-launch-screensaver # start screensaver (if we haven't locked already)
-}
-
-listener {
- timeout = 301 # 5min
- on-timeout = loginctl lock-session # lock screen when timeout has passed
-}
-
-listener {
- timeout = 480 # 8min
- on-timeout = brightnessctl -sd '*::kbd_backlight' set 0 # save state and turn off keyboard backlight
- on-resume = brightnessctl -rd '*::kbd_backlight' # restore keyboard backlight
-}
-
-listener {
- timeout = 480 # 8min
- on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
- on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected
-}
diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf
deleted file mode 100644
index a1840af..0000000
--- a/hypr/hyprland.conf
+++ /dev/null
@@ -1,28 +0,0 @@
-# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/
-
-# Use defaults Omarchy defaults (but don't edit these directly!)
-source = ~/.local/share/omarchy/default/hypr/autostart.conf
-source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
-source = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf
-source = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf
-source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf
-source = ~/.local/share/omarchy/default/hypr/envs.conf
-source = ~/.local/share/omarchy/default/hypr/looknfeel.conf
-source = ~/.local/share/omarchy/default/hypr/input.conf
-source = ~/.local/share/omarchy/default/hypr/windows.conf
-source = ~/.config/omarchy/current/theme/hyprland.conf
-
-# Change your own setup in these files (and overwrite any settings from defaults!)
-source = ~/.config/hypr/monitors.conf
-source = ~/.config/hypr/input.conf
-source = ~/.config/hypr/bindings.conf
-source = ~/.config/hypr/looknfeel.conf
-source = ~/.config/hypr/autostart.conf
-
-# Toggle config flags dynamically (e.g. the lid-close "disable internal display"
-# flag written by omarchy-hyprland-monitor-internal). Without this the lid
-# handler's disable never applies and the laptop workspace stays stranded.
-source = ~/.local/state/omarchy/toggles/hypr/*.conf
-
-# Add any other personal Hyprland configuration below
-# windowrule = workspace 5, match:class qemu
diff --git a/hypr/hyprland.lua b/hypr/hyprland.lua
new file mode 100644
index 0000000..72e178f
--- /dev/null
+++ b/hypr/hyprland.lua
@@ -0,0 +1,13 @@
+-- Learn how to configure Hyprland: https://wiki.hypr.land/Configuring/Start/
+
+dofile((os.getenv("OMARCHY_PATH") or "/usr/share/omarchy") .. "/default/hypr/bootstrap.lua")
+
+require("default.hypr.omarchy")
+
+require("hypr.monitors")
+require("hypr.input")
+require("hypr.bindings")
+require("hypr.looknfeel")
+require("hypr.autostart")
+
+require("default.hypr.toggles")
diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf
deleted file mode 100644
index 1a9ee57..0000000
--- a/hypr/hyprlock.conf
+++ /dev/null
@@ -1,55 +0,0 @@
-source = ~/.config/omarchy/current/theme/hyprlock.conf
-
-general {
- ignore_empty_input = true
-}
-
-background {
- monitor =
- color = $color
- path = ~/.config/omarchy/current/background
- blur_passes = 3
-}
-
-animations {
- enabled = false
-}
-
-input-field {
- monitor =
- size = 650, 100
- position = 0, 0
- halign = center
- valign = center
-
- inner_color = $inner_color
- outer_color = $outer_color
- outline_thickness = 4
-
- font_family = JetBrainsMono Nerd Font
- font_color = $font_color
-
- placeholder_text = Enter Password
- check_color = $check_color
- fail_text = $FAIL ($ATTEMPTS)
-
- rounding = 0
- shadow_passes = 0
- fade_on_empty = false
-}
-
-auth {
- fingerprint:enabled = false
-}
-
-label {
- monitor =
- text = cmd[update:0] cat ~/.config/omarchy/branding/screensaver.txt
- color = $font_color
- font_size = 12
- font_family = JetBrainsMono Nerd Font
- text_align = left
- position = 0, 200
- halign = center
- valign = center
-}
diff --git a/hypr/hyprsunset.conf b/hypr/hyprsunset.conf
index c4d0f8d..a3ba208 100644
--- a/hypr/hyprsunset.conf
+++ b/hypr/hyprsunset.conf
@@ -5,8 +5,8 @@ profile {
identity = true
}
-# To enable auto switch to nightlight, set in your .config/hypr/autostart:
-# exec-once = uwsm app -- hyprsunset
+# To enable auto switch to nightlight, add to your .config/hypr/autostart.lua:
+# o.launch_on_start("hyprsunset")
# and use the following:
# profile {
# time = 20:00
diff --git a/hypr/input.conf b/hypr/input.conf
deleted file mode 100644
index c2b8dfc..0000000
--- a/hypr/input.conf
+++ /dev/null
@@ -1,54 +0,0 @@
-# Control your input devices
-# See https://wiki.hypr.land/Configuring/Variables/#input
-input {
- # Use multiple keyboard layouts and switch between them with Left Alt + Right Alt
- # kb_layout = us,dk,eu
-
- # Use a specific keyboard variant if needed (e.g. intl for international keyboards)
- # kb_variant = intl
-
- kb_layout = us
- kb_options = compose:caps # ,grp:alts_toggle
-
- # Change speed of keyboard repeat
- repeat_rate = 40
- repeat_delay = 600
-
- # Start with numlock on by default
- numlock_by_default = true
-
- # Increase sensitivity for mouse/trackpad (default: 0)
- # sensitivity = 0.35
-
- # Turn off mouse acceleration (default: false)
- # force_no_accel = true
-
- touchpad {
- # Use natural (inverse) scrolling
- # natural_scroll = true
-
- # Use two-finger clicks for right-click instead of lower-right corner
- # clickfinger_behavior = true
-
- # Control the speed of your scrolling
- scroll_factor = 0.4
-
- # Enable the touchpad while typing
- # disable_while_typing = false
-
- # Left-click-and-drag with three fingers
- # drag_3fg = 1
- }
-}
-
-# Scroll nicely in the terminal
-windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5
-windowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2
-
-# Enable touchpad gestures for changing workspaces
-# See https://wiki.hyprland.org/Configuring/Gestures/
-# gesture = 3, horizontal, workspace
-
-# Enable touchpad gestures for moving focus (helpful on scrolling layout)
-# gesture = 3, left, dispatcher, movefocus, l
-# gesture = 3, right, dispatcher, movefocus, r
diff --git a/hypr/input.lua b/hypr/input.lua
new file mode 100644
index 0000000..1e4ffab
--- /dev/null
+++ b/hypr/input.lua
@@ -0,0 +1,20 @@
+-- See https://wiki.hypr.land/Configuring/Basics/Variables/#input
+hl.config({
+ input = {
+ kb_layout = "us",
+ kb_options = "compose:caps",
+
+ repeat_rate = 40,
+ repeat_delay = 600,
+
+ numlock_by_default = true,
+
+ touchpad = {
+ scroll_factor = 0.4,
+ },
+ },
+})
+
+-- Scroll nicely in the terminal.
+o.window("(Alacritty|kitty)", { scroll_touchpad = 1.5 })
+o.window("com.mitchellh.ghostty", { scroll_touchpad = 0.2 })
diff --git a/hypr/keybinds.md b/hypr/keybinds.md
index a0d9479..41c35d6 100644
--- a/hypr/keybinds.md
+++ b/hypr/keybinds.md
@@ -1,8 +1,20 @@
-# Custom Keybinds
+# Keybinds
-Custom bindings on top of Omarchy's defaults, defined in `bindings.conf`.
+Hyprland is configured in Lua on Omarchy 4. Personal bindings live in
+[`bindings.lua`](bindings.lua); everything else below comes from Omarchy's
+own defaults and is no longer redefined here.
-## Apps
+Print the live list at any time with `omarchy menu keybindings --print`.
+
+## Custom
+
+| Keybind | Action |
+| --- | --- |
+| `Super+Alt+W` | Wallpaper picker (AGS widget) |
+
+## Omarchy defaults worth remembering
+
+### Apps
| Keybind | Action |
| --- | --- |
@@ -19,7 +31,7 @@ Custom bindings on top of Omarchy's defaults, defined in `bindings.conf`.
| `Super+Shift+G` | Signal |
| `Super+Shift+O` | Obsidian |
-## Web Apps
+### Web Apps
| Keybind | Action |
| --- | --- |
@@ -30,8 +42,15 @@ Custom bindings on top of Omarchy's defaults, defined in `bindings.conf`.
| `Super+Shift+Ctrl+G` | Google Messages |
| `Super+Shift+P` | Google Photos |
-## Extras
+### Shell and system
| Keybind | Action |
| --- | --- |
-| `Super+Alt+W` | Wallpaper picker |
+| `Super+Space` | Omarchy menu |
+| `Super+Ctrl+Space` | Background switcher |
+| `Super+Shift+Ctrl+Space` | Theme menu |
+| `Super+Shift+Space` | Toggle the top bar |
+| `Super+Backspace` | Toggle transparency on the focused window |
+| `Super+Ctrl+L` | Lock |
+| `Super+Ctrl+I` | Toggle locking on idle |
+| `Super+Ctrl+N` | Toggle nightlight |
diff --git a/hypr/looknfeel.conf b/hypr/looknfeel.conf
deleted file mode 100644
index d0ca8aa..0000000
--- a/hypr/looknfeel.conf
+++ /dev/null
@@ -1,37 +0,0 @@
-# Change the default Omarchy look'n'feel
-
-# https://wiki.hyprland.org/Configuring/Variables/#general
-general {
- # No gaps between windows or borders
- gaps_in = 4
- gaps_out = 4
- # border_size = 0
-
- # Change to niri-like side-scrolling layout
- # layout = scrolling
-}
-
-# https://wiki.hyprland.org/Configuring/Variables/#decoration
-decoration {
- # Use round window corners
- # rounding = 8
-
- # Dim unfocused windows (0.0 = no dim, 1.0 = fully dimmed)
- # dim_inactive = true
- # dim_strength = 0.15
-}
-
-# https://wiki.hyprland.org/Configuring/Variables/#animations
-animations {
- # Disable all animations
- # enabled = no
-}
-
-# https://wiki.hypr.land/Configuring/Variables/#layout
-layout {
- # Avoid overly wide single-window layouts on wide screens
- # single_window_aspect_ratio = 1 1
-}
-
-# Remove default window transparency
-windowrule = opacity 1.0 override 1.0 override, match:tag default-opacity
diff --git a/hypr/looknfeel.lua b/hypr/looknfeel.lua
new file mode 100644
index 0000000..d677fef
--- /dev/null
+++ b/hypr/looknfeel.lua
@@ -0,0 +1,12 @@
+-- https://wiki.hypr.land/Configuring/Basics/Variables/#general
+hl.config({
+ general = {
+ gaps_in = 4,
+ gaps_out = 4,
+ },
+})
+
+-- Remove default window transparency. Turn it back on with `blob_glass on`,
+-- which drops a flag into ~/.local/state/omarchy/toggles/hypr/ that is loaded
+-- after this file.
+o.window({ tag = "default-opacity" }, { opacity = "1.0 override 1.0 override" })
diff --git a/hypr/monitors.conf b/hypr/monitors.conf
deleted file mode 100644
index c01f8c5..0000000
--- a/hypr/monitors.conf
+++ /dev/null
@@ -1,27 +0,0 @@
-# See https://wiki.hyprland.org/Configuring/Monitors/
-# List current monitors and resolutions possible: hyprctl monitors
-# Format: monitor = [port], resolution, position, scale
-
-# --- Dual external monitor setup (laptop lid closed) ---
-# Layout, left -> right: [ 1: C24 / DP-1 ] [ 2: F24 / HDMI-A-1 ]
-# eDP-1 sits to the right of the externals and Hyprland automatically
-# disables it when the lid is closed (since an external is connected).
-
-# Monitor 1 - C24 curved, DisplayPort via DP->HDMI adapter.
-# NOTE: the DP2HDMI adapter caps this panel at 1920x1080@60 (no 75Hz mode).
-monitor = DP-1, 1920x1080@60, 0x0, 1
-
-# Monitor 2 - Sceptre F24, HDMI, native 75Hz.
-monitor = HDMI-A-1, 1920x1080@75, 1920x0, 1
-
-# Laptop panel - only mode is 1920x1200@60. Parked right of the externals;
-# auto-off on lid close so no windows get stranded on a closed screen.
-monitor = eDP-1, 1920x1200@60, 3840x0, 1.5
-
-# Catch-all fallback for any other/unknown display.
-monitor = , preferred, auto, 1
-
-# GDK_SCALE forced integer scaling is intentionally disabled: the external
-# monitors run at 1x, so a global 2x would blow up GTK apps on them. The
-# per-monitor scale factors above are enough.
-# env = GDK_SCALE,2
diff --git a/hypr/monitors.lua b/hypr/monitors.lua
new file mode 100644
index 0000000..083ba86
--- /dev/null
+++ b/hypr/monitors.lua
@@ -0,0 +1,26 @@
+-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
+-- List current monitors and supported resolutions with: hyprctl monitors all
+
+-- Dual external monitor setup (laptop lid closed).
+-- Layout, left -> right: [ 1: C24 / DP-1 ] [ 2: F24 / HDMI-A-1 ] [ eDP-1 ]
+-- eDP-1 sits to the right of the externals and Hyprland automatically
+-- disables it when the lid is closed (since an external is connected).
+
+-- Monitor 1 - C24 curved, DisplayPort via DP->HDMI adapter.
+-- NOTE: the DP2HDMI adapter caps this panel at 1920x1080@60 (no 75Hz mode).
+hl.monitor({ output = "DP-1", mode = "1920x1080@60", position = "0x0", scale = 1 })
+
+-- Monitor 2 - Sceptre F24, HDMI, native 75Hz.
+hl.monitor({ output = "HDMI-A-1", mode = "1920x1080@75", position = "1920x0", scale = 1 })
+
+-- Laptop panel - only mode is 1920x1200@60. Parked right of the externals;
+-- auto-off on lid close so no windows get stranded on a closed screen.
+hl.monitor({ output = "eDP-1", mode = "1920x1200@60", position = "3840x0", scale = 1.5 })
+
+-- Catch-all fallback for any other/unknown display.
+hl.monitor({ output = "", mode = "preferred", position = "auto", scale = 1 })
+
+-- GDK_SCALE forced integer scaling is intentionally left unset: the external
+-- monitors run at 1x, so a global 2x would blow up GTK apps on them. The
+-- per-monitor scale factors above are enough.
+-- hl.env("GDK_SCALE", "2")
diff --git a/install.sh b/install.sh
index 317721d..1b3a9eb 100755
--- a/install.sh
+++ b/install.sh
@@ -129,6 +129,34 @@ replace_and_copy() {
fi
}
+backup_and_copy_file() {
+ local src="$1"
+ local dest="$2"
+ local name="$3"
+
+ if [ ! -e "$dest" ]; then
+ echo "[COPY] $name: New file (creating)"
+ mkdir -p "$(dirname "$dest")"
+ cp "$src" "$dest"
+ return
+ fi
+
+ if [ "$(compute_hash "$src")" = "$(compute_hash "$dest")" ]; then
+ echo "[SKIP] $name: Up to date"
+ return
+ fi
+
+ if [ "$FORCE" = true ]; then
+ echo "[BACKUP] $name: Backing up..."
+ cp "$dest" "$dest.bak"
+
+ echo "[COPY] $name: Overwriting (--force)"
+ cp "$src" "$dest"
+ else
+ echo "[SKIP] $name: Has local changes (use --force to overwrite)"
+ fi
+}
+
install_dependencies() {
echo "=== Checking Dependencies ==="
local deps_needed=()
@@ -141,6 +169,9 @@ install_dependencies() {
if ! command -v awww &> /dev/null; then
deps_needed+=("awww")
fi
+ if ! command -v playerctl &> /dev/null; then
+ deps_needed+=("playerctl")
+ fi
if [ ${#deps_needed[@]} -gt 0 ]; then
echo "Installing missing dependencies: ${deps_needed[*]}"
@@ -162,13 +193,16 @@ echo ""
check_status=0
-check_file "$SCRIPT_DIR/waybar/config.jsonc" "$HOME_DIR/.config/waybar/config.jsonc" "waybar/config.jsonc" || check_status=1
-check_file "$SCRIPT_DIR/hypr/hyprland.conf" "$HOME_DIR/.config/hypr/hyprland.conf" "hypr/hyprland.conf" || check_status=1
-check_file "$SCRIPT_DIR/hypr/monitors.conf" "$HOME_DIR/.config/hypr/monitors.conf" "hypr/monitors.conf" || check_status=1
-check_file "$SCRIPT_DIR/hypr/autostart.conf" "$HOME_DIR/.config/hypr/autostart.conf" "hypr/autostart.conf" || check_status=1
-check_file "$SCRIPT_DIR/hypr/looknfeel.conf" "$HOME_DIR/.config/hypr/looknfeel.conf" "hypr/looknfeel.conf" || check_status=1
-check_file "$SCRIPT_DIR/hypr/bindings.conf" "$HOME_DIR/.config/hypr/bindings.conf" "hypr/bindings.conf" || check_status=1
-check_file "$SCRIPT_DIR/hypr/hypridle.conf" "$HOME_DIR/.config/hypr/hypridle.conf" "hypr/hypridle.conf" || check_status=1
+check_file "$SCRIPT_DIR/hypr/hyprland.lua" "$HOME_DIR/.config/hypr/hyprland.lua" "hypr/hyprland.lua" || check_status=1
+check_file "$SCRIPT_DIR/hypr/monitors.lua" "$HOME_DIR/.config/hypr/monitors.lua" "hypr/monitors.lua" || check_status=1
+check_file "$SCRIPT_DIR/hypr/input.lua" "$HOME_DIR/.config/hypr/input.lua" "hypr/input.lua" || check_status=1
+check_file "$SCRIPT_DIR/hypr/autostart.lua" "$HOME_DIR/.config/hypr/autostart.lua" "hypr/autostart.lua" || check_status=1
+check_file "$SCRIPT_DIR/hypr/looknfeel.lua" "$HOME_DIR/.config/hypr/looknfeel.lua" "hypr/looknfeel.lua" || check_status=1
+check_file "$SCRIPT_DIR/hypr/bindings.lua" "$HOME_DIR/.config/hypr/bindings.lua" "hypr/bindings.lua" || check_status=1
+check_file "$SCRIPT_DIR/hypr/hyprsunset.conf" "$HOME_DIR/.config/hypr/hyprsunset.conf" "hypr/hyprsunset.conf" || check_status=1
+check_file "$SCRIPT_DIR/hypr/xdph.conf" "$HOME_DIR/.config/hypr/xdph.conf" "hypr/xdph.conf" || check_status=1
+check_file "$SCRIPT_DIR/omarchy/shell.json" "$HOME_DIR/.config/omarchy/shell.json" "omarchy/shell.json" || check_status=1
+check_file "$SCRIPT_DIR/omarchy/extensions/omarchy-menu.jsonc" "$HOME_DIR/.config/omarchy/extensions/omarchy-menu.jsonc" "omarchy/extensions/omarchy-menu.jsonc" || check_status=1
check_file "$SCRIPT_DIR/omarchy/hooks/theme-set" "$HOME_DIR/.config/omarchy/hooks/theme-set" "omarchy/hooks/theme-set" || check_status=1
check_file "$SCRIPT_DIR/omarchy/themed/zen.css.tpl" "$HOME_DIR/.config/omarchy/themed/zen.css.tpl" "omarchy/themed/zen.css.tpl" || check_status=1
check_file "$SCRIPT_DIR/ags/app.ts" "$HOME_DIR/.config/ags/app.ts" "ags/app.ts" || check_status=1
@@ -184,9 +218,6 @@ check_file "$SCRIPT_DIR/ags/widget/SysMonitor.tsx" "$HOME_DIR/.config/ags/widget
check_file "$SCRIPT_DIR/ags/widget/ThemePicker.tsx" "$HOME_DIR/.config/ags/widget/ThemePicker.tsx" "ags/widget/ThemePicker.tsx" || check_status=1
check_file "$SCRIPT_DIR/ags/widget/WallPicker.tsx" "$HOME_DIR/.config/ags/widget/WallPicker.tsx" "ags/widget/WallPicker.tsx" || check_status=1
check_file "$SCRIPT_DIR/ags/widget/WidgetCard.tsx" "$HOME_DIR/.config/ags/widget/WidgetCard.tsx" "ags/widget/WidgetCard.tsx" || check_status=1
-check_file "$SCRIPT_DIR/waybar/style.css" "$HOME_DIR/.config/waybar/style.css" "waybar/style.css" || check_status=1
-check_file "$SCRIPT_DIR/elephant/menus/blob_background_selector.lua" "$HOME_DIR/.config/elephant/menus/blob_background_selector.lua" "elephant/menus/blob_background_selector.lua" || check_status=1
-check_file "$SCRIPT_DIR/elephant/menus/blob_theme_selector.lua" "$HOME_DIR/.config/elephant/menus/blob_theme_selector.lua" "elephant/menus/blob_theme_selector.lua" || check_status=1
check_file "$SCRIPT_DIR/branding/about.txt" "$HOME_DIR/.config/omarchy/branding/about.txt" "branding/about.txt" || check_status=1
check_file "$SCRIPT_DIR/branding/screensaver.txt" "$HOME_DIR/.config/omarchy/branding/screensaver.txt" "branding/screensaver.txt" || check_status=1
@@ -230,13 +261,13 @@ fi
echo "=== Applying changes ==="
echo ""
-backup_and_copy "$SCRIPT_DIR/waybar" "$HOME_DIR/.config/waybar" "Waybar config"
backup_and_copy "$SCRIPT_DIR/ags" "$HOME_DIR/.config/ags" "AGS config"
backup_and_copy "$SCRIPT_DIR/hypr" "$HOME_DIR/.config/hypr" "Hyprland config"
backup_and_copy "$SCRIPT_DIR/branding" "$HOME_DIR/.config/omarchy/branding" "Branding files"
-backup_and_copy "$SCRIPT_DIR/elephant" "$HOME_DIR/.config/elephant" "Elephant configs"
backup_and_copy "$SCRIPT_DIR/omarchy/hooks" "$HOME_DIR/.config/omarchy/hooks" "Omarchy hooks"
backup_and_copy "$SCRIPT_DIR/omarchy/themed" "$HOME_DIR/.config/omarchy/themed" "Omarchy custom templates"
+backup_and_copy "$SCRIPT_DIR/omarchy/extensions" "$HOME_DIR/.config/omarchy/extensions" "Omarchy menu extensions"
+backup_and_copy_file "$SCRIPT_DIR/omarchy/shell.json" "$HOME_DIR/.config/omarchy/shell.json" "Omarchy shell config"
replace_and_copy "$SCRIPT_DIR/wallpapers" "$HOME_DIR/wallpapers" "Custom wallpapers"
if [ -d "$SCRIPT_DIR/themes" ]; then
@@ -302,8 +333,8 @@ add_system_path() {
add_system_path
# Keep the laptop awake with the lid closed while docked / on AC, so the two
-# external monitors stay usable. Paired with the lid-switch binds in
-# hypr/bindings.conf, which disable eDP-1 on close so no workspace is stranded.
+# external monitors stay usable. Omarchy's own lid-switch binds disable eDP-1
+# on close so no workspace is stranded.
configure_lid_switch() {
local dropin="/etc/systemd/logind.conf.d/10-lid.conf"
local content="[Login]
@@ -350,11 +381,11 @@ add_path_to_shell "$HOME_DIR/.zshrc"
chmod +x "$HOME_DIR/scripts/"*.sh 2>/dev/null || true
echo ""
-echo "=== Restarting Waybar ==="
-if command -v omarchy-restart-waybar &> /dev/null; then
- omarchy-restart-waybar
+echo "=== Restarting the Omarchy shell ==="
+if command -v omarchy-restart-shell &> /dev/null; then
+ omarchy-restart-shell
else
- echo "Warning: omarchy-restart-waybar not found. Please restart waybar manually."
+ echo "Warning: omarchy-restart-shell not found. Please restart the shell manually."
fi
echo ""
@@ -374,18 +405,9 @@ else
echo "Warning: hyprctl not found. Please reload Hyprland manually."
fi
-echo ""
-echo "=== Restarting hypridle ==="
-if command -v hypridle &> /dev/null; then
- pkill -x hypridle 2>/dev/null || true
- nohup hypridle >/dev/null 2>&1 &
-else
- echo "Warning: hypridle not found. Please restart hypridle manually."
-fi
-
echo ""
echo "=== Reapplying current theme (to pick up new templates) ==="
-current_theme_name=$(cat "$HOME_DIR/.config/omarchy/current/theme.name" 2>/dev/null)
+current_theme_name=$(cat "$HOME_DIR/.local/state/omarchy/current/theme.name" 2>/dev/null)
if [ -n "$current_theme_name" ] && command -v omarchy-theme-set &> /dev/null; then
OMARCHY_THEME_SKIP_BACKGROUND=1 omarchy-theme-set "$current_theme_name" || true
else
diff --git a/omarchy/extensions/omarchy-menu.jsonc b/omarchy/extensions/omarchy-menu.jsonc
new file mode 100644
index 0000000..07013cb
--- /dev/null
+++ b/omarchy/extensions/omarchy-menu.jsonc
@@ -0,0 +1,10 @@
+{
+ // Blob entries added to the Quickshell Omarchy menu (Super + Space).
+ // These replace the walker/elephant menus used before Omarchy 4.
+
+ "blob": { "icon": "", "label": "Blob" },
+ "blob.wallpaper": { "icon": "", "label": "Wallpaper", "action": "blob_wallpaper --menu", "description": "Pick a wallpaper from ~/wallpapers" },
+ "blob.theme": { "icon": "", "label": "Theme", "action": "blob_theme --menu", "description": "Pick a local or Omarchy color theme" },
+ "blob.dynamic": { "icon": "", "label": "Dynamic theme", "action": "blob_theme --dynamic", "description": "Recolor from the current wallpaper" },
+ "blob.glass": { "icon": "", "label": "Toggle glass", "action": "blob_glass toggle", "checked": "test -f $HOME/.local/state/omarchy/toggles/hypr/blob-glass.lua" }
+}
diff --git a/omarchy/hooks/theme-set b/omarchy/hooks/theme-set
index 5f2ebb8..dfd9912 100755
--- a/omarchy/hooks/theme-set
+++ b/omarchy/hooks/theme-set
@@ -3,10 +3,10 @@ THEME_NAME=$1
echo "Theme changed to: $THEME_NAME"
# Generate AGS colors from Omarchy theme colors.toml
-awk -F '=' 'NF==2 { gsub(/"/,"",$2); gsub(/ /,"",$1); gsub(/ /,"",$2); print "@define-color " $1 " " $2 ";" }' ~/.config/omarchy/current/theme/colors.toml > ~/.config/ags/colors.css
+awk -F '=' 'NF==2 { gsub(/"/,"",$2); gsub(/ /,"",$1); gsub(/ /,"",$2); print "@define-color " $1 " " $2 ";" }' ~/.local/state/omarchy/current/theme/colors.toml > ~/.config/ags/colors.css
# Restart AGS to apply new theme colors
if command -v ags &> /dev/null; then
ags quit || true
nohup ags run -d "$HOME/.config/ags" >/dev/null 2>&1 &
-fi
\ No newline at end of file
+fi
diff --git a/omarchy/shell.json b/omarchy/shell.json
new file mode 100644
index 0000000..74ead5d
--- /dev/null
+++ b/omarchy/shell.json
@@ -0,0 +1,66 @@
+{
+ "version": 1,
+ "idle": {
+ "screensaver": 300,
+ "lock": 301
+ },
+ "bar": {
+ "position": "top",
+ "transparent": false,
+ "centerAnchor": "omarchy.clock",
+ "layout": {
+ "left": [
+ {
+ "id": "omarchy.menu"
+ },
+ {
+ "id": "omarchy.workspaces"
+ }
+ ],
+ "center": [
+ {
+ "id": "omarchy.indicators"
+ },
+ {
+ "id": "omarchy.clock",
+ "format": "dddd HH:mm",
+ "formatAlt": "d MMMM 'W'ww yyyy",
+ "verticalFormat": "HH\n\u2014\nmm"
+ },
+ {
+ "id": "omarchy.keyboard-layout"
+ },
+ {
+ "id": "omarchy.weather"
+ },
+ {
+ "id": "omarchy.system-update"
+ }
+ ],
+ "right": [
+ {
+ "id": "omarchy.tray"
+ },
+ {
+ "id": "omarchy.agents"
+ },
+ {
+ "id": "omarchy.bluetooth"
+ },
+ {
+ "id": "omarchy.network"
+ },
+ {
+ "id": "omarchy.audio"
+ },
+ {
+ "id": "omarchy.monitor"
+ },
+ {
+ "id": "omarchy.power"
+ }
+ ]
+ }
+ },
+ "plugins": []
+}
diff --git a/revert.sh b/revert.sh
index 8b48949..2ba88c6 100755
--- a/revert.sh
+++ b/revert.sh
@@ -52,15 +52,29 @@ revert_dir() {
fi
}
+revert_file() {
+ local dest="$1"
+ local name="$2"
+ local bak_file="${dest}.bak"
+
+ if [ -f "$bak_file" ]; then
+ echo "[REVERT] Restoring $name from $bak_file..."
+ cp "$bak_file" "$dest"
+ echo "✓ Restored $name"
+ else
+ echo "[SKIP] No backup found for $name at $bak_file"
+ fi
+}
+
echo "=== Reverting changes ==="
echo ""
-revert_dir "$HOME_DIR/.config/waybar" "Waybar config"
revert_dir "$HOME_DIR/.config/ags" "AGS config"
revert_dir "$HOME_DIR/.config/hypr" "Hyprland config"
revert_dir "$HOME_DIR/.config/omarchy/branding" "Branding files"
-revert_dir "$HOME_DIR/.config/elephant" "Elephant configs"
revert_dir "$HOME_DIR/.config/omarchy/hooks" "Omarchy hooks"
+revert_dir "$HOME_DIR/.config/omarchy/extensions" "Omarchy menu extensions"
+revert_file "$HOME_DIR/.config/omarchy/shell.json" "Omarchy shell config"
revert_dir "$HOME_DIR/wallpapers" "Custom wallpapers"
revert_dir "$HOME_DIR/scripts" "Custom scripts"
@@ -88,11 +102,11 @@ remove_lid_switch() {
remove_lid_switch
echo ""
-echo "=== Restarting Waybar ==="
-if command -v omarchy-restart-waybar &> /dev/null; then
- omarchy-restart-waybar
+echo "=== Restarting the Omarchy shell ==="
+if command -v omarchy-restart-shell &> /dev/null; then
+ omarchy-restart-shell
else
- echo "Warning: omarchy-restart-waybar not found. Please restart waybar manually."
+ echo "Warning: omarchy-restart-shell not found. Please restart the shell manually."
fi
echo ""
@@ -112,14 +126,5 @@ else
echo "Warning: hyprctl not found. Please reload Hyprland manually."
fi
-echo ""
-echo "=== Restarting hypridle ==="
-if command -v hypridle &> /dev/null; then
- pkill -x hypridle 2>/dev/null || true
- nohup hypridle >/dev/null 2>&1 &
-else
- echo "Warning: hypridle not found. Please restart hypridle manually."
-fi
-
echo ""
echo "=== Revert Complete ==="
diff --git a/scripts/blob_glass.sh b/scripts/blob_glass.sh
index 9c159a0..5b0b723 100755
--- a/scripts/blob_glass.sh
+++ b/scripts/blob_glass.sh
@@ -1,13 +1,10 @@
#!/bin/bash
-# Configuration files to modify
-ACTIVE_CONF="$HOME/.config/hypr/looknfeel.conf"
-REPO_CONF="$HOME/Documents/dotfiles/hypr/looknfeel.conf"
+# Window transparency toggle. Omarchy's toggles directory is loaded after
+# ~/.config/hypr/looknfeel.lua, so dropping a flag file here re-enables the
+# default translucency that looknfeel.lua overrides away.
-# The rule to enforce solid opacity
-OVERRIDE_RULE="windowrule = opacity 1.0 override 1.0 override, match:tag default-opacity"
-# A marker comment
-MARKER="# Remove default window transparency"
+FLAG_FILE="$HOME/.local/state/omarchy/toggles/hypr/blob-glass.lua"
ACTION=$1
@@ -16,19 +13,16 @@ if [ -z "$ACTION" ]; then
fi
enable_glass() {
- # Remove the rules
- sed -i "/$MARKER/d" "$ACTIVE_CONF" "$REPO_CONF" 2>/dev/null
- sed -i "/opacity 1.0 override/d" "$ACTIVE_CONF" "$REPO_CONF" 2>/dev/null
+ mkdir -p "$(dirname "$FLAG_FILE")"
+ cat > "$FLAG_FILE" <<'LUA'
+o.window({ tag = "default-opacity" }, { opacity = "0.985 0.96" })
+LUA
echo "Transparency enabled (glass on)."
hyprctl reload >/dev/null
}
disable_glass() {
- # Add the rules if they don't exist
- if ! grep -q "opacity 1.0 override" "$ACTIVE_CONF"; then
- echo -e "\n$MARKER\n$OVERRIDE_RULE" >> "$ACTIVE_CONF"
- echo -e "\n$MARKER\n$OVERRIDE_RULE" >> "$REPO_CONF"
- fi
+ rm -f "$FLAG_FILE"
echo "Transparency disabled (glass off)."
hyprctl reload >/dev/null
}
@@ -38,12 +32,12 @@ if [ "$ACTION" == "on" ]; then
elif [ "$ACTION" == "off" ]; then
disable_glass
elif [ "$ACTION" == "toggle" ]; then
- if grep -q "opacity 1.0 override" "$ACTIVE_CONF"; then
- enable_glass
- else
+ if [ -f "$FLAG_FILE" ]; then
disable_glass
+ else
+ enable_glass
fi
else
echo "Usage: blob_glass [on|off|toggle]"
exit 1
-fi
\ No newline at end of file
+fi
diff --git a/scripts/blob_theme.sh b/scripts/blob_theme.sh
old mode 100644
new mode 100755
index 50e1fe1..170c981
--- a/scripts/blob_theme.sh
+++ b/scripts/blob_theme.sh
@@ -6,7 +6,7 @@
THEME_DIR="$HOME/.config/omarchy/themes/blob-dynamic"
USER_THEMES_DIR="$HOME/.config/omarchy/themes"
-CURRENT_DIR="$HOME/.config/omarchy/current"
+CURRENT_DIR="$HOME/.local/state/omarchy/current"
# Used only when a bare id is passed instead of a full share link.
# Override with: export BLOB_THEME_URL="https://your-deployment.vercel.app"
@@ -16,6 +16,10 @@ slugify() {
echo "$1" | tr '[:upper:]' '[:lower:]' | tr ' ' '-'
}
+prettify() {
+ echo "$1" | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g'
+}
+
current_mode() {
local name
name=$(cat "$CURRENT_DIR/theme.name" 2>/dev/null)
@@ -32,6 +36,30 @@ theme_exists_locally() {
[ -d "$USER_THEMES_DIR/$slug" ] || [ -d "$OMARCHY_PATH/themes/$slug" ]
}
+# Rows for omarchy-menu-select, as "