Personal Hyprland Configuration with Waybar

Welcome

My personal configuration of Hyprland, written as an Org Mode document.

Run the block below with C-c C-c to tangle code blocks to config file.

(org-mode-restart)
(org-babel-tangle)

Hyprland

Monitors

monitor = name, resolution, position, scale
monitor = , preferred, auto, 1

Variables

$terminal = foot
$fileManager = thunar
$menu = rofi -show combi -run-command "uwsm app -- {cmd}"
$colorPicker = hyprpicker -a
$toggleBar = $HOME/.config/hypr/waybar/scripts/toggleBarService.sh

Autostart

Autostart necessary processes (like notifications daemons, status bars, etc.) Or execute your favorite apps at launch like this:

exec-once = $terminal
exec-once = nm-applet &
exec-once = waybar & hyprpaper & firefox

If using uwsm, prefix application startup commands with uwsm app --:

exec-once = uwsm app -- mycommand --arg1 --arg2
bind = SUPER, E, exec, uwsm app -- pcmanfm-qt.desktop

Background Processes

exec-once = uwsm app -- fumon &
exec-once = uwsm app -- kdeconnectd --replace &
exec-once = uwsm app -- wl-paste --type text --watch cliphist store &
exec-once = uwsm app -- wl-paste --type image --watch cliphist store &
exec-once = uwsm app -- $HOME/.scripts/dunst.sh --on &

Desktop Setup

exec-once = uwsm app -- hyprctl setcursor breeze-hacked-cursor-theme 24 &
exec-once = uwsm app -- hyprpm reload -n &
exec-once = uwsm app -- shikane &
exec-once = uwsm app -- waypaper --restore &
exec-once = uwsm app -- gammastep -x &
exec-once = uwsm app -- wpctl set-volume @DEFAULT_AUDIO_SINK@ 25% &

Applications

exec-once = uwsm app -- blueman-applet &
exec-once = uwsm app -- nm-applet &
exec-once = uwsm app -- kdeconnect-indicator &
exec-once = uwsm app -- udiskie -a -n -s &
exec-once = uwsm app -- nextcloud &
exec-once = uwsm app -- syncthing-gtk &
exec-once = uwsm app -- openrgb &

Environment Variables

uwsm users should avoid placing environment variables here. Instead, use ~/.config/uwsm/env for theming, xcursor, nvidia and toolkit variables, and ~.config/uwsm/env-hyprland for HYPR* and AQ_* variables. The format is export KEY=VAL.

export XCURSOR_SIZE=24

See uwsm readme for additional information.

Permissions

ecosystem {
    enforce_permissions = true
}

permission = /usr/(bin|local/bin)/grim, screencopy, allow
permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow

Look and Feel

General

general {
    border_size = 2
    no_border_on_floating = false

    gaps_in = 20
    gaps_out = 30
    gaps_workspaces = 0

    col.active_border = rgba(bd93f9ff) rgba(8be9fdff) 45deg
    col.inactive_border = rgba(282a36ff)

    layout = master

    resize_on_border = false

    allow_tearing = false
}

Decoration

decoration {
    rounding = 10
    rounding_power = 4.0

    active_opacity = 1.0
    inactive_opacity = 1.0
    fullscreen_opacity = 1.0

    dim_inactive = false

    blur {
        enabled = true
        size = 5
        passes = 3
        ignore_opacity = true
        new_optimizations = true
        xray = true

        noise = 0.0117
        contrast = 0.8916
        brightness = 1.0
        vibrancy = 0.1696
        vibrancy_darkness = 0.0

        special = false
        popups = false
        input_methods = false
    }

    shadow {
        enabled = true
        range = 4
        render_power = 3
        color = rgba(1a1a1aee)
        scale = 1.0
    }
}

Animations

animation = NAME, ONOFF, SPEED, CURVE [,STYLE]
  • ONOFF can be either 0 or 1, 0 to disable, 1 to enable. note: if it's 0, you can omit further args.
  • SPEED is the amount of ds (1ds = 100ms) the animation will take
  • CURVE is the bezier curve name, see curves
  • STYLE (optional) is the animation style

The animations are a tree. If an animation is unset, it will inherit its parent's values. See the animation tree.

animation = workspaces, 1, 8, default
animation = windows, 1, 10, myepiccurve, slide
animation = fade, 0
animations {
    enabled = true
    first_launch_animation = true

    bezier = easeOutQuint,0.23,1,0.32,1
    bezier = easeInOutCubic,0.65,0.05,0.36,1
    bezier = linear,0,0,1,1
    bezier = almostLinear,0.5,0.5,0.75,1.0
    bezier = quick,0.15,0,0.1,1

    animation = global, 1, 10, default
    animation = border, 1, 5.39, easeOutQuint
    animation = windows, 1, 4.79, easeOutQuint
    animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
    animation = windowsOut, 1, 1.49, linear, popin 87%
    animation = fadeIn, 1, 1.73, almostLinear
    animation = fadeOut, 1, 1.46, almostLinear
    animation = fade, 1, 3.03, quick
    animation = layers, 1, 3.81, easeOutQuint
    animation = layersIn, 1, 4, easeOutQuint, fade
    animation = layersOut, 1, 1.5, linear, fade
    animation = fadeLayersIn, 1, 1.79, almostLinear
    animation = fadeLayersOut, 1, 1.39, almostLinear
    animation = workspaces, 1, 1.94, almostLinear, fade
    animation = workspacesIn, 1, 1.21, almostLinear, fade
    animation = workspacesOut, 1, 1.94, almostLinear, fade
}

