diff --git a/flake.lock b/flake.lock index 2bd18c3..0d08ad6 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1751880463, - "narHash": "sha256-aSQllMKqsTYAUp4yhpspZn0Hj5yIj7Mh4UD5iyk5iMM=", + "lastModified": 1751463132, + "narHash": "sha256-eKbIZwTsl+Rbkj4coSZETlcTbmVbegN1nCKJ7059p88=", "owner": "catppuccin", "repo": "nix", - "rev": "9474347c69e93e392f194dda7a57c641ba4b998e", + "rev": "a682f7033678ea093c42c5e361975af5988aa3de", "type": "github" }, "original": { @@ -94,11 +94,32 @@ ] }, "locked": { - "lastModified": 1752093218, - "narHash": "sha256-+3rXu8ewcNDi65/2mKkdSGrivQs5zEZVp5aYszXC0d0=", + "lastModified": 1751549056, + "narHash": "sha256-miKaJ4SFNxhZ/WVDADae2jNd9zka5bV9hKmXspAzvxo=", "owner": "nix-community", "repo": "home-manager", - "rev": "206ed3c71418b52e176f16f58805c96e84555320", + "rev": "1fa73bb2cc39e250eb01e511ae6ac83bfbf9f38c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_2": { + "inputs": { + "nixpkgs": [ + "youtube-music", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1747439237, + "narHash": "sha256-5rCGrnkglKKj4cav1U3HC+SIUNJh08pqOK4spQv9RjA=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "ae755329092c87369b9e9a1510a8cf1ce2b1c708", "type": "github" }, "original": { @@ -114,11 +135,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1752110958, - "narHash": "sha256-D3isIKaOsq/6KfKC+t0NDNJ7cY3oik2SZDuPXVFP6vw=", + "lastModified": 1751561412, + "narHash": "sha256-f09KaIjEwn/ljsV3BsIIbp5Fh7rYDRdxqAltLsf00IE=", "owner": "kaylorben", "repo": "nixcord", - "rev": "b11cbba03347769b00eaf531cbc518669e8af447", + "rev": "55990af63fdbc0123a3b7fb18c30de018684ce32", "type": "github" }, "original": { @@ -160,11 +181,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1751984180, - "narHash": "sha256-LwWRsENAZJKUdD3SpLluwDmdXY9F45ZEgCb0X+xgOL0=", + "lastModified": 1751271578, + "narHash": "sha256-P/SQmKDu06x8yv7i0s8bvnnuJYkxVGBWLWHaU+tt4YY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9807714d6944a957c2e036f84b0ff8caf9930bc0", + "rev": "3016b4b15d13f3089db8a41ef937b13a9e33a8df", "type": "github" }, "original": { @@ -198,7 +219,8 @@ "home-manager": "home-manager", "nixcord": "nixcord", "nixpkgs": "nixpkgs_2", - "sops-nix": "sops-nix" + "sops-nix": "sops-nix", + "youtube-music": "youtube-music" } }, "sops-nix": { @@ -206,11 +228,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1751606940, - "narHash": "sha256-KrDPXobG7DFKTOteqdSVeL1bMVitDcy7otpVZWDE6MA=", + "lastModified": 1750119275, + "narHash": "sha256-Rr7Pooz9zQbhdVxux16h7URa6mA80Pb/G07T4lHvh0M=", "owner": "Mic92", "repo": "sops-nix", - "rev": "3633fc4acf03f43b260244d94c71e9e14a2f6e0d", + "rev": "77c423a03b9b2b79709ea2cb63336312e78b72e2", "type": "github" }, "original": { @@ -218,6 +240,27 @@ "repo": "sops-nix", "type": "github" } + }, + "youtube-music": { + "inputs": { + "home-manager": "home-manager_2", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1747498370, + "narHash": "sha256-mJ7fLdL/A4cWHMm0n3/dcQ72Ijm+uTu/snl8iqgtbtc=", + "owner": "h-banii", + "repo": "youtube-music-nix", + "rev": "410071c47bb39a5abb672cd5c1a59bc5f853d908", + "type": "github" + }, + "original": { + "owner": "h-banii", + "repo": "youtube-music-nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 44ab739..dc8e0f4 100644 --- a/flake.nix +++ b/flake.nix @@ -41,6 +41,11 @@ nixcord = { url = "github:kaylorben/nixcord"; }; + + youtube-music = { + url = "github:h-banii/youtube-music-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = diff --git a/homes/x86_64-linux/jo/apps/discord/default.nix b/homes/x86_64-linux/jo/apps/discord/default.nix index c68cdb1..a872828 100644 --- a/homes/x86_64-linux/jo/apps/discord/default.nix +++ b/homes/x86_64-linux/jo/apps/discord/default.nix @@ -1,6 +1,5 @@ { lib, - pkgs, config, ... }: @@ -11,8 +10,6 @@ in # Enable arRPC for discord Rich Presence stuffs services.arrpc.enable = true; - home.packages = with pkgs; [ arrpc ]; - programs.nixcord = { enable = true; vesktop.enable = true; diff --git a/homes/x86_64-linux/jo/apps/firefox/default.nix b/homes/x86_64-linux/jo/apps/firefox/default.nix deleted file mode 100644 index 8844b1a..0000000 --- a/homes/x86_64-linux/jo/apps/firefox/default.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ lib, config, ... }: -let - inherit (lib) mkIf; -in -{ - programs.firefox = mkIf config.programs.firefox.enable { - # Required settings for Onebar - profiles.default.settings = { - "toolkit.legacyUserProfileCustomizations.stylesheets" = true; - }; - }; - - home.file.".mozilla/firefox/default/chrome/userChrome.css".text = - mkIf config.programs.firefox.enable '' - @import "onebar/onebar.css"; - ''; - - home.file.".mozilla/firefox/default/chrome/onebar/onebar.css".source = ./onebar.css; -} diff --git a/homes/x86_64-linux/jo/apps/firefox/onebar.css b/homes/x86_64-linux/jo/apps/firefox/onebar.css deleted file mode 100644 index 76282d6..0000000 --- a/homes/x86_64-linux/jo/apps/firefox/onebar.css +++ /dev/null @@ -1,514 +0,0 @@ -/* 1.8.3 -- Fixed for Firefox 137! -- Fixed https truncate (fix #29) -*/ - -:root { - --urlbar-collapsed-width: 200px; - --urlbar-open-width: 300px; /* Only when disable-centering-of-URLbar is enabled */ -} - -#navigator-toolbox { - display: flex; - flex-wrap: wrap; - flex-direction: row; - position: relative !important; -} - - -/* Hide flexible spaces */ -toolbarspring, -[id^="wrapper-customizableui-special-spring"] { - display: none !important; -} - - -/* Tabs */ -#titlebar { - width: 0; - flex-grow: 1; - overflow: hidden; -} -#toolbar-menubar[inactive="true"] { /* Prevent duplicate window controls */ - display: none !important; -} -#TabsToolbar { - display: flex !important; - align-items: center; - z-index: 1; - padding-left: var(--tab-block-margin) !important; -} -#TabsToolbar-customization-target { - display: flex !important; - margin-block: auto !important; - align-items: center; -} -#tabbrowser-tabs { - overflow: hidden !important; - width: 0 !important; - flex: 1 !important; -} -.tabbrowser-tab { - min-height: calc(var(--tab-min-height) - 2px) !important; -} -.tab-background { /* Just thought it looked nicer */ - margin-block: calc(2px + var(--tab-block-margin)) !important; - box-shadow: none !important; - transition: background-color .2s; -} - -@media -moz-pref("onebar.hide-all-tabs-button") { - @media not (max-width: 700px) { - #alltabs-button { - display: none !important; - } - } -} - - -/* Navigation buttons */ -@media -moz-pref("onebar.conditional-navigation-buttons") { - :root:not([customizing]) #back-button[disabled], - :root:not([customizing]) #forward-button[disabled] { - display: none !important; - } -} -@media not -moz-pref("onebar.disable-hiding-navigation-buttons") { - #urlbar-container ~ :is(#back-button, #forward-button) { - display: none !important; - } - /* In the customize menu */ - :is(#wrapper-back-button, #wrapper-forward-button) { - opacity: 1 !important; - } - #wrapper-urlbar-container ~ :is(#wrapper-back-button, #wrapper-forward-button) { - opacity: .5 !important; - } - - /* Add note in customize menu for nav buttons */ - #customization-header::after { - content: "To hide the back & forward buttons, drag them to the right of the URL bar"; - background-color: blue; - color: white; - border-radius: 4px; - padding: .4em .7em; - margin-top: 1em; - display: block; - width: max-content; - } -} -:root[customizing] .urlbar-input-box { - visibility: visible !important; -} -:root[customizing] .urlbar-input-box::before { - content: "https://"; - margin-block: auto; -} -:root[customizing] #urlbar-input { - display: none !important; -} - -:root[customizing] .customization-target { - padding-inline: 20px; -} -:root[customizing] #nav-bar-customization-target { - border-right: 1px dashed var(--border-color-deemphasized); -} -:root[customizing] #nav-bar-customization-target, -:root[customizing] #tabbrowser-tabs { - border-left: 1px dashed var(--border-color-deemphasized); -} - - - - - -/* Single Tab Styling */ -@media not -moz-pref("onebar.disable-single-tab") { - .tabbrowser-tab:only-of-type { - width: max-content !important; - max-width: 80% !important; - flex: unset !important; - margin-inline-end: auto !important; - --toolbar-bgcolor: transparent !important; - --tab-selected-bgimage: transparent !important; - } - .tabbrowser-tab:only-of-type .tab-text { - font-weight: 600 !important; - } - .tabbrowser-tab:only-of-type .tab-close-button, - #tabbrowser-tabs:not([closebuttons="activetab"]) ~ #alltabs-button { - display: none !important; - } - .tabbrowser-tab:only-of-type .tab-background { - opacity: 0; - } -} - - - -/* Match button sizes to toolbar buttons */ -#TabsToolbar { - --toolbarbutton-inner-padding: 8px !important; -} -#TabsToolbar toolbarbutton { - margin: 0 !important; -} - - -#alltabs-button { - order: -1; -} -.titlebar-buttonbox-container { - order: -100 !important; -} - -/* Toolbar */ -#nav-bar { - background: none !important; -} -#urlbar-container { - width: var(--urlbar-collapsed-width) !important; - flex: 1 !important; - z-index: 10; - justify-content: flex-end; - transition: background-color .2s, width .2s, min-width .2s; -} -#urlbar:not([breakout-extend]) { - min-width: max-content !important; -} -@media not -moz-pref("onebar.disable-centering-of-URLbar") { - #urlbar { - position: relative !important; - top: unset !important; - margin-block: auto !important; - } - #urlbar[breakout-extend] { - position: absolute !important; - inset-inline: 20vw !important; - width: unset !important; - align-self: flex-start !important; - } -} -@media -moz-pref("onebar.disable-centering-of-URLbar") { - #urlbar[breakout-extend] .urlbar-input-box { - width: 400px !important; - } - #urlbar-container:focus-within, #urlbar-container:hover { - width: var(--urlbar-open-width) !important; - } - @media (max-width: 700px) { - #urlbar[breakout-extend] { - width: unset !important; - } - } -} -@media -moz-pref("onebar.collapse-URLbar") { - :root:not([customizing]) #urlbar-container:has(#urlbar:not([focused])) { - justify-content: flex-end; - width: var(--urlbar-collapsed-width) !important; - --urlbar-collapsed-width: calc( - var(--urlbar-min-height) - 2px + 2 * var(--urlbar-container-padding) - ); - #urlbar { - min-width: var(--urlbar-collapsed-width) !important; - width: max-content !important; - max-width: 2000px; - transition: max-width .2s; - } - #urlbar-background::before { - content: ""; - position: absolute; - inset: 0; - background: var(--toolbar-bgcolor); - border-radius: var(--toolbarbutton-border-radius); - opacity: 0; - z-index: -1; - transition: opacity .2s; - } - &:not(:hover) { - #urlbar { - max-width: var(--urlbar-collapsed-width); - } - } - &:hover #urlbar-background::before { - opacity: 1; - } - .urlbar-input-box { - position: absolute !important; - opacity: 0; - pointer-events: none; - } - .identity-box-button { - padding-inline: var(--urlbar-icon-padding) !important; - } - #identity-icon-box, - #tracking-protection-icon-container { - max-width: unset !important; - opacity: 1 !important; - padding-inline: var(--urlbar-icon-padding) !important; - order: 3; - } - @media (max-width: 700px) { - & { - flex: unset !important; - width: auto !important; - margin-inline-start: auto !important; - } - } - } -} - -#urlbar-input-container { - display: flex !important; -} -.urlbar-input-container > :not(.urlbar-input-box) { - order: 2; - margin: 0 !important; -} -.urlbar-input-box { - flex-grow: 1 !important; - padding-left: .5em !important; - width: 100px !important; - min-width: 50px !important; - transition: width .2s; -} -#urlbar-input:not(:focus-within) { - mask: linear-gradient(to right, black calc(100% - 20px), transparent); -} -#urlbar-background { - transition: border .2s; -} -#urlbar:hover:not([focused="true"]) > #urlbar-background { - --toolbar-field-border-color: var(--toolbar-field-focus-border-color) -} - -/* Truncate https:// when collapsed */ -@media (not -moz-pref("onebar.disable-https-truncate")) and (not -moz-pref("browser.urlbar.trimHttps")) { - #urlbar-input { - transition: margin .1s; - } - .verifiedDomain ~ .urlbar-input-box:not(:focus-within) #urlbar-input { - --https-size: 5ch; - margin-left: calc(0ch - var(--https-size)) !important; - mask: linear-gradient(to right, transparent var(--https-size), black calc(var(--https-size) + 1ch) calc(100% - 3ch), transparent) !important; - } -} - -/* Hide unimportant buttons until hover */ -:root { - --in-transition: font-size .2s, padding .2s, margin .2s, max-width .2s, opacity .2s .15s; - --out-transition: font-size .2s, padding .2s, margin .2s, max-width .2s, opacity .07s; -} -#urlbar-container:hover .urlbar-input-container > box:not(#page-action-buttons):not(.urlbar-input-box), -#urlbar-container:hover #page-action-buttons > *, -#urlbar-container:hover #userContext-label { - transition: var(--in-transition) !important; - max-width: 200px; -} -@media -moz-pref("onebar.disable-autohide-of-URLbar-icons") { - #urlbar-container { - width: var(--urlbar-open-width) !important; - } -} -@media not -moz-pref("onebar.disable-autohide-of-URLbar-icons") { - #urlbar-container:not(:hover) :where( - toolbarbutton, - #userContext-label, - #star-button-box, - .verifiedDomain, - #tracking-protection-icon-container, - #pageAction-urlbar-_testpilot-containers, - #pageActionButton, - ) { - font-size: 0 !important; - max-width: 0 !important; - padding-inline: 0 !important; - margin-inline: 0 !important; - opacity: 0 !important; - transition: var(--out-transition) !important; - } - @media -moz-pref("onebar.hide-all-URLbar-icons") { - #urlbar-container:not(:hover) :where(#page-action-buttons, #identity-box) > * { - font-size: 0 !important; - max-width: 0 !important; - padding-inline: 0 !important; - margin-inline: 0 !important; - opacity: 0 !important; - transition: var(--out-transition) !important; - } - } -} -#urlbar-container #urlbar[focused="true"] .urlbar-input-container > box, -#urlbar-container #urlbar[focused="true"] #page-action-buttons > * { - font-size: 0 !important; - max-width: 0 !important; - padding-inline: 0 !important; - margin-inline: 0 !important; - opacity: 0 !important; - transition: var(--out-transition) !important; -} - -/* Other Buttons */ - -.toolbarbutton-icon { - transition: background-color .1s; -} - -#nav-bar #search-container { - min-width: 32px !important; - transition: min-width .2s; -} - -.titlebar-spacer, -#identity-icon-label { - display: none; -} - -@media -moz-pref("onebar.hide-unified-extensions-button") { - #unified-extensions-button, #unified-extensions-button > .toolbarbutton-icon { - width: 0px !important; - padding: 0px !important; - } -} - -/* Wrap other toolbars to bottom */ -#nav-bar ~ * { - width: 100vw !important; -} - - - - - -/* Linux fixes, credits: https://github.com/ranmaru22/firefox-vertical-tabs/pull/39 */ - -@media (-moz-gtk-csd-available) { - /* window control padding values (these don't change the size of the actual buttons, only the padding for the navbar) */ - :root[customtitlebar] { - /* default button/padding size based on adw-gtk3 theme */ - --uc-win-ctrl-btn-width: 38px; - --uc-win-ctrl-padding: 12px; - } - - :root[customtitlebar][lwtheme] { - /* seperate values for when using a theme, based on the Firefox defaults */ - --uc-win-ctrl-btn-width: 30px; - --uc-win-ctrl-padding: 12px; - } - - /* setting the padding value for all button combinations */ - @media (-moz-gtk-csd-minimize-button), - (-moz-gtk-csd-maximize-button), - (-moz-gtk-csd-close-button) { - #navigator-toolbox { - --uc-navbar-padding: calc(var(--uc-win-ctrl-btn-width) * 1); - } - } - - @media (-moz-gtk-csd-minimize-button) and (-moz-gtk-csd-maximize-button), - (-moz-gtk-csd-minimize-button) and (-moz-gtk-csd-close-button), - (-moz-gtk-csd-maximize-button) and (-moz-gtk-csd-close-button) { - #navigator-toolbox { - --uc-navbar-padding: calc(var(--uc-win-ctrl-btn-width) * 2); - } - } - - @media (-moz-gtk-csd-minimize-button) and (-moz-gtk-csd-maximize-button) and (-moz-gtk-csd-close-button) { - #navigator-toolbox { - --uc-navbar-padding: calc(var(--uc-win-ctrl-btn-width) * 3); - } - } - - /* only applies padding/positioning if there is 1 or more buttons */ - @media (-moz-gtk-csd-minimize-button), - (-moz-gtk-csd-maximize-button), - (-moz-gtk-csd-close-button) { - .titlebar-buttonbox-container { - left: 0; - position: absolute; - display: block; - z-index: 101; - } - @media (-moz-gtk-csd-reversed-placement) { - #TabsToolbar { - padding-left: calc(var(--uc-navbar-padding, 0) + var(--uc-win-ctrl-padding)) !important; - } - } - /* window controls on the right */ - @media not (-moz-gtk-csd-reversed-placement) { - #nav-bar { - padding-right: calc(var(--uc-navbar-padding, 0) + var(--uc-win-ctrl-padding)) !important; - } - .titlebar-buttonbox-container { - right: 0; - left: unset; - } - } - .toolbar-items { - max-width: calc(100vw - ( - var(--uc-navbar-padding, 0) + var(--uc-win-ctrl-padding) - )); - } - } -} - -/* MacOS fixes */ -@media (-moz-platform: macos) { - .titlebar-buttonbox-container { - margin-right: 10px; - } -} - -/* Windows OS fixes */ -@media (-moz-platform: windows-win10), (-moz-platform: windows) { - /* Unsure if same attribute changed on windows, - would like confirmation or someone to fix */ - :root[tabsintitlebar], :root[customtitlebar] { - --uc-window-control-width: 137px; - --uc-win-ctrl-padding: 12px; - } - - #nav-bar { - padding-right: calc(var(--uc-window-control-width) + var(--uc-win-ctrl-padding)) !important; - } - .titlebar-buttonbox-container { - top: 0 !important; - right: 0 !important; - height: calc(var(--tab-min-height) + var(--toolbarbutton-inner-padding) + var(--toolbarbutton-outer-padding)); - position: absolute !important; - z-index: 101 !important; - max-height: 100%; - } - .toolbar-items { - max-width: calc(100vw - var(--uc-window-control-width)) !important; - } - - /* Hide window buttons in fullscreen */ - #navigator-toolbox[style*="margin-top: -"] .titlebar-buttonbox-container, - [inDOMFullscreen="true"] .titlebar-buttonbox-container { - transform: translateY(-100px) - } - -} - -/* Small window */ - -@media (max-width: 700px) { - #nav-bar { - width: 0 !important; - flex-grow: 999; - --toolbarbutton-outer-padding: 0px; - --toolbar-start-end-padding: 0px; - } - #TabsToolbar { - min-width: unset !important; - } - #tabbrowser-tabs { - display: none !important; - } - #urlbar[breakout-extend] { - inset-inline: 15px !important; - z-index: 102 !important; - } -} diff --git a/homes/x86_64-linux/jo/apps/youtube-music/default.nix b/homes/x86_64-linux/jo/apps/youtube-music/default.nix index 3e79eb8..af40fc8 100644 --- a/homes/x86_64-linux/jo/apps/youtube-music/default.nix +++ b/homes/x86_64-linux/jo/apps/youtube-music/default.nix @@ -1,7 +1,31 @@ { lib, + config, + osConfig, + namespace, ... }: +let + inherit (lib) mkIf; +in { + programs.youtube-music = { + enable = false; + options = { + tray = true; + trayClickPlayPause = true; + resumeOnStart = false; + themes = [ + (mkIf config.catppuccin.enable ./catppuccin-${config.catppuccin.flavor}.css) + ]; + + language = osConfig.${namespace}.system.locale.keymap; + autoUpdates = false; + }; + + plugins = { + discord.enabled = true; + }; + }; } diff --git a/homes/x86_64-linux/jo/default.nix b/homes/x86_64-linux/jo/default.nix index c9ab3c5..a06a346 100644 --- a/homes/x86_64-linux/jo/default.nix +++ b/homes/x86_64-linux/jo/default.nix @@ -6,7 +6,6 @@ { imports = [ ./apps/discord - ./apps/firefox ./apps/youtube-music ]; diff --git a/modules/home/apps/firefox/default.nix b/modules/home/apps/firefox/default.nix index 6a7f3bf..1278ccc 100644 --- a/modules/home/apps/firefox/default.nix +++ b/modules/home/apps/firefox/default.nix @@ -34,10 +34,6 @@ in } ) { } cfg.extensions; }; - - profiles.default = { - extensions.force = true; - }; }; }; } diff --git a/modules/nixos/services/traefik/default.nix b/modules/nixos/services/traefik/default.nix index 34deab8..884e0c5 100644 --- a/modules/nixos/services/traefik/default.nix +++ b/modules/nixos/services/traefik/default.nix @@ -98,7 +98,7 @@ in } { main = "jo-dev.com"; - sans = [ "*.jo-dev.com" ]; + sans = ["*.jo-dev.com"]; } ]; }; diff --git a/modules/nixos/users/default.nix b/modules/nixos/users/default.nix index 25254af..a4b2de2 100644 --- a/modules/nixos/users/default.nix +++ b/modules/nixos/users/default.nix @@ -99,6 +99,7 @@ in inputs.sops-nix.homeManagerModules.sops inputs.catppuccin.homeModules.default inputs.nixcord.homeModules.nixcord + inputs.youtube-music.homeManagerModules.default ] ++ homeModules; home.stateVersion = lib.mkDefault osConfig.system.stateVersion; diff --git a/systems/x86_64-nixos/puzzlevision/default.nix b/systems/x86_64-nixos/puzzlevision/default.nix index f897aa2..8b96486 100644 --- a/systems/x86_64-nixos/puzzlevision/default.nix +++ b/systems/x86_64-nixos/puzzlevision/default.nix @@ -9,9 +9,6 @@ sops.defaultSopsFile = ./secrets/users.yaml; sops.age.keyFile = "/var/lib/sops-nix/key.txt"; - programs.steam.enable = true; - programs.steam.remotePlay.openFirewall = true; - puzzlevision = { users.jo = { enable = true; @@ -39,12 +36,12 @@ ''; # Configure 8GB SWAP partition - # swapDevices = [ - # { - # device = "/swapfile"; - # size = 8 * 1024; - # } - # ]; + swapDevices = [ + { + device = "/swapfile"; + size = 8 * 1024; + } + ]; boot = { # Configure additional kernel modules.