Compare commits

...
33 Commits
Author SHA1 Message Date
valknarandClaude Sonnet 5 244358a99e fix(hyprland): anchor dolphin window to bottom-right, avoid off-screen clipping
Cursor-based move formula computed position from window_w/window_h before
the rule's own size directive resized the window, pushing it far past the
screen edge. Compute the target position directly from the same size
formula instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 20:24:44 +02:00
valknar 47b461c4c0 fix: reset openrgb 2026-09-14 20:06:44 +02:00
valknarandClaude Sonnet 5 8e783f894d fix(stacks): widen pull retry window and jitter the nightly update timer
Nightly update pulls for coolify/immich kept hitting transient ghcr.io
toomanyrequests errors and getting skipped, because the timer fired at
exactly 02:00:00 Europe/Amsterdam (the same instant countless other
hosts' cron/timer jobs also hit registries) and the retry loop only
spanned ~15s (3 attempts, 5/10/15s backoff) — not enough to ride out
the burst.

- Widen pull retries to 5 attempts with 20/40/60/80s backoff (~3+ min).
- Add RandomizedDelaySec=1800 to the update timer (and its install
  template) so this host's pulls no longer land on the exact
  top-of-hour thundering herd.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XmtksEEYSBZqUacw3qF1A9
2026-09-12 15:45:12 +00:00
valknar f746a52f88 fix(noctalia): show labels 2026-09-12 17:38:15 +02:00
valknarandClaude Sonnet 5 6e60829987 feat(triggershell): add Spotify stop playback command
Pauses Spotify via its MPRIS D-Bus interface. Talks to the user bus
socket directly ($XDG_RUNTIME_DIR/bus) since triggershell.service starts
before the graphical session and lacks DBUS_SESSION_BUS_ADDRESS. No-op
when Spotify is not running.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016uCHmJ3PGcHZGtx8mYqmQG
2026-09-09 21:59:55 +02:00
valknarandClaude Sonnet 5 17f790d1ca fix(noctalia): resolve config validate warnings
- widget.temp/sysmon_2: show_label -> show_value (renamed)
- widget.workspaces: display = "none" -> show_labels = false
- widget.wallhaven: drop unsupported color key (plugin only exposes glyph)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 20:32:46 +02:00
valknarandClaude Sonnet 5 030e27b13b fix(stacks): make nightly update check resilient to transient errors
Two opposite failure modes in `update run`:

- pulsenode was reported "updated" every night though its image never
  changed: the pre-pull image-ID snapshot came back empty (the awk
  fallback used \s, which mawk silently ignores), and empty != populated
  was read as "changed".
- coolify was never recreated despite a new image: its nightly pull kept
  hitting a transient `toomanyrequests`, and a failed pull only warned
  before falling through to the comparison, which then saw no change.

Changes:
- _stack_image_ids: POSIX [[:space:]] instead of \s; return non-zero when
  images can't be resolved so callers can tell "unknown" from "unchanged".
- Retry `docker compose pull` 3x with backoff; if it still fails, add the
  stack to a new `skipped` list and skip the recreate instead of treating
  it as up to date.
- Detect changes by comparing running containers' image IDs against the
  post-pull resolved config, so a transient empty read can't be mistaken
  for "everything changed".
- Notify with an amber "finished with warnings" summary listing skipped
  stacks.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-30 17:11:00 +00:00
valknarandClaude Sonnet 5 b314a97e69 feat(vlc): add desktop override with QT_SCALE_FACTOR for HiDPI
VLC 3's Qt interface ignores Wayland compositor scaling, so the UI
renders tiny on the 4K display (Hyprland scale 1.5). Shadow the system
launcher with QT_SCALE_FACTOR=1.5.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RLbJ5DWegXqY551kBAKGAf
2026-08-29 16:14:21 +02:00
valknarandClaude Sonnet 5 28a9d1b39a feat(triggershell): add Spotify app start command
Launches Spotify via systemd-run --user so it inherits the graphical
session environment (the triggershell service starts before the Wayland
session and lacks WAYLAND_DISPLAY/DISPLAY). Idempotent: no-op when
spotify.service is already active.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LHvz6Nxkf9SU2EufjWZ3cG
2026-08-29 11:53:19 +02:00
valknarandClaude Sonnet 5 a0205f9958 chore: remove tracked .vscode dir
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017T2GTsXrpJizZ6HnwEcid4
2026-08-28 20:38:20 +02:00
valknarandClaude Sonnet 5 cb73339adc feat(triggershell): add power controls, inline openrgb-hue, add off command
- system-shutdown / system-reboot / system-cancel-shutdown scripts with a
  typed-confirmation guard and optional delay (works without sudo via logind)
- openrgb-hue-apply: inline the wrapper script into bash -c, keeping the PATH
  fallback and install hint; drop scripts/openrgb-hue-apply.sh
- openrgb-hue-off: new script wrapping `openrgb-hue off` with device/type/zone
  filters

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZC9uGoYPWeG3hed7FpmJw
2026-08-28 20:23:39 +02:00
valknar 89c3ff257d fix(wayvnc): always restart, even on clean exit
wayvnc exits with status 0 when it loses its capture output (e.g. the
idle daemon powering the screen off), so Restart=on-failure never
brought it back. Restart=always + StartLimitIntervalSec=0 keeps it
retrying until the output returns.
2026-08-24 17:34:23 +02:00
valknar 7520a1a5fb feat(wayvnc): add config and user service for tailnet-only VNC access
Binds to the tailscale IP only, with PAM auth over TLS. TLS cert/key
are machine-local secrets and intentionally not tracked.
2026-08-24 16:32:36 +02:00
valknar 134904ce2c chore: cleanup 2026-08-24 12:35:28 +02:00
valknar db4fc948d8 fix(stacks): surface pull failures and log before/after image IDs on mismatch
update run silently swallowed pull errors and never logged what actually
differed, making a recurring false "updates found" for pulsenode (no
registry-side change since Aug 19) impossible to diagnose.
2026-08-22 09:22:13 +02:00
valknar 7584da9115 chore: zed config update 2026-08-18 19:10:41 +02:00
valknar 145f9171a0 fix(triggershell): fall back to pyenv/local bin dirs when resolving openrgb-hue
systemd --user services get a minimal PATH that never sources shell
rc files, so pyenv shims and pip --user installs weren't found even
though openrgb-hue was installed. Prepend the common user-install
locations before the PATH lookup.
2026-08-17 11:07:40 +02:00
valknar 644ee876e1 fix(triggershell): resolve openrgb-hue via PATH instead of hardcoded venv
Avoids baking in a machine-specific absolute path, and fails with
install instructions if the binary isn't found.
2026-08-17 11:03:54 +02:00
valknar 25dba3fe64 chore: arty tailscale up command 2026-08-16 20:19:55 +02:00
valknar b407185d1f feat(triggershell): use the new searchable combobox for scene picker 2026-08-16 17:21:22 +02:00
valknar f71da3aea0 feat(triggershell): replace demo scripts with openrgb-hue apply
Drop the triggershell init scaffold scripts and add one script that
drives openrgb-hue apply: full option set as form fields, scene as a
103-entry dropdown, mapping defaulting to per-zone. The scene name
goes through a small wrapper since it's a positional CLI arg and
TriggerShell's passAs:arg can only emit --flag value pairs.
2026-08-16 17:16:42 +02:00
valknar 730d01e1dd chore: add pnpm global bin path 2026-08-16 11:27:43 +02:00
valknarandClaude Sonnet 5 01690ce658 hypr: switch default browser hotkey to Chrome
Firefox isn't installed; SUPER+W now launches google-chrome-stable,
and the opacity-override window rule matches Chrome's window class too.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-15 09:00:15 +02:00
valknarandClaude Opus 4.8 5c7bdb0ed8 noctalia: set weather location to Stockach
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 07:13:16 +02:00
valknarandClaude Sonnet 5 918cab2d3d feat: track OpenRGB single-instance fix and RQuickShare desktop files
Adds a headless OpenRGB autostart entry plus a launcher wrapper that
focuses the existing GUI window instead of spawning a duplicate
instance, and tracks the customized RQuickShare autostart/launcher
desktop entries.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-15 05:58:35 +02:00
valknar 00c5e8653f chore: pin node version to v26 2026-08-14 18:45:45 +02:00
valknarandClaude Sonnet 5 383b2aa29c feat: track zed, uwsm, and kitty configs
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 18:15:24 +02:00
valknar 33d3bf60a0 feat(hypr): track Hyprland config
monitors.lua stays untracked since it's machine-specific
(monitor names/resolutions won't transfer to another host).
2026-08-03 19:42:52 +02:00
valknar 50950ac071 feat(noctalia): add wallhaven bar widget 2026-08-03 19:39:59 +02:00
valknar a4c7461958 feat(noctalia): track config and enable idle behavior
Adds lock (5min) and screen-off (6min) idle timeouts, which were
previously unset so the shell never dimmed/locked.
2026-08-03 19:32:18 +02:00
valknar d75219ad2b feat: glow and glamour style 2026-06-29 17:21:39 +02:00
valknarandClaude Sonnet 4.6 39a39d359a feat(p10k): apply Catppuccin Frappé palette
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 17:12:52 +02:00
valknar 3532c50ba4 feat: catppuccin themes 2026-06-29 17:09:10 +02:00
40 changed files with 1581 additions and 2890 deletions
+9
View File
@@ -0,0 +1,9 @@
[Desktop Entry]
Categories=Utility;
Comment=OpenRGB 1.0
Icon=OpenRGB
Name=OpenRGB
StartupNotify=true
Terminal=false
Type=Application
Exec=/usr/bin/openrgb --startminimized --server
+8
View File
@@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Version=1.0
Name=RQuickShare
Comment=RQuickSharestartup script
Exec=/usr/bin/rquickshare
StartupNotify=false
Terminal=false
+1 -1
View File
@@ -1 +1 @@
--theme="Nord" --theme="Catppuccin Frappe"
File diff suppressed because it is too large Load Diff
-204
View File
@@ -1,204 +0,0 @@
{
"document": {
"block_prefix": "\n",
"block_suffix": "\n",
"color": "#D8DEE9",
"margin": 2
},
"block_quote": {
"indent": 1,
"indent_token": "│ ",
"color": "#4C566A",
"italic": true
},
"paragraph": {},
"list": {
"level_indent": 2
},
"heading": {
"block_suffix": "\n",
"bold": true
},
"h1": {
"prefix": " ",
"suffix": " ",
"color": "#2E3440",
"background_color": "#88C0D0",
"bold": true
},
"h2": {
"prefix": "## ",
"color": "#88C0D0"
},
"h3": {
"prefix": "### ",
"color": "#81A1C1"
},
"h4": {
"prefix": "#### ",
"color": "#8FBCBB"
},
"h5": {
"prefix": "##### ",
"color": "#5E81AC"
},
"h6": {
"prefix": "###### ",
"color": "#4C566A",
"bold": false
},
"text": {},
"strikethrough": {
"crossed_out": true
},
"emph": {
"italic": true
},
"strong": {
"color": "#ECEFF4",
"bold": true
},
"hr": {
"color": "#4C566A",
"format": "\n────────────────────────────────────────────────────────────\n"
},
"item": {
"block_prefix": "• "
},
"enumeration": {
"block_prefix": ". ",
"color": "#81A1C1"
},
"task": {
"ticked": "[✓] ",
"unticked": "[ ] "
},
"link": {
"color": "#5E81AC",
"underline": true
},
"link_text": {
"color": "#88C0D0",
"bold": true
},
"image": {
"color": "#B48EAD",
"underline": true
},
"image_text": {
"color": "#4C566A",
"format": "Image: {{.text}} →"
},
"code": {
"prefix": " ",
"suffix": " ",
"color": "#88C0D0",
"background_color": "#3B4252"
},
"code_block": {
"color": "#D8DEE9",
"margin": 2,
"chroma": {
"text": {
"color": "#D8DEE9"
},
"error": {
"color": "#ECEFF4",
"background_color": "#BF616A"
},
"comment": {
"color": "#4C566A"
},
"comment_preproc": {
"color": "#5E81AC"
},
"keyword": {
"color": "#81A1C1"
},
"keyword_reserved": {
"color": "#81A1C1"
},
"keyword_namespace": {
"color": "#5E81AC"
},
"keyword_type": {
"color": "#8FBCBB"
},
"operator": {
"color": "#81A1C1"
},
"punctuation": {
"color": "#D8DEE9"
},
"name": {
"color": "#D8DEE9"
},
"name_builtin": {
"color": "#88C0D0"
},
"name_tag": {
"color": "#81A1C1"
},
"name_attribute": {
"color": "#8FBCBB"
},
"name_class": {
"color": "#8FBCBB",
"underline": true,
"bold": true
},
"name_constant": {
"color": "#B48EAD"
},
"name_decorator": {
"color": "#D08770"
},
"name_exception": {
"color": "#BF616A"
},
"name_function": {
"color": "#88C0D0"
},
"name_other": {},
"literal": {},
"literal_number": {
"color": "#B48EAD"
},
"literal_date": {
"color": "#A3BE8C"
},
"literal_string": {
"color": "#A3BE8C"
},
"literal_string_escape": {
"color": "#EBCB8B"
},
"generic_deleted": {
"color": "#BF616A"
},
"generic_emph": {
"italic": true
},
"generic_inserted": {
"color": "#A3BE8C"
},
"generic_strong": {
"bold": true
},
"generic_subheading": {
"color": "#4C566A"
},
"background": {
"background_color": "#2E3440"
}
}
},
"table": {},
"definition_list": {},
"definition_term": {},
"definition_description": {
"block_prefix": "\n🠶 "
},
"html_block": {},
"html_span": {}
}
+20
View File
@@ -0,0 +1,20 @@
-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/
-- Default beziers
hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1} } })
hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} } })
hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
hl.curve("almostLinear", { type = "bezier", points = { {0.5, 0.5}, {0.75, 1} } })
hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} } })
hl.curve("overshoot", { type = "bezier", points = { {0.5, 0.9}, {0.1, 1.1} } })
-- Default springs
hl.curve("easy", { type = "spring", mass = 1, stiffness = 500, dampening = 35 })
hl.curve("rubber", { type = "spring", mass = 1, stiffness = 200, dampening = 15 })
-- Animations
hl.animation({ leaf = "global", enabled = true, speed = 3, bezier = "quick" })
hl.animation({ leaf = "windows", enabled = true, speed = 3, spring = "easy", style = "slide" })
hl.animation({ leaf = "workspaces", enabled = true, speed = 5, bezier = "quick", style = "slide" })
hl.animation({ leaf = "specialWorkspaceIn", enabled = true, speed = 2, bezier = "quick", style = "slide top"})
hl.animation({ leaf = "specialWorkspaceOut", enabled = true, speed = 2, bezier = "quick", style = "slide bottom"})
+8
View File
@@ -0,0 +1,8 @@
-- Auto-start config
-- if you dont use UWSM add your auto start programs here, otherwise use XDG autostart https://wiki.archlinux.org/title/XDG_Autostart
hl.on("hyprland.start", function ()
hl.exec_cmd("dbus-update-activation-environment --systemd --all")
hl.exec_cmd("noctalia")
hl.exec_cmd("xhost +SI:localuser:root")
end)
+138
View File
@@ -0,0 +1,138 @@
local mainMod = "SUPER"
local noctCall = "noctalia msg "
local launchPrefix = "uwsm app -- " -- if you are not using UWSM, make this empty (e.g. "")
---------------------------
---- WINDOW MANAGEMENT ----
---------------------------
-- Window manipulation
hl.bind(mainMod .. " + Escape", hl.dsp.exec_cmd("hyprctl kill"))
hl.bind(mainMod .. " + Q", hl.dsp.window.close())
hl.bind(mainMod .. " + ALT + Space", hl.dsp.window.float({ action = "toggle" }))
hl.bind(mainMod .. " + D", hl.dsp.window.fullscreen({ mode = 1 }))
hl.bind(mainMod .. " + F", hl.dsp.window.fullscreen())
hl.bind(mainMod .. " + J", hl.dsp.layout("togglesplit"))
-- Change focus
hl.bind(mainMod .. " + Left", hl.dsp.focus({ direction = "left" }))
hl.bind(mainMod .. " + Right", hl.dsp.focus({ direction = "right" }))
hl.bind(mainMod .. " + Up", hl.dsp.focus({ direction = "up" }))
hl.bind(mainMod .. " + Down", hl.dsp.focus({ direction = "down" }))
hl.bind("ALT + Tab", hl.dsp.window.cycle_next())
hl.bind(mainMod .. " + Tab", hl.dsp.exec_cmd(noctCall .. "window-switcher"))
-- Move active window around workspaces & monitors
hl.bind(mainMod .. " + SHIFT + Up", hl.dsp.window.move({ direction = "u" }))
hl.bind(mainMod .. " + SHIFT + Right", hl.dsp.window.move({ direction = "r" }))
hl.bind(mainMod .. " + SHIFT + Left", hl.dsp.window.move({ direction = "l" }))
hl.bind(mainMod .. " + SHIFT + Down", hl.dsp.window.move({ direction = "d" }))
hl.bind(mainMod .. " + SHIFT + 1", hl.dsp.window.move({ monitor = MONITOR1 }))
hl.bind(mainMod .. " + SHIFT + 2", hl.dsp.window.move({ monitor = MONITOR2 }))
hl.bind(mainMod .. " + SHIFT + 3", hl.dsp.window.move({ monitor = MONITOR3 }))
hl.bind(mainMod .. " + SHIFT + mouse_up", hl.dsp.window.move({ monitor = "-1" }))
hl.bind(mainMod .. " + SHIFT + mouse_down", hl.dsp.window.move({ monitor = "+1" }))
hl.bind(mainMod .. " + CONTROL + SHIFT + Right", hl.dsp.window.move({ workspace = "m+1" }))
hl.bind(mainMod .. " + CONTROL + SHIFT + Left", hl.dsp.window.move({ workspace = "m-1" }))
hl.bind(mainMod .. " + CONTROL + SHIFT + mouse_up", hl.dsp.window.move({ workspace = "m-1" }))
hl.bind(mainMod .. " + CONTROL + SHIFT + mouse_down", hl.dsp.window.move({ workspace = "m+1" }))
for i = 1, NUM_WPM do
local key = i % 10
hl.bind(mainMod .. " + SHIFT + CONTROL + " .. key, hl.dsp.window.move({ workspace = "m~" .. i }))
end
-- Move & Resize with mouse
hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag())
hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize())
------------------
---- LAUNCHER ----
------------------
hl.bind(mainMod .. " + Return", hl.dsp.exec_cmd(launchPrefix .. TERMINAL))
hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(launchPrefix .. FILE_MANAGER))
hl.bind(mainMod .. " + T", hl.dsp.exec_cmd(launchPrefix .. EDITOR))
hl.bind(mainMod .. " + C", hl.dsp.exec_cmd(launchPrefix .. CALCULATOR))
hl.bind("XF86Calculator", hl.dsp.exec_cmd(launchPrefix .. CALCULATOR))
hl.bind(mainMod .. " + W", hl.dsp.exec_cmd(launchPrefix .. BROWSER))
hl.bind("CONTROL + SHIFT + Escape", hl.dsp.exec_cmd(launchPrefix .. TERMINAL .. " -e btop"))
hl.bind(mainMod .. " + Z", hl.dsp.exec_cmd(noctCall .. "settings-toggle"))
hl.bind(mainMod .. " + X", hl.dsp.exec_cmd(noctCall .. "panel-toggle control-center"))
hl.bind(mainMod .. " + Space", hl.dsp.exec_cmd(noctCall .. "panel-toggle launcher"))
hl.bind(mainMod .. " + period", hl.dsp.exec_cmd(noctCall .. "panel-toggle launcher /emo"))
hl.bind(mainMod .. " + L", hl.dsp.exec_cmd(noctCall .. "session lock"))
hl.bind(mainMod .. " + ALT + C", hl.dsp.exec_cmd(noctCall .. "panel-toggle session"))
---------------------------
---- HARDWARE CONTROLS ----
---------------------------
-- Audio
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd(noctCall .. "volume-up"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd(noctCall .. "volume-down"), { locked = true, repeating = true })
hl.bind("XF86AudioMute", hl.dsp.exec_cmd(noctCall .. "volume-mute"), { locked = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd(noctCall .. "mic-mute"), { locked = true })
-- Media
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd(noctCall .. "media toggle"), { locked = true })
hl.bind("XF86AudioPause", hl.dsp.exec_cmd(noctCall .. "media toggle"), { locked = true })
hl.bind("XF86AudioNext", hl.dsp.exec_cmd(noctCall .. "media next"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd(noctCall .. "media previous"), { locked = true })
-- Brightness
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd(noctCall .. "brightness-up"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd(noctCall .. "brightness-down"), { locked = true, repeating = true })
-------------------
---- UTILITIES ----
-------------------
-- Screen Capture
hl.bind(mainMod .. " + P", hl.dsp.exec_cmd("hyprpicker -a -n"))
hl.bind("Print", hl.dsp.exec_cmd(noctCall .. "screenshot-region"))
hl.bind(mainMod .. " + Print", hl.dsp.exec_cmd(noctCall .. "screenshot-fullscreen"))
-- Theming and Wallpaper
hl.bind(mainMod .. " + SHIFT + W", hl.dsp.exec_cmd(noctCall .. "panel-toggle wallpaper"))
-- Clipboard
hl.bind(mainMod .. " + V", hl.dsp.exec_cmd(noctCall .. "panel-toggle clipboard"))
-- Notifications
hl.bind(mainMod .. " + A", hl.dsp.exec_cmd(noctCall .. "panel-toggle control-center notifications"))
-------------------------------
---- WORKSPACES & MONITORS ----
-------------------------------
-- Focus on monitors
hl.bind(mainMod .. " + 1", hl.dsp.focus({ monitor = MONITOR1 }))
hl.bind(mainMod .. " + 2", hl.dsp.focus({ monitor = MONITOR2 }))
hl.bind(mainMod .. " + 3", hl.dsp.focus({ monitor = MONITOR3 }))
-- Focus on workspace number
-- Absolute
for i = 1, NUM_WPM do
local key = i % 10
hl.bind(mainMod .. " + TAB + " .. key, hl.dsp.focus({ workspace = i }))
end
-- Relative
for i = 1, NUM_WPM do
local key = i % 10
hl.bind(mainMod .. " + CONTROL + " .. key, hl.dsp.focus({ workspace = "m~" .. i }))
end
-- Move to adjacent workspaces and next empty on a given monitor
hl.bind(mainMod .. " + CONTROL + Right", hl.dsp.focus({ workspace = "m+1" }))
hl.bind(mainMod .. " + CONTROL + Left", hl.dsp.focus({ workspace = "m-1" }))
hl.bind(mainMod .. " + CONTROL + Down", hl.dsp.focus({ workspace = "emptym" }))
-- Scroll through existing workspaces & monitors
hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "m-1" }))
hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "m+1" }))
hl.bind(mainMod .. " + CONTROL + mouse_up", hl.dsp.focus({ workspace = "m-1" }))
hl.bind(mainMod .. " + CONTROL + mouse_down", hl.dsp.focus({ workspace = "m+1" }))
-- Special workspace (scratchpad)
hl.bind(mainMod .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special" }))
hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special())
+11
View File
@@ -0,0 +1,11 @@
-- Cachy colors
CACHYLGREEN = "rgba(82dcccff)"
CACHYMGREEN = "rgba(00aa84ff)"
CACHYDGREEN = "rgba(007d6fff)"
CACHYLBLUE = "rgba(01ccffff)"
CACHYMBLUE = "rgba(182545ff)"
CACHYDBLUE = "rgba(111826ff)"
CACHYWHITE = "rgba(ffffffff)"
CACHYGREY = "rgba(ddddddff)"
CACHYGRAY = "rgba(798bb2ff)"
+46
View File
@@ -0,0 +1,46 @@
-- Look and feel configuration
hl.config({
general = {
gaps_in = 3,
gaps_out = 8,
border_size = 2,
extend_border_grab_area = 10,
resize_on_border = true,
col = {
active_border = {
colors = { CACHYLGREEN, CACHYDGREEN },
angle = 45,
},
inactive_border = CACHYGRAY,
},
},
group = {
col = {
border_active = CACHYLBLUE,
border_inactive = CACHYGRAY,
border_locked_active = CACHYDBLUE,
border_locked_inactive = CACHYGRAY,
},
groupbar = {
col = {
active = CACHYLGREEN,
inactive = CACHYGRAY,
locked_active = CACHYDBLUE,
locked_inactive = CACHYGRAY,
},
},
},
decoration = {
dim_special = 0.3,
rounding = 10,
active_opacity = 0.95,
inactive_opacity = 0.85,
fullscreen_opacity = 1,
blur = {
size = 5,
passes = 4,
special = true,
},
},
})
+10
View File
@@ -0,0 +1,10 @@
-- Environmental variables (for reference https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/)
-- if you use UWSM, define your variables in ~/.config/uwsm/env
-- if you don't use UWSM, define your variables here (e.g. hl.env("QT_QPA_PLATFORM", "wayland"))
-- if you have an NVIDIA GPU uncomment the following lines:
-- hl.env("GBM_BACKEND", "nvidia-drm") -- force GBM as a backend
-- hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia") -- force GBM as a backend
-- hl.env("LIBVA_DRIVER_NAME", "nvidia") -- Hardware acceleration on NVIDIA GPUs
-- hl.env("__GL_GSYNC_ALLOWED", "1") -- Controls if G-Sync capable monitors should use Variable Refresh Rate (VRR)
+18
View File
@@ -0,0 +1,18 @@
-- Input configuration
hl.config({
input = {
-- sensitivity = -0.25,
accel_profile = "flat",
kb_layout = "de",
},
-- Uncomment the section below to enable software cursors; this can help with cursor display or behavior issues
-- cursor = {
-- no_hardware_cursors = 1,
-- },
})
hl.gesture({ fingers = 4, direction = "horizontal", action = "workspace" })
hl.gesture({ fingers = 3, direction = "down", action = "close" })
hl.gesture({ fingers = 3, direction = "up", action = "fullscreen" })
hl.gesture({ fingers = 3, direction = "left", action = "float" })
+21
View File
@@ -0,0 +1,21 @@
hl.config({
dwindle = {
preserve_split = true,
},
misc = {
col = {
splash = CACHYLGREEN,
},
middle_click_paste = false,
enable_swallow = true,
swallow_regex = "(kitty|ghostty|[Kk]onsole|Alacritty|gnome-terminal|xfce[0-9]?-terminal)",
vrr = 3,
},
xwayland = {
force_zero_scaling = true
},
ecosystem = {
no_update_news = true,
no_donation_nag = true,
},
})
+16
View File
@@ -0,0 +1,16 @@
-- Hyprland default apps
TERMINAL = "kitty"
FILE_MANAGER = "dolphin"
BROWSER = "google-chrome-stable"
EDITOR = "gnome-text-editor --new-window"
CALCULATOR = "gnome-calculator"
-- Monitors
MONITOR1 = ""
MONITOR2 = ""
MONITOR3 = ""
PRIMARY_MONITOR = MONITOR1
-- Workspaces
NUM_WPM = 3 -- Number of workspaces per monitor (Max 10)
+116
View File
@@ -0,0 +1,116 @@
-- Window rules wiki https://wiki.hypr.land/Configuring/Basics/Window-Rules/
-- Generic floating position
hl.window_rule({ match = { float = true }, center = true, persistent_size = true })
-- Picture-in-Picture
hl.window_rule({
match = { title = "^([Pp]icture[-\\s]?[Ii]n[-\\s]?[Pp]icture)(.*)$" },
float = true,
keep_aspect_ratio = true,
size = { "max(monitor_w, monitor_h)*0.25", "min(monitor_w, monitor_h)*0.25" },
pin = true,
})
-- Gaming
local gamingApps = "^(steam_app.*|gamescope)$"
local gamingWorkspace = "name:gaming"
hl.window_rule({ match = { content = "game" }, workspace = gamingWorkspace })
hl.window_rule({ match = { xdg_tag = "^(.*game.*)$" }, workspace = gamingWorkspace, fullscreen_state = 2, content = "game", sync_fullscreen = true })
hl.window_rule({ match = { class = gamingApps }, workspace = gamingWorkspace })
hl.window_rule({ match = { class = "^(steam)$", title = "^(Friends List)$" }, float = true })
hl.window_rule({ match = { class = "^(steam)$", title = "^(Launching\\.{3})$" }, float = true, center = true, workspace = gamingWorkspace })
hl.window_rule({
match = {
class = gamingApps,
title = "^(.+)$",
initial_title = "negative:^(.*\\\\home\\\\.*)$",
},
content = "game",
decorate = false,
fullscreen_state = 2,
size = { "monitor_w", "monitor_h" },
sync_fullscreen = true,
})
hl.window_rule({
match = {
class = "^(steam_app.*)$",
initial_title = "^$",
},
center = true,
float = true,
fullscreen = false,
fullscreen_state = 0,
workspace = gamingWorkspace,
})
-- Apps
hl.window_rule({ match = { class = "^(.*\\.exe)$", float = true }, monitor = PRIMARY_MONITOR, center = true, fullscreen_state = 0 })
hl.window_rule({ match = { class = "^(.*[Ll]auncher.*)$" }, float = true, monitor = PRIMARY_MONITOR })
hl.window_rule({ match = { class = "^(vesktop|discord)$" }, monitor = PRIMARY_MONITOR })
hl.window_rule({ match = { class = "^(.*[Cc]alc.*)$" }, float = true, size = { "max(monitor_w, monitor_h)*0.17", "min(monitor_w, monitor_h)*0.43" } })
hl.window_rule({ match = { class = "^(org\\.kde\\.keditfiletype)$" }, float = true })
hl.window_rule({ match = { class = "^(org\\.kde\\.ark)$" }, size = { "max(monitor_w, monitor_h)*0.40", "min(monitor_w, monitor_h)*0.40" } })
hl.window_rule({ match = { class = "^(.*satty.*)$", title = "^(Satty)$" }, min_size = { "max(monitor_w, monitor_h)*0.35", "min(monitor_w, monitor_h)*0.35" }, float = true })
hl.window_rule({ match = { class = "^(dev\\.)?(noctalia\\.Noctalia(\\.Settings)?)$" }, float = true, size = { "monitor_w*0.70", "monitor_h*0.70" } })
hl.window_rule({
match = {
class = "^(org\\.kde\\.dolphin)$",
title = "negative:^(Moving.*|Create New.*|Extract.*|Compress.*|Copying.*|Progress.*|Configure.*|Properties.*|Choose\\sApplication.*)$",
},
float = true,
size = { "max(monitor_w, monitor_h)*0.50", "min(monitor_w, monitor_h)*0.55" },
move = {
"monitor_w - (max(monitor_w, monitor_h)*0.50) - 20", -- X axis: always align to screen right (20px margin)
"monitor_h - (min(monitor_w, monitor_h)*0.55) - 20" -- Y axis: always align to screen bottom (20px margin)
},
})
-- Opacity Overrides
local terminals = "^(kitty|ghostty|[Kk]onsole|Alacritty|gnome-terminal|xfce[0-9]?-terminal)$"
hl.window_rule({ match = { class = "^(firefox|zen|[Gg]oogle-chrome)$" }, opacity = "1.0 override" })
hl.window_rule({ match = { class = terminals }, opacity = "1.0 override" }) -- Override opacity in favor of terminal settings for opacity. If your terminal doesn't support transparency, you can remove this rule.
hl.window_rule({ match = { class = "^(mpv|org.kde.haruna|.*plex.*|org\\.kde\\.gwenview|.*vlc.*)$" }, opacity = "1.0 override" })
-- Float Utility Windows
local floatApps = {
{ class = "^(kvantummanager|qt[56]ct|nwg-look)$" },
{ class = "^(org.pulseaudio.pavucontrol|blueman-manager|nm-applet|nm-connection-editor)$" },
{ title = "^(Winetricks.*|Protontricks.*)$" },
}
for _, m in ipairs(floatApps) do hl.window_rule({ match = m, float = true }) end
-- Float Common Modals
local modalMatches = {
{ title = "^(Open|Authentication Required|Add Folder to Workspace|Choose Files|Save As|Confirm to replace files|File Operation Progress)$" },
{ initial_title = "^(Open File)$" },
{ class = "^([Xx]dg-desktop-portal-gtk)$" },
{ title = "^(File Upload|Choose wallpaper|Library)(.*)$" },
{ class = "^(.*dialog.*)$" },
{ title = "^(.*dialog.*)$" },
{ class = "^(hyprland-share-picker)$"},
}
for _, m in ipairs(modalMatches) do hl.window_rule({ match = m, float = true }) end
-- Ignore maximize requests from all apps. You'll probably like this.
hl.window_rule({
name = "suppress-maximize-events",
match = { class = ".*" },
suppress_event = "maximize",
})
-- Fix some dragging issues with XWayland
hl.window_rule({
name = "fix-xwayland-drags",
match = {
class = "^$",
title = "^$",
xwayland = true,
float = true,
fullscreen = false,
pin = false,
},
no_focus = true,
})
+9
View File
@@ -0,0 +1,9 @@
-- Workspace rules wiki https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- Add your workspace rules here. Increment the workspace number as you go. Do not have duplicate workspaces.
hl.workspace_rule({ workspace = "name:gaming", monitor = PRIMARY_MONITOR, default = true })
hl.workspace_rule({ workspace = "1", monitor = MONITOR1, default = true, persistent = true })
hl.workspace_rule({ workspace = "2", monitor = MONITOR1, default = true, persistent = true })
hl.workspace_rule({ workspace = "3", monitor = MONITOR1, default = true, persistent = true })
-- hl.workspace_rule({ workspace = "4", monitor = MONITOR2, default = true, persistent = true })
-- hl.workspace_rule({ workspace = "5", monitor = MONITOR2, default = true, persistent = true })
-- hl.workspace_rule({ workspace = "6", monitor = MONITOR2, default = true, persistent = true })
+14
View File
@@ -0,0 +1,14 @@
-- CachyOS Hyprland Configuration
require("config.animations")
require("config.autostart")
require("config.colors")
require("config.decorations")
require("config.variables")
require("config.environment")
require("config.inputs")
require("config.binds")
require("config.misc")
require("config.monitors")
require("config.windowrules")
require("config.workspaces")
+3
View File
@@ -0,0 +1,3 @@
screencopy {
allow_token_by_default = true
}
+5
View File
@@ -0,0 +1,5 @@
background_opacity 0.6
cursor_trail 1
window_padding_width 25
include themes/noctalia.conf
+32
View File
@@ -0,0 +1,32 @@
color0 #494d64
color1 #ed8796
color2 #a6da95
color3 #eed49f
color4 #8aadf4
color5 #f5bde6
color6 #8bd5ca
color7 #b8c0e0
color8 #5b6078
color9 #ed8796
color10 #a6da95
color11 #eed49f
color12 #8aadf4
color13 #f5bde6
color14 #8bd5ca
color15 #a5adcb
cursor #f4dbd6
cursor_text_color #24273a
background #24273a
foreground #cad3f5
selection_foreground #cad3f5
selection_background #5b6078
active_border_color #f5bde6
inactive_border_color #363a4f
url_color #f5bde6
active_tab_foreground #24273a
active_tab_background #f5bde6
inactive_tab_foreground #a5adcb
inactive_tab_background #363a4f
cursor_trail_color #a5adcb
-55
View File
@@ -1,55 +0,0 @@
# Nord true-color scheme for micro editor
# https://www.nordtheme.com/docs/colors-and-palettes
#
# Polar Night: nord0=#2E3440 nord1=#3B4252 nord2=#434C5E nord3=#4C566A
# Snow Storm: nord4=#D8DEE9 nord5=#E5E9F0 nord6=#ECEFF4
# Frost: nord7=#8FBCBB nord8=#88C0D0 nord9=#81A1C1 nord10=#5E81AC
# Aurora: nord11=#BF616A nord12=#D08770 nord13=#EBCB8B nord14=#A3BE8C nord15=#B48EAD
color-link default "#D8DEE9,#2E3440"
color-link comment "#4C566A"
color-link identifier "#88C0D0"
color-link identifier.class "#8FBCBB"
color-link identifier.var "#D8DEE9"
color-link constant "#B48EAD"
color-link constant.number "#B48EAD"
color-link constant.bool "#81A1C1"
color-link constant.string "#A3BE8C"
color-link constant.string.url "#88C0D0"
color-link constant.specialChar "#EBCB8B"q
color-link statement "#81A1C1"
color-link symbol "#ECEFF4"
color-link symbol.brackets "#D8DEE9"
color-link symbol.operator "#81A1C1"
color-link preproc "#5E81AC"
color-link type "#8FBCBB"
color-link type.keyword "#81A1C1"
color-link special "#D08770"
color-link underlined "#88C0D0"
color-link error "#BF616A"
color-link todo "#EBCB8B,#2E3440"
color-link selection "#D8DEE9,#434C5E"
color-link indent-char "#3B4252"
color-link line-number "#4C566A,#2E3440"
color-link current-line-number "#D8DEE9,#3B4252"
color-link gutter-info "#88C0D0"
color-link gutter-error "#BF616A"
color-link gutter-warning "#EBCB8B"
color-link cursor-line "#3B4252"
color-link color-column "#3B4252"
color-link statusline "#D8DEE9,#3B4252"
color-link statusline.inactive "#4C566A,#2E3440"
color-link tabbar "#4C566A,#2E3440"
color-link tabbar.active "#ECEFF4,#434C5E"
color-link divider "#3B4252,#3B4252"
color-link scrollbar "#4C566A,#2E3440"
color-link match-brace "#EBCB8B"
color-link hlsearch "#2E3440,#EBCB8B"
color-link diff-added "#A3BE8C"
color-link diff-modified "#EBCB8B"
color-link diff-deleted "#BF616A"
color-link diff-added-lines "#A3BE8C,#2E3440"
color-link diff-modified-lines "#EBCB8B,#2E3440"
color-link diff-deleted-lines "#BF616A,#2E3440"
+1 -1
View File
@@ -1,3 +1,3 @@
{ {
"colorscheme": "nord-tc" "colorscheme": "catppuccin-frappe"
} }
+160
View File
@@ -0,0 +1,160 @@
[accessibility]
ui_scale = 1.20
[location]
address = "Stockach, Deutschland"
[bar.default]
center = [ "workspaces", "spacer_1", "active_window" ]
concave_edge_corners = true
end = [ "media", "spacer_1", "tray", "notifications", "network", "volume", "wallhaven", "session" ]
margin_edge = 0
margin_ends = 0
radius_bottom_left = 12
radius_bottom_right = 12
radius_top_left = 0
radius_top_right = 0
scale = 1.10
start = [ "launcher", "clock", "spacer_1", "group:g1" ]
thickness = 35
[[bar.default.capsule_group]]
border = ""
fill = "on_secondary"
id = "g1"
members = [ "temp", "sysmon_2", "sysmon_3" ]
opacity = 1.0
padding = 6.0
[idle]
behavior_order = [ "lock", "screen-off" ]
pre_action_fade_seconds = 2.0
[idle.behavior.lock]
action = "lock"
enabled = true
timeout = 300
[idle.behavior.screen-off]
action = "screen_off"
enabled = true
timeout = 360
[shell]
clipboard_image_action_command = "satty -f -"
launch_apps_as_systemd_services = true
polkit_agent = true
settings_show_advanced = true
[shell.panel]
open_near_click_control_center = true
session_placement = "floating"
session_position = "center"
[shell.screenshot]
copy_to_clipboard = false
pipe_command = "satty -f -"
pipe_to_command = true
save_to_file = false
[[shell.session.actions]]
action = "lock"
countdown_seconds = 0.0
enabled = true
shortcut = "1"
variant = "default"
[[shell.session.actions]]
action = "logout"
countdown_seconds = 0.0
enabled = true
shortcut = "2"
variant = "default"
[[shell.session.actions]]
action = "lock_and_suspend"
countdown_seconds = 3.0
enabled = true
shortcut = "3"
variant = "default"
[[shell.session.actions]]
action = "reboot"
countdown_seconds = 3.0
enabled = true
shortcut = "4"
variant = "default"
[[shell.session.actions]]
action = "shutdown"
countdown_seconds = 3.0
enabled = true
shortcut = "5"
variant = "destructive"
[system.monitor]
gpu_poll_seconds = 2
[theme]
mode = "dark"
source = "wallpaper"
wallpaper_scheme = "m3-tonal-spot"
[theme.templates]
builtin_ids = [ "btop", "gtk3", "gtk4", "kcolorscheme", "kitty", "qt", "alacritty" ]
[widget.clock]
color = "secondary"
format = "{:%H:%M %A %m/%d/%y}"
[widget.launcher]
color = "secondary"
[widget.media]
hide_when_no_media = true
title_scroll = "on_hover"
[widget.network]
color = "secondary"
[widget.notifications]
color = "secondary"
[widget.session]
color = "error"
[widget.spacer_1]
type = "spacer"
[widget.temp]
show_value = true
[widget.sysmon_2]
glyph = "gpu-usage"
show_value = true
stat = "gpu_temp"
type = "sysmon"
[widget.sysmon_3]
glyph = "cpu-2"
stat = "ram_used"
type = "sysmon"
[widget.wallhaven]
glyph = "photo"
type = "noctalia/wallhaven:wallhaven"
[widget.tray]
capsule = true
capsule_fill = "on_secondary"
[widget.volume]
color = "secondary"
[widget.workspaces]
active_pill_size = 2.5
capsule = true
capsule_fill = "on_primary"
show_labels = false
inactive_pill_size = 1.0
pill_scale = 0.80
+15
View File
@@ -0,0 +1,15 @@
[Unit]
Description=wayvnc - VNC server for wlroots Wayland compositors
After=graphical-session.target
PartOf=graphical-session.target
Requisite=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/bin/wayvnc
Restart=always
RestartSec=5
StartLimitIntervalSec=0
[Install]
WantedBy=graphical-session.target
+15
View File
@@ -0,0 +1,15 @@
export BROWSER=google-chrome
export TERM=xterm-kitty
export QT_QPA_PLATFORM="wayland;xcb"
export QT_QPA_PLATFORMTHEME="qt6ct"
export ELECTRON_OZONE_PLATFORM_HINT=auto
export HYPRCURSOR_THEME="Bibata-Modern-Ice"
export HYPRCURSOR_SIZE=24
export XCURSOR_THEME="Bibata-Modern-Ice"
export XCURSOR_SIZE=24
# If you have an NVIDIA GPU uncommment the following lines
# export GBM_BACKEND=nvidia-drm # force GBM as a backend
# export __GLX_VENDOR_LIBRARY_NAME=nvidia # force GBM as a backend
# export LIBVA_DRIVER_NAME=nvidia # Hardware acceleration on NVIDIA GPUs
# export __GL_GSYNC_ALLOWED=1 # Controls if G-Sync capable monitors should use Variable Refresh Rate (VRR)
+6
View File
@@ -0,0 +1,6 @@
address=100.64.0.1
port=5900
enable_auth=true
enable_pam=true
certificate_file=/home/valknar/.config/wayvnc/tls_cert.pem
private_key_file=/home/valknar/.config/wayvnc/tls_key.pem
-138
View File
@@ -1,138 +0,0 @@
# Nord theme for Yazi
# https://www.nordtheme.com/docs/colors-and-palettes
#
# Polar Night: nord0=#2E3440 nord1=#3B4252 nord2=#434C5E nord3=#4C566A
# Snow Storm: nord4=#D8DEE9 nord5=#E5E9F0 nord6=#ECEFF4
# Frost: nord7=#8FBCBB nord8=#88C0D0 nord9=#81A1C1 nord10=#5E81AC
# Aurora: nord11=#BF616A nord12=#D08770 nord13=#EBCB8B nord14=#A3BE8C nord15=#B48EAD
[app]
overall = { bg = "#2E3440" }
[mgr]
cwd = { fg = "#88C0D0", bold = true }
find_keyword = { fg = "#EBCB8B", bold = true, italic = true, underline = true }
find_position = { fg = "#D08770", bg = "reset", bold = true, italic = true }
symlink_target = { fg = "#81A1C1", italic = true }
marker_copied = { fg = "#A3BE8C", bg = "#A3BE8C" }
marker_cut = { fg = "#BF616A", bg = "#BF616A" }
marker_marked = { fg = "#EBCB8B", bg = "#EBCB8B" }
marker_selected = { fg = "#88C0D0", bg = "#88C0D0" }
count_copied = { fg = "#2E3440", bg = "#A3BE8C" }
count_cut = { fg = "#2E3440", bg = "#BF616A" }
count_selected = { fg = "#2E3440", bg = "#88C0D0" }
border_symbol = "│"
border_style = { fg = "#4C566A" }
[indicator]
parent = { fg = "#4C566A", bg = "#3B4252" }
current = { bg = "#434C5E" }
preview = { fg = "#4C566A", bg = "#3B4252" }
padding = { open = "", close = "" }
[tabs]
active = { fg = "#ECEFF4", bg = "#434C5E", bold = true }
inactive = { fg = "#4C566A", bg = "#3B4252" }
sep_inner = { open = "", close = "" }
sep_outer = { open = "", close = "" }
[mode]
normal_main = { fg = "#2E3440", bg = "#88C0D0", bold = true }
normal_alt = { fg = "#88C0D0", bg = "#3B4252" }
select_main = { fg = "#2E3440", bg = "#A3BE8C", bold = true }
select_alt = { fg = "#A3BE8C", bg = "#3B4252" }
unset_main = { fg = "#2E3440", bg = "#EBCB8B", bold = true }
unset_alt = { fg = "#EBCB8B", bg = "#3B4252" }
[status]
overall = { fg = "#D8DEE9", bg = "#3B4252" }
sep_left = { open = "", close = "" }
sep_right = { open = "", close = "" }
perm_type = { fg = "#81A1C1" }
perm_read = { fg = "#A3BE8C" }
perm_write = { fg = "#BF616A" }
perm_exec = { fg = "#EBCB8B" }
perm_sep = { fg = "#4C566A" }
progress_label = { fg = "#ECEFF4", bold = true }
progress_normal = { fg = "#88C0D0", bg = "#3B4252" }
progress_error = { fg = "#BF616A", bg = "#3B4252" }
[which]
cols = 3
mask = { bg = "#3B4252" }
cand = { fg = "#88C0D0" }
rest = { fg = "#D8DEE9" }
desc = { fg = "#4C566A" }
separator = "  "
separator_style = { fg = "#4C566A" }
[confirm]
border = { fg = "#81A1C1" }
title = { fg = "#88C0D0", bold = true }
body = {}
list = {}
btn_yes = { fg = "#2E3440", bg = "#A3BE8C", bold = true }
btn_no = { fg = "#2E3440", bg = "#BF616A", bold = true }
btn_labels = [" [Y]es ", " (N)o "]
[spot]
border = { fg = "#81A1C1" }
title = { fg = "#88C0D0", bold = true }
tbl_col = { fg = "#88C0D0", bold = true }
tbl_cell = { fg = "#EBCB8B", reversed = true }
[notify]
title_info = { fg = "#A3BE8C", bold = true }
title_warn = { fg = "#EBCB8B", bold = true }
title_error = { fg = "#BF616A", bold = true }
icon_info = ""
icon_warn = ""
icon_error = ""
[pick]
border = { fg = "#81A1C1" }
active = { fg = "#88C0D0", bold = true }
inactive = {}
[input]
border = { fg = "#81A1C1" }
title = { fg = "#88C0D0", bold = true }
value = {}
selected = { reversed = true }
[cmp]
border = { fg = "#81A1C1" }
active = { reversed = true }
inactive = {}
icon_file = ""
icon_folder = ""
icon_command = ""
[tasks]
border = { fg = "#81A1C1" }
title = { fg = "#88C0D0", bold = true }
hovered = { fg = "#B48EAD", bold = true }
[help]
on = { fg = "#8FBCBB" }
run = { fg = "#B48EAD" }
desc = {}
hovered = { reversed = true, bold = true }
footer = { fg = "#2E3440", bg = "#D8DEE9" }
[filetype]
rules = [
# Images
{ mime = "image/*", fg = "#D08770" },
# Media
{ mime = "{audio,video}/*", fg = "#B48EAD" },
# Archives
{ mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio}", fg = "#BF616A" },
# Documents
{ mime = "application/{pdf,doc,rtf}", fg = "#88C0D0" },
# Special files
{ url = "*", is = "orphan", bg = "#BF616A" },
{ url = "*", is = "exec", fg = "#A3BE8C" },
# Directories
{ url = "*/", fg = "#81A1C1" },
]
+19
View File
@@ -0,0 +1,19 @@
// Zed settings
//
// For information on how to configure Zed, see the Zed
// documentation: https://zed.dev/docs/configuring-zed
//
// To see all of Zed's default settings without changing your
// custom settings, run `zed: open default settings` from the
// command palette (cmd-shift-p / ctrl-shift-p)
{
"cli_default_open_behavior": "existing_window",
"icon_theme": "Catppuccin Frappé",
"ui_font_size": 16,
"buffer_font_size": 15,
"theme": {
"mode": "system",
"light": "One Light",
"dark": "Catppuccin Frappé",
},
}
+44 -9
View File
@@ -16,29 +16,64 @@
!.zshenv !.zshenv
!.hushlogin !.hushlogin
!arty.yml !arty.yml
!triggershell.yml
!scripts/
!scripts/openrgb-hue-apply.sh
!bin/ !bin/
!bin/arty !bin/arty
!bin/stacks !bin/stacks
!bin/README.md !bin/README.md
!bin/setup !bin/setup
!.vscode/
!.vscode/settings.json
!.vscode/keybindings.json
!.config/ !.config/
!.config/yazi/ !.config/yazi/
!.config/yazi/yazi.toml !.config/yazi/yazi.toml
!.config/yazi/theme.toml
!.config/micro/ !.config/micro/
!.config/micro/settings.json !.config/micro/settings.json
!.config/micro/bindings.json !.config/micro/bindings.json
!.config/micro/colorschemes/
!.config/micro/colorschemes/nord-tc.micro
!.config/bat/ !.config/bat/
!.config/bat/config !.config/bat/config
!.config/bat/themes/
!.config/bat/themes/Nord.tmTheme
!.config/glow/ !.config/glow/
!.config/glow/glow.yml !.config/glow/glow.yml
!.config/glow/nord.json !.config/noctalia/
!.config/noctalia/config.toml
!.config/hypr/
!.config/hypr/hyprland.lua
!.config/hypr/xdph.conf
!.config/hypr/config/
!.config/hypr/config/animations.lua
!.config/hypr/config/autostart.lua
!.config/hypr/config/binds.lua
!.config/hypr/config/colors.lua
!.config/hypr/config/decorations.lua
!.config/hypr/config/environment.lua
!.config/hypr/config/inputs.lua
!.config/hypr/config/misc.lua
!.config/hypr/config/variables.lua
!.config/hypr/config/windowrules.lua
!.config/hypr/config/workspaces.lua
!.config/zed/
!.config/zed/settings.json
!.config/uwsm/
!.config/uwsm/env
!.config/wayvnc/
!.config/wayvnc/config
!.config/systemd/
!.config/systemd/user/
!.config/systemd/user/wayvnc.service
!.config/kitty/
!.config/kitty/kitty.conf
!.config/kitty/themes/
!.config/kitty/themes/noctalia.conf
!.config/autostart/
!.config/autostart/OpenRGB.desktop
!.config/autostart/RQuickShare.desktop
!.local/
!.local/bin/
!.local/bin/openrgb-launcher.sh
!.local/share/
!.local/share/applications/
!.local/share/applications/org.openrgb.OpenRGB.desktop
!.local/share/applications/rquickshare.desktop
!.local/share/applications/vlc.desktop
!LICENSE !LICENSE
!README.md !README.md
@@ -0,0 +1,9 @@
[Desktop Entry]
Categories=Development;
Exec=env GDK_BACKEND=x11 WEBKIT_DISABLE_COMPOSITING_MODE=1 WEBKIT_DISABLE_DMABUF_RENDERER=1 rquickshare
Icon=rquickshare
Name=RQuickShare
Terminal=false
Type=Application
X-Desktop-File-Install-Version=0.28
StartupWMClass=rquickshare
+230
View File
@@ -0,0 +1,230 @@
[Desktop Entry]
Version=1.0
Name=VLC media player
GenericName=Media player
Comment=Read, capture, broadcast your multimedia streams
Name[af]=VLC-mediaspeler
GenericName[af]=Mediaspeler
Comment[af]=Lees, vang, send u multimediastrome
Name[am]=የ ቪኤልሲ መገናኛ ማጫወቻ
GenericName[am]=የ መገናኛ ማጫወቻ
Comment[am]=የ እርስዎን በርካታ መገናኛ ማንበቢያ: መያዣ ማስተላለፊያ
Name[ar]=مشغل الوسائط VLC
GenericName[ar]=مشغل الوسائط
Comment[ar]=اقرأ ، التقط ، و بث تدفقات وسائطك المتعددة
Name[as_IN]=VLC মিডিয়া প্লেয়াৰ
GenericName[as_IN]=মিডিয়া প্লেয়াৰ
Comment[as_IN]=আপোনাৰ মাল্টিমিডিয়া ষ্ট্ৰীমসমূহ পঢ়ক, কেপচাৰ কৰক, সম্প্ৰচাৰ কৰক
Name[ast]=Reproductor multimedia VLC
GenericName[ast]=Reproductor multimedia
Comment[ast]=Llei, captura y emiti fluxos multimedia
Name[az]=VLC media pleyeri
GenericName[az]=Media pleyeri
Comment[az]=Multinedia axınlarını oxudun, yazın və yayımlayın
Name[be]=Медыяпрайгравальнік VLC
GenericName[be]=Медыяпрайгравальнік
Comment[be]=Чытаць, лавіць і трансляваць мультымедыйныя патокі
Name[bg]=Медиен плейър VLC
GenericName[bg]=Медиен плейър
Comment[bg]=Прочитане, прихващане и излъчване на мултимедийни потоци.
Name[bn_BD]=VLC মিডিয়া প্লেয়ার
GenericName[bn_BD]=মিডিয়া প্লেয়ার
Comment[bn_BD]=আপনার মাল্টিমিডিয়া স্ট্রীম পড়ুন, ধরে রাখুন এবং ছড়িয়ে দিন
Name[br]=VLC lenner mediaoù
GenericName[br]=Lenner mediaoù
Comment[br]=Lenn, enrollañ, skignañ ho froudoù liesvedia
Name[ca]=Reproductor multimèdia VLC
GenericName[ca]=Reproductor multimèdia
Comment[ca]=Reproduïu, captureu i emeteu fluxos multimèdia
Name[co]=Lettore multimedia VLC
GenericName[co]=Lettore multimedia
Comment[co]=Leghje, cattura, diffonde i vostri flussi multimedia
Name[cs]=Multimediální přehrávač VLC
GenericName[cs]=Multimediální přehrávač
Comment[cs]=Čtěte, zachytávejte, a vysílejte své multimediální proudy
Name[cy]=Chwaraeydd VLC
GenericName[cy]=Chwaraeydd cyfryngau
Comment[cy]=Darllen, cipio a darlledu dy ffrydiau aml-gyfrwng
Name[da]=VLC media player
GenericName[da]=Medieafspiller
Comment[da]=Læs, indspil, transmittér dine multimediestreams
Name[de]=VLC Media Player
GenericName[de]=Medienwiedergabe
Comment[de]=Wiedergabe, Aufnahme und Verbreitung Ihrer Multimedia-Streams
Name[el]=Αναπαραγωγός πολυμέσων VLC
GenericName[el]=Αναπαραγωγός πολυμέσων
Comment[el]=Διαβάστε, καταγράψτε, μεταδώστε τα πολυμέσα σας
Name[en_GB]=VLC media player
GenericName[en_GB]=Media player
Comment[en_GB]=Read, capture, broadcast your multimedia streams
Name[es]=Reproductor multimedia VLC
GenericName[es]=Reproductor multimedia
Comment[es]=Lea, capture y emita sus contenidos multimedia
Name[es_MX]=Reproductor multimedia VLC
GenericName[es_MX]=Reproductor multimedia
Comment[es_MX]=Lea, capture, emita sus transmisiones multimedia
Name[et]=VLC meediaesitaja
GenericName[et]=Meediaesitaja
Comment[et]=Multimeediafailide ja -voogude taasesitamine, lindistamine ja edastamine
Name[eu]=VLC multimedia-erreproduzigailua
GenericName[eu]=Multimedia irakurgailua
Comment[eu]=Irakurri, hartu, igorri zure multimedia jarioak
Name[fi]=VLC-mediasoitin
GenericName[fi]=Mediasoitin
Comment[fi]=Toista, tallenna ja lähetä multimediaa
Name[fr]=Lecteur multimédia VLC
GenericName[fr]=Lecteur multimédia
Comment[fr]=Lit, capture, diffuse vos flux multimédias
Name[fy]=VLC media player
GenericName[fy]=Mediaspiler
Comment[fy]=Jo multimedia-streams lêze, opnimme en útstjoere
Name[ga]=Seinnteoir meán VLC
GenericName[ga]=Seinnteoir meán
Comment[ga]=Léigh, gabh, craol do shruthanna ilmheán
Name[gd]=Cluicheadair mheadhanan VLC
GenericName[gd]=Cluicheadair mheadhanan
Comment[gd]=Leugh, glac is craol sruthan ioma-mheadhain
Name[gl]=Reprodutor multimedia VLC
GenericName[gl]=Reprodutor multimedia
Comment[gl]=Lea, capture e emita os seus fluxos multimedia
Name[he]=נגן המדיה VLC
GenericName[he]=נגן מדיה
Comment[he]=קריאה, לכידה ושידור של תזרימי המולטימדיה שלך
Name[hi]=वीएलसी मीडिया प्लेयर
GenericName[hi]=मीडिया प्लेयर
Comment[hi]=अपनी मल्टीमीडिया स्ट्रीम को पढ़ें, रिकॉर्ड करें, प्रसारित करें
Name[hu]=VLC médialejátszó
GenericName[hu]=Médialejátszó
Comment[hu]=Multimédia adatfolyamok olvasása, felvétele és továbbítása
Name[id]=Pemutar media VLC
GenericName[id]=Pemutar Media
Comment[id]=Baca, tangkap, pancarkan/broadcast aliran multimedia
Name[ie]=Reproductor de media VLC
GenericName[ie]=Reproductor de media
Comment[ie]=Leer, registrar e difuser vor fluvies multimedia
Name[is]=VLC spilarinn
GenericName[is]=Margmiðlunarspilari
Comment[is]=Lesa, taka upp og útvarpa margmiðlunarstreymi
Name[it]=Lettore multimediale VLC
GenericName[it]=Lettore multimediale
Comment[it]=Leggi, cattura, trasmetti i tuoi flussi multimediali
Name[ja]=VLCメディアプレイヤー
GenericName[ja]=メディアプレイヤー
Comment[ja]=マルチメディアストリームの読み込み、キャプチャー、ブロードキャスト
Name[ka]=VLC მედიადამკვრელი
GenericName[ka]=მედიაფაილების დამკვრელი
Comment[ka]=გახსენით, გადაიღეთ, გაუშვით მედიაფაილები ეთერში
Name[kab]=Imeɣri n umidya VLC
GenericName[kab]=Imeɣri n umidya
Comment[kab]=Ɣeṛ, ṭṭef agdil, suffeɣ-d isuddam n umidya-ik
Name[km]=កម្មវិធី​ចាក់​មេឌៀ VLC
GenericName[km]=កម្មវិធី​ចាក់​មេឌៀ
Comment[km]=អាន ចាប់យក ប្រកាស​ស្ទ្រីម​ពហុមេឌៀ​របស់​អ្នក
Name[ko]=VLC 미디어 플레이어
GenericName[ko]=미디어 플레이어
Comment[ko]=당신의 멀티미디어 스트림을 캡쳐 및 방송 할 수 있습니다
Name[lt]=VLC leistuvė
GenericName[lt]=Leistuvė
Comment[lt]=Groti, įrašyti, siųsti įvairialypės terpės kūrinius
Name[lv]=VLC mediju atskaņotājs
GenericName[lv]=Mediju atskaņotājs
Comment[lv]=Lasiet, tveriet un apraidiet savas multimediju straumes
Name[ml]=VLC മീഡിയ പ്ലെയർ
GenericName[ml]=മീഡിയ പ്ലെയർ
Comment[ml]=നിങ്ങളുടെ മൾട്ടിമീഡിയ സ്ട്രീമുകൾ റീഡ് ചെയ്യുക, ക്യാപ്‌ചർ ചെയ്യുക, പ്രക്ഷേപണം ചെയ്യുക
Name[mn]=VLC дамжуулга тоглуулагч
GenericName[mn]=Дамжуулга тоглуулагч
Comment[mn]=Таны дамжуулгын урсгалыг унших, бичиж авах, цацах
Name[mr]=VLC मीडिया प्लेअर
GenericName[mr]=मीडिया प्लेअर
Comment[mr]=आपले मल्टीमिडिया प्रवाह बघा, हस्तगत करा, प्रसारित करा
Name[ms]=Pemain media VLC
GenericName[ms]=Pemain media
Comment[ms]=Baca, tangkap, siarkan strim multimedia anda
Name[my]=VLC မီဒီယာ ပြစက်
GenericName[my]=မီဒီယာ ပြစက်
Comment[my]=သင်၏ မာတီမီဒီယာ တိုက်ရိုက်လွှင့်ပြ စီးကြောင်းများကို ဖတ်၊ ဖမ်းယူ၊ ထုတ်လွင့်ခြင်း
Name[nb]=VLC media player
GenericName[nb]=Mediespiller
Comment[nb]=Innless, ta opp, og kringkast dine multimediastrømmer
Name[ne]=VLC मिडिया प्लेयर
GenericName[ne]=मिडिया प्लेयर
Comment[ne]=पढ्नुहोस्, क्याप्चर गर्नुहोस्, तपाईंका मल्टिमिडिया स्ट्रिमहरू प्रसारण गर्नुहोस्
Name[nl]=VLC media player
GenericName[nl]=Mediaspeler
Comment[nl]=Uw multimedia-streams lezen, opnemen en uitzenden
Name[nn]=VLC mediespelar
GenericName[nn]=Mediespelar
Comment[nn]=Spel av, ta opp og send ut multimedia
Name[oc]=Lector multimèdia VLC
GenericName[oc]=Lector multimèdia
Comment[oc]=Legissètz, capturatz, difusatz vòstres fluxes multimèdia
Name[pa]=VLC ਮੀਡਿਆ ਪਲੇਅਰ
GenericName[pa]=ਮੀਡਿਆ ਪਲੇਅਰ
Comment[pa]=ਆਪਣੀ ਮਲਟੀਮੀਡਿਆ ਸਟਰੀਮ ਪੜ੍ਹੋ, ਕੈਪਚਰ ਤੇ ਬਰਾਡਕਾਸਟ ਕਰੋ
Name[pl]=VLC media player
GenericName[pl]=Odtwarzacz multimedialny
Comment[pl]=Odczytywanie, przechwytywanie i nadawanie strumieni multimedialnych
Name[pt_BR]=Reprodutor de Mídias VLC
GenericName[pt_BR]=Reprodutor de Mídias
Comment[pt_BR]=Reproduza, capture e transmita os seus transmissões multimídia
Name[pt_PT]=VLC media player
GenericName[pt_PT]=Reprodutor de multimédia
Comment[pt_PT]=Ler, capturar, transmitir as suas emissões de multimédia
Name[ro]=Redor media VLC
GenericName[ro]=Redor media
Comment[ro]=Citește, capturează, difuzează fluxurile multimedia
Name[ru]=Медиаплеер VLC
GenericName[ru]=Медиаплеер
Comment[ru]=Универсальный проигрыватель видео и аудио
Name[sc]=Leghidore multimediale VLC
GenericName[sc]=Leghidore multimediale
Comment[sc]=Leghe, catura, trasmite sos flussos multimediales tuos
Name[sk]=VLC media player
GenericName[sk]=Prehrávač médií
Comment[sk]=Načítavajte, zaznamenávajte, vysielajte svoje multimediálne streamy
Name[sl]=Predvajalnik VLC
GenericName[sl]=Predvajalnik predstavnih vsebin
Comment[sl]=Berite, zajemite, oddajajte vaše večpredstavne pretoke
Name[sr]=ВЛЦ медијски плејер
GenericName[sr]=Медијски плејер
Comment[sr]=Читај, хватај, емитуј своје мултимедијалне токове
Name[sq]=VLC lexues media
GenericName[sq]=Lexues Media
Comment[sq]=Lexoni, kapni dhe transmetoni transmetimet tuaja multimedia
Name[sv]=VLC media player
GenericName[sv]=Mediaspelare
Comment[sv]=Läs, fånga, sänd dina multimediaströmmar
Name[te]=VLC మాధ్యమ ప్రదర్శకం
GenericName[te]=మాధ్యమ ప్రదర్శకం
Comment[te]=మీ బహుళమాధ్యమ ప్రవాహాలను చదువు, బంధించు మరియు ప్రసారం చేయి
Name[th]=โปรแกรมเล่นสื่อ VLC
GenericName[th]=โปรแกรมเล่นสื่อ
Comment[th]=อ่าน จับ และถ่ายทอดสตรีมมัลติมีเดียของคุณ
Name[tr]=VLC ortam oynatıcısı
GenericName[tr]=Ortam oynatıcısı
Comment[tr]=Çoklu ortam akışlarınızı okuyun, yakalayın, yayınlayın
Name[uk]=Медіапрогравач VLC
GenericName[uk]=Медіапрогравач
Comment[uk]=Читання, захоплення та поширення ваших мультимедійних потоків
Name[vi]=Trình phát media VLC
GenericName[vi]=Trình phát Media
Comment[vi]=Đọc, chụp, phát các luồng đa phương tiện của bạn
Name[wa]=Djouweu d' media VLC
GenericName[wa]=Djouweu d' media
Comment[wa]=Lét, egaloye, evoye vos floûs multimedia
Name[zh_CN]=VLC 媒体播放器
GenericName[zh_CN]=媒体播放器
Comment[zh_CN]=读取、捕获、广播您的多媒体流
Name[zh_TW]=VLC 媒體播放器
GenericName[zh_TW]=媒體播放器
Comment[zh_TW]=讀取、擷取與廣播您的多媒體串流
Exec=env QT_SCALE_FACTOR=1.5 /usr/bin/vlc --started-from-file %U
TryExec=/usr/bin/vlc
Icon=vlc
Terminal=false
Type=Application
Categories=AudioVideo;Player;Recorder;
MimeType=application/ogg;application/x-ogg;audio/ogg;audio/vorbis;audio/x-vorbis;audio/x-vorbis+ogg;video/ogg;video/x-ogm;video/x-ogm+ogg;video/x-theora+ogg;video/x-theora;audio/x-speex;audio/opus;application/x-flac;audio/flac;audio/x-flac;audio/x-ms-asf;audio/x-ms-asx;audio/x-ms-wax;audio/x-ms-wma;video/x-ms-asf;video/x-ms-asf-plugin;video/x-ms-asx;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-msvideo;audio/x-pn-windows-acm;video/divx;video/msvideo;video/vnd.divx;video/avi;video/x-avi;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/vnd.rn-realaudio;audio/x-pn-realaudio;audio/x-pn-realaudio-plugin;audio/x-real-audio;audio/x-realaudio;video/vnd.rn-realvideo;audio/mpeg;audio/mpg;audio/mp1;audio/mp2;audio/mp3;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpg;video/mp2t;video/mpeg;video/mpeg-system;video/x-mpeg;video/x-mpeg2;video/x-mpeg-system;application/mpeg4-iod;application/mpeg4-muxcodetable;application/x-extension-m4a;application/x-extension-mp4;audio/aac;audio/m4a;audio/mp4;audio/x-m4a;audio/x-aac;video/mp4;video/mp4v-es;video/x-m4v;application/x-quicktime-media-link;application/x-quicktimeplayer;video/quicktime;application/x-matroska;audio/x-matroska;video/x-matroska;video/webm;audio/webm;audio/3gpp;audio/3gpp2;audio/AMR;audio/AMR-WB;video/3gp;video/3gpp;video/3gpp2;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtsp;x-scheme-handler/rtp;x-scheme-handler/rtmp;x-scheme-handler/icy;x-scheme-handler/icyx;application/x-cd-image;x-content/video-vcd;x-content/video-svcd;x-content/video-dvd;x-content/audio-cdda;x-content/audio-player;application/ram;application/xspf+xml;audio/mpegurl;audio/x-mpegurl;audio/scpls;audio/x-scpls;text/google-video-pointer;text/x-google-video-pointer;video/vnd.mpegurl;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.ms-wpl;application/sdp;audio/dv;video/dv;audio/x-aiff;audio/x-pn-aiff;video/x-anim;video/x-nsv;video/fli;video/flv;video/x-flc;video/x-fli;video/x-flv;audio/wav;audio/x-pn-au;audio/x-pn-wav;audio/x-wav;audio/x-adpcm;audio/ac3;audio/eac3;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/basic;audio/midi;audio/x-ape;audio/x-gsm;audio/x-musepack;audio/x-tta;audio/x-wavpack;audio/x-shorten;application/x-shockwave-flash;application/x-flash-video;misc/ultravox;image/vnd.rn-realpix;audio/x-it;audio/x-mod;audio/x-s3m;audio/x-xm;application/mxf;
X-KDE-Protocols=ftp,http,https,mms,rtmp,rtsp,sftp,smb
Keywords=Player;Capture;DVD;Audio;Video;Server;Broadcast;
+1 -1
View File
@@ -1 +1 @@
v20.19.1 v26
+9 -9
View File
@@ -37,15 +37,15 @@
# Zsh >= 5.1 is required. # Zsh >= 5.1 is required.
[[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return
# Prompt colors — Nord palette. # Prompt colors — Catppuccin Frappé palette.
# https://www.nordtheme.com/docs/colors-and-palettes # https://catppuccin.com/palette/
local grey='#4C566A' # nord3 local grey='#838ba7' # overlay1
local red='#BF616A' # nord11 local red='#e78284' # red
local yellow='#EBCB8B' # nord13 local yellow='#e5c890' # yellow
local blue='#88C0D0' # nord8 local blue='#85c1dc' # sapphire
local magenta='#B48EAD' # nord15 local magenta='#ca9ee6' # mauve
local cyan='#8FBCBB' # nord7 local cyan='#81c8be' # teal
local white='#ECEFF4' # nord6 local white='#c6d0f5' # text
# Left prompt segments. # Left prompt segments.
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
-10
View File
@@ -1,10 +0,0 @@
[
{
"key": "shift+enter",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\u001b\r"
},
"when": "terminalFocus"
}
]
-1076
View File
File diff suppressed because it is too large Load Diff
+4 -1
View File
@@ -17,5 +17,8 @@ export EDITOR=micro
# Enable TrueColors for micro # Enable TrueColors for micro
export MICRO_TRUECOLOR=1 export MICRO_TRUECOLOR=1
# Set custom glamour style
export GLAMOUR_STYLE="$HOME/.catppuccin/glamour/themes/catppuccin-frappe.json"
# Set custom glow style # Set custom glow style
export GLOW_STYLE="$HOME/.config/glow/nord.json" export GLOW_STYLE="$HOME/.catppuccin/glamour/themes/catppuccin-frappe.json"
+1
View File
@@ -65,6 +65,7 @@ path_extensions=(
"$HOME/.pyenv/bin" "$HOME/.pyenv/bin"
"$HOME/.cargo/bin" "$HOME/.cargo/bin"
"$HOME/go/bin" "$HOME/go/bin"
"$HOME/.local/share/pnpm/bin"
) )
# Apply add_to_path to each directory (prepend by default) # Apply add_to_path to each directory (prepend by default)
+19 -1
View File
@@ -28,6 +28,16 @@ references:
into: .zsh/plugins/zsh-autosuggestions into: .zsh/plugins/zsh-autosuggestions
- url: https://github.com/zsh-users/zsh-syntax-highlighting.git - url: https://github.com/zsh-users/zsh-syntax-highlighting.git
into: .zsh/plugins/zsh-syntax-highlighting into: .zsh/plugins/zsh-syntax-highlighting
- url: https://github.com/catppuccin/bat.git
into: .catppuccin/bat
- url: https://github.com/catppuccin/yazi.git
into: .catppuccin/yazi
- url: https://github.com/catppuccin/zsh-syntax-highlighting.git
into: .catppuccin/zsh-syntax-highlighting
- url: https://github.com/catppuccin/micro.git
into: .catppuccin/micro
- url: https://github.com/catppuccin/glamour.git
into: .catppuccin/glamour
scripts: scripts:
git:config: | git:config: |
printf 'Name: ' && read name printf 'Name: ' && read name
@@ -61,8 +71,16 @@ scripts:
sudo apt install -y micro sudo apt install -y micro
micro:plugins: | micro:plugins: |
micro -plugin install editorconfig micro -plugin install editorconfig
bat:build: bat cache --build catppuccin:install: |
mkdir -p ~/.config/micro/colorschemes
ln -sf ~/.catppuccin/micro/themes/catppuccin-frappe.micro ~/.config/micro/colorschemes/catppuccin-frappe.micro
mkdir -p ~/.config/bat/themes
ln -sf ~/.catppuccin/bat/themes/Catppuccin\ Frappe.tmTheme ~/.config/bat/themes/Catppuccin\ Frappe.tmTheme
bat cache --build
ln -sf ~/.catppuccin/yazi/themes/frappe/catppuccin-frappe-blue.toml ~/.config/yazi/theme.toml
ln -sf ~/.catppuccin/zsh-syntax-highlighting/themes/catppuccin_frappe-zsh-syntax-highlighting.zsh ~/.zsh/catppuccin_frappe-zsh-syntax-highlighting.zsh
fonts:install: | fonts:install: |
mkdir -p ~/.local/share/fonts/Meslo mkdir -p ~/.local/share/fonts/Meslo
curl -L https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.tar.xz | tar --extract --xz --directory ~/.local/share/fonts/Meslo curl -L https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.tar.xz | tar --extract --xz --directory ~/.local/share/fonts/Meslo
fc-cache -fv fc-cache -fv
tailscale:up: sudo tailscale up --login-server https://headscale.pivoine.art
+77 -18
View File
@@ -379,22 +379,32 @@ cmd_compose() {
# ─── Update Service ─────────────────────────────────────────────────────────── # ─── Update Service ───────────────────────────────────────────────────────────
# Resolve each service's image tag to its current local SHA256 ID. # Resolve the compose config's image references to their current local SHA256
# Reads from the local image store (updated by 'docker compose pull'), # IDs, one per line, sorted. Reads from the local image store (updated by
# NOT from running containers — so the comparison reflects the pulled image. # 'docker compose pull'), NOT from running containers.
#
# Returns non-zero (and prints nothing) if the image list can't be resolved or
# none of the images are present locally — callers MUST treat that as "unknown",
# never as "everything changed".
_stack_image_ids() { _stack_image_ids() {
local stack_dir="$1"; shift local stack_dir="$1"; shift
local -a env_flag=("$@") local -a env_flag=("$@")
local images local images ids
# 'config --images' (compose v2.19+) outputs one image name per line; # 'config --images' (compose v2.19+) outputs one image name per line;
# fall back to parsing the resolved config yaml for older versions. # fall back to parsing the resolved config yaml for older versions.
if images=$(cd "$stack_dir" && docker compose "${env_flag[@]}" config --images 2>/dev/null) \ # NOTE: the fallback regex must be POSIX ([[:space:]], not \s) — mawk, the
&& [[ -n "$images" ]]; then # default awk on Debian, does not understand \s and silently matches nothing.
echo "$images" if ! images=$(cd "$stack_dir" && docker compose "${env_flag[@]}" config --images 2>/dev/null) \
else || [[ -z "$images" ]]; then
cd "$stack_dir" && docker compose "${env_flag[@]}" config 2>/dev/null \ images=$(cd "$stack_dir" && docker compose "${env_flag[@]}" config 2>/dev/null \
| awk '/^\s+image:/{print $2}' | sort -u | awk '/^[[:space:]]+image:/{print $2}' | sort -u) || true
fi | xargs -r docker image inspect --format '{{.Id}}' 2>/dev/null | sort fi
[[ -n "$images" ]] || return 1
ids=$(echo "$images" | xargs -r docker image inspect --format '{{.Id}}' 2>/dev/null | sort) || true
[[ -n "$ids" ]] || return 1
echo "$ids"
} }
_update_run() { _update_run() {
@@ -402,7 +412,7 @@ _update_run() {
local -a all_stacks=() local -a all_stacks=()
mapfile -t all_stacks < <(list_all_stacks) mapfile -t all_stacks < <(list_all_stacks)
local -a updated=() failed=() local -a updated=() failed=() skipped=()
local -i checked=0 local -i checked=0
log "Starting image update check (${#all_stacks[@]} stacks)" log "Starting image update check (${#all_stacks[@]} stacks)"
@@ -415,13 +425,56 @@ _update_run() {
info "Checking ${BOLD}$stack${RESET}" info "Checking ${BOLD}$stack${RESET}"
((checked++)) || true ((checked++)) || true
local before after # --- Pull, with retry. Nightly runs regularly hit transient registry
before=$(_stack_image_ids "$stack_dir" "${env_flag[@]+"${env_flag[@]}"}") || true # errors (toomanyrequests, TLS resets, gitea registry restarting) that
(cd "$stack_dir" && docker compose "${env_flag[@]}" pull 2>&1) || true # a short backoff clears. A pull that never succeeds must NOT fall
after=$(_stack_image_ids "$stack_dir" "${env_flag[@]+"${env_flag[@]}"}") || true # through to the change check — otherwise a stale image looks
# "up to date" forever (this is what stuck coolify). ---
local pull_ok=false attempt
for attempt in 1 2 3 4 5; do
if (cd "$stack_dir" && docker compose "${env_flag[@]}" pull 2>&1); then
pull_ok=true
break
fi
warn " Pull failed for $stack (attempt $attempt/5)"
[[ $attempt -lt 5 ]] && sleep $((attempt * 20))
done
if ! $pull_ok; then
err " Pull failed for $stack after 5 attempts — skipping (not recreated)"
skipped+=("$stack")
continue
fi
if [[ "$before" != "$after" ]]; then # --- Decide whether a recreate is needed by comparing the image IDs the
# RUNNING containers use against the IDs the (post-pull) config
# resolves to. Unlike the old before/after snapshot diff, a transient
# empty read here can't be mistaken for "everything changed" — an
# unresolvable list is skipped, not acted on. ---
local desired current
desired=$(_stack_image_ids "$stack_dir" "${env_flag[@]+"${env_flag[@]}"}") || desired=""
if [[ -z "$desired" ]]; then
warn " Could not resolve images for $stack — skipping (not recreated)"
skipped+=("$stack")
continue
fi
current=$(cd "$stack_dir" && docker compose "${env_flag[@]}" ps -q 2>/dev/null \
| xargs -r docker inspect --format '{{.Image}}' 2>/dev/null | sort -u)
if [[ -z "$current" ]]; then
info " Up to date (stack not running — left as is)"
continue
fi
local stale=false cid
while IFS= read -r cid; do
[[ -z "$cid" ]] && continue
grep -qxF -- "$cid" <<<"$desired" || stale=true
done <<<"$current"
if $stale; then
info " Updates found — recreating $stack" info " Updates found — recreating $stack"
info " running: ${current//$'\n'/ }"
info " resolved: ${desired//$'\n'/ }"
if (cd "$stack_dir" && docker compose "${env_flag[@]}" up -d 2>&1); then if (cd "$stack_dir" && docker compose "${env_flag[@]}" up -d 2>&1); then
updated+=("$stack") updated+=("$stack")
ok " $stack updated" ok " $stack updated"
@@ -440,9 +493,14 @@ _update_run() {
local date_str local date_str
date_str="$(date '+%Y-%m-%d %H:%M')" date_str="$(date '+%Y-%m-%d %H:%M')"
local skipped_line=""
[[ ${#skipped[@]} -gt 0 ]] && skipped_line="\n⚠️ Skipped (transient errors, not recreated): ${skipped[*]}"
if [[ ${#failed[@]} -gt 0 ]]; then if [[ ${#failed[@]} -gt 0 ]]; then
_notify "#cc0000" "❌ **Update failed** — $date_str\nUpdated: ${updated[*]:-none}\nFailed: ${failed[*]}" _notify "#cc0000" "❌ **Update failed** — $date_str\nUpdated: ${updated[*]:-none}\nFailed: ${failed[*]}${skipped_line}"
return 1 return 1
elif [[ ${#skipped[@]} -gt 0 ]]; then
_notify "#e8a33d" "⚠️ **Update finished with warnings** — $date_str\nUpdated: ${updated[*]:-none}${skipped_line}"
elif [[ ${#updated[@]} -gt 0 ]]; then elif [[ ${#updated[@]} -gt 0 ]]; then
_notify "#36a64f" "✅ **Updates applied** — $date_str\nStacks updated (${#updated[@]}/$checked): ${updated[*]}" _notify "#36a64f" "✅ **Updates applied** — $date_str\nStacks updated (${#updated[@]}/$checked): ${updated[*]}"
else else
@@ -482,6 +540,7 @@ Description=Daily Docker stacks image update at 2:00 AM
[Timer] [Timer]
OnCalendar=*-*-* 02:00:00 Europe/Amsterdam OnCalendar=*-*-* 02:00:00 Europe/Amsterdam
RandomizedDelaySec=1800
Persistent=true Persistent=true
[Install] [Install]
+486
View File
@@ -0,0 +1,486 @@
# TriggerShell configuration.
# Full reference: https://dev.pivoine.art/valknar/triggershell.git (see docs/CONFIG_REFERENCE.md)
server:
host: 0.0.0.0
port: 4173
auth:
enabled: true
# Must be >= 32 characters if auth is enabled. Kept out of this file - `triggershell init`
# generated one into .env (TRIGGERSHELL_SESSION_SECRET) alongside this config.
sessionSecret: "${TRIGGERSHELL_SESSION_SECRET}"
sessionTtlHours: 12
users:
- username: admin
passwordHash: ${TRIGGERSHELL_USER_ADMIN_PASSWORD_HASH}
# Add a user with: triggershell users add <username>
tokens:
- name: test-verification
tokenHash: ${TRIGGERSHELL_TOKEN_TEST_VERIFICATION_HASH}
# Add an API token with: triggershell users add-token <name>
database:
path: .triggershell/triggershell.db
logs:
dir: .triggershell/logs
retentionDays: 30
scripts:
- id: openrgb-hue-apply
name: "OpenRGB: Apply Hue Scene"
description: Apply a Philips Hue scene as a static color gradient across OpenRGB-controlled lights (motherboard, GPU, RAM, etc).
command: bash
args:
- -c
- |
# systemd --user units run with a minimal PATH that skips pyenv shims
# and pip's --user bin dir, so add the common locations as a fallback.
export PATH="$HOME/.local/bin:$HOME/.pyenv/shims:$PATH"
if ! command -v openrgb-hue >/dev/null 2>&1; then
echo "error: 'openrgb-hue' was not found on PATH." >&2
echo "Install it with:" >&2
echo " pip install --index-url https://dev.pivoine.art/api/packages/valknar/pypi/simple/ --extra-index-url https://pypi.org/simple openrgb-hue" >&2
exit 1
fi
exec openrgb-hue apply "$SCENE" "$@"
- openrgb-hue-apply
cwd: ./
timeoutSeconds: 30
variables:
- name: scene
label: Scene
description: Philips Hue scene to render as a gradient.
type: enum
required: true
control: combobox
passAs: env
envName: SCENE
choices:
- "Tropical twilight"
- "Blossom"
- "Bright"
- "Savanna sunset"
- "Relax"
- "Energize"
- "Dreamy dusk"
- "Concentrate"
- "Warm embrace"
- "Golden pond"
- "Honolulu"
- "Rest"
- "Ruby glow"
- "Rolling hills"
- "Precious"
- "Cool bright"
- "Mountain breeze"
- "Read"
- "Dimmed"
- "Narcissa"
- "Crocus"
- "Nightlight"
- "São Paulo"
- "Ruby romance"
- "Sunset allure"
- "Smitten"
- "Promise"
- "City of love"
- "Lovebirds"
- "Glitz and glam"
- "Nighttime"
- "Unwind"
- "Shine"
- "Sleepy"
- "Storybook"
- "Arise"
- "Baby's breath"
- "Malibu pink"
- "Rio"
- "Ibiza"
- "Tokyo"
- "Fairfax"
- "Cancun"
- "Chinatown"
- "Osaka"
- "Motown"
- "Galaxy"
- "Blood moon"
- "Moonlight"
- "Starlight"
- "Arctic aurora"
- "Nebula"
- "Ocean dawn"
- "Sunday morning"
- "Spring blossom"
- "Lake mist"
- "Frosty dawn"
- "Emerald isle"
- "Beginnings"
- "Horizon"
- "Sunflare"
- "First light"
- "Valley dawn"
- "Emerald flutter"
- "Memento"
- "Resplendent"
- "Scarlet dream"
- "Amethyst valley"
- "Hazy days"
- "Autumn gold"
- "Winter mountain"
- "Misty ridge"
- "Midsummer sun"
- "Spring lake"
- "Midwinter"
- "Amber bloom"
- "Painted sky"
- "Orange fields"
- "Blue Planet"
- "Lily"
- "Winter beauty"
- "Forest adventure"
- "Meriete"
- "Soho"
- "Magneto"
- "Disturbia"
- "Vapor wave"
- "Tyrell"
- "Hal"
- "Still waters"
- "Pensive"
- "Sundown"
- "Palm Beach"
- "Adrift"
- "Majestic morning"
- "Blue lagoon"
- "Lake Placid"
- "Zandvoort"
- "Miami"
- "Bahrain"
- "Singapore"
- "Silverstone"
- "Suzuka"
- name: mapping
label: Mapping Mode
description: How the gradient is laid out across your LEDs.
type: enum
choices: [sequence, per-device, per-zone, matrix, mirror, shuffle]
default: per-zone
control: select
passAs: arg
argName: --mapping
- name: direction
label: Matrix Direction
description: Only used when mapping is "matrix".
type: enum
choices: [left-right, top-bottom, diagonal, radial]
default: left-right
control: select
passAs: arg
argName: --direction
- name: deviceType
label: Device Type
description: Limit to devices of this type. Leave unset to target every device.
type: enum
required: false
choices: [DRAM, GPU, MOTHERBOARD]
control: select
passAs: arg
argName: --device-type
- name: device
label: Device
description: Limit to a single device by name. Leave unset to target every device.
type: enum
required: false
choices:
- "Corsair Vengeance RGB DDR5"
- "Gigabyte GeForce RTX 3060 Gaming OC"
- "MSI MYSTIC LIGHT"
control: select
passAs: arg
argName: --device
- name: zone
label: Zone
description: Limit to a single zone by name. Leave unset to target every zone.
type: enum
required: false
choices:
- "Corsair DRAM"
- "GPU Zone"
- "JAF"
- "JARGB 1"
- "JARGB 2"
- "JARGB 3"
control: select
passAs: arg
argName: --zone
- name: seed
label: Shuffle Seed
description: Only used when mapping is "shuffle".
type: number
default: 0
passAs: arg
argName: --seed
- name: interpolation
label: Interpolation
description: Color space used to interpolate between gradient stops.
type: enum
choices: [rgb, hsv]
default: hsv
control: select
passAs: arg
argName: --interpolation
- name: dim
label: Dim
description: Global brightness multiplier (0-1), independent of the scene's own brightness.
type: number
default: 1.0
min: 0
max: 1
step: 0.05
control: slider
passAs: arg
argName: --dim
- name: noDedupe
label: Disable Color Deduping
description: Keep consecutive duplicate colors instead of collapsing them into one gradient stop.
type: boolean
default: false
control: switch
passAs: flag
argName: --no-dedupe
- name: noBrightness
label: Ignore Scene Brightness
description: Don't scale each gradient stop by the scene's recorded light brightness.
type: boolean
default: false
control: switch
passAs: flag
argName: --no-brightness
- name: fast
label: Fast Mode
description: Use OpenRGB's no-readback fast update mode.
type: boolean
default: false
control: switch
passAs: flag
argName: --fast
- name: dryRun
label: Dry Run
description: Preview the result without touching real hardware.
type: boolean
default: false
control: switch
passAs: flag
argName: --dry-run
- name: dryRunLeds
label: Dry Run LED Count
description: Number of synthetic flat LEDs to use for Dry Run. Ignored otherwise.
type: number
required: false
min: 1
passAs: arg
argName: --dry-run-leds
- id: openrgb-hue-off
name: "OpenRGB: Turn Off Lights"
description: Turn off OpenRGB-controlled LEDs. Leave every filter unset to turn off all of them.
command: bash
args:
- -c
- |
export PATH="$HOME/.local/bin:$HOME/.pyenv/shims:$PATH"
if ! command -v openrgb-hue >/dev/null 2>&1; then
echo "error: 'openrgb-hue' was not found on PATH." >&2
echo "Install it with:" >&2
echo " pip install --index-url https://dev.pivoine.art/api/packages/valknar/pypi/simple/ --extra-index-url https://pypi.org/simple openrgb-hue" >&2
exit 1
fi
exec openrgb-hue off "$@"
- openrgb-hue-off
cwd: ./
timeoutSeconds: 30
variables:
- name: deviceType
label: Device Type
description: Limit to devices of this type. Leave unset to target every device.
type: enum
required: false
choices: [DRAM, GPU, MOTHERBOARD]
control: select
passAs: arg
argName: --device-type
- name: device
label: Device
description: Limit to a single device by name. Leave unset to target every device.
type: enum
required: false
choices:
- "Corsair Vengeance RGB DDR5"
- "Gigabyte GeForce RTX 3060 Gaming OC"
- "MSI MYSTIC LIGHT"
control: select
passAs: arg
argName: --device
- name: zone
label: Zone
description: Limit to a single zone by name. Leave unset to target every zone.
type: enum
required: false
choices:
- "Corsair DRAM"
- "GPU Zone"
- "JAF"
- "JARGB 1"
- "JARGB 2"
- "JARGB 3"
control: select
passAs: arg
argName: --zone
- id: spotify-start
name: "Spotify: Start App"
description: >-
Launch the Spotify desktop app on the local session. Does nothing if it is
already running (Spotify focuses its existing window).
command: bash
args:
- -c
- |
# triggershell.service starts before the graphical session, so its own
# environment has no WAYLAND_DISPLAY/DISPLAY and a stripped-down PATH.
# systemd-run --user launches Spotify from the user manager instead,
# which does carry the full graphical environment.
if systemctl --user --quiet is-active spotify.service; then
echo "Spotify is already running."
exit 0
fi
systemctl --user reset-failed spotify.service 2>/dev/null || true
exec systemd-run --user --collect --quiet --unit=spotify spotify-launcher
- spotify-start
cwd: ./
timeoutSeconds: 20
variables: []
- id: spotify-stop
name: "Spotify: Stop Playback"
description: >-
Pauses Spotify playback on the local session via its MPRIS D-Bus
interface. Does nothing if Spotify is not running.
command: bash
args:
- -c
- |
# triggershell.service starts before the graphical session and has no
# DBUS_SESSION_BUS_ADDRESS, so point dbus-send at the user bus socket
# directly (systemctl --user works here, so this socket exists).
bus="unix:path=${XDG_RUNTIME_DIR:-/run/user/$(id -u)}/bus"
if ! dbus-send --bus="$bus" --print-reply --dest=org.freedesktop.DBus \
/org/freedesktop/DBus org.freedesktop.DBus.ListNames 2>/dev/null \
| grep -q '"org.mpris.MediaPlayer2.spotify"'; then
echo "Spotify is not running."
exit 0
fi
exec dbus-send --bus="$bus" --print-reply --type=method_call \
--dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 \
org.mpris.MediaPlayer2.Player.Pause
- spotify-stop
cwd: ./
timeoutSeconds: 15
variables: []
- id: system-shutdown
name: "System: Shutdown"
description: >-
Powers off this machine. Type "shutdown" in the Confirm field to proceed.
Optionally schedule it a few minutes out (cancel a pending one with "System: Cancel Shutdown").
command: bash
args:
- -c
- >-
if [ "$CONFIRM" != "shutdown" ]; then
echo 'Aborted: type "shutdown" in the Confirm field to proceed.' >&2; exit 1;
fi;
when=now;
if [ "${DELAY_MINUTES:-0}" -gt 0 ] 2>/dev/null; then when="+$DELAY_MINUTES"; fi;
echo "Scheduling poweroff ($when)...";
exec shutdown -h "$when"
timeoutSeconds: 30
variables:
- name: confirm
label: Confirm
description: Type "shutdown" (exactly) to confirm you want to power off this machine.
type: string
required: true
pattern: "^shutdown$"
passAs: env
envName: CONFIRM
- name: delayMinutes
label: Delay (minutes)
description: Wait this many minutes before powering off. 0 = immediately.
type: number
default: 0
min: 0
max: 120
passAs: env
envName: DELAY_MINUTES
- id: system-reboot
name: "System: Reboot"
description: >-
Reboots this machine. Type "reboot" in the Confirm field to proceed.
Optionally schedule it a few minutes out (cancel a pending one with "System: Cancel Shutdown").
command: bash
args:
- -c
- >-
if [ "$CONFIRM" != "reboot" ]; then
echo 'Aborted: type "reboot" in the Confirm field to proceed.' >&2; exit 1;
fi;
when=now;
if [ "${DELAY_MINUTES:-0}" -gt 0 ] 2>/dev/null; then when="+$DELAY_MINUTES"; fi;
echo "Scheduling reboot ($when)...";
exec shutdown -r "$when"
timeoutSeconds: 30
variables:
- name: confirm
label: Confirm
description: Type "reboot" (exactly) to confirm you want to reboot this machine.
type: string
required: true
pattern: "^reboot$"
passAs: env
envName: CONFIRM
- name: delayMinutes
label: Delay (minutes)
description: Wait this many minutes before rebooting. 0 = immediately.
type: number
default: 0
min: 0
max: 120
passAs: env
envName: DELAY_MINUTES
- id: system-cancel-shutdown
name: "System: Cancel Shutdown"
description: Cancels a pending scheduled shutdown or reboot.
command: shutdown
args: ["-c"]
timeoutSeconds: 15
variables: []