Compare

0c8fa3a2a270747f3dbb54fe8792f3f0aec997e3main · 13 commits

merge base 0c8fa3a2a270…

Changed files

Commits

HashSubjectAuthorDate
a2c01524 Change default to be for any screen other than internal so its a bit more gene… Ryan Schanzenbacher
c589cef1 Added vorsaint and settings file, refactor yabai Ryan Schanzenbacher
cd1edb81 thought kdenlive worked on darwin Ryan Schanzenbacher
2e301216 remove unneeded AI documentation Ryan Schanzenbacher
397af8b5 Should be good, need to clean slop still Ryan Schanzenbacher
181f59e7 ssh fix in guix Ryan Schanzenbacher
cabf188a various fixes to guix Ryan Schanzenbacher
0ce4331f extra linux package Ryan Schanzenbacher
08d200c7 cleanup work Ryan Schanzenbacher
7108fc28 bump flake.lock for things and remove some comments Ryan Schanzenbacher
63e15655 remove some stuff Ryan Schanzenbacher
1e8ce618 temp Ryan Schanzenbacher
22e588d2 Document git-submodule wiring into guix-dotfiles in MIGRATION.md Ryan Schanzenbacher
diff --git a/MIGRATION.md b/MIGRATION.md
deleted file mode 100644
index 0e3f7f4..0000000
--- a/MIGRATION.md
+++ /dev/null
@@ -1,221 +0,0 @@
-# Migrating guix-dotfiles onto nix-combined
-
-This repo supersedes `guix-dotfiles/home-config/nix-home-manager` (the ad-hoc
-home-manager flake guix-dotfiles was already using) and pulls Linux desktop
-config that used to live in `guix-dotfiles/home-config/home-configuration.scm`
-into home-manager proper. It does **not** replace Guix itself: package
-management, the system config, and three specific home services stay in
-Guix (see "Stays in Guix" below). Nothing in `guix-dotfiles` has been edited
-by this migration - the changes below are for you to apply by hand.
-
-## 1. Point `home-manager` at this repo
-
-In `guix-dotfiles/home-config/home-configuration.scm`, `%home-symlinks`
-currently has:
-
-```scheme
-(".config/guix/home-config/nix-home-manager" ".config/home-manager")
-```
-
-Change the target to wherever you clone `nix-combined`, e.g.:
-
-```scheme
-("/path/to/nix-combined" ".config/home-manager")
-```
-
-Then switch with `home-manager switch --flake ~/.config/home-manager#ryan`
-(the `rebuild` zsh alias does this on Linux). The old
-`guix-dotfiles/home-config/nix-home-manager` directory can be deleted once
-you've confirmed the new flake builds and switches cleanly.
-
-**Leave the `nix-config` symlink entry alone for the first switch.** It's
-what sets `experimental-features = nix-command flakes` for your user today,
-which is what lets `home-manager`/`nix` read this flake at all -
-home-manager can't bootstrap its own prerequisite. `linux.nix` now writes
-its own `~/.config/nix/nix.conf` and `~/.config/nix/registry.json` via
-`xdg.configFile`, so *after* the first successful switch, remove the
-`nix-config` entry from `%home-symlinks` too - otherwise HM's files resolve
-through that symlink and land as untracked files inside the guix-dotfiles
-checkout instead of in the Nix store.
-
-## 2. Remove entries `home-configuration.scm` now duplicates
-
-Once nix-combined delivers a path, Guix must stop also writing it, or
-activation will collide (two things trying to own the same symlink target).
-In `home-configuration.scm`'s `home-xdg-configuration-files-service-type` and
-`home-files-service-type`, remove these lines (nix-combined now owns them):
-
-- `"nvim/init.vim"`, `"nvim/after/ftplugin/markdown/custom.vim"`,
- `"nvim/after/ftplugin/mail/custom.vim"` - nix-combined's neovim config
- (lazy.nvim-based, in `users/ryan/modules/nvim`) is the canonical one now;
- the old vim-plug based `nvim/config/init.vim` + `plug.vim` is superseded.
-- `"hypr/monitors.conf"`, `"hypr/pyprland.toml"`, `"hypr/family_guy.mp4"`,
- `"hypr/hyprlock.conf"`, `"hypr/hypridle.conf"`, `"hypr/kanshi.conf"`,
- `"hypr/subwaysurfer.webm"`, `"hypr/scripts"` (the `hyprland.conf` itself
- was already coming from the old nix-home-manager flake, unchanged in
- spirit here - just re-homed)
-- `"wpaperd"`, `"mpv"`, `"foot"`, `"waybar"`, `"alacritty"`, `"aerc"`
-- `"pulse/client.conf"`
-- `.local/share/nvim/site/autoload/plug.vim` (dead once nvim is lazy.nvim-based)
-- `.local/share/mailvelope`, `.mozilla/native-messaging-hosts/tridactyl.json`,
- `.local/share/tridactyl`
-- **`.icons`** (from `home-files-service-type`) - this one isn't optional
- cleanup, it's a hard prerequisite. Guix delivers `.icons` today as a
- single recursive `local-file` symlink, but `linux.nix`'s
- `home.pointerCursor` (with `x11.enable = true`) needs to write
- `~/.icons/default/index.theme` itself. With the old symlink still in
- place, HM can't create a file inside a symlinked-to-store directory and
- activation fails outright. Remove this entry before your first
- `home-manager switch`.
-- `.gitconfig` (nix-combined's `programs.git` now owns this, with the
- `filter.lfs` and `[sendemail]` sections merged in - they existed in
- guix-dotfiles' `.gitconfig` but were missing from the old nix-dotfiles config)
-- `.ssh/config` (same story - nix-combined's `programs.ssh.settings` is a
- strict superset: added the `linode` host, the `192.168.216.1`
- legacy-algorithm host, the `KexAlgorithms` exclusion on `Host *`, and the
- `Match host * exec "gpg-connect-agent ..."` line)
-- `.docker/cli-plugins` (docker-compose plugin - if you still want this,
- it's cheap to add to `users/ryan/linux.nix`'s `home.file`; it wasn't
- carried over because nothing else referenced it and I didn't want to
- guess at whether you still use it)
-
-`hypr/Wallpapers` and the sway config were left alone deliberately - you said
-you'd handle wallpapers yourself, and `sway` isn't referenced by anything
-active (Hyprland is the real WM; see "Dead/unused" below).
-
-## 3. Switch the login shell to zsh
-
-`guix-dotfiles/modules/ryan-config/base-system.scm`'s `base-operating-system`
-has:
-
-```scheme
-;(shell (file-append zsh "/bin/zsh"))
-```
-
-commented out, so your account's login shell is still bash even though the
-canonical config (nix-dotfiles, and now nix-combined) is zsh. Uncomment that
-line (and rebuild/reconfigure the system) so `programs.zsh` in
-`users/ryan/common.nix` is actually what runs on login. Until you do, bash
-still runs (Guix's `home-bash-service-type` config, if still present, keeps
-working - just don't remove it from `home-configuration.scm` until the shell
-is actually switched, or you'll drop to a shell with no rc file at all).
-
-## Stays in Guix - no home-manager equivalent without systemd
-
-Home-manager's `services.*` modules assume a systemd user session to
-autostart things (or launchd on macOS). Guix uses shepherd instead, and
-home-manager has no shepherd backend. These three keep running exactly as
-they do today, defined in `guix-dotfiles/modules/ryan-services/`:
-
-- **`home-pipewire-service-type`** (pipewire + wireplumber daemons)
-- **`home-dbus-service-type`** (per-user session dbus, since Guix has no
- systemd --user to provide one)
-- **`downloads-garbage-collector-service-type`** (the weekly Downloads
- cleanup shepherd timer)
-
-`home-gpg-agent-service-type` is the one service that *did* migrate cleanly:
-gpg-agent doesn't need a supervisor. It's socket-activated the same way on
-both platforms via the zsh init in `common.nix`
-(`gpgconf --launch gpg-agent` + exporting `SSH_AUTH_SOCK`), which is exactly
-what nix-dotfiles' darwin config already did. `linux.nix` points
-`services.gpg-agent.pinentry.package` at nixpkgs' `pinentry-qt` rather than
-Guix's system profile path, so it isn't cross-dependent on Guix.
-
-`home-spotifyd-service-type` is already commented out/disabled in
-`home-configuration.scm` - nothing to do there.
-
-## Dead/unused - candidates to delete from guix-dotfiles
-
-Found while comparing the two repos; none of these are referenced by
-anything active, so nothing carried them into nix-combined:
-
-- **fish** (`home-config/fish/`) - the `fish` package is commented out of
- `home-configuration.scm`'s package list, but the dotfiles are still
- checked in. Orphaned.
-- **`.nix-channels`** - classic (non-flake) nix-channel file. Now that
- everything is flake-based, this shouldn't be needed.
-- **`icons/XCursor-Pro-Dark*`** - not referenced anywhere; only
- `Bibata-Modern-*` appears in `hypr/hyprland.conf`.
-- **`fonts/Fira Code`, `fonts/Lilex`, `fonts/Monofur For Powerline`,
- `fonts/AnonymicePro`, `fonts/MonofurNerdFont`** - superseded by
- `nerd-fonts.{fira-code,lilex,anonymice,monofur}` from nixpkgs
- (`linux.nix`'s `home.packages`), which ship the same font families.
-- **`home-spotifyd-service-type`** usage - already disabled.
-- **`alacritty`** - config exists in both repos, but no package installs the
- `alacritty` binary in either the guix or the old nix-home-manager config.
- `foot` is what's actually wired into the system (Guix package list,
- kmscon login). I added `pkgs.alacritty` to `linux.nix` so the config isn't
- dead weight, but confirm whether you still use it - if not, drop both the
- package and `users/ryan/linux/alacritty/`.
-- **`sway` config** - not referenced by anything; Hyprland (via
- home-manager) is the actual compositor in use.
-
-## Additive merges (things nix-dotfiles was missing, now fixed)
-
-- **aerc**: `signature_personal`, `signature_rit_personal`,
- `templates/quoted_reply`, `templates/thanks` existed only in
- guix-dotfiles' aerc config, even though `accounts.conf`/`aerc.conf`
- already referenced them by path. Copied into `users/ryan/aerc/`.
-- **git**: `filter.lfs` and `[sendemail]` sections, merged into
- `common.nix`'s `programs.git.settings`.
-- **ssh**: `linode`, `192.168.216.1` (legacy host key/pubkey algorithms),
- the `KexAlgorithms` exclusion, and the `Match host * exec ...` line,
- merged into `common.nix`'s `programs.ssh`.
-
-## Linux desktop stack re-pin (see also the flake-version conversation)
-
-The old `guix-dotfiles/home-config/nix-home-manager/flake.nix` pinned
-home-manager to a 2024 commit specifically so it'd match separately-pinned
-`hyprland`/`hyprlock`/`hyprpicker`/`wpaperd` flake inputs (plus a
-`ryan77627/nixGL` fork and a `rust-overlay` pin for wpaperd). Sharing
-`common.nix` with the darwin config (which tracks home-manager master)
-required moving Linux onto the same nixpkgs/home-manager as darwin.
-
-The good news: current nixpkgs-unstable now packages `hyprland` (0.52.2),
-`hyprlock`, `hypridle`, `hyprpicker`, `wpaperd`, `kanshi`, and `pyprland`
-directly, so those five extra flake inputs (and the rust-overlay pin) are
-gone entirely - `linux.nix` just uses `pkgs.hyprland` etc. Only two
-Linux-specific flake inputs remain in `flake.nix`:
-
-- `nixgl` (still needed - it exists specifically to patch Guix's mesa/GL
- mismatch, unrelated to nixpkgs version)
-- `clipboard-sync` (not in nixpkgs)
-
-**Dropped**: the `hypr-dynamic-cursors` Hyprland plugin (animated cursor
-trails). It has no nixpkgs package and pinning a matching flake input just
-for one cosmetic plugin didn't seem worth the added re-pin risk. If you want
-it back, add it as a flake input with `inputs.nixpkgs.follows = "nixpkgs"`
-and pass it as a plugin in `wayland.windowManager.hyprland.plugins`.
-
-**Dropped**: `mozff` (firefox-nightly flake) - unused. The
-`firefox-nightly` module's package line was already commented out in the
-guix config; it just configures `programs.firefox` (nixpkgs' own package).
-
-**Cursor theme changed**: the vendored `Bibata-Modern-Classic-Hyprland` /
-`Bibata-Modern-daed9-v1.0.2-x11` asset had oddly-versioned internal theme
-names from however that release was originally packaged. Replaced with
-nixpkgs' `bibata-cursors` (`home.pointerCursor` in `linux.nix`) - the
-`HYPRCURSOR_THEME`/`XCURSOR_THEME` env vars in `hyprland.conf` were updated
-to the plain name `Bibata-Modern-Classic` to match. nixpkgs' build doesn't
-have a `-Hyprland`-suffixed hyprcursor variant; Hyprland falls back to
-rendering the XCursor theme directly, which works fine, just without the
-optional cleaner hyprcursor rendering path.
-
-## Verification note
-
-`homeConfigurations.ryan` was checked with:
-
-```
-nix eval --raw .#homeConfigurations.ryan.activationPackage.drvPath
-```
-
-which forces full module evaluation (catches missing options and
-darwin-only packages referenced on Linux) without building anything.
-
-`darwinConfigurations.RyanMac` could not be evaluated on this machine (no
-aarch64-darwin builder). It was verified by structural diff instead:
-`flake.nix`'s darwin-facing inputs/outputs, `hosts/RyanMac/configuration.nix`,
-and `modules/darwin/random-wallpaper` are unchanged from `nix-dotfiles`;
-`common.nix`/`darwin.nix` reproduce `nix-dotfiles/users/ryan/home.nix`
-line-for-line except where noted above. Please run
-`darwin-rebuild build --flake .#RyanMac` yourself before switching for real.
diff --git a/README.md b/README.md
deleted file mode 100644
index 8476171..0000000
--- a/README.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# nix-combined
-
-One flake, two targets:
-
-- `darwinConfigurations.RyanMac` - the mac system (nix-darwin + home-manager),
- equivalent to what `nix-dotfiles` built.
-- `homeConfigurations.ryan` - standalone home-manager for `x86_64-linux`,
- meant to run *on top of* Guix System as the home-manager substitute for
- what `guix-dotfiles/home-config/home-configuration.scm` used to fully own.
- Guix still owns the system config, package management, and three home
- services that need shepherd (pipewire, dbus, downloads-gc) - see
- `MIGRATION.md`.
-
-`users/ryan/common.nix` holds everything shared by both (git, ssh, gpg-agent,
-starship, zsh, zen-browser, neovim). `darwin.nix` and `linux.nix` hold the
-platform-specific rest.
-
-## Darwin
-
-```
-sudo nix run --extra-experimental-features "nix-command flakes" github:nix-darwin/nix-darwin -- switch --flake .#RyanMac \
- --option "extra-substituters" "https://virby-nix-darwin.cachix.org" \
- --option "extra-trusted-public-keys" "virby-nix-darwin.cachix.org-1:z9GiEZeBU5bEeoDQjyfHPMGPBaIQJOOvYOOjGMKIlLo="
-```
-
-Subsequent rebuilds: `rebuild` (zsh alias) or
-`sudo darwin-rebuild switch --flake ~/.config/nix/.`
-
-## Linux (Guix)
-
-Requires `experimental-features = nix-command flakes` in
-`~/.config/nix/nix.conf` (guix-dotfiles already symlinks this in).
-
-```
-nix run --extra-experimental-features "nix-command flakes" home-manager -- switch --flake .#ryan
-```
-
-Subsequent rebuilds: `rebuild` (zsh alias) or
-`home-manager switch --flake ~/.config/home-manager#ryan`.
-
-See `MIGRATION.md` for what needs to change in `guix-dotfiles` for this to
-slot in cleanly (symlink target, overlapping config entries to remove, the
-zsh login-shell switch), what stays Guix-native and why, and what got
-dropped as dead weight along the way.
diff --git a/files/darwin-settings/vorssaint_settings.plist b/files/darwin-settings/vorssaint_settings.plist
new file mode 100644
index 0000000..44a5daa
--- /dev/null
+++ b/files/darwin-settings/vorssaint_settings.plist
@@ -0,0 +1,787 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>settings</key>
+ <dict>
+ <key>appAppearance</key>
+ <string>system</string>
+ <key>appUpdatesCheckFrequency</key>
+ <string>off</string>
+ <key>appUpdatesIncludeAppStore</key>
+ <true/>
+ <key>appUpdatesNotify</key>
+ <true/>
+ <key>autoCheckUpdates</key>
+ <true/>
+ <key>autoQuitEnabled</key>
+ <true/>
+ <key>autoQuitExceptions</key>
+ <array>
+ <string>com.apple.finder</string>
+ </array>
+ <key>batteryLimitPercent</key>
+ <integer>10</integer>
+ <key>brightnessControlEnabled</key>
+ <false/>
+ <key>brightnessKeysEnabled</key>
+ <false/>
+ <key>brightnessOSDEnabled</key>
+ <false/>
+ <key>cameraPreviewShortcut</key>
+ <string>control+option+command:13</string>
+ <key>cameraPreviewShortcutEnabled</key>
+ <false/>
+ <key>clamshellPreferred</key>
+ <false/>
+ <key>cleanerScheduleFrequency</key>
+ <string>off</string>
+ <key>cleanerScheduleHour</key>
+ <integer>9</integer>
+ <key>cleanerScheduleMinute</key>
+ <integer>0</integer>
+ <key>cleanerScheduleNotify</key>
+ <true/>
+ <key>cleanerScheduleWeekday</key>
+ <integer>2</integer>
+ <key>clipboardHistoryEnabled</key>
+ <false/>
+ <key>clipboardHistoryIncludeImagesFiles</key>
+ <true/>
+ <key>clipboardHistoryLimit</key>
+ <integer>50</integer>
+ <key>clipboardHistoryShortcut</key>
+ <string>control+option+command:9</string>
+ <key>clipboardHistoryShortcutEnabled</key>
+ <true/>
+ <key>clipboardHistorySkipSensitive</key>
+ <true/>
+ <key>colorPickerBareHex</key>
+ <false/>
+ <key>colorPickerFormat</key>
+ <string>hex</string>
+ <key>colorPickerShortcut</key>
+ <string>control+option+command:8</string>
+ <key>colorPickerShortcutEnabled</key>
+ <false/>
+ <key>commandBarAliases</key>
+ <string></string>
+ <key>commandBarDisabledSources</key>
+ <string></string>
+ <key>commandBarHidden</key>
+ <string></string>
+ <key>commandBarPins</key>
+ <string></string>
+ <key>commandBarShortcut</key>
+ <string>option:49</string>
+ <key>commandBarShortcutEnabled</key>
+ <false/>
+ <key>defaultDurationMinutes</key>
+ <integer>0</integer>
+ <key>dockClickCycleWindows</key>
+ <false/>
+ <key>dockClickMinimize</key>
+ <true/>
+ <key>dockPreviewEnabled</key>
+ <true/>
+ <key>extraBrightnessEnabled</key>
+ <false/>
+ <key>extraBrightnessLevel</key>
+ <integer>100</integer>
+ <key>featureAvailable.appUpdates</key>
+ <false/>
+ <key>featureAvailable.autoQuit</key>
+ <true/>
+ <key>featureAvailable.brightness</key>
+ <false/>
+ <key>featureAvailable.cameraPreview</key>
+ <true/>
+ <key>featureAvailable.cleaner</key>
+ <false/>
+ <key>featureAvailable.cleaningMode</key>
+ <false/>
+ <key>featureAvailable.clipboardHistory</key>
+ <false/>
+ <key>featureAvailable.colorPicker</key>
+ <true/>
+ <key>featureAvailable.commandBar</key>
+ <false/>
+ <key>featureAvailable.dockClick</key>
+ <false/>
+ <key>featureAvailable.dockPreview</key>
+ <false/>
+ <key>featureAvailable.extraBrightness</key>
+ <false/>
+ <key>featureAvailable.finderCutPaste</key>
+ <true/>
+ <key>featureAvailable.homebrew</key>
+ <false/>
+ <key>featureAvailable.keepAwake</key>
+ <false/>
+ <key>featureAvailable.keyboardDebounce</key>
+ <false/>
+ <key>featureAvailable.mediaTools</key>
+ <false/>
+ <key>featureAvailable.micMute</key>
+ <false/>
+ <key>featureAvailable.middleClick</key>
+ <false/>
+ <key>featureAvailable.mixer</key>
+ <true/>
+ <key>featureAvailable.monitorCPU</key>
+ <true/>
+ <key>featureAvailable.monitorDisk</key>
+ <true/>
+ <key>featureAvailable.monitorGPU</key>
+ <true/>
+ <key>featureAvailable.monitorMemory</key>
+ <true/>
+ <key>featureAvailable.monitorNetwork</key>
+ <true/>
+ <key>featureAvailable.monitorPower</key>
+ <true/>
+ <key>featureAvailable.mouseButtonShortcuts</key>
+ <false/>
+ <key>featureAvailable.mouseNavigation</key>
+ <false/>
+ <key>featureAvailable.musicBlock</key>
+ <false/>
+ <key>featureAvailable.pastePlain</key>
+ <false/>
+ <key>featureAvailable.quickLauncher</key>
+ <true/>
+ <key>featureAvailable.quickToggles</key>
+ <false/>
+ <key>featureAvailable.radialMenu</key>
+ <true/>
+ <key>featureAvailable.scratchpad</key>
+ <false/>
+ <key>featureAvailable.screenOCR</key>
+ <false/>
+ <key>featureAvailable.screenshot</key>
+ <true/>
+ <key>featureAvailable.scrollInverter</key>
+ <true/>
+ <key>featureAvailable.shelf</key>
+ <true/>
+ <key>featureAvailable.smoothScroll</key>
+ <false/>
+ <key>featureAvailable.soundOutputSwitcher</key>
+ <false/>
+ <key>featureAvailable.superKey</key>
+ <false/>
+ <key>featureAvailable.switcher</key>
+ <false/>
+ <key>featureAvailable.textSnippets</key>
+ <false/>
+ <key>featureAvailable.uninstaller</key>
+ <false/>
+ <key>featureAvailable.urlCleaner</key>
+ <false/>
+ <key>featureAvailable.windowLayout</key>
+ <false/>
+ <key>featureAvailable.windowMaximizer</key>
+ <false/>
+ <key>featuresOnboardingVersion</key>
+ <integer>4</integer>
+ <key>finderCutPasteEnabled</key>
+ <true/>
+ <key>hasOnboarded</key>
+ <true/>
+ <key>hotkeyEnabled</key>
+ <true/>
+ <key>keepAwakeActiveIcon</key>
+ <string>vorssaint</string>
+ <key>keepAwakeAutoStart</key>
+ <false/>
+ <key>keepAwakeConnectedToPower</key>
+ <false/>
+ <key>keepAwakeExternalDisplay</key>
+ <false/>
+ <key>keepAwakeIconTint</key>
+ <string>orange</string>
+ <key>keepAwakeMouseJiggleEnabled</key>
+ <false/>
+ <key>keepAwakeMouseJiggleIntervalMinutes</key>
+ <integer>5</integer>
+ <key>keepAwakeShortcut</key>
+ <string>control+option+command:40</string>
+ <key>keyboardDebounceEnabled</key>
+ <false/>
+ <key>keyboardDebounceKeyWindows</key>
+ <string></string>
+ <key>keyboardDebounceWindowMs</key>
+ <integer>5</integer>
+ <key>lastUpdateIntroVersion</key>
+ <string>3.2.0</string>
+ <key>launchAtLoginWanted</key>
+ <false/>
+ <key>mediaGIFEnd</key>
+ <real>0.0</real>
+ <key>mediaGIFFPS</key>
+ <real>12</real>
+ <key>mediaGIFLoops</key>
+ <true/>
+ <key>mediaGIFQuality</key>
+ <real>0.73999999999999999</real>
+ <key>mediaGIFStart</key>
+ <real>0.0</real>
+ <key>mediaGIFWidth</key>
+ <integer>720</integer>
+ <key>mediaImageFormat</key>
+ <string>jpeg</string>
+ <key>mediaImageMaxDimension</key>
+ <integer>1600</integer>
+ <key>mediaImageQuality</key>
+ <real>0.71999999999999997</real>
+ <key>mediaImageStripMetadata</key>
+ <true/>
+ <key>mediaLastTool</key>
+ <string>videoCompressor</string>
+ <key>mediaTextAccurate</key>
+ <true/>
+ <key>mediaTextLanguageCorrection</key>
+ <true/>
+ <key>mediaVideoCodec</key>
+ <string>h264</string>
+ <key>mediaVideoEnd</key>
+ <real>0.0</real>
+ <key>mediaVideoFPS</key>
+ <real>30</real>
+ <key>mediaVideoKeepAudio</key>
+ <true/>
+ <key>mediaVideoMaxDimension</key>
+ <integer>1280</integer>
+ <key>mediaVideoQuality</key>
+ <real>0.68000000000000005</real>
+ <key>mediaVideoStart</key>
+ <real>0.0</real>
+ <key>menuBarBatteryTemperature</key>
+ <false/>
+ <key>menuBarBatteryTime</key>
+ <false/>
+ <key>menuBarCPU</key>
+ <false/>
+ <key>menuBarCPUTemperature</key>
+ <false/>
+ <key>menuBarCombineTemperatures</key>
+ <true/>
+ <key>menuBarDiskActivity</key>
+ <false/>
+ <key>menuBarDiskUsage</key>
+ <false/>
+ <key>menuBarGPU</key>
+ <false/>
+ <key>menuBarGPUTemperature</key>
+ <false/>
+ <key>menuBarHideIconWithMetrics</key>
+ <false/>
+ <key>menuBarLabelStyle</key>
+ <string>compact</string>
+ <key>menuBarMemoryStyle</key>
+ <string>percent</string>
+ <key>menuBarMetricAppearance</key>
+ <string>values</string>
+ <key>menuBarMetricOrder</key>
+ <string>cpu,cpuTemperature,gpu,gpuTemperature,memory,battery,batteryTime,batteryTemperature,peripheralBattery,network,diskUsage,diskActivity,power</string>
+ <key>menuBarMetricSpacing</key>
+ <string>compact</string>
+ <key>menuBarNetworkUploadFirst</key>
+ <false/>
+ <key>menuBarPeripheralBattery</key>
+ <false/>
+ <key>menuBarPreset</key>
+ <string>dense</string>
+ <key>menuBarSeparateMetrics</key>
+ <false/>
+ <key>menuBarUsageBarCriticalColor</key>
+ <string>#FF453A</string>
+ <key>menuBarUsageBarElevatedColor</key>
+ <string>#FFD60A</string>
+ <key>menuBarUsageBarHighThreshold</key>
+ <integer>90</integer>
+ <key>menuBarUsageBarMediumThreshold</key>
+ <integer>70</integer>
+ <key>menuBarUsageBarNormalColor</key>
+ <string>#64D2FF</string>
+ <key>micMuteMenuBarIndicator</key>
+ <true/>
+ <key>micMuteShortcut</key>
+ <string>control+option+command:46</string>
+ <key>micMuteShortcutEnabled</key>
+ <false/>
+ <key>middleClickEnabled</key>
+ <false/>
+ <key>middleClickExceptions</key>
+ <array/>
+ <key>middleClickTapFingers</key>
+ <integer>0</integer>
+ <key>mixerHeadphonesDisconnectVolumePercent</key>
+ <integer>25</integer>
+ <key>mixerLowerVolumeOnHeadphonesDisconnect</key>
+ <false/>
+ <key>mixerShowFinder</key>
+ <true/>
+ <key>monitorAlertBattery</key>
+ <false/>
+ <key>monitorAlertBatteryPercent</key>
+ <integer>15</integer>
+ <key>monitorAlertCPU</key>
+ <false/>
+ <key>monitorAlertCPUTemperature</key>
+ <false/>
+ <key>monitorAlertCPUTemperatureThreshold</key>
+ <integer>90</integer>
+ <key>monitorAlertCPUThreshold</key>
+ <integer>90</integer>
+ <key>monitorAlertCooldownMinutes</key>
+ <integer>15</integer>
+ <key>monitorAlertDisk</key>
+ <false/>
+ <key>monitorAlertDiskFreePercent</key>
+ <integer>10</integer>
+ <key>monitorAlertMemory</key>
+ <false/>
+ <key>monitorDiskActivity</key>
+ <true/>
+ <key>monitorDiskProtection</key>
+ <true/>
+ <key>monitorDiskSMART</key>
+ <true/>
+ <key>monitorDiskTools</key>
+ <true/>
+ <key>monitorDiskUsage</key>
+ <true/>
+ <key>monitorGraphBattery</key>
+ <true/>
+ <key>monitorGraphCPU</key>
+ <true/>
+ <key>monitorGraphDisk</key>
+ <true/>
+ <key>monitorGraphGPU</key>
+ <true/>
+ <key>monitorGraphMemory</key>
+ <true/>
+ <key>monitorGraphNetwork</key>
+ <true/>
+ <key>monitorGraphPower</key>
+ <true/>
+ <key>monitorIntervalSeconds</key>
+ <integer>2</integer>
+ <key>monitorNetApps</key>
+ <true/>
+ <key>monitorNetSpeed</key>
+ <true/>
+ <key>monitorNetTest</key>
+ <true/>
+ <key>monitorNetTotals</key>
+ <true/>
+ <key>monitorPwrAdapter</key>
+ <true/>
+ <key>monitorPwrBattery</key>
+ <true/>
+ <key>monitorPwrHealth</key>
+ <true/>
+ <key>monitorPwrSystem</key>
+ <true/>
+ <key>monitorPwrTimeRemaining</key>
+ <true/>
+ <key>monitorShowDisk</key>
+ <true/>
+ <key>monitorShowFanControlBeta</key>
+ <false/>
+ <key>monitorShowMixer</key>
+ <true/>
+ <key>monitorShowNetwork</key>
+ <true/>
+ <key>monitorShowPower</key>
+ <true/>
+ <key>monitorShowSystem</key>
+ <true/>
+ <key>monitorSysAlerts</key>
+ <true/>
+ <key>monitorSysBattery</key>
+ <true/>
+ <key>monitorSysCPU</key>
+ <true/>
+ <key>monitorSysGPU</key>
+ <true/>
+ <key>monitorSysMemory</key>
+ <true/>
+ <key>monitorSysTemps</key>
+ <true/>
+ <key>monitorSysUptime</key>
+ <true/>
+ <key>mouseButtonExceptions</key>
+ <array/>
+ <key>mouseButtonShortcuts</key>
+ <dict/>
+ <key>mouseButtonShortcutsEnabled</key>
+ <false/>
+ <key>mouseNavigationEnabled</key>
+ <false/>
+ <key>mouseNavigationExceptions</key>
+ <array/>
+ <key>musicBlockEnabled</key>
+ <false/>
+ <key>musicBlockReplacementPath</key>
+ <string></string>
+ <key>onboardingStep</key>
+ <integer>0</integer>
+ <key>panelCollapsedResetVersion</key>
+ <string>2.15.1</string>
+ <key>panelControlAutoQuit</key>
+ <true/>
+ <key>panelControlCutPaste</key>
+ <true/>
+ <key>panelControlDockClick</key>
+ <true/>
+ <key>panelControlDockClickCycle</key>
+ <true/>
+ <key>panelControlDockPreview</key>
+ <true/>
+ <key>panelControlFilesExpanded</key>
+ <false/>
+ <key>panelControlInputExpanded</key>
+ <false/>
+ <key>panelControlKeyDebounce</key>
+ <true/>
+ <key>panelControlMiddleClick</key>
+ <true/>
+ <key>panelControlMouseButtonShortcuts</key>
+ <true/>
+ <key>panelControlMouseNavigation</key>
+ <true/>
+ <key>panelControlMouseScroll</key>
+ <true/>
+ <key>panelControlRadialMenu</key>
+ <true/>
+ <key>panelControlShelf</key>
+ <true/>
+ <key>panelControlSuperKey</key>
+ <true/>
+ <key>panelControlSwitcher</key>
+ <true/>
+ <key>panelControlTextSnippets</key>
+ <true/>
+ <key>panelControlWindowMaximize</key>
+ <true/>
+ <key>panelControlWindowsExpanded</key>
+ <false/>
+ <key>panelNavigationEnabled</key>
+ <true/>
+ <key>panelPowerOrder</key>
+ <string>system,adapter,battery,remaining,health</string>
+ <key>panelShowBrightness</key>
+ <true/>
+ <key>panelShowControls</key>
+ <true/>
+ <key>panelShowKeepAwake</key>
+ <true/>
+ <key>panelShowToggles</key>
+ <true/>
+ <key>panelShowUtilities</key>
+ <true/>
+ <key>panelToggleDarkMode</key>
+ <true/>
+ <key>panelToggleDesktopIcons</key>
+ <true/>
+ <key>panelToggleDisplayOff</key>
+ <true/>
+ <key>panelToggleEjectDisks</key>
+ <true/>
+ <key>panelToggleEmptyTrash</key>
+ <true/>
+ <key>panelToggleHiddenFiles</key>
+ <true/>
+ <key>panelToggleLockScreen</key>
+ <true/>
+ <key>panelToggleScreenSaver</key>
+ <true/>
+ <key>panelUtilityAppUpdates</key>
+ <true/>
+ <key>panelUtilityCameraPreview</key>
+ <true/>
+ <key>panelUtilityCleaner</key>
+ <true/>
+ <key>panelUtilityCleaning</key>
+ <true/>
+ <key>panelUtilityClipboard</key>
+ <true/>
+ <key>panelUtilityColorPicker</key>
+ <true/>
+ <key>panelUtilityCommandBar</key>
+ <true/>
+ <key>panelUtilityHomebrew</key>
+ <true/>
+ <key>panelUtilityMedia</key>
+ <true/>
+ <key>panelUtilityMicMute</key>
+ <true/>
+ <key>panelUtilityQuickLauncher</key>
+ <true/>
+ <key>panelUtilityScratchpad</key>
+ <true/>
+ <key>panelUtilityScreenOCR</key>
+ <true/>
+ <key>panelUtilityScreenshot</key>
+ <true/>
+ <key>panelUtilityURLCleaner</key>
+ <true/>
+ <key>panelUtilityUninstaller</key>
+ <true/>
+ <key>panelUtilityWindowLayout</key>
+ <true/>
+ <key>pastePlainEnabled</key>
+ <false/>
+ <key>pastePlainShortcut</key>
+ <string>option+shift+command:9</string>
+ <key>previewSize</key>
+ <string>normal</string>
+ <key>quickLauncherHiddenItems</key>
+ <string></string>
+ <key>quickLauncherShortcut</key>
+ <string>control+command:9</string>
+ <key>quickLauncherShortcutEnabled</key>
+ <true/>
+ <key>radialMenuActivationMode</key>
+ <string>pressOrHold</string>
+ <key>radialMenuAtPointer</key>
+ <true/>
+ <key>radialMenuEnabled</key>
+ <false/>
+ <key>radialMenuItems</key>
+ <data>
+ W3sicGF5bG9hZCI6InNjcmVlbnNob3QiLCJjaGlsZHJlbiI6W10sIm5hbWUi
+ OiIiLCJpZCI6IjU1N0M5QjY0LURBRUQtNEY0OS1CMjAyLUE2RTRFMjg3QkE3
+ MSIsImtpbmQiOiJ0b29sIiwic3ltYm9sTmFtZSI6IiJ9LHsicGF5bG9hZCI6
+ ImNvbG9yUGlja2VyIiwiY2hpbGRyZW4iOltdLCJuYW1lIjoiIiwiaWQiOiI4
+ NDc1RTg2OS0yNjFELTQ2OEUtODJEOC1BMjFGM0VFN0VGQjgiLCJraW5kIjoi
+ dG9vbCIsInN5bWJvbE5hbWUiOiIifSx7InBheWxvYWQiOiJjYW1lcmFQcmV2
+ aWV3IiwiY2hpbGRyZW4iOltdLCJuYW1lIjoiIiwiaWQiOiIzRTNCRUU3MS05
+ QzgxLTQ5QjMtOTEzNS03OTA5RkY5MDc4QUQiLCJraW5kIjoidG9vbCIsInN5
+ bWJvbE5hbWUiOiIifV0=
+ </data>
+ <key>radialMenuMouseButton</key>
+ <string>off</string>
+ <key>radialMenuShortcut</key>
+ <string>control+option+command:49</string>
+ <key>releaseNotesOnUpdate</key>
+ <true/>
+ <key>scratchpadCloseOnClickOutside</key>
+ <true/>
+ <key>scratchpadRetention</key>
+ <string>never</string>
+ <key>scratchpadShortcut</key>
+ <string>control+option+command:45</string>
+ <key>scratchpadShortcutEnabled</key>
+ <false/>
+ <key>screenOCRDetectQRCodes</key>
+ <true/>
+ <key>screenOCRShortcut</key>
+ <string>control+option+command:17</string>
+ <key>screenOCRShortcutEnabled</key>
+ <false/>
+ <key>screenshotAnnotationShadows</key>
+ <false/>
+ <key>screenshotBackdropPresets</key>
+ <string>[]</string>
+ <key>screenshotBackdropStyle</key>
+ <string></string>
+ <key>screenshotCopyToClipboard</key>
+ <true/>
+ <key>screenshotDefaultAction</key>
+ <string></string>
+ <key>screenshotDelay</key>
+ <integer>0</integer>
+ <key>screenshotDownscale</key>
+ <false/>
+ <key>screenshotFileNamePattern</key>
+ <string></string>
+ <key>screenshotFileNumberNext</key>
+ <integer>1</integer>
+ <key>screenshotFileNumberStart</key>
+ <integer>1</integer>
+ <key>screenshotFreeze</key>
+ <true/>
+ <key>screenshotIncludePointer</key>
+ <false/>
+ <key>screenshotLastColor</key>
+ <string>red</string>
+ <key>screenshotLastSticker</key>
+ <string>check</string>
+ <key>screenshotLastStroke</key>
+ <string>medium</string>
+ <key>screenshotLastTool</key>
+ <string>select</string>
+ <key>screenshotOpenEditorDirectly</key>
+ <false/>
+ <key>screenshotSaveFolder</key>
+ <string></string>
+ <key>screenshotSaveSubfolder</key>
+ <string></string>
+ <key>screenshotShortcut</key>
+ <string>control+option+command:21</string>
+ <key>screenshotShortcutEnabled</key>
+ <true/>
+ <key>screenshotShowLastRegion</key>
+ <true/>
+ <key>screenshotToolOrder</key>
+ <string>select,arrow,pixelate,crop,text,sticker,rect,highlight,freehand,line,ellipse,counter,redact</string>
+ <key>screenshotToolShortcutsEnabled</key>
+ <true/>
+ <key>scrollInverterEnabled</key>
+ <true/>
+ <key>scrollInverterExceptions</key>
+ <array/>
+ <key>shelfAutomaticExclusions</key>
+ <array/>
+ <key>shelfCloseAfterDrop</key>
+ <false/>
+ <key>shelfDropZoneEnabled</key>
+ <true/>
+ <key>shelfEnabled</key>
+ <true/>
+ <key>shelfRemoveAfterDrop</key>
+ <true/>
+ <key>shelfShakeToOpen</key>
+ <true/>
+ <key>shelfShortcut</key>
+ <string>control+option+command:2</string>
+ <key>shelfShortcutEnabled</key>
+ <true/>
+ <key>showCountdownInMenuBar</key>
+ <false/>
+ <key>smoothScrollEnabled</key>
+ <false/>
+ <key>smoothScrollExceptions</key>
+ <array/>
+ <key>smoothScrollStep</key>
+ <integer>40</integer>
+ <key>snippetLibraryEnabled</key>
+ <false/>
+ <key>snippetLibraryShortcut</key>
+ <string>control+option+command:37</string>
+ <key>soundOutputSwitcherEnabled</key>
+ <false/>
+ <key>soundOutputSwitcherShortcut</key>
+ <string>control+option+command:1</string>
+ <key>superKeyEnabled</key>
+ <false/>
+ <key>superKeySoloAction</key>
+ <string>none</string>
+ <key>supportUpdateIntroVersion</key>
+ <string>3.1.13</string>
+ <key>switcherCurrentSpaceOnly</key>
+ <false/>
+ <key>switcherEnabled</key>
+ <true/>
+ <key>switcherIconRowMode</key>
+ <false/>
+ <key>switcherMergeTabs</key>
+ <false/>
+ <key>switcherShortcut</key>
+ <string>command:48</string>
+ <key>switcherShowWindowlessFinder</key>
+ <true/>
+ <key>switcherSimpleMode</key>
+ <false/>
+ <key>switcherWindowShortcut</key>
+ <string>command:50</string>
+ <key>switcherWindowlessApps</key>
+ <string>finder</string>
+ <key>temperatureUnit</key>
+ <string>celsius</string>
+ <key>textSnippetsEnabled</key>
+ <false/>
+ <key>updateHighlightsSeenVersion</key>
+ <string>3.2.0</string>
+ <key>urlCleanerEnabled</key>
+ <false/>
+ <key>whatsAppDownloadsAutomaticEnabled</key>
+ <false/>
+ <key>whatsAppDownloadsCategories</key>
+ <string>image,video,audio</string>
+ <key>whatsAppDownloadsIncludeExisting</key>
+ <false/>
+ <key>whatsAppDownloadsNotify</key>
+ <true/>
+ <key>whatsAppDownloadsRetentionDays</key>
+ <integer>7</integer>
+ <key>whatsAppOrganizerCategories</key>
+ <string>image,video,audio,document,archive,other</string>
+ <key>whatsAppOrganizerDelayMinutes</key>
+ <integer>5</integer>
+ <key>whatsAppOrganizerDuplicateAction</key>
+ <string>trashNew</string>
+ <key>whatsAppOrganizerEnabled</key>
+ <false/>
+ <key>whatsAppOrganizerLayout</key>
+ <string>flat</string>
+ <key>windowGestureEnabled</key>
+ <false/>
+ <key>windowGestureModifiers</key>
+ <string>control+command</string>
+ <key>windowGestureRaiseWindow</key>
+ <false/>
+ <key>windowLayoutHiddenActions</key>
+ <string></string>
+ <key>windowLayoutShortcutBottom</key>
+ <string>control+option:125</string>
+ <key>windowLayoutShortcutBottomCenterSixth</key>
+ <string>none</string>
+ <key>windowLayoutShortcutBottomLeft</key>
+ <string>control+option:38</string>
+ <key>windowLayoutShortcutBottomLeftSixth</key>
+ <string>none</string>
+ <key>windowLayoutShortcutBottomRight</key>
+ <string>control+option:40</string>
+ <key>windowLayoutShortcutBottomRightSixth</key>
+ <string>none</string>
+ <key>windowLayoutShortcutCenter</key>
+ <string>control+option:8</string>
+ <key>windowLayoutShortcutCenterThird</key>
+ <string>control+option:3</string>
+ <key>windowLayoutShortcutFullScreen</key>
+ <string>none</string>
+ <key>windowLayoutShortcutLeft</key>
+ <string>control+option:123</string>
+ <key>windowLayoutShortcutLeftThird</key>
+ <string>control+option:2</string>
+ <key>windowLayoutShortcutLeftTwoThirds</key>
+ <string>control+option:14</string>
+ <key>windowLayoutShortcutMaximize</key>
+ <string>control+option:36</string>
+ <key>windowLayoutShortcutNextDisplay</key>
+ <string>control+option+command:124</string>
+ <key>windowLayoutShortcutRestore</key>
+ <string>control+option:15</string>
+ <key>windowLayoutShortcutRight</key>
+ <string>control+option:124</string>
+ <key>windowLayoutShortcutRightThird</key>
+ <string>control+option:5</string>
+ <key>windowLayoutShortcutRightTwoThirds</key>
+ <string>control+option:17</string>
+ <key>windowLayoutShortcutTop</key>
+ <string>control+option:126</string>
+ <key>windowLayoutShortcutTopCenterSixth</key>
+ <string>none</string>
+ <key>windowLayoutShortcutTopLeft</key>
+ <string>control+option:32</string>
+ <key>windowLayoutShortcutTopLeftSixth</key>
+ <string>none</string>
+ <key>windowLayoutShortcutTopRight</key>
+ <string>control+option:34</string>
+ <key>windowLayoutShortcutTopRightSixth</key>
+ <string>none</string>
+ <key>windowLayoutShortcutsEnabled</key>
+ <false/>
+ <key>windowMaximizeEnabled</key>
+ <true/>
+ </dict>
+ <key>vorssaintBackupAppVersion</key>
+ <string>3.2.0</string>
+ <key>vorssaintBackupVersion</key>
+ <integer>1</integer>
+</dict>
+</plist>
diff --git a/flake.lock b/flake.lock
index 5c684b1..4ff553b 100644
--- a/flake.lock
+++ b/flake.lock
@@ -96,11 +96,11 @@
"homebrew-cask": {
"flake": false,
"locked": {
- "lastModified": 1785732563,
- "narHash": "sha256-g96wDRb5AZOFjmdMDWMHB/00N/cXAdqh3sB/TYJDwaU=",
+ "lastModified": 1785635183,
+ "narHash": "sha256-m5oRXbzWWRmdr1hwfzRcK6vvvT5qiaDG3M4blTWdCRQ=",
"owner": "homebrew",
"repo": "homebrew-cask",
- "rev": "bee069693a0d8407ea8e2bd746a5109a6930a5d0",
+ "rev": "dae004070bf51388a7f9a5160ff5e7da78feeae5",
"type": "github"
},
"original": {
@@ -112,11 +112,11 @@
"homebrew-core": {
"flake": false,
"locked": {
- "lastModified": 1785729508,
- "narHash": "sha256-u40Hmtr6mLTyydI+JKHCzyzIemIk8tYEZbaCe1OfvZA=",
+ "lastModified": 1785632252,
+ "narHash": "sha256-cPRVTvfzohGsJqrytd6QSDn10O00q1NxMajK7pkqPbI=",
"owner": "homebrew",
"repo": "homebrew-core",
- "rev": "5ec2eaf8b84b6f3bdc4872f74014c050bb4b439d",
+ "rev": "bb71705fd502d9d1b6b20be0febe5d4984077336",
"type": "github"
},
"original": {
@@ -218,11 +218,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1785602060,
- "narHash": "sha256-z7D96eESRM4CPV/XtwpwFn8IDdfLAmxz6lVWrGYXvR4=",
+ "lastModified": 1785542685,
+ "narHash": "sha256-sjfvXMbG5pCFgpvw2OZAFcZiTvrppCWvnB6cuGrSY08=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "a5cbcfe954791221bfffe2307f7d1a1bf61a871e",
+ "rev": "f8e81fc7eb063db454f563cdd596fb96a5ad1497",
"type": "github"
},
"original": {
@@ -293,11 +293,11 @@
]
},
"locked": {
- "lastModified": 1785652409,
- "narHash": "sha256-0273OvIPfkJcdv0+Z3iPL8+eSRavAwGRCnr+Y6tRjYY=",
+ "lastModified": 1785784141,
+ "narHash": "sha256-VG4SKltdvSWd6Y2ppsDdSZC8m3x9xtFevh5wndYqo08=",
"owner": "0xc000022070",
"repo": "zen-browser-flake",
- "rev": "12224626d0d1cead79603f19601666360c715379",
+ "rev": "073be825a844ac51ece75ebfe9d82b5e2ee89a5c",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index c5f593f..3f110c1 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,5 +1,5 @@
{
- description = "Combined nix flake: darwin system (RyanMac) + standalone home-manager for Guix (ryan@linux)";
+ description = "My main dotfiles flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
@@ -46,12 +46,7 @@
flake = false;
};
- # Linux-only. hyprland/hyprlock/hypridle/hyprpicker/wpaperd/kanshi/pyprland
- # all now ship in nixpkgs itself, so only the pieces nixpkgs doesn't carry
- # need their own flake input:
nixgl = {
- # Ryan's fork exists to patch Guix's mesa/OpenGL mismatch, unrelated to
- # nixpkgs version - keep tracking it regardless of the nixpkgs bump.
url = "github:ryan77627/nixGL";
inputs.nixpkgs.follows = "nixpkgs";
};
@@ -93,6 +88,8 @@
inputs.zen-browser.homeModules.beta
./users/ryan/common.nix
./users/ryan/linux.nix
+ ./users/ryan/linux/foreign.nix
+ ./users/ryan/linux/guix.nix
];
};
};
diff --git a/hosts/RyanMac/configuration.nix b/hosts/RyanMac/configuration.nix
index e19490d..687b941 100644
--- a/hosts/RyanMac/configuration.nix
+++ b/hosts/RyanMac/configuration.nix
@@ -24,20 +24,6 @@ let
];
});
- mkSpace = i: {
- name = toString (117+i);
- value = {
- enabled = true;
- value = {
- type = "standard";
- parameters = [ (48 + i) (builtins.elemAt [ 18 19 20 21 22 23 25 26 28 ] (i - 1)) 524288 ]; # opt + num
- #parameters = [ (48 + i) (builtins.elemAt [ 18 19 20 21 22 23 25 26 28 ] (i - 1)) 1048576 ]; # cmd + num
- };
- };
- };
-
- spaceHotkeys = builtins.listToAttrs (map mkSpace (lib.range 1 9));
-
manualHotkeys = {
"64" = {
enabled = true;
@@ -49,6 +35,7 @@ in {
imports = [
inputs.nix-homebrew.darwinModules.nix-homebrew
../../modules/darwin/random-wallpaper
+ ../../modules/darwin/yabai
];
# Define the system's user and home dir location
@@ -69,43 +56,14 @@ in {
};
# Configure yabai
- services.yabai = {
+ local.yabai = {
enable = true;
- enableScriptingAddition = false;
- config = {
- mouse_follows_focus = "on";
- layout = "bsp";
- window_placement = "second_child";
- top_padding = "10";
- bottom_padding = "10";
- left_padding = "10";
- right_padding = "10";
- window_gap = "10";
- mouse_modifier = "alt";
- mouse_drop_action = "swap";
- mouse_action1 = "move";
- mouse_action2 = "resize";
- focus_follows_mouse = "autofocus";
+ defaultPadding = 10;
+ defaultTopPadding = 40;
+ displayTopPadding = {
+ "37D8832A-2D66-02CA-B9F7-8F30A301B230" = 10; # macOS retina display
};
- extraConfig = ''
- yabai -m rule --add app='System Settings' manage=off
- yabai -m rule --add app="^Zen$" title="^Picture-in-Picture$" manage=off
- ''
- # Add simple-bar signals if enabled
- + lib.optionalString config.home-manager.users.${username}.ryan.simple-bar.enable ''
- yabai -m signal --add event=window_focused action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-bar spaces & windows when focused application changes"
- yabai -m signal --add event=window_resized action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-bar spaces & windows when a window is resized"
- yabai -m signal --add event=window_destroyed action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-ba spaces & windows when an application window is closed"
- yabai -m signal --add event=space_changed action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-bar spaces & windows on space change"
- yabai -m signal --add event=display_changed action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-bar spaces & windows on display focus change"
- yabai -m signal --add event=window_title_changed action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-bar spaces & windows when current window title changes"
- yabai -m signal --add event=space_destroyed action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-bar spaces & windows on space removal"
- yabai -m signal --add event=space_created action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-bar spaces & windows on space creation"
- yabai -m signal --add event=application_activated action="curl http://localhost:7776/yabai/spaces/refresh && curl http://localhost:7776/yabai/windows/refresh" label="Refresh simple-bar spaces & windows when application is activated"
- yabai -m signal --add event=display_added action="curl http://localhost:7776/yabai/displays/refresh" label="Refresh simple-bar displays when a new dispay is added"
- yabai -m signal --add event=display_removed action="curl http://localhost:7776/yabai/displays/refresh" label="Refresh simple-bar displays when a dispay is removed"
- yabai -m signal --add event=display_moved action="curl http://localhost:7776/yabai/displays/refresh" label="Refresh simple-bar displays when a dispay is moved"
- '';
+ extraSymbolicHotkeys = manualHotkeys;
};
# Configure JankyBorders
@@ -179,7 +137,7 @@ in {
enable = true;
onActivation = {
- cleanup = "zap";
+ #extraFlags = [ "--force-cleanup" ];
};
global.brewfile = true;
@@ -197,6 +155,10 @@ in {
"netbird-ui"
"ubersicht"
"hammerspoon"
+ "gimp"
+ "kdenlive"
+ "rustdesk"
+ "vorssaint"
];
};
@@ -206,35 +168,6 @@ in {
skhdConfig = ''
alt - d : osascript -e 'tell application "System Events" to key code 49 using {command down}'
alt - return : osascript -e 'tell application "Ghostty"' -e 'new window' -e 'activate' -e 'end tell'
-
- shift + alt - q : ${pkgs.yabai}/bin/yabai -m window --close
-
- alt - up : ${pkgs.yabai}/bin/yabai -m window --focus north || ${pkgs.yabai}/bin/yabai -m display --focus north
- shift + alt - up : ${pkgs.yabai}/bin/yabai -m window --swap north || ${pkgs.yabai}/bin/yabai -m window --display north
- alt - down : ${pkgs.yabai}/bin/yabai -m window --focus south || ${pkgs.yabai}/bin/yabai -m display --focus south
- shift + alt - down : ${pkgs.yabai}/bin/yabai -m window --swap south || ${pkgs.yabai}/bin/yabai -m window --display south
- alt - right : ${pkgs.yabai}/bin/yabai -m window --focus east || ${pkgs.yabai}/bin/yabai -m display --focus east
- shift + alt - right : ${pkgs.yabai}/bin/yabai -m window --swap east || ${pkgs.yabai}/bin/yabai -m window --display east
- alt - left : ${pkgs.yabai}/bin/yabai -m window --focus west || ${pkgs.yabai}/bin/yabai -m display --focus west
- shift + alt - left: ${pkgs.yabai}/bin/yabai -m window --swap west || ${pkgs.yabai}/bin/yabai -m window --display west
-
- shift + alt - space: ${pkgs.yabai}/bin/yabai -m window --toggle float
-
- shift + alt - return: ${pkgs.yabai}/bin/yabai -m window --toggle sticky
-
- alt - f : ${pkgs.yabai}/bin/yabai -m window --toggle zoom-fullscreen
-
- shift + alt - f: ${pkgs.yabai}/bin/yabai -m window --toggle native-fullscreen
-
- shift + alt - 1 : ${pkgs.yabai}/bin/yabai -m window --space 1
- shift + alt - 2 : ${pkgs.yabai}/bin/yabai -m window --space 2
- shift + alt - 3 : ${pkgs.yabai}/bin/yabai -m window --space 3
- shift + alt - 4 : ${pkgs.yabai}/bin/yabai -m window --space 4
- shift + alt - 5 : ${pkgs.yabai}/bin/yabai -m window --space 5
- shift + alt - 6 : ${pkgs.yabai}/bin/yabai -m window --space 6
- shift + alt - 7 : ${pkgs.yabai}/bin/yabai -m window --space 7
- shift + alt - 8 : ${pkgs.yabai}/bin/yabai -m window --space 8
- shift + alt - 9 : ${pkgs.yabai}/bin/yabai -m window --space 9
'';
};
@@ -247,9 +180,6 @@ in {
};
system.defaults = {
- WindowManager = {
- EnableTilingOptionAccelerator = false;
- };
NSGlobalDomain = {
# 24 hour time
AppleICUForce24HourTime = true;
@@ -388,10 +318,6 @@ in {
"com.apple.Accessibility" = {
ReduceMotionEnabled = 1;
};
-
- "com.apple.symbolichotkeys" = {
- AppleSymbolicHotKeys = manualHotkeys // spaceHotkeys;
- };
};
universalaccess.reduceMotion = true;
};
@@ -419,7 +345,7 @@ in {
# this is fragile so it goes at the bottom
echo "Reloading skhd..."
- sudo -iu ${username} ${pkgs.skhd}/bin/skhd -r
+ sudo -iu ${username} ${pkgs.skhd}/bin/skhd -r || echo "Failed to reload skhd; continuing anyway..."
# Notes if we are running for the first time and writes a message for actions that may need to be done on macOS or linux
MARK="/opt/.nix-complete"
diff --git a/modules/darwin/yabai/default.nix b/modules/darwin/yabai/default.nix
new file mode 100644
index 0000000..cc7df15
--- /dev/null
+++ b/modules/darwin/yabai/default.nix
@@ -0,0 +1,237 @@
+# modules/darwin/yabai/default.nix
+{ config, lib, pkgs, ... }:
+
+let
+ cfg = config.local.yabai;
+
+ # symbolic hotkey IDs 118..126 == "Switch to Desktop 1".."Switch to Desktop 9"
+ spaceKeycodes = [ 18 19 20 21 22 23 25 26 28 ];
+
+ mkSpaceHotkey = i: {
+ name = toString (117 + i);
+ value = {
+ enabled = true;
+ value = {
+ type = "standard";
+ parameters = [
+ (48 + i) # ASCII '1'..'9'
+ (builtins.elemAt spaceKeycodes (i - 1)) # virtual keycode
+ cfg.spaceHotkeys.modifierMask
+ ];
+ };
+ };
+ };
+
+ spaceHotkeys = builtins.listToAttrs
+ (map mkSpaceHotkey (lib.range 1 cfg.spaceHotkeys.count));
+
+ padArms = lib.concatStringsSep "\n" (lib.mapAttrsToList
+ (uuid: pad: " ${uuid}) pad=${toString pad} ;;")
+ cfg.displayTopPadding);
+
+ displayPaddingScript = pkgs.writeShellScript "yabai-display-padding" ''
+ set -eu
+ yabai="${cfg.package}/bin/yabai"
+
+ "$yabai" -m query --displays \
+ | ${lib.getExe pkgs.jq} -r '.[] | "\(.uuid) \(.spaces | map(tostring) | join(" "))"' \
+ | while read -r uuid spaces; do
+ case "$uuid" in
+${padArms}
+ *) pad=${toString cfg.defaultTopPadding} ;;
+ esac
+ for s in $spaces; do
+ for k in top_padding; do
+ "$yabai" -m config --space "$s" "$k" "$pad" || true
+ done
+ done
+ done
+ '';
+
+ yabaiBin = "${cfg.package}/bin/yabai";
+
+ directionBinds = lib.concatStringsSep "\n" (map (d: ''
+ alt - ${d.key} : ${yabaiBin} -m window --focus ${d.dir} || ${yabaiBin} -m display --focus ${d.dir}
+ shift + alt - ${d.key} : ${yabaiBin} -m window --swap ${d.dir} || ${yabaiBin} -m window --display ${d.dir}
+ '') [
+ { key = "up"; dir = "north"; }
+ { key = "down"; dir = "south"; }
+ { key = "right"; dir = "east"; }
+ { key = "left"; dir = "west"; }
+ ]);
+
+ spaceMoveBinds = lib.concatStringsSep "\n"
+ (map (i: "shift + alt - ${toString i} : ${yabaiBin} -m window --space ${toString i}")
+ (lib.range 1 cfg.spaceHotkeys.count));
+
+in {
+ options.local.yabai = {
+ enable = lib.mkEnableOption "yabai tiling window manager setup";
+
+ package = lib.mkOption {
+ type = lib.types.package;
+ default = pkgs.yabai;
+ description = "yabai package. Referenced by keybindings and the padding script.";
+ };
+
+ enableScriptingAddition = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = ''
+ Only gates space creation/destruction and moving windows between
+ spaces. Window geometry and padding work without it.
+ '';
+ };
+
+ defaultPadding = lib.mkOption {
+ type = lib.types.int;
+ default = 10;
+ description = ''
+ Padding and window_gap for any display not listed in displayTopPadding.
+ Sized for Retina (2x) panels.
+ '';
+ };
+
+ defaultTopPadding = lib.mkOption {
+ type = lib.types.int;
+ default = 10;
+ description = ''
+ Padding for top edge of screen
+ '';
+ };
+
+ displayTopPadding = lib.mkOption {
+ type = lib.types.attrsOf lib.types.int;
+ default = { };
+ example = lib.literalExpression ''
+ { "37D8832A-2D66-02CA-B9F7-8F30A301B230" = 40; }
+ '';
+ description = ''
+ Display UUID -> padding value. The value is applied to all four
+ paddings and to window_gap for every space on that display.
+
+ Get UUIDs with:
+ yabai -m query --displays | jq -r '.[] | "\(.uuid) \(.frame)"'
+
+ Do not key off frame dimensions: yabai reports points, not pixels,
+ so a scaled 1080p panel will not report 1920x1080.
+ '';
+ };
+
+ manageKeybindings = lib.mkOption {
+ type = lib.types.bool;
+ default = true;
+ description = "Emit yabai skhd bindings into services.skhd.skhdConfig.";
+ };
+
+ spaceHotkeys = {
+ enable = lib.mkEnableOption "opt+<n> macOS space-switching hotkeys" // {
+ default = true;
+ };
+
+ count = lib.mkOption {
+ type = lib.types.ints.between 1 9;
+ default = 9;
+ description = "Number of spaces to bind. macOS exposes 9 symbolic hotkeys.";
+ };
+
+ modifierMask = lib.mkOption {
+ type = lib.types.int;
+ default = 524288; # option
+ description = "Carbon modifier mask. 524288 = option, 1048576 = command.";
+ };
+ };
+
+ extraSymbolicHotkeys = lib.mkOption {
+ type = lib.types.attrs;
+ default = { };
+ description = ''
+ Merged into com.apple.symbolichotkeys alongside the space hotkeys.
+ Put non-yabai symbolic hotkeys here rather than defining
+ CustomUserPreferences."com.apple.symbolichotkeys" in the host config --
+ CustomUserPreferences is types.attrs and merges shallowly, so a second
+ definition of that domain silently clobbers this one.
+ '';
+ };
+
+ extraSettings = lib.mkOption {
+ type = lib.types.attrs;
+ default = { };
+ description = "Extra keys merged into services.yabai.config.";
+ };
+
+ extraConfig = lib.mkOption {
+ type = lib.types.lines;
+ default = "";
+ description = "Extra shell appended to yabairc (rules, signals).";
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ services.yabai = {
+ enable = true;
+ inherit (cfg) package enableScriptingAddition;
+
+ config = {
+ mouse_follows_focus = "on";
+ layout = "bsp";
+ window_placement = "second_child";
+ top_padding = toString cfg.defaultTopPadding;
+ bottom_padding = toString cfg.defaultPadding;
+ left_padding = toString cfg.defaultPadding;
+ right_padding = toString cfg.defaultPadding;
+ window_gap = toString cfg.defaultPadding;
+ mouse_modifier = "alt";
+ mouse_drop_action = "swap";
+ mouse_action1 = "move";
+ mouse_action2 = "resize";
+ focus_follows_mouse = "autofocus";
+ } // cfg.extraSettings;
+
+ extraConfig = ''
+ yabai -m rule --add app='System Settings' manage=off
+ yabai -m rule --add app="^Zen$" title="^Picture-in-Picture$" manage=off
+ ''
+ + lib.optionalString (cfg.displayTopPadding != { }) ''
+
+ # Per-display padding. space_created is required, not redundant:
+ # display_added fires when yabai sees the display, which can precede
+ # macOS finishing space creation on it, so the first pass may find
+ # zero or one space. display_removed is required because yabai
+ # reindexes spaces on disconnect and the overrides are keyed by index.
+ yabai -m signal --add event=display_added action="${displayPaddingScript}" label="per-display padding (added)"
+ yabai -m signal --add event=display_removed action="${displayPaddingScript}" label="per-display padding (removed)"
+ yabai -m signal --add event=space_created action="${displayPaddingScript}" label="per-display padding (space)"
+ ${displayPaddingScript}
+ ''
+ + cfg.extraConfig;
+ };
+
+ services.skhd = lib.mkIf cfg.manageKeybindings {
+ enable = true;
+ skhdConfig = ''
+ shift + alt - q : ${yabaiBin} -m window --close
+
+ ${directionBinds}
+
+ shift + alt - space : ${yabaiBin} -m window --toggle float
+ shift + alt - return : ${yabaiBin} -m window --toggle sticky
+ alt - f : ${yabaiBin} -m window --toggle zoom-fullscreen
+ shift + alt - f : ${yabaiBin} -m window --toggle native-fullscreen
+
+ ${spaceMoveBinds}
+ '';
+ };
+
+ # Prerequisites, not preferences: yabai requires per-display spaces, and
+ # macOS's own tiling fights it for window placement.
+ system.defaults = {
+ spaces."spans-displays" = false;
+ WindowManager.EnableTilingOptionAccelerator = false;
+
+ CustomUserPreferences."com.apple.symbolichotkeys".AppleSymbolicHotKeys =
+ cfg.extraSymbolicHotkeys
+ // (lib.optionalAttrs cfg.spaceHotkeys.enable spaceHotkeys);
+ };
+ };
+}
diff --git a/users/ryan/common.nix b/users/ryan/common.nix
index 2e7505f..b1599fd 100644
--- a/users/ryan/common.nix
+++ b/users/ryan/common.nix
@@ -5,6 +5,9 @@
news.display = "silent";
+ # Keep everything in lockstep
+ home.stateVersion = "26.05";
+
# My own modules
ryan.neovim.enable = true;
@@ -109,10 +112,6 @@
};
};
- # HM always renders the "*" block last regardless of dag order, so this
- # trailing exec-only Match block (no directives of its own - position
- # relative to the Host blocks above doesn't matter) is safe to append here.
- # `settings."*"` above satisfies the assertion that gates using extraConfig.
extraConfig = ''
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
'';
@@ -139,10 +138,7 @@
shellAliases = {
cat = "bat --paging=never";
diff = "delta";
- # Merged from guix-dotfiles' bash aliases (home-bash-service-type) -
- # bash is being retired there in favor of this zsh config. `ls`/`spt`/
- # `python` are Linux-only (BSD ls on darwin doesn't take --color/-p,
- # spotify_player and python3 aren't darwin things) - see linux.nix.
+ brew = "env -u XDG_CONFIG_HOME brew";
grep = "grep --color=auto";
ll = "ls -l";
rebuild =
@@ -150,20 +146,50 @@
then "sudo darwin-rebuild switch --flake ~/.config/nix/."
else "home-manager switch --flake ~/.config/home-manager/#ryan";
};
+ plugins = [
+ {
+ name = "zsh-vi-mode";
+ src = "${pkgs.zsh-vi-mode}/share/zsh-vi-mode";
+ }
+ ];
};
# Shared across darwin and linux; the guix side already deferred these
# packages to nix (all commented out of home-configuration.scm's package
# list), same as the darwin config always has.
home.packages = with pkgs; [
+ bat
+ fd
+ fzf
+ tmux
+ restic
+ rsync
+ pv
+ jq
+ htop
+ (pkgs.zathura.override {
+ plugins = [ pkgs.zathuraPkgs.zathura_pdf_mupdf ];
+ })
+ go
+ pass
+ file
+ pandoc
+ weechat
+ python3
yt-dlp
aerc
gdu
taskwarrior3
delta
- kubectl
- talhelper
- talosctl
+ prismlauncher
+ git-lfs
+ audacity
+ blender
+
+ nerd-fonts.anonymice
+ nerd-fonts.monofur
+ nerd-fonts.lilex
+ nerd-fonts.fira-code
];
xdg.configFile."aerc" = {
diff --git a/users/ryan/darwin.nix b/users/ryan/darwin.nix
index 72467ee..568306a 100644
--- a/users/ryan/darwin.nix
+++ b/users/ryan/darwin.nix
@@ -8,8 +8,6 @@
./modules/ubersicht
];
- home.stateVersion = "26.05"; # Please read the comment before changing.
-
ryan.sketchybar.enable = true;
programs.zen-browser = {
@@ -26,21 +24,12 @@
# Add hammerspoon
home.file.".hammerspoon".source = ./hammerspoon;
+ home.file.".config/homebrew".source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.homebrew";
+
home.packages = with pkgs; [
- bat
- pass
- pandoc
iina # Media player (frontend to mpv essentially)
- audacity
- ffmpeg
- blender
- nerd-fonts.anonymice
jujutsu
netbird-tui
- # common.nix's programs.git.settings now sets filter.lfs (merged from
- # guix-dotfiles' .gitconfig) - Guix's package list already has git-lfs,
- # darwin needs its own copy or LFS checkouts hard-fail.
- git-lfs
];
# Install User apps to subdir for dock stuff
diff --git a/users/ryan/linux.nix b/users/ryan/linux.nix
index a86cad1..add81df 100644
--- a/users/ryan/linux.nix
+++ b/users/ryan/linux.nix
@@ -1,56 +1,43 @@
-{ config, pkgs, lib, inputs, ... }:
+{ pkgs, lib, inputs, ... }:
{
imports = [
- ./linux/firefox-nightly
];
home.username = "ryan";
home.homeDirectory = "/home/ryan";
- home.stateVersion = "23.11"; # Please read the comment before changing.
nixpkgs.config.allowUnfree = true;
- programs.zsh.shellAliases = {
- ls = "ls -p --color=auto";
- spt = "spotify_player";
- python = "python3";
+ fonts.fontconfig.enable = true;
+ fonts.fontconfig.defaultFonts = {
+ monospace = [ "DejaVu Sans Mono" ];
+ sansSerif = [ "Noto Sans" "DejaVu Sans" ];
+ serif = [ "Noto Serif" "DejaVu Serif" ];
};
- # `nix shell nixpkgs#...`/`nix run nixpkgs#...` etc. resolve `nixpkgs` to
- # this flake's own pinned input instead of fetching latest nixpkgs-unstable.
- # This is the standalone-HM equivalent of RyanMac's /etc/nix/flake-registry.json.
- # HM owns the whole ~/.config/nix directory (including nix.conf) so this
- # doesn't end up writing through guix-dotfiles' `nix-config` symlink - see
- # MIGRATION.md.
- xdg.configFile."nix/nix.conf".text = "experimental-features = nix-command flakes\n";
- xdg.configFile."nix/registry.json".text = builtins.toJSON {
- version = 2;
- flakes = [
- {
- from = { type = "indirect"; id = "nixpkgs"; };
- to = {
- type = "path";
- path = inputs.nixpkgs.outPath;
- lastModified = inputs.nixpkgs.lastModified;
- narHash = inputs.nixpkgs.narHash;
- };
- }
- ];
+ gtk = {
+ enable = true;
+ font = {
+ name = "Noto Sans";
+ size = 10;
+ };
+ theme = {
+ name = "Adwaita";
+ package = pkgs.gnome-themes-extra;
+ };
+ iconTheme = {
+ name = "Adwaita";
+ package = pkgs.adwaita-icon-theme;
+ };
+ colorScheme = "dark";
};
- # Non-NixOS (Guix), so HM has to write its own fontconfig instead of
- # relying on a system module.
- fonts.fontconfig.enable = true;
- fonts.fontconfig.defaultFonts = {
- monospace = [ "DejaVu Sans Mono" ];
- sansSerif = [ "DejaVu Sans" ];
- serif = [ "DejaVu Serif" ];
+ qt = {
+ enable = true;
+ platformTheme.name = "gtk3";
};
- # Cursor theme. Replaces the previously hand-vendored Bibata asset (which
- # embedded oddly-versioned theme names) with nixpkgs' own build - see the
- # comment in linux/hypr/hyprland.conf for the corresponding env var change.
home.pointerCursor = {
enable = true;
package = pkgs.bibata-cursors;
@@ -60,13 +47,12 @@
x11.enable = true;
};
- # gpg-agent itself is enabled in common.nix; nixpkgs' pinentry here instead
- # of depending on Guix's system profile path.
services.gpg-agent.pinentry.package = pkgs.pinentry-qt;
wayland.windowManager.hyprland = {
enable = true;
package = pkgs.hyprland;
+ configType = "hyprlang";
portalPackage = pkgs.xdg-desktop-portal-hyprland;
extraConfig = builtins.readFile ./linux/hypr/hyprland.conf;
};
@@ -80,6 +66,7 @@
"hypr/scripts" = { source = ./linux/hypr/scripts; recursive = true; };
"hypr/family_guy.mp4".source = ./linux/hypr/family_guy.mp4;
"hypr/subwaysurfer.webm".source = ./linux/hypr/subwaysurfer.webm;
+ "wallpapers".source = ../../files/Wallpapers;
"waybar" = { source = ./linux/waybar; recursive = true; };
"alacritty" = { source = ./linux/alacritty; recursive = true; };
@@ -88,26 +75,18 @@
"mpv" = { source = ./linux/mpv; recursive = true; };
"pulse/client.conf".source = ./linux/pulseaudio/client.conf;
- "spotify-player/app.toml".source = ./linux/spotify-player/app.toml;
};
home.file = {
- ".local/share/mailvelope" = { source = ./linux/mailvelope; recursive = true; };
- ".local/share/tridactyl" = { source = ./linux/tridactyl; recursive = true; };
- ".mozilla/native-messaging-hosts/tridactyl.json".source = ./linux/tridactyl/tridactyl.json;
+ # Files that need to be in ~ go here
};
home.packages = with pkgs; [
- rustup
- zoxide
- pnpm
gcc
pkg-config
wttrbar
wl-clip-persist
- gifski
waypaper
- spotify-player
xwayland
xdg-desktop-portal
xdg-desktop-portal-gtk
@@ -121,42 +100,27 @@
wl-mirror
pyprland
satty
- fluxcd
sops
restic
- kdePackages.kdenlive
bluetui
supercell-wx
chromium
+ foot
+ kdePackages.kdenlive
+
+ waybar
+ fuzzel
- # foot is Guix system-packaged and is the terminal actually wired into
- # the WM; alacritty's config was carried over from guix-dotfiles but
- # nothing provided its binary there either - see MIGRATION.md.
- alacritty
-
- # Nerd Fonts, replacing the hand-vendored ttf files that used to live in
- # guix-dotfiles/home-config/fonts (Fira Code and "Monofur For Powerline"
- # dropped - superseded by these, unreferenced anywhere)
- nerd-fonts.anonymice
- nerd-fonts.monofur
- nerd-fonts.lilex
- nerd-fonts.fira-code
noto-fonts
dejavu_fonts
liberation_ttf
noto-fonts-cjk-sans
noto-fonts-color-emoji
- # hyprlock built by nix needs Guix's PAM/fontconfig libs preloaded to run
- # under the Guix system profile - same interop hack as before.
- (pkgs.writeScriptBin "hyprlock" ''
- #! ${pkgs.bash}/bin/bash
- export LD_PRELOAD="/run/current-system/profile/lib/libpam.so.0:/run/current-system/profile/lib/libfontconfig.so:$LD_PRELOAD"
- exec ${pkgs.hyprlock}/bin/hyprlock "$@"
- '')
-
- # Guix's mesa doesn't match nixpkgs', so GL apps built by nix need nixGL.
- inputs.nixgl.packages.${pkgs.system}.nixGLIntel
- inputs.clipboard-sync.packages.${pkgs.system}.default
+ inputs.clipboard-sync.packages.${pkgs.stdenv.hostPlatform.system}.default
+
+ # hyprlock itself is provided by the host-specific module (e.g.
+ # linux/guix.nix wraps it with an LD_PRELOAD shim; a plain NixOS host
+ # would just add pkgs.hyprlock here instead).
];
}
diff --git a/users/ryan/linux/firefox-nightly/.to-be-deleted b/users/ryan/linux/firefox-nightly/.to-be-deleted
new file mode 100644
index 0000000..e69de29
diff --git a/users/ryan/linux/foreign.nix b/users/ryan/linux/foreign.nix
new file mode 100644
index 0000000..b1b06ab
--- /dev/null
+++ b/users/ryan/linux/foreign.nix
@@ -0,0 +1,25 @@
+{ inputs, ... }:
+
+# Applies to any standalone (non-NixOS) home-manager install, where
+# home-manager owns the user profile on its own instead of being wired in
+# via a NixOS module. NixOS manages nix.conf/the flake registry and doesn't
+# need the genericLinux target at all, so this is skipped on NixOS hosts.
+{
+ targets.genericLinux.enable = true;
+
+ xdg.configFile."nix/nix.conf".text = "experimental-features = nix-command flakes\n";
+ xdg.configFile."nix/registry.json".text = builtins.toJSON {
+ version = 2;
+ flakes = [
+ {
+ from = { type = "indirect"; id = "nixpkgs"; };
+ to = {
+ type = "path";
+ path = inputs.nixpkgs.outPath;
+ lastModified = inputs.nixpkgs.lastModified;
+ narHash = inputs.nixpkgs.narHash;
+ };
+ }
+ ];
+ };
+}
diff --git a/users/ryan/linux/guix.nix b/users/ryan/linux/guix.nix
new file mode 100644
index 0000000..21fea52
--- /dev/null
+++ b/users/ryan/linux/guix.nix
@@ -0,0 +1,72 @@
+{ config, pkgs, lib, inputs, ... }:
+
+{
+ systemd.user.startServices = false;
+
+ programs.zsh.profileExtra = ''
+ if [ -f "$HOME/.guix-home/setup-environment" ]; then
+ HOME_ENVIRONMENT="$HOME/.guix-home"
+ . "$HOME_ENVIRONMENT/setup-environment"
+ "$HOME_ENVIRONMENT/on-first-login"
+ unset HOME_ENVIRONMENT
+ fi
+
+ # /etc/profile normally puts ~/.config/guix/current (the guix pull
+ # profile with our actual channels: nonguix, rosenthal, ...) ahead of
+ # /run/current-system/profile on PATH, but that only happens for bash
+ # login shells -- zsh never sources /etc/profile. Without this, `guix`
+ # resolves to the bare system profile's guix, which doesn't know about
+ # our channels.
+ if [ -d "$HOME/.config/guix/current" ]; then
+ export PATH="$HOME/.config/guix/current/bin:$PATH"
+ export INFOPATH="$HOME/.config/guix/current/share/info''${INFOPATH:+:}$INFOPATH"
+ fi
+ '';
+
+ dconf.enable = false;
+
+ wayland.windowManager.hyprland.extraConfig = ''
+ exec-once = sh -c 'gpgconf --launch gpg-agent; hyprctl setenv SSH_AUTH_SOCK "$(gpgconf --list-dirs agent-ssh-socket)"'
+ '';
+
+ programs.gpg.scdaemonSettings.disable-ccid = true;
+
+ # Guix needs a special fonts.conf file in the user env since it doesn't
+ # have one in /etc/fonts/fonts.conf from nixos
+ xdg.configFile."fontconfig-nix/fonts.conf".text = ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
+ <include ignore_missing="yes">${pkgs.fontconfig.out}/etc/fonts/conf.d</include>
+ <include ignore_missing="yes">${config.home.homeDirectory}/.config/fontconfig/conf.d</include>
+ <dir>${config.home.homeDirectory}/.guix-home/profile/share/fonts</dir>
+ <cachedir>${config.home.homeDirectory}/.cache/fontconfig</cachedir>
+ </fontconfig>
+ '';
+
+ home.sessionVariables.FONTCONFIG_FILE = "${config.home.homeDirectory}/.config/fontconfig-nix/fonts.conf";
+
+ home.packages = [
+ (pkgs.writeScriptBin "hyprlock" ''
+ #! ${pkgs.bash}/bin/bash
+ export LD_PRELOAD="/run/current-system/profile/lib/libpam.so.0:$LD_PRELOAD"
+ exec ${pkgs.hyprlock}/bin/hyprlock "$@"
+ '')
+
+ # Guix's mesa doesn't match nixpkgs', so GL apps built by nix need nixGL.
+ inputs.nixgl.packages.${pkgs.stdenv.hostPlatform.system}.nixGLIntel
+ ];
+
+ # We need to correct the ssh config file's permissions on guix
+ # Remove the symlink and just install the store file directly
+ home.activation = {
+ fixSshPermissions = lib.hm.dag.entryAfter [ "linkGeneration" ] ''
+ run install -d -m 0700 "$HOME/.ssh"
+ if [ -L "$HOME/.ssh/config" ]; then
+ src="$(readlink -f "$HOME/.ssh/config")"
+ run rm -f "$HOME/.ssh/config"
+ run install -m 0600 "$src" "$HOME/.ssh/config"
+ fi
+ '';
+ };
+}
diff --git a/users/ryan/linux/hypr/hyprland.conf b/users/ryan/linux/hypr/hyprland.conf
index e51b54c..42d8a52 100644
--- a/users/ryan/linux/hypr/hyprland.conf
+++ b/users/ryan/linux/hypr/hyprland.conf
@@ -113,7 +113,7 @@ animations {
dwindle {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
- pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ #pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = yes # you probably want this
}
@@ -130,9 +130,9 @@ device {
}
# Example windowrule v1
-# windowrule = float, ^(kitty)$
+# windowrule = float on, ^(kitty)$
# Example windowrule v2
-# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
+# windowrulev2 = float on,match:class ^(kitty)$,match:title ^(kitty)$
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
@@ -147,8 +147,8 @@ bind = $mainMod SHIFT, E, exit
bind = $mainMod SHIFT, Space, togglefloating
bind = $mainMod SHIFT, Return, pin, active
bind = $mainMod, D, exec, fuzzel --width=35 --font='Hack:weight=bold:size=12' --background-color='282a36fa' --selection-color='3d4460fa' --line-height=20 --border-radius=20
-bind = $mainMod, P, pseudo, # dwindle
-bind = $mainMod, J, togglesplit, # dwindle
+#bind = $mainMod, P, pseudo, # dwindle
+#bind = $mainMod, J, togglesplit, # dwindle
bind = $mainMod, F, fullscreen, 1
bind = $mainMod SHIFT, F, fullscreen
bind = ,XF86MonBrightnessUp, exec, light -A 10
@@ -252,46 +252,46 @@ bind = $mainMod SHIFT CTRL ALT, L, exec, xdg-open https://linkedin.com
# Window Rules
# Firefox PiP
-windowrulev2 = float, class:^(zen-beta)$, title:^(Picture-in-Picture)$
-windowrulev2 = pin, class:^(zen-beta)$, title:^(Picture-in-Picture)$
-windowrulev2 = size 22% 22%, class:^(zen-beta)$, title:^(Picture-in-Picture)$
-windowrulev2 = move 76% 8%, class:^(zen-beta)$, title:^(Picture-in-Picture)$
+windowrule = float on, match:class ^(zen-beta)$, match:title ^(Picture-in-Picture)$
+windowrule = pin on, match:class ^(zen-beta)$, match:title ^(Picture-in-Picture)$
+windowrule = size 22% 22%, match:class ^(zen-beta)$, match:title ^(Picture-in-Picture)$
+windowrule = move 76% 8%, match:class ^(zen-beta)$, match:title ^(Picture-in-Picture)$
# Firefox Sharing Indicator
-windowrulev2 = float, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = size 56 31, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = move 50% 0, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
-windowrulev2 = suppressevent fullscreen maximize, class:^(firefox)$, title:^(Firefox — Sharing Indicator)$
+windowrule = float on, match:class ^(firefox)$, match:title ^(Firefox — Sharing Indicator)$
+windowrule = size 56 31, match:class ^(firefox)$, match:title ^(Firefox — Sharing Indicator)$
+windowrule = move 50% 0, match:class ^(firefox)$, match:title ^(Firefox — Sharing Indicator)$
+windowrule = suppress_event = fullscreen maximize, match:class ^(firefox)$, match:title ^(Firefox — Sharing Indicator)$
# Weather
-windowrulev2 = float,class:^(ala-wttr)$
-windowrulev2 = size 822 1026, class:^(ala-wttr)$
+windowrule = float on,match:class ^(ala-wttr)$
+windowrule = size 822 1026, match:class ^(ala-wttr)$
# Floating terminal
-windowrulev2 = float,class:^(float-foot)$
-windowrulev2 = size 930 680,class:^(float-foot)$
-windowrulev2 = center,class:^(float-foot)$
+windowrule = float on,match:class ^(float-foot)$
+windowrule = size 930 680,match:class ^(float-foot)$
+windowrule = center on,match:class ^(float-foot)$
# Change color of pinned windows
-windowrulev2 = bordercolor rgba(bf0000ee) rgba(ab00adee) 45deg,pinned:1
+windowrule = border_color rgba(bf0000ee) rgba(ab00adee) 45deg,match:pin 1
# Fun Keybinds
# Subway surfer
bind = $mainMod CTRL SHIFT, S, exec, mpv ~/.config/hypr/subwaysurfer.webm
-windowrulev2 = float,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
-windowrulev2 = size 310 554,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
-windowrulev2 = move 81% 46% ,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
-windowrulev2 = pin,class:^(mpv)$, title:^(subwaysurfer.webm - mpv)$
+windowrule = float on,match:class ^(mpv)$, match:title ^(subwaysurfer.webm - mpv)$
+windowrule = size 310 554,match:class ^(mpv)$, match:title ^(subwaysurfer.webm - mpv)$
+windowrule = move 81% 46% ,match:class ^(mpv)$, match:title ^(subwaysurfer.webm - mpv)$
+windowrule = pin on,match:class ^(mpv)$, match:title ^(subwaysurfer.webm - mpv)$
# Family guy funny moments
bind = $mainMod CTRL SHIFT, F, exec, mpv ~/.config/hypr/family_guy.mp4
-windowrulev2 = float,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
-windowrulev2 = size 595 336,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
-windowrulev2 = move 67% 5% ,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
-windowrulev2 = pin,class:^(mpv)$, title:^(family_guy.mp4 - mpv)$
+windowrule = float on,match:class ^(mpv)$, match:title ^(family_guy.mp4 - mpv)$
+windowrule = size 595 336,match:class ^(mpv)$, match:title ^(family_guy.mp4 - mpv)$
+windowrule = move 67% 5% ,match:class ^(mpv)$, match:title ^(family_guy.mp4 - mpv)$
+windowrule = pin on,match:class ^(mpv)$, match:title ^(family_guy.mp4 - mpv)$
# Satty windowrules
-windowrulev2 = fullscreen,class:^(com.gabm.satty)$
+windowrule = fullscreen on,match:class ^(com.gabm.satty)$
exec-once = ~/.config/hypr/scripts/autostart.sh
diff --git a/users/ryan/linux/hypr/scripts/autostart.sh b/users/ryan/linux/hypr/scripts/autostart.sh
index 706f82f..080f6e9 100755
--- a/users/ryan/linux/hypr/scripts/autostart.sh
+++ b/users/ryan/linux/hypr/scripts/autostart.sh
@@ -6,8 +6,6 @@ mako &
#swaybg -i ~/.config/hypr/Wallpapers/above-clouds.jpg &
-nice -n13 swww init &
-
#~/.config/hypr/wallpaper-daemon.sh &
wpaperd -d &
diff --git a/users/ryan/linux/mailvelope/gpgmejson.json b/users/ryan/linux/mailvelope/gpgmejson.json
deleted file mode 100644
index 7ad8586..0000000
--- a/users/ryan/linux/mailvelope/gpgmejson.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "name": "gpgmejson",
- "description": "JavaScript binding for GnuPG",
- "path": "/home/ryan/.local/share/mailvelope/start.sh",
- "type": "stdio",
- "allowed_extensions": ["jid1-AQqSMBYb0a8ADg@jetpack"]
-}
diff --git a/users/ryan/linux/mailvelope/start.sh b/users/ryan/linux/mailvelope/start.sh
deleted file mode 100755
index 01b3ee2..0000000
--- a/users/ryan/linux/mailvelope/start.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env bash
-
-# Wrap for gpgme-json so firefox can use it
-exec gpgme-json $@
diff --git a/users/ryan/linux/spotify-player/app.toml b/users/ryan/linux/spotify-player/app.toml
deleted file mode 100644
index 4eac5e4..0000000
--- a/users/ryan/linux/spotify-player/app.toml
+++ /dev/null
@@ -1,34 +0,0 @@
-theme = "dracula"
-client_id = "4b1219bdc29945bc8ca914f80a8a6a47"
-client_port = 8888
-playback_format = """
-{track} • {artists}
-{album}
-{metadata}"""
-tracks_playback_limit = 50
-app_refresh_duration_in_ms = 32
-playback_refresh_duration_in_ms = 0
-cover_image_refresh_duration_in_ms = 2000
-page_size_in_rows = 20
-play_icon = "▶"
-pause_icon = "▌▌"
-liked_icon = "♥"
-border_type = "Plain"
-progress_bar_type = "Rectangle"
-playback_window_position = "Top"
-cover_img_length = 9
-cover_img_width = 5
-cover_img_scale = 1.0
-playback_window_width = 6
-enable_media_control = true
-enable_streaming = "DaemonOnly"
-enable_cover_image_cache = true
-default_device = "RyanThinkpad"
-
-[copy_command]
-command = "wlcopy"
-args = []
-
-[notify_format]
-summary = "{track} • {artists}"
-body = "{album}"
diff --git a/users/ryan/linux/waybar/config b/users/ryan/linux/waybar/config
index 62e6b20..4459ce7 100644
--- a/users/ryan/linux/waybar/config
+++ b/users/ryan/linux/waybar/config
@@ -5,50 +5,69 @@
"modules-left": ["hyprland/workspaces", "hyprland/submap"],
"modules-center": ["hyprland/window"],
- "modules-right": ["tray", "custom/spotify", "privacy", "custom/weather", "custom/mail", "custom/storage", "backlight", "bluetooth", "pulseaudio", "network", "idle_inhibitor", "battery", "battery#num2", "clock"],
+ "modules-right": ["tray", "privacy", "custom/weather", "custom/mail", "custom/storage", "backlight", "bluetooth", "pulseaudio", "network", "idle_inhibitor", "battery", "battery#num2", "clock"],
+
"hyprland/submap": {
"format": " {}"
},
+
"hyprland/workspaces": {
"format": "{id}",
"all-outputs": false,
"disable-scroll": true
},
+
"hyprland/window": {
"max-length": 80,
"tooltip": false,
"separate-outputs": true
},
+
"clock": {
"format": "{:%a %d %b %H:%M}",
"tooltip": false
},
+
"battery": {
"format": "{capacity}% {icon}",
"format-alt": "{time} {icon}",
- "format-icons": ["", "", "", "", ""],
- "format-charging": "{capacity}% ",
+ "format-icons": [
+ "󰁺",
+ "󰁻",
+ "󰁼",
+ "󰁽",
+ "󰁹"
+ ],
+ "format-charging": "{capacity}% 󰂄",
"interval": 30,
"states": {
"warning": 25,
"critical": 10
},
"tooltip": false,
- "bat":"BAT0"
+ "bat": "BAT0"
},
+
"battery#num2": {
"format": "{capacity}% {icon}",
"format-alt": "{time} {icon}",
- "format-icons": ["", "", "", "", ""],
- "format-charging": "{capacity}% ",
+ "format-icons": [
+ "󰁺",
+ "󰁻",
+ "󰁼",
+ "󰁽",
+ "󰁹"
+ ],
+ "format-charging": "{capacity}% 󰂄",
"interval": 30,
"states": {
"warning": 25,
"critical": 10
},
"tooltip": false,
- "bat":"BAT1"
+ "bat": "BAT1"
},
+
"bluetooth": {
"format": "󰂯",
"format-disabled": "󰂲",
@@ -56,60 +75,75 @@
"format-connected-battery": "󰂱 {device_battery_percentage}%",
"on-click": "foot bluetui",
"tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected",
- "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
- "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
- "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%"
+ "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}",
+ "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}",
+ "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%"
},
+
"network": {
"format-alt": "{ipaddr}/{cidr} {icon} {bandwidthTotalBytes}󰹹",
"format": "{ipaddr}/{cidr} {icon}",
"format-alt-click": "click-right",
"format-icons": {
- "wifi": ["󰤟", "󰤢" ,"󰤥", "󰤨"],
- "ethernet": [""],
- "disconnected": ["󰤭"]
+ "wifi": [
+ "󰤟",
+ "󰤢",
+ "󰤥",
+ "󰤨"
+ ],
+ "ethernet": [
+ "󰈀"
+ ],
+ "disconnected": [
+ "󰤭"
+ ]
},
"on-click": "foot -t alacritty doas nmtui",
"tooltip": false
},
+
"privacy": {
- "icon-spacing":4,
- "icon-size":18,
- "transition-duration":250,
+ "icon-spacing": 4,
+ "icon-size": 18,
+ "transition-duration": 250,
"modules": [
{
- "type":"screenshare",
- "tooltip":true,
- "tooltip-icon-size":24
+ "type": "screenshare",
+ "tooltip": true,
+ "tooltip-icon-size": 24
},
{
- "type":"audio-in",
- "tooltip":true,
- "tooltip-icon-size":24
+ "type": "audio-in",
+ "tooltip": true,
+ "tooltip-icon-size": 24
}
]
},
+
"pulseaudio": {
"format-alt": "{icon}",
"format": "{volume} {icon}",
"format-alt-click": "click-right",
"format-muted": "",
"format-icons": {
- "phone": [" ", " ", " ", " "],
- "default": ["", "", "", ""]
+ "phone": [
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "default": [
+ "",
+ "",
+ "",
+ ""
+ ]
},
"scroll-step": 1,
"on-click": "pavucontrol",
"tooltip": false
},
- "custom/spotify": {
- "interval": 2,
- "return-type": "json",
- "exec": "~/.config/waybar/modules/spotify.sh",
- "exec-if": "~/.config/waybar/modules/check-for-music.sh",
- "escape": true,
- "on-click": "playerctl play-pause"
- },
+
"custom/storage": {
"format-alt": "{} ",
"format": "{percentage}% ",
@@ -118,14 +152,19 @@
"interval": 60,
"exec": "~/.config/waybar/modules/storage.sh"
},
+
"backlight": {
"format-alt": "{icon}",
"format": "{percent}% {icon}",
"format-alt-click": "click-right",
- "format-icons": ["", ""],
+ "format-icons": [
+ "",
+ "󰃞"
+ ],
"on-scroll-up": "light -A 1",
"on-scroll-down": "light -U 1"
},
+
"custom/weather_OLD": {
"format-alt": "{}",
"format": "{alt}: {}",
@@ -136,14 +175,16 @@
"exec": "~/.config/waybar/modules/weather.sh",
"exec-if": "ping wttr.in -c1"
},
+
"custom/weather": {
"format": "{} °F",
"tooltip": true,
"interval": 3600,
- "exec": "exit=101; while [ $exit = 101 ]; do wttrbar --main-indicator temp_F --fahrenheit; exit=$(echo $?); sleep 1; done",
+ "exec": "exit=101; while [ $exit = 101 ]; do wttrbar --main-indicator temp_F --fahrenheit --nerd; exit=$(echo $?); sleep 1; done",
"on-click": "foot -a ala-wttr -H curl https://v2.wttr.in",
"return-type": "json"
},
+
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
@@ -152,6 +193,7 @@
},
"tooltip": false
},
+
"custom/mail": {
"format": "",
"format-alt": "{alt} ",
@@ -161,7 +203,9 @@
"exec": "~/.config/waybar/modules/mail.py",
"tooltip": false
},
+
"tray": {
"icon-size": 18
}
}
+
diff --git a/users/ryan/linux/waybar/modules/storage.sh b/users/ryan/linux/waybar/modules/storage.sh
index 90cc3dc..7cb7249 100755
--- a/users/ryan/linux/waybar/modules/storage.sh
+++ b/users/ryan/linux/waybar/modules/storage.sh
@@ -1,25 +1,70 @@
#!/bin/sh
-mount="/"
+set -eu
+
+mountpoint="/"
warning=20
critical=10
-df -h -P -l "$mount" | awk -v warning=$warning -v critical=$critical '
-/\/.*/ {
- text=$4
- tooltip="Filesystem: "$1"\rSize: "$2"\rUsed: "$3"\rAvail: "$4"\rUse%: "$5"\rMounted on: "$6
- use=$5
- exit 0
+error() {
+ jq -cn --arg message "$1" '{
+ text: "N/A",
+ percentage: 0,
+ tooltip: $message,
+ class: "critical"
+ }'
+ exit 0
}
-END {
- class=""
- gsub(/%$/,"",use)
- if ((100 - use) < critical) {
+
+line=$(df -hP -l "$mountpoint" 2>/dev/null | tail -n 1) ||
+ error "Unable to read filesystem statistics"
+
+# df -P guarantees a single line per filesystem.
+set -- $line
+
+[ "$#" -ge 6 ] || error "Unable to parse filesystem statistics"
+
+filesystem=$1
+size=$2
+used=$3
+available=$4
+use=${5%\%}
+mounted=$6
+
+case "$use" in
+ ''|*[!0-9]*) error "Invalid filesystem usage percentage: $use%" ;;
+esac
+
+free=$((100 - use))
+
+if [ "$free" -le "$critical" ]; then
class="critical"
- } else if ((100 - use) < warning) {
+elif [ "$free" -le "$warning" ]; then
class="warning"
- }
- print "{\"text\":\""text"\", \"percentage\":"use",\"tooltip\":\""tooltip"\", \"class\":\""class"\"}"
-}
-'
+else
+ class=""
+fi
+
+jq -cn \
+ --arg text "${use}%" \
+ --argjson percentage "$use" \
+ --arg filesystem "$filesystem" \
+ --arg size "$size" \
+ --arg used "$used" \
+ --arg available "$available" \
+ --arg mounted "$mounted" \
+ --arg class "$class" \
+ '{
+ text: $text,
+ percentage: $percentage,
+ tooltip: (
+ "Filesystem: " + $filesystem +
+ "\rSize: " + $size +
+ "\rUsed: " + $used +
+ "\rAvail: " + $available +
+ "\rUse%: " + $text +
+ "\rMounted on: " + $mounted
+ ),
+ class: $class
+ }'
diff --git a/users/ryan/linux/waybar/style.css b/users/ryan/linux/waybar/style.css
index 682a14e..ac78984 100644
--- a/users/ryan/linux/waybar/style.css
+++ b/users/ryan/linux/waybar/style.css
@@ -1,7 +1,7 @@
* {
border: none;
border-radius: 0;
- font-family: AnonymicePro Nerd Font;
+ font-family: FiraCode Nerd Font;
font-size: 15px;
box-shadow: none;
text-shadow: none;
diff --git a/users/ryan/linux/wpaperd/config.toml b/users/ryan/linux/wpaperd/config.toml
index 9947370..9735c20 100644
--- a/users/ryan/linux/wpaperd/config.toml
+++ b/users/ryan/linux/wpaperd/config.toml
@@ -1,4 +1,4 @@
[default]
duration = "30m"
-path = "~/.config/hypr/Wallpapers/static/"
+path = "/home/ryan/.config/wallpapers/"
transition-time = 2000
diff --git a/users/ryan/zen/zenPolicies.nix b/users/ryan/zen/zenPolicies.nix
index 1fbb5e1..8d39689 100644
--- a/users/ryan/zen/zenPolicies.nix
+++ b/users/ryan/zen/zenPolicies.nix
@@ -117,6 +117,7 @@ in
"xpinstall.whitelist.required" = lock-true;
"dom.webgpu.enabled" = lock-true;
"media.eme.enabled" = lock-true;
+ "ui.preferReducedMotion" = lock-false;
"general.autoScroll" = lock-true;
"general.smoothScroll" = lock-true;
"browser.crashReports.unsubmittedCheck.autoSubmit2" = lock-false;