Dwindle Layout

dwindle {
    pseudotile = true # Master switch for pseudotiling. See keybinding section to enable
    preserve_split = true # You probably want this
}

Master Layout

master {
    allow_small_split = false
    special_scale_factor = 1.0
    mfact = 0.5
    new_status = master
    new_on_top = true
    new_on_active = none
    orientation = left
    inherit_fullscreen = true
    smart_resizing = true
    drop_at_cursor = true
    always_keep_position = false
}

Miscellaneous

misc {
    disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
    disable_splash_rendering = false
    force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
    vfr = true
    vrr = 3
    mouse_move_enables_dpms = true
    key_press_enables_dpms = true
}

Input

Keyboard and Mouse

input {
    kb_layout = us
    kb_variant =
    kb_model =
    kb_options =
    kb_rules =

    numlock_by_default = true

    accel_profile = flat
    sensitivity = 0.0
    follow_mouse = 1

    scroll_method = 2fg

    touchpad {
        disable_while_typing = false
        natural_scroll = true
        scroll_factor = 0.5
        tap-to-click = true
    }
}

Gestures

gestures {
    workspace_swipe = true
    workspace_swipe_fingers = 3
    workspace_swipe_min_fingers = true
}

Device

device {
    name = epic-mouse-v1
    sensitivity = -0.5
}

Keybindings

bind = MODS, key, dispatcher, params

