Commit Graph
128 Commits
Author SHA1 Message Date
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
valknar f703b52d44 chore: cleanup bin/README.md 2026-06-29 16:17:08 +02:00
valknarandClaude Sonnet 4.6 e15dd0a6c5 feat: set GLOW_STYLE and add glow to go:install:tools
- .zshenv: export GLOW_STYLE pointing to Nord theme JSON
- arty.yml: add glow v2 to go:install:tools

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 18:26:04 +02:00
valknarandClaude Sonnet 4.6 2a7059783b revert(arty): remove glow style workaround — use GLAMOUR_STYLE in zshenv
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 18:24:48 +02:00
valknarandClaude Sonnet 4.6 f9d4ab8c33 fix(arty): work around glow ~ expansion bug in style path
glow v2.1.2 validates the style path with ~ expanded but passes the
original unexpanded string to glamour's file reader, causing ENOENT.
Fix: pass the style via --style flag so bash expands $HOME before glow
sees it. Revert glow.yml style to "auto" (unused when arty drives it).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 18:20:42 +02:00
valknarandClaude Sonnet 4.6 f36e978846 fix(glow): use ~ relative path for Nord style
glow expands ~ via go-homedir, so the absolute path is not needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 18:16:16 +02:00
valknarandClaude Sonnet 4.6 52a5409495 feat: apply Nord theme to glow markdown renderer
- Add .config/glow/nord.json — full glamour style using Nord palette
  (Polar Night bg, Frost headings, Aurora syntax, Snow Storm text)
- Configure glow.yml to use the Nord style by default
- Track both glow files in .gitignore whitelist

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 18:13:10 +02:00
valknar e3f8f8a742 docs: update README.md 2026-06-24 10:47:42 +02:00
valknarandClaude Sonnet 4.6 22e8229903 fix(arty): render description as plain markdown, not blockquote
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 10:46:35 +02:00
valknarandClaude Sonnet 4.6 a8d2f457eb feat(arty): generate full Markdown doc in notes command
- New generate_notes_md(): builds title, description blockquote,
  dependencies table, per-script fenced blocks, and details section
  from the entire arty.yml using existing yq helpers
- show_notes() now accepts --raw to print raw Markdown; formatted
  mode pipes through the same glow/mdcat/python3 render pipeline
- Removes the decorative ━━━ border (clashes with full-document output)
- main() passes args[] through to show_notes for flag forwarding

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 10:42:57 +02:00
valknar 31932b956b chore: cleanup 2026-06-24 10:17:35 +02:00
valknar 30eaba9971 fix: add git config cmd to setup 2026-06-24 04:59:55 +02:00
valknar e644f32cfe fix: git config script indention in file 2026-06-23 21:05:53 +02:00
valknarandClaude Sonnet 4.6 428ec75bd4 feat(arty): add git:config script to create .gitconfig.local
Prompts for name and email, writes [user] section to ~/.gitconfig.local
which is already included by .gitconfig.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 21:02:51 +02:00
valknar a5a9bbfd26 fix: arty.yml cleanup 2026-06-23 12:28:10 +02:00
valknar 23aacf1900 feat: .gitconfig alias 2026-06-23 11:57:08 +02:00
valknar d73822bacb fix: .gitconfig 2026-06-23 11:39:10 +02:00
valknar fbaa4f170a fix: .gitconfig 2026-06-23 11:26:14 +02:00
valknar d3427ae137 fix: ssh keygen with git email 2026-06-23 10:56:32 +02:00
valknarandClaude Sonnet 4.6 98d004b4d9 fix(arty): source nvm.sh before nvm install
nvm is a shell function, not a binary — it doesn't survive into arty's
subprocess. Sourcing nvm.sh inline makes it available.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 10:35:59 +02:00