Compare

0ce4331f742863ec03c711c27b0a0dee7e8cc187main · 7 commits

merge base 0ce4331f7428…

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
diff --git a/MIGRATION.md b/MIGRATION.md
deleted file mode 100644
index 92f6392..0000000
--- a/MIGRATION.md
+++ /dev/null
@@ -1,249 +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).
-
-`nix-combined` is deliberately its own repo (own history, own remote) so
-that darwin machines never need to clone anything guix-related. It's wired
-into `guix-dotfiles` as a **git submodule** at
-`guix-dotfiles/home-config/nix-combined` - the rest of this section covers
-that wiring; everything after "Stays in Guix" is still a plan for you to
-apply by hand.
-
-## 1. Submodule wiring (already done in this working tree)
-
-Already applied, not yet committed/pushed - review with `git status`/`git
-diff` in `guix-dotfiles` before committing:
-
-- `guix-dotfiles/.gitmodules` added, pointing `home-config/nix-combined` at
- **the local filesystem path** to this checkout of `nix-combined`. That
- only works on this machine. **Before pushing**, create the real remote
- (recommend `https://git.rschanz.org/nix-combined`, matching the
- `nix-dotfiles`/`guix-dotfiles` naming convention) and push `nix-combined`
- there, then run, from `guix-dotfiles`:
- ```
- git submodule set-url home-config/nix-combined https://git.rschanz.org/nix-combined
- git add .gitmodules
- git commit
- ```
-- `home-configuration.scm`'s `%home-symlinks` now points
- `.config/guix/home-config/nix-combined` at `.config/home-manager`
- (previously `.config/guix/home-config/nix-home-manager`).
-- `deploy.sh`'s fresh-install clone now uses `git clone --recurse-submodules`
- so a from-scratch deploy pulls `nix-combined` in the same step.
-
-**On existing machines**, after pulling this change:
-```
-git submodule update --init --recursive
-```
-(or `git clone --recurse-submodules` next time you clone `guix-dotfiles`
-fresh). Then switch with `home-manager switch --flake ~/.config/home-manager#ryan`
-(the `rebuild` zsh alias does this on Linux).
-
-**Updating `nix-combined` later**: since the submodule pins an exact commit,
-pulling new `nix-combined` changes needs a bump in `guix-dotfiles`:
-```
-cd home-config/nix-combined && git pull origin main && cd -
-git add home-config/nix-combined
-git commit -m "bump nix-combined"
-```
-
-The old `guix-dotfiles/home-config/nix-home-manager` directory (the
-pre-submodule ad-hoc flake) can be deleted once you've confirmed the new
-one 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 1a14c7f..4ff553b 100644
--- a/flake.lock
+++ b/flake.lock
@@ -293,11 +293,11 @@
]
},
"locked": {
- "lastModified": 1785569296,
- "narHash": "sha256-ux2+60xcjl4LloKPevqrkP+uY4DNZXhzVd+TYrfE2+w=",
+ "lastModified": 1785784141,
+ "narHash": "sha256-VG4SKltdvSWd6Y2ppsDdSZC8m3x9xtFevh5wndYqo08=",
"owner": "0xc000022070",
"repo": "zen-browser-flake",
- "rev": "945e834a12a97a5e3b08869960e35c7ccfde6f69",
+ "rev": "073be825a844ac51ece75ebfe9d82b5e2ee89a5c",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 1fb7bff..3f110c1 100644
--- a/flake.nix
+++ b/flake.nix
@@ -88,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 e8339e6..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
@@ -200,6 +158,7 @@ in {
"gimp"
"kdenlive"
"rustdesk"
+ "vorssaint"
];
};
@@ -209,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
'';
};
@@ -250,9 +180,6 @@ in {
};
system.defaults = {
- WindowManager = {
- EnableTilingOptionAccelerator = false;
- };
NSGlobalDomain = {
# 24 hour time
AppleICUForce24HourTime = true;
@@ -391,10 +318,6 @@ in {
"com.apple.Accessibility" = {
ReduceMotionEnabled = 1;
};
-
- "com.apple.symbolichotkeys" = {
- AppleSymbolicHotKeys = manualHotkeys // spaceHotkeys;
- };
};
universalaccess.reduceMotion = true;
};
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 58346e7..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;
@@ -143,6 +146,12 @@
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
@@ -159,7 +168,7 @@
jq
htop
(pkgs.zathura.override {
- plugins = [ pkgs.zathuraPkgs.zathura-pdf-mupdf ];
+ plugins = [ pkgs.zathuraPkgs.zathura_pdf_mupdf ];
})
go
pass
@@ -174,9 +183,13 @@
delta
prismlauncher
git-lfs
- kdePackages.kdenlive
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 e721347..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 = {
@@ -30,7 +28,6 @@
home.packages = with pkgs; [
iina # Media player (frontend to mpv essentially)
- nerd-fonts.anonymice
jujutsu
netbird-tui
];
diff --git a/users/ryan/linux.nix b/users/ryan/linux.nix
index 5e6d767..add81df 100644
--- a/users/ryan/linux.nix
+++ b/users/ryan/linux.nix
@@ -1,4 +1,4 @@
-{ config, pkgs, lib, inputs, ... }:
+{ pkgs, lib, inputs, ... }:
{
imports = [
@@ -6,31 +6,36 @@
home.username = "ryan";
home.homeDirectory = "/home/ryan";
- home.stateVersion = "23.11"; # Please read the comment before changing.
nixpkgs.config.allowUnfree = 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;
- };
- }
- ];
- };
-
fonts.fontconfig.enable = true;
fonts.fontconfig.defaultFonts = {
monospace = [ "DejaVu Sans Mono" ];
- sansSerif = [ "DejaVu Sans" ];
- serif = [ "DejaVu Serif" ];
+ sansSerif = [ "Noto Sans" "DejaVu Sans" ];
+ serif = [ "Noto Serif" "DejaVu Serif" ];
+ };
+
+ 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";
+ };
+
+ qt = {
+ enable = true;
+ platformTheme.name = "gtk3";
};
home.pointerCursor = {
@@ -47,6 +52,7 @@
wayland.windowManager.hyprland = {
enable = true;
package = pkgs.hyprland;
+ configType = "hyprlang";
portalPackage = pkgs.xdg-desktop-portal-hyprland;
extraConfig = builtins.readFile ./linux/hypr/hyprland.conf;
};
@@ -60,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; };
@@ -99,30 +106,21 @@
supercell-wx
chromium
foot
+ kdePackages.kdenlive
waybar
fuzzel
- 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/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/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