l -> locked, will also work when an input inhibitor (e.g. a lockscreen) is active. r -> release, will trigger on release of a key. c -> click, will trigger on release of a key or button as long as the mouse cursor stays inside binds:drag_threshold. g -> drag, will trigger on release of a key or button as long as the mouse cursor moves outside binds:drag_threshold. o -> longPress, will trigger on long press of a key. e -> repeat, will repeat when held. n -> non-consuming, key/mouse events will be passed to the active window in addition to triggering the dispatcher. m -> mouse, see below. t -> transparent, cannot be shadowed by other binds. i -> ignore mods, will ignore modifiers. s -> separate, will arbitrarily combine keys between each mod/key, see [Keysym combos](#keysym-combos) above. d -> has description, will allow you to write a description for your bind. p -> bypasses the app's requests to inhibit keybinds.

Binds

binds {
    pass_mouse_when_bound = false
    workspace_back_and_forth = false
    allow_workspace_cycles = false
    workspace_center_on = 1
    focus_preferred_method = 0
    movefocus_cycles_fullscreen = false
    window_direction_monitor_fallback = true
}

Mod Key

$mainMod = SUPER # Sets "Windows" key as main modifier

Session Control

bind = $mainMod SHIFT, Q, exec, loginctl terminate-user ""

Launch Programs

bind = $mainMod SHIFT, Return, exec, uwsm app -- $terminal
bind = $mainMod, E, exec, uwsm app -- $fileManager
bind = $mainMod, P, exec, uwsm app -- $menu
bind = $mainMod, G, exec, uwsm app -- $colorPicker
bind = $mainMod, B, exec, uwsm app -- $toggleBar
bind = $mainMod CTRL, P, exec, uwsm app -- $HOME/.scripts/control-center.sh --rofi
bind = $mainMod CTRL, C, exec, uwsm app -- cliphist list | rofi -dmenu | cliphist decode | wl-copy
bind = $mainMod CTRL, D, exec, uwsm app -- $HOME/.scripts/brightness.sh --rofi
bind = $mainMod CTRL, V, exec, uwsm app -- $HOME/.scripts/pactl.sh --rofi
bind = $mainMod CTRL, M, exec, uwsm app -- $HOME/.scripts/playerctl.sh --rofi
bind = $mainMod CTRL, N, exec, uwsm app -- $HOME/.scripts/dunst.sh --rofi
bind = $mainMod CTRL, Q, exec, uwsm app -- $HOME/.scripts/session.sh --rofi

Control Windows / Layout

General

bind = $mainMod SHIFT, C, killactive
bind = $mainMod CTRL SHIFT, C, forcekillactive
bind = $mainMod SHIFT, F, fullscreenstate, 0 3
bind = $mainMod CTRL SHIFT, F, fullscreen
bind = $mainMod, F, togglefloating

Dwindle Layout

bind = $mainMod, D, pseudo
bind = $mainMod, S, togglesplit

Master Layout

bind = $mainMod, Return, layoutmsg, swapwithmaster auto

Move Focus

Move focus with mainMod + vim keys

bind = $mainMod, H, movefocus, l
bind = $mainMod, L, movefocus, r
bind = $mainMod, K, movefocus, u
bind = $mainMod, J, movefocus, d

Switch Workspaces

Switch workspaces with mainMod + [0-9]

bind = $mainMod, 1, split-workspace, 1
bind = $mainMod, 2, split-workspace, 2
bind = $mainMod, 3, split-workspace, 3
bind = $mainMod, 4, split-workspace, 4
bind = $mainMod, 5, split-workspace, 5
bind = $mainMod, 6, split-workspace, 6
bind = $mainMod, 7, split-workspace, 7
bind = $mainMod, 8, split-workspace, 8
bind = $mainMod, 9, split-workspace, 9
bind = $mainMod, 0, split-workspace, 10

Switch between most recent workspace

bind = $mainMod, Tab, split-workspace, previous_per_monitor

Move Windows to Workspace

Move active window to a workspace with mainMod + SHIFT + [0-9]

bind = $mainMod SHIFT, 1, split-movetoworkspace, 1
bind = $mainMod SHIFT, 2, split-movetoworkspace, 2
bind = $mainMod SHIFT, 3, split-movetoworkspace, 3
bind = $mainMod SHIFT, 4, split-movetoworkspace, 4
bind = $mainMod SHIFT, 5, split-movetoworkspace, 5
bind = $mainMod SHIFT, 6, split-movetoworkspace, 6
bind = $mainMod SHIFT, 7, split-movetoworkspace, 7
bind = $mainMod SHIFT, 8, split-movetoworkspace, 8
bind = $mainMod SHIFT, 9, split-movetoworkspace, 9
bind = $mainMod SHIFT, 0, split-movetoworkspace, 10

Special Workspace

Example special workspace (scratchpad)

bind = $mainMod, S, togglespecialworkspace, magic
bind = $mainMod SHIFT, S, split-movetoworkspace, special:magic

Workspace Scroll

Scroll through existing workspaces with mainMod + scroll

bind = $mainMod, mouse_down, split-workspace, e+1
bind = $mainMod, mouse_up, split-workspace, e-1

Move / Resize Windows

Move windows with mainMod + SHIFT + vim keys

bind = $mainMod SHIFT, H, movewindow, l
bind = $mainMod SHIFT, L, movewindow, r
bind = $mainMod SHIFT, K, movewindow, u
bind = $mainMod SHIFT, J, movewindow, d

Move windows to monitors with mainMod + SHIFT + <>

bind = $mainMod SHIFT, period, movewindow, mon:+1
bind = $mainMod SHIFT, comma, movewindow, mon:-1

Move/resize windows with mainMod + LMB/RMB and dragging

bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow

Multimedia Keys

Screenshot

bind = , print, exec, uwsm app -- grim -g "$(slurp)" - | swappy -f -

Volume Controls

bindel = , XF86AudioRaiseVolume, exec, uwsm app -- $HOME/.scripts/pactl.sh --raise
bindel = , XF86AudioLowerVolume, exec, uwsm app -- $HOME/.scripts/pactl.sh --lower
bindel = , XF86AudioMute, exec, uwsm app -- $HOME/.scripts/pactl.sh --mute

Brightness Controls

bindel = , XF86MonBrightnessUp, exec, uwsm app -- $HOME/.scripts/brightness.sh --raise
bindel = , XF86MonBrightnessDown, exec, uwsm app -- $HOME/.scripts/brightness.sh --lower

Media Controls

bindl = , XF86AudioNext, exec, uwsm app -- $HOME/.scripts/playerctl.sh --next
bindl = , XF86AudioPause, exec, uwsm app -- $HOME/.scripts/playerctl.sh --play-pause
bindl = , XF86AudioPlay, exec, uwsm app -- $HOME/.scripts/playerctl.sh --play-pause
bindl = , XF86AudioPrev, exec, uwsm app -- $HOME/.scripts/playerctl.sh --prev

Windows and Workspaces

Window Rules

Example windowrule

windowrule = float,class:^(kitty)$,title:^(kitty)$

Ignore maximize requests from apps. You'll probably like this.

windowrule = suppressevent maximize, class:.*

Fix some dragging issues with XWayland

windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0

Smart Gaps

Example config for enabling smart gaps

workspace = w[tv1], gapsout:0, gapsin:0
workspace = f[1], gapsout:0, gapsin:0
windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
windowrule = rounding 0, floating:0, onworkspace:w[tv1]
windowrule = bordersize 0, floating:0, onworkspace:f[1]
windowrule = rounding 0, floating:0, onworkspace:f[1]

Graphics

XWayland

xwayland {
    enabled = true
    use_nearest_neighbor = true
    force_zero_scaling = false
    create_abstract_socket = false
}

OpenGL

opengl {
    nvidia_anti_flicker = true
}

Render

render {
    direct_scanout = 2
    expand_undersized_textures = true
    xp_mode = false
    ctm_animation = 2
    cm_fs_passthrough = 2
    cm_enabled = true
}

Ecosystem

ecosystem {
    no_update_news = true
    no_donation_nag = true
}

Plugins

hyprEasymotion

Keybindings

Enable easymotion navigation

bind = $mainMod, z, easymotion, action:hyprctl dispatch focuswindow address:{}
Appearance

Configure appearance of easymotion navigation indicators

plugin {
  easymotion {
    #font size of the text
    textsize=100

    #color of the text, takes standard hyprland color format
    textcolor=rgba(50fa7bff)

    #background color of the label box. alpha is respected
    bgcolor=rgba(282a36ff)

    #enable blur. The bgcolor alpha must be at least semi-transparent.
    blur=0

    #Set blur alpha value. Blur must be enabled (float value)
    blurA=1.0

    #Set xray. Blur must be enabled
    xray=0

    #font to use for the label. This is passed directly to the pango font description
    textfont=Sans

    #padding around the text (inside the label box) size in pixels, adjusted for
    #monitor scaling. This is the same format as hyprland's gapsin/gapsout workspace layout rule
    #example: textpadding=2 5 5 2 (spaces not commas)
    textpadding=20 20 20 20

    #size of the border around the label box. A border size of zero disables border rendering.
    bordersize=2

    #color of the border. takes the same format as hyprland's border (so it can be a gradient)
    bordercolor=rgba(50fa7bff)

    #rounded corners? Same as hyprland's 'decoration:rounding' config
    rounding=1

    #what to do if a window is fullscreen
    #none: nothing. (easymotion label won't be displayed on that window)
    #toggle: take the window out of fullscreen entirely.
    #maximize: convert the window to maximized.
    #windows are restored to fullscreen after easymotion is exited/selected
    fullscreen_action=toggle

    #which keys to use for labeling windows
    motionkeys=abcdefghijklmnopqrstuvwxyz1234567890

    #if a monitor has a focused special workspace, only put easymotion labels on the windows in the special workspace
    only_special = true
  }
}

Split Monitor Workspaces

plugin {
  split-monitor-workspaces {
    # How many workspaces to bind to the monitor
    count = 10

    # Keep current workspaces focused on plugin init / reload
    keep_focused = true

    # Enable notifications
    enable_notifications = false

    # Enable management of persistent workspaces.
    # This means the plugin will at initialization create $count
    # workspaces on each monitor and make them persistent
    enable_persistent_workspaces = false
  }
}

xdg-desktop-portal-hyprland

Screencopy

screencopy {
    max_fps = 0
    allow_token_by_default = false
}

Hypridle

General

general {
    lock_cmd = pgrep hyprlock || hyprlock       # avoid starting multiple hyprlock instances
    before_sleep_cmd = loginctl lock-session    # lock before suspend
    after_sleep_cmd = hyprctl dispatch dpms on  # to avoid having to press a key to turn on the display
    ignore_dbus_inhibit = false
    ignore_systemd_inhibit = false
    inhibit_sleep = 2
}

Listeners

Lock screen after 10 minutes

listener {
    timeout = 600
    on-timeout = loginctl lock-session
}

Sleep after 30 minutes

listener {
    timeout = 1800
    on-timeout = systemctl suspend
}

Hyprlock

General

general {
    hide_cursor = true
    grace = 0
    ignore_empty_input = false
    immediate_render = true
    text_trim = true
    fractional_scaling = 2
    screencopy_mode = 0
    fail_timeout = 2000
}

Authentication

auth {
    pam {
        enabled = true
        module = hyprlock
    }
}

Animations

animations {
    enabled = false
}

Widgets

Background

background {
    monitor =
    path = ~/Data/NextCloud/Wallpapers/Desktop/Solar_System.png
    color = rgba(282a36ff)
}

Input Field

input-field {
    monitor =
    size = 20%, 5%
    outline_thickness = 2
    dots_size = 0.2
    dots_spacing = 0.35
    dots_center = true
    dots_rounding = -1
    outer_color = rgba(8be9fdff) rgba(bd93f9ff) 45deg
    inner_color = rgba(282a36ff)
    font_color = rgba(f8f8f2ff)
    font_family = Noto Sans
    fade_on_empty = true
    fade_timeout = 2000
    check_color = rgba(f1fa8cff)
    fail_color = rgba(ff5555ff)
    halign = center
    valign = center
}

Date

label {
    monitor =
    text = cmd[update:1000] date +"%A, %B %d"
    color = rgba(bd93f9ff)
    font_size = 22
    font_family = JetBrains Mono
    position = 0, 300
    halign = center
    valign = center
}

Time

label {
    monitor =
    text = cmd[update:1000] date +"%-I:%M %p"
    color = rgba(8be9fdff)
    font_size = 95
    font_family = JetBrains Mono Extrabold
    position = 0, 200
    halign = center
    valign = center
}

Waybar

Start Configuration

// -*- mode: jsonc -*-
{

Bar

Configuration

    "layer": "top", // Waybar at top layer
    // "output": "",
    "position": "top", // Waybar position (top|bottom|left|right)
    // "height": 25, // Waybar height (to be removed for auto height)
    // "width": 1280, // Waybar width
    "spacing": 4, // Gaps between modules (4px)
    "mode": "dock",
    "start_hidden": false,
    "fixed-center": true,
    "reload_style_on_change": true,
    "modules-left": [
        "group/power-menu",
        "hyprland/workspaces",
        "hyprland/window",
        "hyprland/submap",
    ],
    "modules-center": [
        "tray",
    ],
    "modules-right": [
        "group/media-playing",
        "pulseaudio",
        "idle_inhibitor",
        "custom/system76-power",
        "cpu",
        "memory",
        "disk",
        "battery",
        "clock",
        "group/dunst",
    ],
    "group/power-menu": {
        "orientation": "inherit",
        "modules": [
            "custom/power-menu-launcher",
            "custom/power-menu-shutdown",
            "custom/power-menu-reboot",
            "custom/power-menu-sleep",
            "custom/power-menu-lock",
            "custom/power-menu-logout",
        ],
        "drawer": {
            "transition-duration": 500,
            "transition-left-to-right": true,
            "click-to-reveal": false,
        },
    },
    "group/media-playing": {
        "orientation": "inherit",
        "modules": [
            "custom/media-playing-source",
            "custom/media-playing-prev",
            "custom/media-playing-play-pause",
            "custom/media-playing-next",
        ],
    },
    "group/dunst": {
        "orientation": "inherit",
        "modules": [
            "custom/dunst-status",
            "custom/dunst-history-view",
            "custom/dunst-clear",
            "custom/dunst-history-clear",
        ],
        "drawer": {
            "transition-duration": 500,
            "transition-left-to-right": true,
            "click-to-reveal": false,
        },
    },

Styling

window#waybar {
    background: transparent;
}

#window {
    padding: 0px 0px;
    color: transparent;
    background: transparent;
}

