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/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);
+ };
+ };
+}