#+TITLE: NixOS Configuration #+AUTHOR: Preston Pan #+Description: My NixOS configuration in full #+html_head: * Configuration #+begin_src nix :tangle t # Edit this configuration file to define what should be installed on # your system. Help is available in the configuration.nix(5) man page # and in the NixOS manual (accessible by running ‘nixos-help’). { config, pkgs, ... }: { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix ]; # Bootloader. boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; networking.hostName = "continuity"; # Define your hostname. # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. # Configure network proxy if necessary # networking.proxy.default = "http://user:password@proxy:port/"; # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; # Enable networking networking.networkmanager.enable = true; # Set your time zone. time.timeZone = "America/Vancouver"; # Select internationalisation properties. i18n.defaultLocale = "en_CA.UTF-8"; # Enable the X11 windowing system. services.xserver.enable = true; services.xserver.displayManager.startx.enable = true; # Configure keymap in X11 services.xserver = { layout = "us"; xkbVariant = ""; xkbOptions = "caps:escape"; }; # Enable CUPS to print documents. services.printing.enable = true; # Enable sound with pipewire. sound.enable = true; hardware.pulseaudio.enable = false; security.rtkit.enable = true; services.pipewire = { enable = true; alsa.enable = true; alsa.support32Bit = true; pulse.enable = true; # If you want to use JACK applications, uncomment this #jack.enable = true; # use the example session manager (no others are packaged yet so this is enabled by default, # no need to redefine it in your config for now) #media-session.enable = true; }; # Enable touchpad support (enabled default in most desktopManager). # services.xserver.libinput.enable = true; home-manager.users.preston = { nixpkgs.config.packageOverrides = pkgs: { nur = import (builtins.fetchTarball "https://github.com/nix-community/NUR/archive/master.tar.gz") { inherit pkgs; }; }; home.packages = [ pkgs.vim pkgs.git pkgs.curl pkgs.wget pkgs.neofetch pkgs.cowsay pkgs.starship pkgs.kitty pkgs.ffmpeg pkgs.hyprland pkgs.grim pkgs.acpilight pkgs.light pkgs.gnupg pkgs.pass pkgs.fira-code pkgs.croc pkgs.nixpkgs-fmt pkgs.mu pkgs.rust-analyzer pkgs.rustc pkgs.cargo pkgs.rnix-lsp pkgs.clang pkgs.bear pkgs.gnumake pkgs.clang-tools pkgs.gammastep pkgs.pinentry pkgs.texliveFull pkgs.helvum pkgs.xdg-utils pkgs.ncmpcpp pkgs.noto-fonts pkgs.noto-fonts-cjk pkgs.autobuild pkgs.rsync pkgs.pavucontrol pkgs.swww pkgs.fswebcam pkgs.nmap pkgs.mpc-cli pkgs.yt-dlp pkgs.mpv (pkgs.nerdfonts.override { fonts = [ "Iosevka" ]; }) (pkgs.discord.override { withOpenASAR = true; withVencord = true; }) pkgs.vesktop ]; fonts.fontconfig.enable = true; xsession.enable = true; home.stateVersion = "23.11"; services.gpg-agent = { enable = true; pinentryFlavor = "emacs"; extraConfig = '' allow-emacs-pinentry allow-loopback-pinentry ''; }; services.mpd = { enable = true; dbFile = "/home/preston/.config/mpd/db"; dataDir = "/home/preston/.config/mpd/"; network.port = 6600; musicDirectory = "/home/preston/music"; playlistDirectory = "/home/preston/.config/mpd/playlists"; extraConfig = '' audio_output { type "pipewire" name "pipewire boi" } ''; }; programs.wofi = { enable = true; settings = { location = "bottom-right"; allow_markup = true; show = "drun"; width = 750; height = 400; always_parse_args = true; show_all = false; term = "kitty"; hide_scroll = true; print_command = true; insensitive = true; prompt = ""; columns = 2; }; style = '' @define-color rosewater #f5e0dc; @define-color rosewater-rgb rgb(245, 224, 220); @define-color flamingo #f2cdcd; @define-color flamingo-rgb rgb(242, 205, 205); @define-color pink #f5c2e7; @define-color pink-rgb rgb(245, 194, 231); @define-color mauve #cba6f7; @define-color mauve-rgb rgb(203, 166, 247); @define-color red #f38ba8; @define-color red-rgb rgb(243, 139, 168); @define-color maroon #eba0ac; @define-color maroon-rgb rgb(235, 160, 172); @define-color peach #fab387; @define-color peach-rgb rgb(250, 179, 135); @define-color yellow #f9e2af; @define-color yellow-rgb rgb(249, 226, 175); @define-color green #a6e3a1; @define-color green-rgb rgb(166, 227, 161); @define-color teal #94e2d5; @define-color teal-rgb rgb(148, 226, 213); @define-color sky #89dceb; @define-color sky-rgb rgb(137, 220, 235); @define-color sapphire #74c7ec; @define-color sapphire-rgb rgb(116, 199, 236); @define-color blue #89b4fa; @define-color blue-rgb rgb(137, 180, 250); @define-color lavender #b4befe; @define-color lavender-rgb rgb(180, 190, 254); @define-color text #cdd6f4; @define-color text-rgb rgb(205, 214, 244); @define-color subtext1 #bac2de; @define-color subtext1-rgb rgb(186, 194, 222); @define-color subtext0 #a6adc8; @define-color subtext0-rgb rgb(166, 173, 200); @define-color overlay2 #9399b2; @define-color overlay2-rgb rgb(147, 153, 178); @define-color overlay1 #7f849c; @define-color overlay1-rgb rgb(127, 132, 156); @define-color overlay0 #6c7086; @define-color overlay0-rgb rgb(108, 112, 134); @define-color surface2 #585b70; @define-color surface2-rgb rgb(88, 91, 112); @define-color surface1 #45475a; @define-color surface1-rgb rgb(69, 71, 90); @define-color surface0 #313244; @define-color surface0-rgb rgb(49, 50, 68); @define-color base #1e1e2e; @define-color base-rgb rgb(30, 30, 46); @define-color mantle #181825; @define-color mantle-rgb rgb(24, 24, 37); @define-color crust #11111b; @define-color crust-rgb rgb(17, 17, 27); * { font-family: 'Iosevka Nerd Font', monospace; font-size: 14px; } /* Window */ window { margin: 0px; padding: 10px; border: 0.16em solid @lavender; border-radius: 0.1em; background-color: @base; animation: slideIn 0.5s ease-in-out both; } /* Slide In */ @keyframes slideIn { 0% { opacity: 0; } 100% { opacity: 1; } } /* Inner Box */ #inner-box { margin: 5px; padding: 10px; border: none; background-color: @base; animation: fadeIn 0.5s ease-in-out both; } /* Fade In */ @keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } /* Outer Box */ #outer-box { margin: 5px; padding: 10px; border: none; background-color: @base; } /* Scroll */ #scroll { margin: 0px; padding: 10px; border: none; background-color: @base; } /* Input */ #input { margin: 5px 20px; padding: 10px; border: none; border-radius: 0.1em; color: @text; background-color: @base; animation: fadeIn 0.5s ease-in-out both; } #input image { border: none; color: @red; } #input * { outline: 4px solid @red!important; } /* Text */ #text { margin: 5px; border: none; color: @text; animation: fadeIn 0.5s ease-in-out both; } #entry { background-color: @base; } #entry arrow { border: none; color: @lavender; } /* Selected Entry */ #entry:selected { border: 0.11em solid @lavender; } #entry:selected #text { color: @mauve; } #entry:drop(active) { background-color: @lavender!important; } ''; }; programs.kitty = { enable = true; settings = { enable_audio_bell = false; font_family = "Fira Code"; font_size = 12; confirm_os_window_close = -1; background_opacity = "0.9"; }; extraConfig = '' # The basic colors foreground #CDD6F4 background #1E1E2E selection_foreground #1E1E2E selection_background #F5E0DC # Cursor colors cursor #F5E0DC cursor_text_color #1E1E2E # URL underline color when hovering with mouse url_color #F5E0DC # Kitty window border colors active_border_color #B4BEFE inactive_border_color #6C7086 bell_border_color #F9E2AF # OS Window titlebar colors wayland_titlebar_color #1E1E2E macos_titlebar_color #1E1E2E # Tab bar colors active_tab_foreground #11111B active_tab_background #CBA6F7 inactive_tab_foreground #CDD6F4 inactive_tab_background #181825 tab_bar_background #11111B # Colors for marks (marked text in the terminal) mark1_foreground #1E1E2E mark1_background #B4BEFE mark2_foreground #1E1E2E mark2_background #CBA6F7 mark3_foreground #1E1E2E mark3_background #74C7EC # The 16 terminal colors # black color0 #45475A color8 #585B70 # red color1 #F38BA8 color9 #F38BA8 # green color2 #A6E3A1 color10 #A6E3A1 # yellow color3 #F9E2AF color11 #F9E2AF # blue color4 #89B4FA color12 #89B4FA # magenta color5 #F5C2E7 color13 #F5C2E7 # cyan color6 #94E2D5 color14 #94E2D5 # white color7 #BAC2DE color15 #A6ADC8 ''; }; programs.firefox = { policies = { EnableTrackingProtection = true; OfferToSaveLogins = false; }; enable = true; profiles = { default = { id = 0; name = "default"; isDefault = true; extensions = with pkgs.nur.repos.rycee.firefox-addons; [ ublock-origin tree-style-tab firefox-color vimium ]; extraConfig = '' // /* You may copy+paste this file and use it as it is. * * If you make changes to your about:config while the program is running, the * changes will be overwritten by the user.js when the application restarts. * * To make lasting changes to preferences, you will have to edit the user.js. */ /**************************************************************************** * Betterfox * * "Ad meliora" * * version: 122 * * url: https://github.com/yokoffing/Betterfox * ****************************************************************************/ /**************************************************************************** * SECTION: FASTFOX * ****************************************************************************/ /** GENERAL ***/ user_pref("content.notify.interval", 100000); /** GFX ***/ user_pref("gfx.canvas.accelerated.cache-items", 4096); user_pref("gfx.canvas.accelerated.cache-size", 512); user_pref("gfx.content.skia-font-cache-size", 20); /** DISK CACHE ***/ user_pref("browser.cache.jsbc_compression_level", 3); /** MEDIA CACHE ***/ user_pref("media.memory_cache_max_size", 65536); user_pref("media.cache_readahead_limit", 7200); user_pref("media.cache_resume_threshold", 3600); /** IMAGE CACHE ***/ user_pref("image.mem.decode_bytes_at_a_time", 32768); /** NETWORK ***/ user_pref("network.buffer.cache.size", 262144); user_pref("network.buffer.cache.count", 128); user_pref("network.http.max-connections", 1800); user_pref("network.http.max-persistent-connections-per-server", 10); user_pref("network.http.max-urgent-start-excessive-connections-per-host", 5); user_pref("network.http.pacing.requests.enabled", false); user_pref("network.dnsCacheExpiration", 3600); user_pref("network.dns.max_high_priority_threads", 8); user_pref("network.ssl_tokens_cache_capacity", 10240); /** SPECULATIVE LOADING ***/ user_pref("network.dns.disablePrefetch", true); user_pref("network.prefetch-next", false); user_pref("network.predictor.enabled", false); /** EXPERIMENTAL ***/ user_pref("layout.css.grid-template-masonry-value.enabled", true); user_pref("dom.enable_web_task_scheduling", true); user_pref("layout.css.has-selector.enabled", true); user_pref("dom.security.sanitizer.enabled", true); /**************************************************************************** * SECTION: SECUREFOX * ****************************************************************************/ /** TRACKING PROTECTION ***/ user_pref("browser.contentblocking.category", "strict"); user_pref("urlclassifier.trackingSkipURLs", "*.reddit.com, *.twitter.com, *.twimg.com, *.tiktok.com"); user_pref("urlclassifier.features.socialtracking.skipURLs", "*.instagram.com, *.twitter.com, *.twimg.com"); user_pref("network.cookie.sameSite.noneRequiresSecure", true); user_pref("browser.download.start_downloads_in_tmp_dir", true); user_pref("browser.helperApps.deleteTempFileOnExit", true); user_pref("browser.uitour.enabled", false); user_pref("privacy.globalprivacycontrol.enabled", true); /** OCSP & CERTS / HPKP ***/ user_pref("security.OCSP.enabled", 0); user_pref("security.remote_settings.crlite_filters.enabled", true); user_pref("security.pki.crlite_mode", 2); /** SSL / TLS ***/ user_pref("security.ssl.treat_unsafe_negotiation_as_broken", true); user_pref("browser.xul.error_pages.expert_bad_cert", true); user_pref("security.tls.enable_0rtt_data", false); /** DISK AVOIDANCE ***/ user_pref("browser.privatebrowsing.forceMediaMemoryCache", true); user_pref("browser.sessionstore.interval", 60000); /** SHUTDOWN & SANITIZING ***/ /** L **/ user_pref("privacy.history.custom", true); /** SEARCH / URL BAR ***/ user_pref("browser.search.separatePrivateDefault.ui.enabled", true); user_pref("browser.urlbar.update2.engineAliasRefresh", true); user_pref("browser.search.suggest.enabled", false); user_pref("browser.urlbar.suggest.quicksuggest.sponsored", false); user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); user_pref("browser.formfill.enable", false); user_pref("security.insecure_connection_text.enabled", true); user_pref("security.insecure_connection_text.pbmode.enabled", true); user_pref("network.IDN_show_punycode", true); /** HTTPS-FIRST POLICY ***/ user_pref("dom.security.https_first", true); user_pref("dom.security.https_first_schemeless", true); /** PASSWORDS ***/ user_pref("signon.formlessCapture.enabled", false); user_pref("signon.privateBrowsingCapture.enabled", false); user_pref("network.auth.subresource-http-auth-allow", 1); user_pref("editor.truncate_user_pastes", false); /** MIXED CONTENT + CROSS-SITE ***/ user_pref("security.mixed_content.block_display_content", true); user_pref("security.mixed_content.upgrade_display_content", true); user_pref("security.mixed_content.upgrade_display_content.image", true); user_pref("pdfjs.enableScripting", false); user_pref("extensions.postDownloadThirdPartyPrompt", false); /** HEADERS / REFERERS ***/ user_pref("network.http.referer.XOriginTrimmingPolicy", 2); /** CONTAINERS ***/ user_pref("privacy.userContext.ui.enabled", true); /** WEBRTC ***/ user_pref("media.peerconnection.ice.proxy_only_if_behind_proxy", true); user_pref("media.peerconnection.ice.default_address_only", true); /** SAFE BROWSING ***/ user_pref("browser.safebrowsing.downloads.remote.enabled", false); /** MOZILLA ***/ user_pref("permissions.default.desktop-notification", 2); user_pref("permissions.default.geo", 2); user_pref("geo.provider.network.url", "https://location.services.mozilla.com/v1/geolocate?key=%MOZILLA_API_KEY%"); user_pref("permissions.manager.defaultsUrl", ""); user_pref("webchannel.allowObject.urlWhitelist", ""); /** TELEMETRY ***/ user_pref("datareporting.policy.dataSubmissionEnabled", false); user_pref("datareporting.healthreport.uploadEnabled", false); user_pref("toolkit.telemetry.unified", false); user_pref("toolkit.telemetry.enabled", false); user_pref("toolkit.telemetry.server", "data:,"); user_pref("toolkit.telemetry.archive.enabled", false); user_pref("toolkit.telemetry.newProfilePing.enabled", false); user_pref("toolkit.telemetry.shutdownPingSender.enabled", false); user_pref("toolkit.telemetry.updatePing.enabled", false); user_pref("toolkit.telemetry.bhrPing.enabled", false); user_pref("toolkit.telemetry.firstShutdownPing.enabled", false); user_pref("toolkit.telemetry.coverage.opt-out", true); user_pref("toolkit.coverage.opt-out", true); user_pref("toolkit.coverage.endpoint.base", ""); user_pref("browser.ping-centre.telemetry", false); user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false); user_pref("browser.newtabpage.activity-stream.telemetry", false); /** EXPERIMENTS ***/ user_pref("app.shield.optoutstudies.enabled", false); user_pref("app.normandy.enabled", false); user_pref("app.normandy.api_url", ""); /** CRASH REPORTS ***/ user_pref("breakpad.reportURL", ""); user_pref("browser.tabs.crashReporting.sendReport", false); user_pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false); /** DETECTION ***/ user_pref("captivedetect.canonicalURL", ""); user_pref("network.captive-portal-service.enabled", false); user_pref("network.connectivity-service.enabled", false); /**************************************************************************** * SECTION: PESKYFOX * ****************************************************************************/ /** MOZILLA UI ***/ /** format on save please? **/ user_pref("browser.privatebrowsing.vpnpromourl", ""); user_pref("extensions.getAddons.showPane", false); user_pref("extensions.htmlaboutaddons.recommendations.enabled", false); user_pref("browser.discovery.enabled", false); user_pref("browser.shell.checkDefaultBrowser", false); user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false); user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false); user_pref("browser.preferences.moreFromMozilla", false); user_pref("browser.tabs.tabmanager.enabled", false); user_pref("browser.aboutConfig.showWarning", false); user_pref("browser.aboutwelcome.enabled", false); /** THEME ADJUSTMENTS ***/ user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); user_pref("browser.compactmode.show", true); user_pref("browser.display.focus_ring_on_anything", true); user_pref("browser.display.focus_ring_style", 0); user_pref("browser.display.focus_ring_width", 0); user_pref("layout.css.prefers-color-scheme.content-override", 2); user_pref("browser.privateWindowSeparation.enabled", false); // WINDOWS /** COOKIE BANNER HANDLING ***/ user_pref("cookiebanners.service.mode", 1); user_pref("cookiebanners.service.mode.privateBrowsing", 1); /** FULLSCREEN NOTICE ***/ user_pref("full-screen-api.transition-duration.enter", "0 0"); user_pref("full-screen-api.transition-duration.leave", "0 0"); user_pref("full-screen-api.warning.delay", -1); user_pref("full-screen-api.warning.timeout", 0); /** URL BAR ***/ user_pref("browser.urlbar.suggest.calculator", true); user_pref("browser.urlbar.unitConversion.enabled", true); user_pref("browser.urlbar.trending.featureGate", false); /** NEW TAB PAGE ***/ user_pref("browser.newtabpage.activity-stream.feeds.topsites", false); user_pref("browser.newtabpage.activity-stream.feeds.section.topstories", false); /** POCKET ***/ user_pref("extensions.pocket.enabled", false); /** DOWNLOADS ***/ user_pref("browser.download.always_ask_before_handling_new_types", true); user_pref("browser.download.manager.addToRecentDocs", false); /** PDF ***/ user_pref("browser.download.open_pdf_attachments_inline", true); /** TAB BEHAVIOR ***/ user_pref("browser.bookmarks.openInTabClosesMenu", false); user_pref("browser.menu.showViewImageInfo", true); user_pref("findbar.highlightAll", true); user_pref("layout.word_select.eat_space_to_next_word", false); ''; }; }; }; programs.waybar = { enable = true; style = '' * { border: none; border-radius: 0px; /*font-family: Fira Code, Iosevka Nerd Font, Noto Sans CJK;*/ font-family: Iosevka, FontAwesome, Noto Sans CJK; font-size: 14px; font-style: normal; min-height: 0; } window#waybar { background: rgba(30, 30, 46, 0.5); border-bottom: 1px solid #45475a; color: #cdd6f4; } #workspaces { background: #45475a; margin: 5px 5px 5px 5px; padding: 0px 5px 0px 5px; border-radius: 16px; border: solid 0px #f4d9e1; font-weight: normal; font-style: normal; } #workspaces button { padding: 0px 5px; border-radius: 16px; color: #a6adc8; } #workspaces button.active { color: #f4d9e1; background-color: transparent; border-radius: 16px; } #workspaces button:hover { background-color: #cdd6f4; color: black; border-radius: 16px; } #custom-date, #clock, #battery, #pulseaudio, #network, #custom-randwall, #custom-launcher { background: transparent; padding: 5px 5px 5px 5px; margin: 5px 5px 5px 5px; border-radius: 8px; border: solid 0px #f4d9e1; } #custom-date { color: #D3869B; } #custom-power { color: #24283b; background-color: #db4b4b; border-radius: 5px; margin-right: 10px; margin-top: 5px; margin-bottom: 5px; margin-left: 0px; padding: 5px 10px; } #tray { background: #45475a; margin: 5px 5px 5px 5px; border-radius: 16px; padding: 0px 5px; /*border-right: solid 1px #282738;*/ } #clock { color: #cdd6f4; background-color: #45475a; border-radius: 0px 0px 0px 24px; padding-left: 13px; padding-right: 15px; margin-right: 0px; margin-left: 10px; margin-top: 0px; margin-bottom: 0px; font-weight: bold; /*border-left: solid 1px #282738;*/ } #battery { color: #89b4fa; } #battery.charging { color: #a6e3a1; } #battery.warning:not(.charging) { background-color: #f7768e; color: #f38ba8; border-radius: 5px 5px 5px 5px; } #backlight { background-color: #24283b; color: #db4b4b; border-radius: 0px 0px 0px 0px; margin: 5px; margin-left: 0px; margin-right: 0px; padding: 0px 0px; } #network { color: #f4d9e1; border-radius: 8px; margin-right: 5px; } #pulseaudio { color: #f4d9e1; border-radius: 8px; margin-left: 0px; } #pulseaudio.muted { background: transparent; color: #928374; border-radius: 8px; margin-left: 0px; } #custom-randwall { color: #f4d9e1; border-radius: 8px; margin-right: 0px; } #custom-launcher { color: #e5809e; background-color: #45475a; border-radius: 0px 24px 0px 0px; margin: 0px 0px 0px 0px; padding: 0 20px 0 13px; /*border-right: solid 1px #282738;*/ font-size: 20px; } #custom-launcher button:hover { background-color: #FB4934; color: transparent; border-radius: 8px; margin-right: -5px; margin-left: 10px; } #custom-playerctl { background: #45475a; padding-left: 15px; padding-right: 14px; border-radius: 16px; /*border-left: solid 1px #282738;*/ /*border-right: solid 1px #282738;*/ margin-top: 5px; margin-bottom: 5px; margin-left: 0px; font-weight: normal; font-style: normal; font-size: 16px; } #custom-playerlabel { background: transparent; padding-left: 10px; padding-right: 15px; border-radius: 16px; /*border-left: solid 1px #282738;*/ /*border-right: solid 1px #282738;*/ margin-top: 5px; margin-bottom: 5px; font-weight: normal; font-style: normal; } #window { background: #45475a; padding-left: 15px; padding-right: 15px; border-radius: 16px; /*border-left: solid 1px #282738;*/ /*border-right: solid 1px #282738;*/ margin-top: 5px; margin-bottom: 5px; font-weight: normal; font-style: normal; } #custom-wf-recorder { padding: 0 20px; color: #e5809e; background-color: #1E1E2E; } #cpu { background-color: #45475a; /*color: #FABD2D;*/ border-radius: 16px; margin: 5px; margin-left: 5px; margin-right: 5px; padding: 0px 10px 0px 10px; font-weight: bold; } #memory { background-color: #45475a; /*color: #83A598;*/ border-radius: 16px; margin: 5px; margin-left: 5px; margin-right: 5px; padding: 0px 10px 0px 10px; font-weight: bold; } #disk { background-color: #45475a; /*color: #8EC07C;*/ border-radius: 16px; margin: 5px; margin-left: 5px; margin-right: 5px; padding: 0px 10px 0px 10px; font-weight: bold; } #custom-hyprpicker { background-color: #45475a; /*color: #8EC07C;*/ border-radius: 16px; margin: 5px; margin-left: 5px; margin-right: 5px; padding: 0px 11px 0px 9px; font-weight: bold; } ''; settings = { mainBar = { layer = "top"; position = "top"; height = 30; output = [ "LVDS-1" ]; modules-left = [ "hyprland/workspaces" ]; modules-center = [ "hyprland/window" ]; modules-right = [ "battery" "clock" ]; battery = { bat = "BAT0"; format = "{capacity}% {icon}"; format-icons = [ "" "" "" "" "" ]; }; clock = { format = "{:%a %d, %b %H:%M}"; }; }; }; }; programs.zsh = { enable = true; initExtra = '' source ${pkgs.zsh-vi-mode}/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh ''; shellAliases = { c = "clear"; g = "git"; v = "vim"; h = "Hyprland"; }; }; programs.emacs = { enable = true; package = pkgs.emacs29-pgtk; extraConfig = '' (setq debug-on-error t) (org-babel-load-file (expand-file-name "~/org/website/config/emacs.org"))''; extraPackages = epkgs: [ epkgs.nix-mode epkgs.emms epkgs.magit epkgs.vterm epkgs.auctex epkgs.use-package epkgs.evil epkgs.evil-collection epkgs.org-roam epkgs.org-journal epkgs.general epkgs.which-key epkgs.gruvbox-theme epkgs.elfeed epkgs.elfeed-org epkgs.doom-modeline epkgs.dashboard epkgs.org-superstar epkgs.projectile epkgs.lsp-mode epkgs.ivy epkgs.lsp-ivy epkgs.all-the-icons epkgs.page-break-lines epkgs.counsel epkgs.mu4e epkgs.yasnippet epkgs.company epkgs.pinentry epkgs.pdf-tools epkgs.circe epkgs.ivy-pass epkgs.magit-delta epkgs.sudo-edit epkgs.evil-commentary epkgs.evil-org epkgs.catppuccin-theme epkgs.htmlize epkgs.web-mode epkgs.emmet-mode epkgs.ement epkgs.rustic epkgs.chatgpt-shell ]; }; programs.mbsync = { enable = true; extraConfig = '' IMAPAccount prestonpan Host mail.nullring.xyz User preston PassCmd "pass Mail" Port 993 SSLType IMAPS AuthMechs * CertificateFile /etc/ssl/certs/ca-certificates.crt IMAPStore prestonpan-remote Account prestonpan MaildirStore prestonpan-local Path ~/email/mbsyncmail/ Inbox ~/email/mbsyncmail/INBOX SubFolders Verbatim Channel prestonpan Far :prestonpan-remote: Near :prestonpan-local: Patterns * Create Near Sync All Expunge None SyncState * ''; }; programs.msmtp = { enable = true; extraConfig = '' # Set default values for all following accounts. defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log # Gmail account preston host mail.nullring.xyz port 587 from preston@nullring.xyz user preston passwordeval "pass Mail" # Set a default account account default : preston ''; }; programs.bash = { enable = true; }; programs.qutebrowser = { enable = true; searchEngines = { w = "https://en.wikipedia.org/wiki/Special:Search?search={}&go=Go&ns0=1"; aw = "https://wiki.archlinux.org/?search={}"; nw = "https://nixos.wiki/index.php?search={}"; g = "https://www.google.com/search?hl=en&q={}"; DEFAULT = "https://www.google.com/search?hl=en&q={}"; }; settings = { }; extraConfig = '' import os from urllib.request import urlopen if not os.path.exists(config.configdir / "theme.py"): theme = "https://raw.githubusercontent.com/catppuccin/qutebrowser/main/setup.py" with urlopen(theme) as themehtml: with open(config.configdir / "theme.py", "a") as file: file.writelines(themehtml.read().decode("utf-8")) if os.path.exists(config.configdir / "theme.py"): import theme theme.setup(c, 'mocha', True) ''; }; programs.git = { enable = true; userName = "Preston Pan"; userEmail = "preston@nullring.xyz"; signing.key = "2B749D1FB976E81613858E490290504780B30E20"; aliases = { co = "checkout"; c = "commit"; a = "add"; s = "switch"; b = "branch"; }; }; wayland.windowManager.hyprland = { enable = true; package = pkgs.hyprland; xwayland.enable = true; systemd.enable = true; settings = { "$mod" = "SUPER"; exec-once = [ "waybar" "swww init" "swww img /home/preston/wallpapers/bigrobot.png" ]; blurls = [ "waybar" ]; bind = [ "$mod, F, exec, firefox" "$mod, Return, exec, kitty" "$mod, E, exec, emacs" "$mod, v, exec, vencorddesktop" "$mod, d, exec, wofi --show run" ", Print, exec, grimblast copy area" "$mod, Q, killactive" "$mod SHIFT, H, movewindow, l" "$mod SHIFT, L, movewindow, r" "$mod SHIFT, K, movewindow, u" "$mod SHIFT, J, movewindow, d" "$mod, H, movefocus, l" "$mod, L, movefocus, r" "$mod, K, movefocus, u" "$mod, J, movefocus, d" ] ++ ( builtins.concatLists (builtins.genList ( x: let ws = let c = (x + 1) / 10; in builtins.toString (x + 1 - (c * 10)); in [ "$mod, ${ws}, workspace, ${toString (x + 1)}" "$mod SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}" ] ) 10) ); decoration = { blur = { enabled = true; size = 5; passes = 2; }; rounding = 5; shadow_offset = "0 5"; "col.shadow" = "rgba(00000099)"; }; input = { kb_options = "caps:swapescape"; repeat_delay = 300; repeat_rate = 50; }; bindm = [ "$mod, mouse:272, movewindow" "$mod, mouse:273, resizewindow" "$mod ALT, mouse:272, resizewindow" ]; binde = [ ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+" ", XF86AudioLowerVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-" ", XF86AudioPlay, exec, mpc toggle" ", XF86AudioNext, exec, mpc next" ", XF86AudioPrev, exec, mpc prev" ]; }; }; }; # Define a user account. Don't forget to set a password with ‘passwd’. programs.zsh.enable = true; security.sudo = { enable = true; extraRules = [{ commands = [ { command = "${pkgs.systemd}/bin/systemctl suspend"; options = [ "NOPASSWD" ]; } { command = "${pkgs.systemd}/bin/reboot"; options = [ "NOPASSWD" ]; } { command = "${pkgs.systemd}/bin/poweroff"; options = [ "NOPASSWD" ]; } { command = "${pkgs.light}/bin/light"; options = [ "NOPASSWD" ]; } ]; groups = [ "wheel" ]; }]; }; users.users.preston = { isNormalUser = true; description = "Preston Pan"; extraGroups = [ "networkmanager" "wheel" ]; shell = pkgs.zsh; packages = with pkgs; [ # thunderbird ]; }; # Allow unfree packages nixpkgs.config.allowUnfree = true; # List packages installed in system profile. To search, run: # $ nix search wget nixpkgs.config.packageOverrides = pkgs: { nur = import (builtins.fetchTarball "https://github.com/nix-community/NUR/archive/master.tar.gz") { inherit pkgs; }; }; environment.systemPackages = with pkgs; [ # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. # wget nixpkgs-fmt rnix-lsp light ]; xdg.portal = { enable = true; wlr.enable = true; extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; config.common.default = "*"; }; # Some programs need SUID wrappers, can be configured further or are # started in user sessions. # programs.mtr.enable = true; # programs.gnupg.agent = { # enable = true; # enableSSHSupport = true; # }; # List services that you want to enable: # Enable the OpenSSH daemon. # services.openssh.enable = true; # Open ports in the firewall. # networking.firewall.allowedTCPPorts = [ ... ]; # networking.firewall.allowedUDPPorts = [ ... ]; # Or disable the firewall altogether. # networking.firewall.enable = false; # This value determines the NixOS release from which the default # settings for stateful data, like file locations and database versions # on your system were taken. It‘s perfectly fine and recommended to leave # this value at the release version of the first install of this system. # Before changing this value read the documentation for this option # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). system.stateVersion = "23.11"; # Did you read the comment? } #+end_src