widget {
    background: #282a36;
    border-radius: 25px;
}

label.module {
    padding: 0px 10px;
}

button {
    border-radius: 0px;
    padding: 0px 0px;
}

.module,button {
    font-size: 15px;
    font-family: Ubuntu Nerd Font;
}

Modules

Battery

Configuration
    "battery": {
        "interval": 60,
        "format": "{icon} {capacity}%",
        "format-icons": ["󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"],
        "tooltip": true,
        "tooltip-format": "󱧥\t{timeTo}\n󱐋\t{power} W\n󱠴\t{cycles}\n󱈏\t{health}%",
    },
Styling
#battery {
    background: transparent;
    color: #ff79c6;
}

CPU

Configuration
    "cpu": {
        "interval": 5,
        "format": " {usage}%",
        "tooltip": true,
        "on-click-right": "uwsm app -- foot btop",
    },
Styling
#cpu {
    background: transparent;
    color: #ffb86c;
}

Clock

Configuration
    "clock": {
        "interval": 60,
        "format": "󰥔 {:%I:%M %p}",
        "tooltip": true,
        "tooltip-format": "<tt><small>{calendar}</small></tt>",
        "calendar": {
            "mode"          : "month",
            "mode-mon-col"  : 3,
            "weeks-pos"     : "left",
            "on-scroll"     : 1,
            "format": {
                "months":     "<span color='#50fa7b'><b>{}</b></span>",
                "days":       "<span color='#f8f8f2'><b>{}</b></span>",
                "weeks":      "<span color='#8be9fd'><b>W{}</b></span>",
                "weekdays":   "<span color='#f1fa8c'><b>{}</b></span>",
                "today":      "<span color='#bd93f9'><b><u>{}</u></b></span>"
            },
        },
        "actions": {
            "on-click": "mode",
            "on-click-right": "shift_reset",
            "on-scroll-up": "shift_up",
            "on-scroll-down": "shift_down",
        },
    },
Styling
#clock {
    background: transparent;
    color: #bd93f9;
}

Dunst

Configuration
    "custom/dunst-status": {
        "exec": "uwsm app -- $HOME/.config/hypr/waybar/scripts/dunst.sh",
        "restart-interval": 1,
        "on-click": "uwsm app -- $HOME/.scripts/dunst.sh --dnd",
        "on-click-right": "uwsm app -- $HOME/.scripts/dunst.sh --rofi",
        "tooltip": true,
        "tooltip-format": "Toggle Do Not Disturb",
    },
    "custom/dunst-clear": {
        "format": "",
        "on-click": "uwsm app -- $HOME/.scripts/dunst.sh --close-all",
        "tooltip": true,
        "tooltip-format": "Close Open Notifications",
    },
    "custom/dunst-history-view": {
        "format": "󰋚",
        "on-click": "uwsm app -- $HOME/.scripts/dunst.sh --history",
        "tooltip": true,
        "tooltip-format": "View Notification History",
    },
    "custom/dunst-history-clear": {
        "format": "󰎟",
        "on-click": "uwsm app -- $HOME/.scripts/dunst.sh --history-clear",
        "tooltip": true,
        "tooltip-format": "Clear Notification History",
    },
Styling
box#dunst {
    padding: 0px 10px;
}
#custom-dunst-status {
    background: transparent;
    color: #50fa7b;
    padding: 0px 5px;
}
#custom-dunst-clear {
    background: transparent;
    color: #50fa7b;
    padding: 0px 5px;
}
#custom-dunst-history-view {
    background: transparent;
    color: #50fa7b;
    padding: 0px 5px;
}
#custom-dunst-history-clear {
    background: transparent;
    color: #50fa7b;
    padding: 0px 5px;
}
Script
isPaused=$(dunstctl is-paused)
notificationCount=$(dunstctl count history)

if [[ "$isPaused" == "true" ]]; then
    echo "󰂛 $notificationCount"
else
    echo "󰂚 $notificationCount"
fi

Disk

Configuration
    "disk": {
        "interval": 60,
        "format": "󰋊 {percentage_used}%",
        "tooltip": true,
        "tooltip-format": "Used: {used} ({percentage_used}%)\nFree: {free} ({percentage_free}%)\nTotal: {total}",
        "on-click-right": "uwsm app -- qdirstat",
    },
Styling
#disk {
    background: transparent;
    color: #f1fa8c;
}

Hyprland

Configuration
    "hyprland/workspaces": {
        "active-only": false,
        "all-outputs": false,
        "format": "{icon}",
        "format-icons": {
		    "1": "󰻧 ₁",
		    "2": "󰍩 ₂",
		    "3": "󰠮 ₃",
		    "4": " ₄",
		    "5": "󰖟 ₅",
            "6": " ₆",
            "7": "󰊢 ₇",
            "8": "󰊖 ₈",
            "9": " ₉",
            "10": " ₁₀",
		    "11": "󰻧 ₁",
		    "12": "󰍩 ₂",
		    "13": "󰠮 ₃",
		    "14": " ₄",
		    "15": "󰖟 ₅",
            "16": " ₆",
            "17": "󰊢 ₇",
            "18": "󰊖 ₈",
            "19": " ₉",
            "20": " ₁₀",
		    "21": "󰻧 ₁",
		    "22": "󰍩 ₂",
		    "23": "󰠮 ₃",
		    "24": " ₄",
		    "25": "󰖟 ₅",
            "26": " ₆",
            "27": "󰊢 ₇",
            "28": "󰊖 ₈",
            "29": " ₉",
            "30": " ₁₀",
		    "31": "󰻧 ₁",
		    "32": "󰍩 ₂",
		    "33": "󰠮 ₃",
		    "34": " ₄",
		    "35": "󰖟 ₅",
            "36": " ₆",
            "37": "󰊢 ₇",
            "38": "󰊖 ₈",
            "39": " ₉",
            "40": " ₁₀",
		    "41": "󰻧 ₁",
		    "42": "󰍩 ₂",
		    "43": "󰠮 ₃",
		    "44": " ₄",
		    "45": "󰖟 ₅",
            "46": " ₆",
            "47": "󰊢 ₇",
            "48": "󰊖 ₈",
            "49": " ₉",
            "50": " ₁₀",
	    },
        "show-special": true,
        "special-visible-only": true,
        "move-to-monitor": false,
    },
    "hyprland/window": {
        "format": "{title}",
        "rewrite": {
            "": "",
        },
        "separate-outputs": true,
        "icon": true,
        "icon-size": 21,
    },
    "hyprland/submap": {
        "format": "󰘳 {}",
        "always-on": false,
        "default-submap": "",
    },
Styling
#workspaces {
    padding: 0px 10px;
}
#workspaces button {
    background: transparent;
    color: #f1fa8c;
    padding: 0px 5px;
}
#workspaces button.empty {
    color: #44475a;
}
#workspaces button.active {
    box-shadow: inset 0 -3px #bd93f9;
}
#workspaces button.urgent {
    color: #ff5555;
}
#window {
    background: transparent;
    color: #f8f8f2;
    padding: 0px 10px;
}
#submap {
    background: transparent;
    color: #50fa7b;
    padding: 0px 10px;
}

Idle Inhibitor

Configuration
    "idle_inhibitor": {
        "format": "{icon}",
        "format-icons": {
            "activated": "󱄄 on",
            "deactivated": "󰶐 off",
        },
        "tooltip": true,
        "tooltip-format-activated": "Idle Inhibitor: {status}",
        "tooltip-format-deactivated": "Idle Inhibitor: {status}",
        "start-activated": true,
    },
Styling
#idle_inhibitor.activated {
    background: transparent;
    color: #f1fa8c;
}
#idle_inhibitor.deactivated {
    background: transparent;
    color: #44475a;
}

Memory

Configuration
    "memory": {
        "interval": 5,
        "format": "  {percentage}%",
        "tooltip": true,
        "tooltip-format": "RAM:\n\tUsed: {used} GiB ({percentage}%)\n\tFree: {avail} GiB\n\tTotal: {total} GiB\nSwap:\n\tUsed: {swapUsed} GiB ({swapPercentage}%)\n\tFree: {swapAvail} GiB\n\tTotal: {swapTotal} GiB",
        "on-click-right": "uwsm app -- foot btop",
    },
Styling
#memory {
    background: transparent;
    color: #8be9fd;
}

Playerctl

Configuration
    "custom/media-playing-source": {
        "exec": "uwsm app -- $HOME/.config/hypr/waybar/scripts/get-media-playing.sh",
        "return-type": "json",
        "restart-interval": 1,
        "on-click": "uwsm app -- $HOME/.scripts/playerctl.sh --change",
        "tooltip": true,
    },
    "custom/media-playing-prev": {
        "format": "󰒮",
        "on-click": "uwsm app -- $HOME/.scripts/playerctl.sh --prev",
        "tooltip": false,
    },
    "custom/media-playing-play-pause": {
        "exec": "uwsm app -- $HOME/.config/hypr/waybar/scripts/get-media-status-icon.sh",
        "restart-interval": 1,
        "on-click": "uwsm app -- $HOME/.scripts/playerctl.sh --play-pause",
        "tooltip": false,
    },
    "custom/media-playing-next": {
        "format": "󰒭",
        "on-click": "uwsm app -- $HOME/.scripts/playerctl.sh --next",
        "tooltip": false,
    },
Styling
box#media-playing {
    padding: 0px 10px;
}
#custom-media-playing-source {
    background: transparent;
    color: #ff5555;
    padding: 0px 5px;
}
#custom-media-playing-prev {
    background: transparent;
    color: #ff5555;
    padding: 0px 5px;
}
#custom-media-playing-play-pause {
    background: transparent;
    color: #ff5555;
    padding: 0px 5px;
}
#custom-media-playing-next {
    background: transparent;
    color: #ff5555;
    padding: 0px 5px;
}
Script
mediaStatus=$(playerctl --player=playerctld metadata 2>&1)

if [[ "$mediaStatus" == "No player could handle this command" ]]; then
    echo "󰡀"
else
    trackid=$(playerctl --player=playerctld metadata --format '{{ mpris:trackid }}')
    title=$(playerctl --player=playerctld metadata --format '{{ xesam:title }}')

    if grep -q -i "netflix" <<< "$title"; then
        echo "󰝆"
    elif grep -q -i "hulu" <<< "$title"; then
        echo "󰠩"
    elif grep -q -i "prime video" <<< "$title"; then
        echo ""
    elif grep -q -i "youtube tv" <<< "$title"; then
        echo "󰑈"
    elif grep -q -i "chromium" <<< "$trackid"; then
        echo ""
    elif grep -q -i "vlc" <<< "$trackid"; then
        echo "󰕼"
    elif grep -q -i "spotify" <<< "$trackid"; then
        echo ""
    else
        echo "󰡀"
    fi
fi
mediaStatus=$(`dirname $0`/get-media-status.sh)

if [[ "$mediaStatus" == "N/A" ]]; then
    echo "󰐎"
else
    if [[ "$mediaStatus" == "Playing" ]]; then
        echo "󰏤"
    elif [[ "$mediaStatus" == "Paused" ]]; then
        echo "󰐊"
    fi
fi
mediaStatus=$(playerctl --player=playerctld metadata 2>&1)

if [[ "$mediaStatus" == "No player could handle this command" ]]; then
    echo "N/A"
else
    status=$(playerctl --player=playerctld metadata --format '{{ status }}')

    echo $status
fi
mediaSourceIcon=$(`dirname $0`/get-media-source-icon.sh)
mediaStatus=$(playerctl --player=playerctld metadata 2>&1)

if [[ "$mediaStatus" == "No player could handle this command" ]]; then
        artist="N/A"
        title="N/A"
        album="N/A"
        status="N/A"
else
        artist=$(playerctl --player=playerctld metadata --format '{{ xesam:artist }}')
        title=$(playerctl --player=playerctld metadata --format '{{ xesam:title }}')
        album=$(playerctl --player=playerctld metadata --format '{{ xesam:album }}')
        status=$(playerctl --player=playerctld metadata --format '{{ status }}')

        if [[ $artist == "" ]]; then
            artist="N/A"
        fi

        if [[ $title == "" ]]; then
            title="N/A"
        fi

        if [[ $album == "" ]]; then
            album="N/A"
        fi

        if [[ $status == "" ]]; then
            status="N/A"
        fi
fi

echo '{"text":"'$mediaSourceIcon'","tooltip":"󰝚\t'${title//'"'/'\"'}'\r󰠃\t'${artist//'"'/'\"'}'\r󰀥\t'${album//'"'/'\"'}'\r󰐎\t'${status//'"'/'\"'}'"}'

Power Menu

Configuration
    "custom/power-menu-launcher": {
        "format": "",
        "on-click": "rofi -show combi -run-command 'uwsm app -- {cmd}'",
        "on-click-right": "uwsm app -- $HOME/.scripts/control-center.sh --rofi",
        "tooltip": true,
        "tooltip-format": "Application Launcher",
    },
    "custom/power-menu-shutdown": {
        "format": "",
        "on-click": "uwsm app -- $HOME/.scripts/session.sh --shutdown",
        "tooltip": true,
        "tooltip-format": "Shutdown",
    },
    "custom/power-menu-reboot": {
        "format": "",
        "on-click": "uwsm app -- $HOME/.scripts/session.sh --reboot",
        "tooltip": true,
        "tooltip-format": "Reboot",
    },
    "custom/power-menu-sleep": {
        "format": "⏾",
        "on-click": "uwsm app -- $HOME/.scripts/session.sh --sleep",
        "tooltip": true,
        "tooltip-format": "Sleep",
    },
    "custom/power-menu-lock": {
        "format": "",
        "on-click": "uwsm app -- $HOME/.scripts/session.sh --lock",
        "tooltip": true,
        "tooltip-format": "Lock",
    },
    "custom/power-menu-logout": {
        "format": "",
        "on-click": "uwsm app -- $HOME/.scripts/session.sh --logout",
        "tooltip": true,
        "tooltip-format": "Logout",
    },
Styling
box#power-menu {
    padding: 0px 10px;
}
#custom-power-menu-launcher {
    background: transparent;
    color: #8be9fd;
    padding: 0px 5px;
}
#custom-power-menu-shutdown {
    background: transparent;
    color: #ff5555;
    padding: 0px 5px;
}
#custom-power-menu-reboot {
    background: transparent;
    color: #50fa7b;
    padding: 0px 5px;
}
#custom-power-menu-sleep {
    background: transparent;
    color: #f1fa8c;
    padding: 0px 5px;
}
#custom-power-menu-lock {
    background: transparent;
    color: #ff79c6;
    padding: 0px 5px;
}
#custom-power-menu-logout {
    background: transparent;
    color: #ffb86c;
    padding: 0px 5px;
}

Pulseaudio

Configuration
    "pulseaudio": {
        "interval": 5,
        "format": "{icon} {volume}%",
        "format-bluetooth": "{icon} 󰂯 {volume}%",
        "format-muted": "󰝟 muted",
        "format-icons": {
            "hdmi": "󰡁",
            "headset": "󰋎",
            "speaker": "󰓃",
            "headphone": "󰋋",
            "car": "",
            "hifi": "󰤽",
            "default": "",
        },
        "scroll-step": 5,
        "on-click": "uwsm app -- $HOME/.scripts/pactl.sh --mute",
        "on-click-right": "uwsm app -- $HOME/.scripts/pactl.sh --mixer",
        "tooltip": true,
        "tooltip-format": "{desc}",
        "scroll-step": 0.25,
    },
Styling
#pulseaudio {
    background: transparent;
    color: #ff79c6;
}

System76 Power

Configuration
    "custom/system76-power": {
        "exec": "uwsm app -- $HOME/.config/hypr/waybar/scripts/system76-power.sh",
        "return-type": "json",
        "restart-interval": 60,
        "on-click-right": "uwsm app -- $HOME/.scripts/cpu-gpu.sh --rofi",
        "tooltip": true,
    },
Styling
#custom-system76-power {
    background: transparent;
    color: #50fa7b;
}
Script
profile="$(sudo system76-power profile | sed -z '$ s/\n$//' | tr '\n' '\r')"
graphics="$(sudo system76-power graphics)"
graphicsPower="$(sudo system76-power graphics power)"
chargeThresholds="$(sudo system76-power charge-thresholds | sed -z '$ s/\n$//' | tr '\n' '\r')"

echo '{"text":"󰢮 '$graphics'","tooltip":"󰢮\t'$graphics'\r󰐥\t'$graphicsPower'\r\r  Profile\r'$profile'\r\r󰚥 Charge Thresholds\r'$chargeThresholds'"}'

Tray

Configuration
    "tray": {
        "icon-size": 21,
        "show-passive-items": true,
        "spacing": 4,
        "reverse-direction": false,
    },
Styling
#tray {
    background: transparent;
    padding: 0px 10px;
}

End Configuration

}

Toggle Script

if systemctl --user is-active waybar.service; then
    systemctl --user stop waybar.service
else
    systemctl --user start waybar.service
fi
Description
Personal configuration of Hyprland dynamic tiling Wayland compositor
Readme 686 KiB
Languages
Shell 52.1%
CSS 47.9%