summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorfreya <Freya Murphy>2025-01-21 02:43:35 +0000
committerFreya Murphy <freya@freyacat.org>2025-01-21 02:45:29 +0000
commit05ea082c5fed25655e59ed7851c0cd53b0624b35 (patch)
tree87390bf699e04027f042ccfc10743a42bf768788 /modules
downloaddotfiles-nix-05ea082c5fed25655e59ed7851c0cd53b0624b35.tar.gz
dotfiles-nix-05ea082c5fed25655e59ed7851c0cd53b0624b35.tar.bz2
dotfiles-nix-05ea082c5fed25655e59ed7851c0cd53b0624b35.zip
initial
Diffstat (limited to 'modules')
-rw-r--r--modules/default.nix175
-rw-r--r--modules/home.nix83
-rw-r--r--modules/programs/default.nix16
-rw-r--r--modules/programs/firefox/default.nix88
-rw-r--r--modules/programs/firefox/extensions.nix58
-rw-r--r--modules/programs/firefox/policies.nix142
-rw-r--r--modules/programs/firefox/preferences.nix131
-rw-r--r--modules/programs/git/default.nix24
-rw-r--r--modules/programs/gnupg/default.nix25
-rw-r--r--modules/programs/hypr/default.nix10
-rw-r--r--modules/programs/hypr/hypridle.nix56
-rw-r--r--modules/programs/hypr/hyprland.nix302
-rw-r--r--modules/programs/hypr/hyprlock.nix96
-rw-r--r--modules/programs/hypr/hyprpaper.nix28
-rw-r--r--modules/programs/kitty/default.nix88
-rw-r--r--modules/programs/mako/default.nix32
-rw-r--r--modules/programs/starship/default.nix52
-rw-r--r--modules/programs/waybar/default.nix212
-rw-r--r--modules/programs/wofi/default.nix98
-rw-r--r--modules/programs/zsh/default.nix13
-rw-r--r--modules/system.nix101
-rw-r--r--modules/themes/catppuccin/default.nix6
-rw-r--r--modules/themes/catppuccin/frappe.nix21
-rw-r--r--modules/themes/catppuccin/latte.nix21
-rw-r--r--modules/themes/catppuccin/macchiato.nix21
-rw-r--r--modules/themes/catppuccin/mocha.nix21
-rw-r--r--modules/themes/default.nix3
27 files changed, 1923 insertions, 0 deletions
diff --git a/modules/default.nix b/modules/default.nix
new file mode 100644
index 0000000..083e63c
--- /dev/null
+++ b/modules/default.nix
@@ -0,0 +1,175 @@
+{ config, lib, pkgs, ... }:
+
+{
+
+ imports = [
+ ./programs
+ ./home.nix
+ ./system.nix
+ ];
+
+ options = {
+
+ # Primary user of the system
+ user = lib.mkOption {
+ type = lib.types.str;
+ description = "Primary user of the system";
+ };
+ fullName = lib.mkOption {
+ type = lib.types.str;
+ description = "Human readable name of the user";
+ };
+ homePath = lib.mkOption {
+ type = lib.types.str;
+ description = "Home directory path of the user";
+ default = "/home/${config.user}";
+ };
+ email = lib.mkOption {
+ type = lib.types.str;
+ description = "Primary email of the user";
+ };
+
+ # Toggable components
+ desktop = {
+ enable = lib.mkEnableOption {
+ description = "Enable the gui.";
+ default = false;
+ };
+ };
+ system = {
+ enable = lib.mkEnableOption {
+ description = "Enable system services.";
+ default = false;
+ };
+ };
+
+ # Monitor
+ monitor = {
+ name = lib.mkOption {
+ type = lib.types.str;
+ description = "Name of the primary monitor.";
+ default = "";
+ };
+ scale = lib.mkOption {
+ type = lib.types.float;
+ description = "Scale of the primary monitor.";
+ default = 1.0;
+ };
+ };
+
+ # Theme of the system
+ theme = {
+ colors = lib.mkOption {
+ type = lib.types.attrs;
+ description = "base16 color scheme";
+ default = (import ./themes).catppuccin.mocha;
+ };
+
+ accentColor = lib.mkOption {
+ type = lib.types.str;
+ description = "Theme accent color.";
+ default = config.theme.colors.base0D;
+ };
+
+ opacity = lib.mkOption {
+ type = lib.types.float;
+ description = "Window opacity.";
+ default = 1.0;
+ };
+
+ font = lib.mkOption {
+ type = lib.types.str;
+ description = "Theme primary font.";
+ default = "JetBrains Mono";
+ };
+
+ fontSize = lib.mkOption {
+ type = lib.types.int;
+ description = "Theme primary font size.";
+ default = 14;
+ };
+
+ headerFont = lib.mkOption {
+ type = lib.types.str;
+ description = "Theme header font.";
+ default = "JetBrains Mono ExtraBold";
+ };
+
+ monospaceFont = lib.mkOption {
+ type = lib.types.str;
+ description = "Theme monospace font.";
+ default = "monospace";
+ };
+
+ iconFont = lib.mkOption {
+ type = lib.types.str;
+ description = "Theme icon font.";
+ default = "Font Awesome 6 Pro";
+ };
+
+ borderWidth = lib.mkOption {
+ type = lib.types.int;
+ description = "Theme border width";
+ default = 3;
+ };
+
+ outerRadius = lib.mkOption {
+ type = lib.types.int;
+ description = "Theme outer border radius.";
+ default = 5;
+ };
+
+ innerRadius = lib.mkOption {
+ type = lib.types.int;
+ description = "Theme inner border radius.";
+ default = 2;
+ };
+
+ outerGap = lib.mkOption {
+ type = lib.types.int;
+ description = "Theme outer gap/spacing.";
+ default = 10;
+ };
+
+ innerGap = lib.mkOption {
+ type = lib.types.int;
+ description = "Theme inner gap/spacing.";
+ default = 3;
+ };
+ };
+
+ wallpaper = lib.mkOption {
+ type = lib.types.str;
+ description = "Path to wallpaper image";
+ default = "";
+ };
+
+ avatar = lib.mkOption {
+ type = lib.types.str;
+ description = "Path to avatar image";
+ default = "";
+ };
+ };
+
+ config = {
+
+ # use system packages in home manager
+ home-manager.useGlobalPkgs = true;
+
+ # install user packages to /etc/profiles and not home directory
+ home-manager.useUserPackages = true;
+
+ # allow flakes
+ nix.settings.experimental-features = [ "nix-command" "flakes" ];
+
+ # allow unfree packages
+ nixpkgs.config.allowUnfree = true;
+
+ # set state version
+ home-manager.users.${config.user}.home.stateVersion = "25.05";
+ home-manager.users.root.home.stateVersion = "25.05";
+ system.stateVersion = "25.05";
+
+ };
+
+}
diff --git a/modules/home.nix b/modules/home.nix
new file mode 100644
index 0000000..dcee2ec
--- /dev/null
+++ b/modules/home.nix
@@ -0,0 +1,83 @@
+{ config, pkgs, ... }:
+
+{
+ home-manager.users.${config.user} = {
+
+ home.username = config.user;
+ home.homeDirectory = config.homePath;
+
+ news.display = "silent";
+ fonts.fontconfig.enable = true;
+ nixpkgs.config.allowUnfree = true;
+
+ home.packages = with pkgs; [
+ # c / c++
+ gcc
+ nasm
+ pkg-config
+ # rust
+ rustc
+ rustfmt
+ rust-analyzer
+ cargo
+ clippy
+ # programs
+ cage
+ easyeffects
+ discord
+ element-desktop
+ fd
+ gamescope
+ gajim
+ gimp
+ imagemagick
+ libnotify
+ mpv
+ pavucontrol
+ pfetch-rs
+ rsync
+ starship
+ steam
+ thunderbird
+ wine
+ wl-clip-persist
+ yt-dlp
+ zathura
+ # gtk
+ orchis-theme
+ ];
+
+ home.file = {
+ ".ssh/config".source = ../files/config/ssh/config;
+ ".zshrc".source = ../files/config/zsh/zshrc;
+ ".zprofile".source = ../files/config/zsh/zprofile;
+ };
+
+ xdg.configFile = {
+ iris = {
+ source = ../files/config/iris;
+ recursive = true;
+ };
+ nvim = {
+ source = ../files/config/nvim;
+ recursive = true;
+ };
+ };
+
+ xdg.dataFile = {
+ fonts = {
+ source = ../files/fonts;
+ recursive = true;
+ };
+ };
+
+ gtk = {
+ enable = true;
+ gtk3.extraConfig.gtk-application-prefer-dark-theme = 1;
+ };
+
+ programs.home-manager.enable = true;
+
+ };
+}
+
diff --git a/modules/programs/default.nix b/modules/programs/default.nix
new file mode 100644
index 0000000..20c3610
--- /dev/null
+++ b/modules/programs/default.nix
@@ -0,0 +1,16 @@
+{ ... }:
+
+{
+ imports = [
+ ./firefox
+ ./git
+ ./gnupg
+ ./hypr
+ ./kitty
+ ./mako
+ ./starship
+ ./waybar
+ ./wofi
+ ./zsh
+ ];
+}
diff --git a/modules/programs/firefox/default.nix b/modules/programs/firefox/default.nix
new file mode 100644
index 0000000..dce7d0b
--- /dev/null
+++ b/modules/programs/firefox/default.nix
@@ -0,0 +1,88 @@
+{ config, lib, pkgs, ... }:
+
+let
+
+ extraPrefs = ''//
+
+// Automatically click cookiebanners although uBlock Origin might block them
+lockPref("cookiebanners.bannerClicking.enabled", true);
+lockPref("cookiebanners.service.mode", 2);
+lockPref("cookiebanners.service.mode.privateBrowsing", 2);
+
+// DNT although PrivacyBadger from policy handles this
+lockPref("privacy.donottrackheader.enabled", true);
+lockPref("privacy.donottrackheader.value", 1);
+
+// New sidebar
+lockPref("sidebar.revamp", true);
+lockPref("sidebar.verticalTabs", true);
+lockPref("sidebar.visibility", "always-show");
+lockPref("sidebar.main.tools", "history,bookmarks");
+
+//'';
+
+ userChrome = ''
+/* sidebar hack to flip contents the way i want them (arrows on the left) */
+#nav-bar-customization-target {
+ flex-direction: row-reverse;
+}
+
+/* remove broken padding from sidebar hack */
+#unified-extensions-button {
+ padding-left: 0 !important;
+}
+
+/* remove padding beside search bar */
+toolbarspring {
+ display: none !important;
+}
+
+/* remove overflow menu and everything in it */
+#nav-bar-overflow-button,
+#firefox-view-button,
+#alltabs-button {
+ visibility: collapse;
+}
+'';
+
+ my-firefox = (pkgs.firefox.override {
+ extraPrefs = extraPrefs;
+ });
+
+in
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ programs.firefox = {
+
+ enable = true;
+ package = my-firefox;
+
+ # import configuration
+ policies = import ./policies.nix;
+
+ # create profile for me :3
+ profiles.${config.user} = {
+ search = {
+ force = true;
+ default = "DuckDuckGo";
+ engines = {
+ "Google".metaData.hidden = true;
+ "Bing".metaData.hidden = true;
+ "Amazon.com".metaData.hidden = true;
+ "eBay".metaData.hidden = true;
+ "Twitter".metaData.hidden = true;
+ };
+ };
+
+ # firefox doesnt make styling the toolbar easy using about:config
+ # since its just a massive json string. so i did it here in css.
+ userChrome = userChrome;
+ }; # end profile
+
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/firefox/extensions.nix b/modules/programs/firefox/extensions.nix
new file mode 100644
index 0000000..ebc3003
--- /dev/null
+++ b/modules/programs/firefox/extensions.nix
@@ -0,0 +1,58 @@
+{
+
+ # extensions to be auto downloaded into
+ # firefox
+
+ # dont allow extensions to be installed though
+ # firefox, they must be described here!
+ "*".installation_mode = "blocked";
+
+ # uBlock Origin
+ "uBlock0@raymondhill.net" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
+ installation_mode = "force_installed";
+ };
+
+ # Bitwarden
+ "{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
+ installation_mode = "force_installed";
+ };
+
+ # User Agent Switcher
+ "user-agent-switcher@ninetailed.ninja" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/uaswitcher/latest.xpi";
+ installation_mode = "force_installed";
+ };
+
+ # SponsorBlock
+ "sponsorBlocker@ajay.app" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi";
+ installation_mode = "force_installed";
+ };
+
+ # Privacy Badger
+ "jid1-MnnxcxisBPnSXQ@jetpack" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi";
+ installation_mode = "force_installed";
+ };
+
+ # FoxyProxy
+ "foxyproxy@eric.h.jung" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/foxyproxy-standard/latest.xpi";
+ installation_mode = "force_installed";
+ };
+
+ # Redirector
+ "redirector@einaregilsson.com" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/redirector/latest.xpi";
+ installation_mode = "force_installed";
+ };
+
+ # linkding
+ "{61a05c39-ad45-4086-946f-32adb0a40a9d}" = {
+ install_url = "https://addons.mozilla.org/firefox/downloads/latest/linkding-extension/latest.xpi";
+ installation_mode = "force_installed";
+ };
+
+}
diff --git a/modules/programs/firefox/policies.nix b/modules/programs/firefox/policies.nix
new file mode 100644
index 0000000..5b49f65
--- /dev/null
+++ b/modules/programs/firefox/policies.nix
@@ -0,0 +1,142 @@
+{
+
+ # policies to be set in firefox
+ # see: https://mozilla.github.io/policy-templates/
+
+ ExtensionSettings = import ./extensions.nix;
+ Preferences = import ./preferences.nix;
+
+ EnableTrackingProtection = {
+ Value = true;
+ Locked = true;
+ Cryptomining = true;
+ Fingerprinting = true;
+ EmailTracking = true;
+ };
+
+ # Certificates
+ Certificates = {
+ ImportEnterpriseRoots = true;
+ Install = [
+ "freya_ca.crt"
+ "tinternet.crt"
+ ];
+ };
+
+ # Cookies
+ Cookies = {
+ Behavior = "reject-foreign";
+ BehaviorPrivateBrowsing = "reject-foreign";
+ Locked = true;
+ };
+
+ # DNS
+ DNSOverHTTPS = {
+ Enabled = false;
+ Locked = true;
+ };
+
+ # Disable Bad
+ DisableAppUpdate = true;
+ DisableAccounts = true;
+ DisableFirefoxAccounts = true;
+ DisableFirefoxScreenshots = true;
+ DisableFirefoxStudies = true;
+ DisablePocket = true;
+ DisableTelemetry = true;
+ AutofillAddressEnabled = false;
+ AutofillCreditCardEnabled = false;
+
+ # Disable Certain Messages
+ UserMessaging = {
+ WhatsNew = false;
+ ExtensionRecommendations = false;
+ FeatureRecommendations = false;
+ UrlbarInterventions = false;
+ SkipOnboarding = true;
+ MoreFromMozilla = false;
+ Labs = false;
+ Locked = true;
+ };
+
+ # Disable Password Manager
+ DisableMasterPasswordCreation = true;
+ PasswordManagerEnabled = false;
+ PrimaryPassword = false;
+ OfferToSaveLogins = false;
+
+ # Remove Special Pages
+ OverrideFirstRunPage = "";
+ OverridePostUpdatePage = "";
+
+ # Start Page
+ Homepage = {
+ StartPage = "previous-session";
+ Locked = true;
+ };
+
+ # Home Page
+ FirefoxHome = {
+ Search = true;
+ TopSites = false;
+ SponsoredTopSites = false;
+ Highlights = false;
+ Pocket = false;
+ SponsoredPocket = false;
+ Snippets = false;
+ Locked = true;
+ };
+
+ # Search Suggestions
+ SearchSuggestEnabled = true;
+ FirefoxSuggest = {
+ WebSuggestions = false;
+ SponsoredSuggestions = false;
+ ImproveSuggest = false;
+ Locked = true;
+ };
+
+ # Save All on Shutdown
+ SanitizeOnShutdown = {
+ Cache = false;
+ Cookies = false;
+ Downloads = false;
+ Histroy = false;
+ Sessions = false;
+ SiteSettings = false;
+ OfflineApps = false;
+ Locked = true;
+ };
+
+ # Popups
+ PopupBlocking = {
+ Default = true;
+ Locked = true;
+ };
+
+ # Allow Bypasses
+ DisableSecurityBypass = {
+ InvalidCertificate = false;
+ SafeBrowsing = false;
+ };
+
+ # PictureInPicure
+ PictureInPicture = {
+ Enabled = true;
+ Locked = true;
+ };
+
+ # Topbar
+ SearchBar = "unified";
+ DisplayMenuBar = "default-off";
+ DisplayBookmarksToolbar = "newtab";
+ NoDefaultBookmarks = true;
+
+ # Miscellaneous
+ HttpsOnlyMode = "force_enabled";
+ HardwareAcceleration = true;
+ DontCheckDefaultBrowser = true;
+ PromptForDownloadLocation = false;
+ PrivateBrowsingModeAvailability = 0;
+
+}
diff --git a/modules/programs/firefox/preferences.nix b/modules/programs/firefox/preferences.nix
new file mode 100644
index 0000000..a8ac797
--- /dev/null
+++ b/modules/programs/firefox/preferences.nix
@@ -0,0 +1,131 @@
+let
+ # quick variables to specify
+ # locked true/false
+ lock-false = {
+ Value = false;
+ Status = "locked";
+ };
+ lock-true = {
+ Value = true;
+ Status = "locked";
+ };
+in
+{
+
+ # about:config Preferences
+ # ... set policies that cannot be set using policies.json directly
+
+ # allow userChrom.css
+ "toolkit.legacyUserProfileCustomizations.stylesheets" = lock-true;
+
+ # dark theme
+ "extensions.activeThemeID" = {
+ Value = "firefox-compact-dark@mozilla.org";
+ Status = "locked";
+ };
+ "layout.css.prefers-color-scheme.content-override" = {
+ Value = 0;
+ Status = "locked";
+ };
+
+ # homepage
+ "browser.startup.homepage" = {
+ Value = "about:home";
+ Status = "locked";
+ };
+ "browser.newtabpage.enabed" = lock-true;
+ "browser.newtabpage.url" = {
+ Value = "about:home";
+ Status = "locked";
+ };
+
+ # autofill
+ "browser.autofill.enabled" = lock-false;
+ "browser.formfill.enable" = lock-false;
+
+ # search enable
+ "browser.urlbar.suggest.recentsearches" = lock-true;
+ "browser.urlbar.suggest.bookmark" = lock-true;
+ "browser.urlbar.suggest.clipboard" = lock-true;
+ "browser.urlbar.suggest.history" = lock-true;
+
+ # search disable
+ "browser.urlbar.suggest.addons" = lock-false;
+ "browser.urlbar.suggest.calculator" = lock-false;
+ "browser.urlbar.suggest.engines" = lock-false;
+ "browser.urlbar.suggest.fakespot" = lock-false;
+ "browser.urlbar.suggest.mdn" = lock-false;
+ "browser.urlbar.suggest.openpage" = lock-false;
+ "browser.urlbar.suggest.pocket" = lock-false;
+ "browser.urlbar.suggest.remotetab" = lock-false;
+ "browser.urlbar.suggest.topsites" = lock-false;
+ "browser.urlbar.suggest.trending" = lock-false;
+ "browser.urlbar.suggest.weather" = lock-false;
+ "browser.urlbar.suggest.yelp" = lock-false;
+
+ # privacy
+ "privacy.globalprivacycontrol.enabled" = lock-true;
+
+ # security
+ "security.OCSP.enabled" = {
+ Value = 0;
+ Status = "locked";
+ };
+ "browser.contentblocking.category" = {
+ Value = "strict";
+ Status = "locked";
+ };
+ "xpinstall.whitelist.required" = lock-true;
+ "signon.management.page.breach-alerts.enabled" = lock-false;
+
+ # graphics
+ "dom.webgpu.enabled" = lock-true;
+ "media.eme.enabled" = lock-true;
+
+ # user messaging
+ # ... disable shit that is annoying
+ "browser.newtabpage.activity-stream.feeds.section.topstories" = lock-false;
+ "browser.newtabpage.activity-stream.feeds.snippets" = lock-false;
+ "browser.newtabpage.activity-stream.section.highlights.includePocket" = lock-false;
+ "browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = lock-false;
+ "browser.newtabpage.activity-stream.section.highlights.includeDownloads" = lock-false;
+ "browser.newtabpage.activity-stream.section.highlights.includeVisited" = lock-false;
+ "browser.newtabpage.activity-stream.showSponsored" = lock-false;
+ "browser.newtabpage.activity-stream.system.showSponsored" = lock-false;
+ "browser.newtabpage.activity-stream.showSponsoredTopSites" = lock-false;
+ "browser.newtabpage.activity-stream.showWeather" = lock-false;
+ "browser.newtabpage.activity-stream.newtabWallpapers.enabled" = lock-false;
+ "browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled" = lock-false;
+ "browser.newtabpage.activity-stream.default.sites" = {
+ Value = "";
+ Status = "locked";
+ };
+
+ # safebrowsing
+ "browser.safebrowsing.malware.enabled" = lock-true;
+ "browser.safebrowsing.phishing.enabled" = lock-true;
+ "browser.safebrowsing.downloads.enabled" = lock-true;
+ "browser.safebrowsing.downloads.remote.block_uncommon" = lock-false;
+ "browser.safebrowsing.downloads.remote.block_potentially_unwanted" = lock-false;
+
+ # sidebar
+ "browser.tabs.inTitlebar" = {
+ Value = 0;
+ Status = "locked";
+ };
+ "browser.tabs.warnOnClose" = lock-true;
+ "browser.tabs.firefox-view" = lock-false;
+ "browser.tabs.closeTabByDblclick" = lock-true;
+ "ui.key.menuAccessKeyFocuses" = lock-false;
+
+ # general settings
+ "general.autoScroll" = lock-false;
+ "general.smoothScroll" = lock-true;
+ "widget.gtk.overlay-scrollbars.enabled" = lock-false;
+ "accessibility.browsewithcaret" = lock-false;
+ "accessibility.typeaheadfind" = lock-false;
+ "media.hardwaremediakeys.enabled" = lock-true;
+ "browser.crashReports.unsubmittedCheck.autoSubmit2" = lock-false;
+ "browser.aboutConfig.showWarning" = lock-false;
+
+}
diff --git a/modules/programs/git/default.nix b/modules/programs/git/default.nix
new file mode 100644
index 0000000..a3fe80d
--- /dev/null
+++ b/modules/programs/git/default.nix
@@ -0,0 +1,24 @@
+{ config, ... }:
+
+{
+ config = {
+
+ home-manager.users.${config.user} = {
+ programs.git = {
+ enable = true;
+ userName = config.user;
+ userEmail = config.fullName;
+
+ signing = {
+ key = "D9AF0A4209B7C2DE11A884BFACBC553660D9993D";
+ signByDefault = true;
+ };
+
+ extraConfig = {
+ init.defaultBranch = "main";
+ };
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/gnupg/default.nix b/modules/programs/gnupg/default.nix
new file mode 100644
index 0000000..67be4bc
--- /dev/null
+++ b/modules/programs/gnupg/default.nix
@@ -0,0 +1,25 @@
+{ config, pkgs, ... }:
+
+{
+ config = {
+
+ programs.gnupg.agent = {
+ enable = true;
+ enableSSHSupport = true;
+ pinentryPackage = pkgs.pinentry-gtk2;
+ };
+
+ home-manager.users.${config.user} = {
+ programs.gpg = {
+ enable = true;
+ publicKeys = [
+ {
+ source = ../../../files/keys/freya-gpg.pub;
+ trust = 5;
+ }
+ ];
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/hypr/default.nix b/modules/programs/hypr/default.nix
new file mode 100644
index 0000000..08b2d93
--- /dev/null
+++ b/modules/programs/hypr/default.nix
@@ -0,0 +1,10 @@
+{ ... }:
+
+{
+ imports = [
+ ./hypridle.nix
+ ./hyprland.nix
+ ./hyprlock.nix
+ ./hyprpaper.nix
+ ];
+}
diff --git a/modules/programs/hypr/hypridle.nix b/modules/programs/hypr/hypridle.nix
new file mode 100644
index 0000000..f69db63
--- /dev/null
+++ b/modules/programs/hypr/hypridle.nix
@@ -0,0 +1,56 @@
+{ config, pkgs, lib, inputs, ... }:
+
+let
+ # inputs
+ system = pkgs.stdenv.hostPlatform.system;
+ hypridle = inputs.hypridle.packages.${system};
+in
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ services.hypridle = {
+
+ enable = true;
+ package = hypridle.hypridle;
+
+ settings = {
+ general = {
+ lock_cmd = "pidof hyprlock || hyprlock";
+ before_sleep_cmd = "loginctl lock-session";
+ after_sleep_cmd = "hyprctl dispatch dpms on";
+ ignore_dbus_inhibit = false;
+ };
+
+ listener = [
+ # dim screen
+ {
+ timeout = 150;
+ on-timeout = "brightnessctl -s set 10";
+ on-resume = "brightnessctl -r";
+ }
+ # dim keyboard backlight
+ {
+ timeout = 150;
+ on-timeout = "brightnessctl -sd rgb:kbd_backlight set 0";
+ on-resume = "brightnessctl -rd rgb:kbd_backlight";
+ }
+ # lock
+ {
+ timeout = 300;
+ on-timeout = "loginctl lock-session";
+ }
+ # turn off screen
+ {
+ timeout = 350;
+ on-timeout = "hyprctl dispatch dpms off";
+ on-resume = "hyprctl dispatch dpms on";
+ }
+ ];
+ };
+ };
+ };
+
+ };
+}
+
diff --git a/modules/programs/hypr/hyprland.nix b/modules/programs/hypr/hyprland.nix
new file mode 100644
index 0000000..6ae9afd
--- /dev/null
+++ b/modules/programs/hypr/hyprland.nix
@@ -0,0 +1,302 @@
+{ config, pkgs, lib, inputs, ... }:
+
+let
+ # inputs
+ system = pkgs.stdenv.hostPlatform.system;
+ hyprland = inputs.hyprland.packages.${system};
+ hyprland-plugins = inputs.hyprland-plugins.packages.${system};
+ hy3 = inputs.hy3.packages.${system};
+
+ browser = "firefox";
+ launcher = "wofi --show drun --prompt \"Search Program\"";
+ lock_screen = "hyprlock";
+ terminal = "kitty";
+in
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ wayland.windowManager.hyprland = {
+
+ enable = true;
+ package = hyprland.hyprland;
+
+ # Plugins
+ plugins = [
+ hyprland-plugins.hyprexpo
+ hy3.hy3
+ ];
+
+ # Config
+ settings = {
+ # Monitors
+ monitor = [
+ "${config.monitor.name}, highres, auto, ${toString config.monitor.scale}"
+ ];
+
+ # Autostart
+ exec-once = [
+ "waybar"
+ "thunderbird"
+ "discord --enable-features=UseOzonePlatform --ozone-platform=wayland"
+ "element-desktop --enable-features=UseOzonePlatform --ozone-platform=wayland"
+ ];
+
+ # General
+ general = {
+ gaps_in = config.theme.innerGap;
+ gaps_out = config.theme.outerGap;
+ layout = "hy3";
+ resize_on_border = "yes";
+ extend_border_grab_area = 20;
+ border_size = config.theme.borderWidth;
+ "col.active_border" = "rgb(${config.theme.accentColor})";
+ "col.inactive_border" = "rgb(${config.theme.colors.base04})";
+ };
+
+ # Gestures
+ gestures = {
+ workspace_swipe = true;
+ workspace_swipe_fingers = 3;
+ workspace_swipe_forever = true;
+ workspace_swipe_cancel_ratio = 0.15;
+ };
+
+ # Decoration
+ decoration = {
+ rounding = config.theme.outerRadius;
+ shadow.enabled = false;
+ blur = {
+ enabled = true;
+ size = 4;
+ passes = 2;
+ noise = 0.008;
+ contrast = 0.8916;
+ brightness = 0.8;
+ };
+ };
+
+ # Animations
+ animations = {
+ enabled = true;
+
+ bezier = [
+ "windowIn, 0.06, 0.71, 0.25, 1"
+ "windowResize, 0.04, 0.67, 0.38, 1"
+ ];
+
+ animation = [
+ "windowsIn, 1, 3, windowIn, slide #popin 20%"
+ "windowsOut, 1, 3, windowIn, slide #popin 70%"
+ "windowsMove, 1, 2.5, windowResize"
+ "border, 1, 10, default"
+ "borderangle, 1, 8, default"
+ "fade, 1, 3, default"
+ "workspaces, 1, 6, default"
+ "layers, 1, 5, windowIn, slide"
+ ];
+ };
+
+ # Environment
+ env = [
+ "XDG_CURRENT_DESKTOP,Hyprland"
+ "XDG_SESSION_DESKTOP,Hyprland"
+
+ "XCURSOR_THEME,Adwaita"
+ "XCURSOR_SIZE,24"
+
+ "GTK_THEME,Orchis-Teal-Dark"
+ "GDK_SCALE,${toString config.monitor.scale}"
+
+ "MOZ_ENABLE_WAYLAND,1"
+ "MOZ_USE_XINPUT,1"
+ "_JAVA_AWT_WM_NONREPARENTING,1"
+ ];
+
+ # Input
+ input = {
+ kb_layout = "us";
+ kb_variant = "";
+ kb_model = "";
+ kb_options = "gtp:alt_shit_toggle, compose:ralt";
+ kb_rules = "";
+ follow_mouse = 1;
+ touchpad = {
+ natural_scroll = "yes";
+ };
+ sensitivity = 0;
+ };
+
+ # Keybinds
+ "$mod" = "SUPER";
+ bind = [
+ # Launch programs
+
+ "$mod, W, exec, ${browser}"
+ "$mod, D, exec, ${launcher}"
+ "$mod, L, exec, ${lock_screen}"
+ "$mod, Return, exec, ${terminal}"
+
+ # Misc
+
+ "$mod SHIFT, L, exit"
+ "$mod, tab, hyprexpo:expo, toggle"
+
+ # Window operations
+
+ "$mod SHIFT, Q, killactive"
+ "$mod SHIFT, SPACE, togglefloating"
+ "$mod, F, fullscreen"
+ "$mod, J, togglesplit"
+
+ # Move focus with mod + arrow keys
+
+ "$mod, left, movefocus, l"
+ "$mod, right, movefocus, r"
+ "$mod, up, movefocus, u"
+ "$mod, down, movefocus, d"
+
+ # Move window across workspace with mod + arrow keys
+
+ "$mod SHIFT, left, hy3:movewindow, l"
+ "$mod SHIFT, right, hy3:movewindow, r"
+ "$mod SHIFT, up, hy3:movewindow, u"
+ "$mod SHIFT, down, hy3:movewindow, d"
+
+ # Switch workspaces with mod + [0-9]
+
+ "$mod, 1, workspace, 1"
+ "$mod, 2, workspace, 2"
+ "$mod, 3, workspace, 3"
+ "$mod, 4, workspace, 4"
+ "$mod, 5, workspace, 5"
+ "$mod, 6, workspace, 6"
+ "$mod, 7, workspace, 7"
+ "$mod, 8, workspace, 8"
+ "$mod, 9, workspace, 9"
+
+ # Move active window to a workspace with mod + SHIFT + [0-9]
+
+ "$mod SHIFT, 1, movetoworkspacesilent, 1"
+ "$mod SHIFT, 2, movetoworkspacesilent, 2"
+ "$mod SHIFT, 3, movetoworkspacesilent, 3"
+ "$mod SHIFT, 4, movetoworkspacesilent, 4"
+ "$mod SHIFT, 5, movetoworkspacesilent, 5"
+ "$mod SHIFT, 6, movetoworkspacesilent, 6"
+ "$mod SHIFT, 7, movetoworkspacesilent, 7"
+ "$mod SHIFT, 8, movetoworkspacesilent, 8"
+ "$mod SHIFT, 9, movetoworkspacesilent, 9"
+ "$mod SHIFT, 0, movetoworkspacesilent, 10"
+
+ # Move to tab
+
+ "LALT, 1, hy3:focustab, index, 01"
+ "LALT, 2, hy3:focustab, index, 02"
+ "LALT, 3, hy3:focustab, index, 03"
+ "LALT, 4, hy3:focustab, index, 04"
+ "LALT, 5, hy3:focustab, index, 05"
+ "LALT, 6, hy3:focustab, index, 06"
+ "LALT, 7, hy3:focustab, index, 07"
+ "LALT, 8, hy3:focustab, index, 08"
+ "LALT, 9, hy3:focustab, index, 09"
+ "LALT, 0, hy3:focustab, index, 10"
+
+ "$mod SHIFT, B, hy3:makegroup, h"
+ "$mod SHIFT, V, hy3:makegroup, v"
+ "$mod SHIFT, C, hy3:changegroup, toggletab"
+
+ # Scroll through existing workspaces with mod + scroll
+
+ "$mod, mouse_down, workspace, e+1"
+ "$mod, mouse_up, workspace, e-1"
+ ];
+
+ bindn = [
+ # Focus windows with scroll wheel or middle click
+
+ ", mouse:272, hy3:focustab, mouse"
+ ", mouse_down, hy3:focustab, l, require_hovered"
+ ", mouse_up, hy3:focustab, r, require_hovered"
+ ];
+
+ bindm = [
+ # Move/resize windows with mod + LMB/RMB and dragging
+
+ "$mod, mouse:272, movewindow"
+ "$mod, mouse:273, resizewindow"
+ ];
+
+ binde = [
+ # Audio
+
+ # raise volume
+ ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"
+ # lower volume
+ ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
+ # mute speaker
+ ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
+ # mute mic
+ ", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
+
+ # Media
+
+ # play
+ ", XF86AudioPlay, exec, playerctl play-pause"
+ # next
+ ", XF86AudioNext, exec, playerctl next"
+ # prev
+ ", XF86AudioPrev, exec, playerctl previous"
+
+ # Backlight
+
+ ", XF86MonBrightnessDown, exec, brightnessctl set 5%-"
+ ", XF86MonBrightnessUp, exec, brightnessctl set 5%+"
+ ];
+
+ # Plugin configuration
+ plugin = {
+ # hy3
+ hy3 = {
+ tabs = {
+ height = 24;
+ text_height = 9;
+ text_padding = 10;
+ padding = 2;
+ render_text = true;
+ text_font = "monospace";
+ radius = config.theme.outerRadius;
+
+ "col.active" = "rgb(${config.theme.colors.base00})";
+ "col.inactive" = "rgb(${config.theme.colors.base00})";
+ "col.text.active" = "rgb(${config.theme.colors.base05})";
+ "col.text.inactive" = "rgb(${config.theme.colors.base05})";
+ "col.border.active" = "rgb(${config.theme.accentColor})";
+ "col.border.inactive" = "rgb(${config.theme.colors.base04})";
+ };
+
+ autotile = {
+ enable = true;
+ };
+ };
+ };
+
+ # XWayland
+ xwayland = {
+ force_zero_scaling = "true";
+ use_nearest_neighbor = "false";
+ };
+
+ # Misc
+ misc = {
+ disable_hyprland_logo = true;
+ disable_splash_rendering = true;
+ key_press_enables_dpms = true;
+ mouse_move_enables_dpms = true;
+ vrr = 1;
+ };
+ };
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/hypr/hyprlock.nix b/modules/programs/hypr/hyprlock.nix
new file mode 100644
index 0000000..e80b020
--- /dev/null
+++ b/modules/programs/hypr/hyprlock.nix
@@ -0,0 +1,96 @@
+{ config, pkgs, lib, inputs, ... }:
+
+let
+ # inputs
+ system = pkgs.stdenv.hostPlatform.system;
+ hyprlock = inputs.hyprlock.packages.${system};
+in
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ programs.hyprlock = {
+
+ enable = true;
+ package = hyprlock.hyprlock;
+
+ settings = {
+
+ background = {
+ monitor = "";
+ path = config.wallpaper;
+ blur_passes = 3;
+ contrast = 0.8916;
+ brightness = 0.8172;
+ vibrancy = 0.1696;
+ vibrancy_darkness = 0.0;
+ };
+
+ general = {
+ no_fade_in = false;
+ grace = 0;
+ disable_loading_bar = true;
+ };
+
+ input-field = {
+ monitor = "";
+ size = "250, 60";
+ outline_thickness = 2;
+ dots_size = 0.2; # Scale of input-field height, 0.2 - 0.8
+ dots_spacing = 0.2; # Scale of dots' absolute size, 0.0 - 1.0
+ dots_center = true;
+ outer_color = "rgba(0, 0, 0, 0)";
+ inner_color = "rgba(0, 0, 0, 0.5)";
+ font_color = "rgb(${config.theme.colors.base05})";
+ font_family = config.theme.font;
+ fade_on_empty = false;
+ placeholder_text = "<i><span foreground=\"#${config.theme.colors.base05}\">Input Password...</span></i>";
+ hide_input = false;
+ position = "0, -120";
+ halign = "center";
+ valign = "center";
+ };
+
+ label = [
+ # Clock
+ {
+ monitor = "";
+ text = "cmd[update:1000] echo \"$(date +\"%-H:%M:%S\")\"";
+ font_size = 80;
+ font_color = "rgb(${config.theme.colors.base05})";
+ font_family = config.theme.headerFont;
+ position = "0, 500";
+ halign = "center";
+ valign = "center";
+ }
+
+ # Name
+ {
+ monitor = "";
+ text = config.fullName;
+ font_color = "rgb(${config.theme.colors.base05})";
+ font_family = config.theme.headerFont;
+ font_size = 25;
+ position = "0, 50";
+ halign = "center";
+ valign = "center";
+ }
+ ];
+
+ # Profile image
+ image = {
+ monitor = "";
+ path = config.avatar;
+ size = 300;
+ rounding = -1;
+ border_size = 0;
+ position = "0, 250";
+ halign = "center";
+ valign = "center";
+ };
+ };
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/hypr/hyprpaper.nix b/modules/programs/hypr/hyprpaper.nix
new file mode 100644
index 0000000..1d6b0cd
--- /dev/null
+++ b/modules/programs/hypr/hyprpaper.nix
@@ -0,0 +1,28 @@
+{ config, pkgs, lib, inputs, ... }:
+
+let
+ # inputs
+ system = pkgs.stdenv.hostPlatform.system;
+ hyprpaper = inputs.hyprpaper.packages.${system};
+in
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ services.hyprpaper = {
+
+ enable = true;
+ package = hyprpaper.hyprpaper;
+
+ settings = {
+ preload = config.wallpaper;
+ wallpaper = ",${config.wallpaper}";
+ splash = false;
+ };
+
+ };
+ };
+
+ };
+}
+
diff --git a/modules/programs/kitty/default.nix b/modules/programs/kitty/default.nix
new file mode 100644
index 0000000..f148e96
--- /dev/null
+++ b/modules/programs/kitty/default.nix
@@ -0,0 +1,88 @@
+{ config, lib, ... }:
+
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ programs.kitty = {
+
+ enable = true;
+ environment = { };
+ extraConfig = "";
+
+ settings = {
+ # Font
+ font_family = config.theme.monospaceFont;
+ font_size = 11;
+ bold_font = "auto";
+ italic_font = "auto";
+ bold_italic_font = "auto";
+
+ # Scrollback
+ scrollback_lines = 10000;
+ scrollback_pager_history_size = 300; # MB
+
+ # Urls
+ detect_urls = true;
+ show_hyperlink_targets = false;
+
+ # Window
+ window_padding_width = config.theme.outerGap;
+ window_border_width = 0;
+ draw_minimal_borders = true;
+ background_opacity = config.theme.opacity;
+
+ # Disable audio
+ enable_audio_bell = false;
+
+ # Disable close prompt
+ confirm_os_window_close = 0;
+
+ # colors
+ background = "#${config.theme.colors.base00}";
+ foreground = "#${config.theme.colors.base05}";
+ selection_background = "#${config.theme.colors.base05}";
+ selection_foreground = "#${config.theme.colors.base00}";
+ url_color = "#${config.theme.colors.base04}";
+ cursor = "#${config.theme.colors.base05}";
+ active_border_color = "#${config.theme.colors.base03}";
+ inactive_border_color = "#${config.theme.colors.base01}";
+ active_tab_background = "#${config.theme.colors.base00}";
+ active_tab_foreground = "#${config.theme.colors.base05}";
+ inactive_tab_background = "#${config.theme.colors.base01}";
+ inactive_tab_foreground = "#${config.theme.colors.base04}";
+ tab_bar_background = "#${config.theme.colors.base01}";
+
+ # normal
+ color0 = "#${config.theme.colors.base00}";
+ color1 = "#${config.theme.colors.base08}";
+ color2 = "#${config.theme.colors.base0B}";
+ color3 = "#${config.theme.colors.base0A}";
+ color4 = "#${config.theme.colors.base0D}";
+ color5 = "#${config.theme.colors.base0E}";
+ color6 = "#${config.theme.colors.base0C}";
+ color7 = "#${config.theme.colors.base05}";
+
+ # bright
+ color8 = "#${config.theme.colors.base03}";
+ color9 = "#${config.theme.colors.base08}";
+ color10 = "#${config.theme.colors.base0B}";
+ color11 = "#${config.theme.colors.base0A}";
+ color12 = "#${config.theme.colors.base0D}";
+ color13 = "#${config.theme.colors.base0E}";
+ color14 = "#${config.theme.colors.base0C}";
+ color15 = "#${config.theme.colors.base07}";
+
+ # extended base16 colors
+ color16 = "#${config.theme.colors.base09}";
+ color17 = "#${config.theme.colors.base0F}";
+ color18 = "#${config.theme.colors.base01}";
+ color19 = "#${config.theme.colors.base02}";
+ color20 = "#${config.theme.colors.base04}";
+ color21 = "#${config.theme.colors.base06}";
+ };
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/mako/default.nix b/modules/programs/mako/default.nix
new file mode 100644
index 0000000..3987d0d
--- /dev/null
+++ b/modules/programs/mako/default.nix
@@ -0,0 +1,32 @@
+{ config, lib, ... }:
+
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ services.mako = {
+
+ enable = true;
+
+ font = "${config.theme.font} 11";
+
+ margin = toString config.theme.outerGap;
+ padding = toString config.theme.innerGap;
+
+ backgroundColor = "#${config.theme.colors.base00}";
+ progressColor = "#${config.theme.colors.base00}";
+ textColor = "#${config.theme.colors.base05}";
+
+ borderColor = "#${config.theme.accentColor}";
+ borderSize = config.theme.borderWidth;
+ borderRadius = 0;
+
+ defaultTimeout = 5000;
+ layer = "overlay";
+ icons = true;
+
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/starship/default.nix b/modules/programs/starship/default.nix
new file mode 100644
index 0000000..a22909f
--- /dev/null
+++ b/modules/programs/starship/default.nix
@@ -0,0 +1,52 @@
+{ config, lib, ... }:
+
+{
+ config = {
+
+ home-manager.users.${config.user} = {
+ programs.starship = {
+
+ enable = true;
+
+ settings = {
+ format = lib.concatStrings [
+ "╭─ "
+ "$username"
+ "$hostname"
+ "$git_branch"
+ "$directory"
+ "$line_break"
+ "╰─ "
+ ];
+
+ username = {
+ style_user = "bold purple";
+ style_root = "bold purple";
+ format = "[$user]($style) ";
+ disabled = false;
+ show_always = true;
+ };
+
+ hostname = {
+ ssh_only = false;
+ format = "on [$hostname](bold blue) ";
+ disabled = false;
+ };
+
+ directory = {
+ format = "[$path]($style)[$read_only]($read_only_style) ";
+ truncation_length = -1;
+ truncate_to_repo = false;
+ truncation_symbol = "…/";
+ };
+
+ git_branch = {
+ style = "bold fg:97";
+ format = "at [$symbol$branch(:$remote_branch)]($style) ";
+ };
+ };
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/waybar/default.nix b/modules/programs/waybar/default.nix
new file mode 100644
index 0000000..702e3d5
--- /dev/null
+++ b/modules/programs/waybar/default.nix
@@ -0,0 +1,212 @@
+{ config, lib, ... }:
+
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ programs.waybar = {
+
+ enable = true;
+
+ settings = [{
+ height = 24;
+ layer = "top";
+ position = "top";
+ spacing = 4;
+
+ modules-left = [
+ "hyprland/workspaces"
+ "hyprland/window"
+ ];
+ modules-center = [
+ ];
+ modules-right = [
+ "battery"
+ "wireplumber"
+ "network"
+ "clock"
+ "tray"
+ ];
+
+ "hyprland/workspaces" = {
+ disable-scroll = true;
+ all-outputs = true;
+ format = "{name}";
+ };
+
+ battery = {
+ interval = 1;
+ states = {
+ warning = 30;
+ critical = 15;
+ };
+ forma = " {capacity}%";
+ format-charging = " {capacity}%";
+ format-plugged = " {capacity}%";
+ format-full = " {capacity}%";
+ format-warning = " {capacity}%";
+ format-critical = " {capacity}%";
+ };
+
+ wireplumber = {
+ format = " {volume}%";
+ format-bluetooth = " {volume}%";
+ format-muted = " muted";
+ scroll-step = 1;
+ on-click = "pavucontrol";
+ ignored-sinks = ["Easy Effects Sink"];
+ };
+
+ network = {
+ format = " disconnected";
+ format-wifi = " {essid}";
+ format-ethernet = " {ipaddr}/{cidr}";
+ format-disconnected = " disconnected";
+ max-length = 50;
+ on-click = "nm-connection-editor";
+ };
+
+ clock = {
+ interval = 1;
+ format = "{:%Y-%m-%d %a %H:%M:%S}";
+ };
+
+ tray = {
+ spacing = config.theme.outerGap;
+ };
+ }];
+
+ style =
+ let
+ accentColor = "#${config.theme.accentColor}";
+ textColor = "#${config.theme.colors.base05}";
+ baseColor = "#${config.theme.colors.base00}";
+ surfaceColor = "#${config.theme.colors.base02}";
+ greenColor = "#${config.theme.colors.base0B}";
+ yellowColor = "#${config.theme.colors.base0A}";
+ redColor = "#${config.theme.colors.base08}";
+ fontSize = "${toString config.theme.fontSize}px";
+ outerGap = "${toString config.theme.outerGap}px";
+ innerGap = "${toString config.theme.innerGap}px";
+ outerRadius = "${toString config.theme.outerRadius}px";
+ innerRadius = "${toString config.theme.innerRadius}px";
+ borderWidth = "${toString config.theme.borderWidth}px";
+ in ''
+
+/** Base */
+
+window#waybar {
+ font-family: "${config.theme.font}", "${config.theme.iconFont}", "${config.theme.monospaceFont}";
+ font-size: ${fontSize};
+ color: ${textColor};
+ background-color: transparent;
+}
+
+window#waybar > box {
+ margin: ${outerGap};
+ margin-bottom: 0px;
+}
+
+.modules-left,
+.modules-right {
+ padding: ${innerGap} 0px;
+ border-radius: ${outerRadius};
+ background-color: @base;
+ border: ${borderWidth} solid ${accentColor};
+}
+
+/** Workspaces */
+
+#workspaces {
+ margin-left: ${innerGap};
+}
+
+#workspaces button {
+ all: initial;
+ color: ${textColor};
+ background-color: transparent;
+ border-radius: ${innerRadius};
+ padding: ${innerGap} ${outerGap};
+}
+
+#workspaces button.focused,
+#workspaces button.active {
+ background-color: ${accentColor};
+ color: ${baseColor};
+}
+
+#workspaces button.urgent {
+ background-color: ${redColor};
+}
+
+/** Window */
+
+window#waybar:not(.empty) #window {
+ padding: 0 ${outerGap};
+ border-left: ${borderWidth} solid ${surfaceColor};
+ margin: 0 ${innerGap};
+}
+
+/** Tray */
+
+#tray {
+ border: none;
+ margin-right: ${outerGap};
+}
+
+#tray > .passive {
+ -gtk-icon-effect: dim;
+}
+
+#tray > .needs-attention {
+ -gtk-icon-effect: highlight;
+}
+
+/** Right modules */
+
+#battery,
+#wireplumber,
+#network,
+#clock {
+ padding: 0 ${outerGap};
+ border-right: ${borderWidth} solid ${surfaceColor};
+ color: @text;
+}
+
+/** Battery */
+
+#battery.charging {
+ color: ${greenColor};
+}
+
+#battery.warning:not(.charging) {
+ color: ${yellowColor};
+}
+
+#battery.critical:not(.charging) {
+ color: ${redColor};
+}
+
+/** Wireplumber */
+
+#wireplumber.muted {
+ color: ${redColor};
+}
+
+/** Network */
+
+#network.wifi,
+#network.ethernet {
+ color: ${greenColor};
+}
+
+#network.disconnected {
+ color: ${redColor};
+}
+ '';
+
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/wofi/default.nix b/modules/programs/wofi/default.nix
new file mode 100644
index 0000000..d60c052
--- /dev/null
+++ b/modules/programs/wofi/default.nix
@@ -0,0 +1,98 @@
+{ config, lib, ... }:
+
+{
+ config = lib.mkIf config.desktop.enable {
+
+ home-manager.users.${config.user} = {
+ programs.wofi = {
+
+ enable = true;
+
+ settings = {
+ key_expand = "Tab";
+ term = "kitty";
+ matching = "multi-contains";
+ insensitive = true;
+ gtk_dark = true;
+ hide_scroll = true;
+ };
+
+ style =
+ let
+ accentColor = "#${config.theme.accentColor}";
+ textColor = "#${config.theme.colors.base05}";
+ baseColor = "#${config.theme.colors.base00}";
+ surfaceColor = "#${config.theme.colors.base02}";
+ fontSize = "${toString config.theme.fontSize}px";
+ outerGap = "${toString config.theme.outerGap}px";
+ innerGap = "${toString config.theme.innerGap}px";
+ outerRadius = "${toString config.theme.outerRadius}px";
+ innerRadius = "${toString config.theme.innerRadius}px";
+ borderWidth = "${toString config.theme.borderWidth}px";
+ in ''
+* {
+ font-family: ${config.theme.monospaceFont};
+ font-size: ${fontSize};
+}
+
+/* Window */
+window {
+ margin: 0px;
+ border: ${borderWidth} solid ${accentColor};
+ border-radius: ${outerRadius};
+ background-color: ${baseColor};
+}
+
+/* Outer Box */
+#outer-box {
+ padding: ${outerGap};
+}
+
+/* Scroll */
+#scroll {
+ margin: 0px;
+ padding: ${innerGap};
+ border: none;
+}
+
+/* Input */
+#input {
+ margin: ${innerGap};
+ padding: ${innerGap};
+ border: none;
+ color: ${textColor};
+ background-color: ${surfaceColor};
+ border-radius: ${outerRadius};
+}
+
+#input:focus,
+#input:active {
+ border: ${borderWidth} solid ${accentColor};
+ box-shadow: none;
+ outline: none;
+}
+
+/* Text */
+#text {
+ margin: ${innerGap};
+ padding: ${innerGap};
+ border: none;
+ color: ${textColor};
+}
+
+/* Selected Entry */
+#entry:selected {
+ background-color: ${accentColor};
+ border-radius: ${outerRadius};
+}
+
+#entry:selected #text {
+ color: ${baseColor};
+}
+ '';
+
+ };
+ };
+
+ };
+}
diff --git a/modules/programs/zsh/default.nix b/modules/programs/zsh/default.nix
new file mode 100644
index 0000000..d8f25eb
--- /dev/null
+++ b/modules/programs/zsh/default.nix
@@ -0,0 +1,13 @@
+{ ... }:
+
+{
+ config = {
+
+ programs.zsh = {
+ enable = true;
+ enableCompletion = true;
+ enableGlobalCompInit = false;
+ };
+
+ };
+}
diff --git a/modules/system.nix b/modules/system.nix
new file mode 100644
index 0000000..25e1944
--- /dev/null
+++ b/modules/system.nix
@@ -0,0 +1,101 @@
+{ config, pkgs, ... }:
+
+{
+
+ # common system packages
+ environment.systemPackages = with pkgs; [
+ # editor
+ neovim
+ vim
+ # lib
+ libz
+ openssl
+ # shell
+ bash
+ zsh
+ # utility
+ acpi
+ curl
+ htop
+ openssh
+ p7zip
+ ripgrep
+ tree
+ unzip
+ wget
+ ];
+
+ # timezone
+ time.timeZone = "Americia/New_York";
+
+ # locale
+ i18n.defaultLocale = "en_US.UTF-8";
+
+ # system component
+ networking.networkmanager.enable = config.system.enable;
+ services.fwupd.enable = config.system.enable;
+ services.pcscd.enable = config.system.enable;
+ services.printing.enable = config.system.enable;
+ services.pipewire = {
+ enable = config.system.enable;
+ alsa.enable = config.system.enable;
+ pulse.enable = config.system.enable;
+ jack.enable = config.system.enable;
+ };
+
+ # gui component
+ services.libinput.enable = config.desktop.enable;
+
+ # create user account
+ users.users.${config.user} = {
+ isNormalUser = true;
+ description = config.fullName;
+ extraGroups = if config.system.enable then [ "networkmanager" "wheel" "sys" "video" "audio" ] else [ "wheel" ];
+ home = config.homePath;
+ shell = pkgs.zsh;
+ };
+
+ # certs
+ security.pki.certificateFiles = [
+ ../files/certs/freyanet.crt
+ ];
+
+ # fonts
+ fonts.packages = with pkgs; [
+ dejavu_fonts
+ fira-code
+ fira-code-symbols
+ jetbrains-mono
+ material-icons
+ nerd-fonts.fira-code
+ noto-fonts
+ noto-fonts-cjk-sans
+ noto-fonts-emoji
+ twemoji-color-font
+ ];
+
+ fonts.fontconfig = {
+ enable = true;
+ defaultFonts = {
+ serif = [
+ "Twemoji"
+ "DejaVu Serif"
+ ];
+ sansSerif = [
+ "Twemoji"
+ "DejaVu Sans"
+ ];
+ monospace = [
+ "Fira Code"
+ "FiraCode Nerd Font Mono"
+ "Font Awesome 6 Pro Regular"
+ "Twemoji"
+ "DejaVu Sans Mono"
+ ];
+ emoji = [
+ "Twemoji"
+ "Noto Color Emoji"
+ ];
+ };
+ };
+}
diff --git a/modules/themes/catppuccin/default.nix b/modules/themes/catppuccin/default.nix
new file mode 100644
index 0000000..5d587ef
--- /dev/null
+++ b/modules/themes/catppuccin/default.nix
@@ -0,0 +1,6 @@
+{
+ frappe = import ./frappe.nix;
+ latte = import ./latte.nix;
+ macchiato = import ./macchiato.nix;
+ mocha = import ./mocha.nix;
+}
diff --git a/modules/themes/catppuccin/frappe.nix b/modules/themes/catppuccin/frappe.nix
new file mode 100644
index 0000000..77bae89
--- /dev/null
+++ b/modules/themes/catppuccin/frappe.nix
@@ -0,0 +1,21 @@
+{
+ name = "Catppuccin Frappe";
+ author = "https://github.com/catppuccin/catppuccin";
+
+ base00 = "303446"; # base
+ base01 = "292c3c"; # mantle
+ base02 = "414559"; # surface0
+ base03 = "51576d"; # surface1
+ base04 = "626880"; # surface2
+ base05 = "c6d0f5"; # text
+ base06 = "f2d5cf"; # rosewater
+ base07 = "babbf1"; # lavender
+ base08 = "e78284"; # red
+ base09 = "ef9f76"; # peach
+ base0A = "e5c890"; # yellow
+ base0B = "a6d189"; # green
+ base0C = "81c8be"; # teal
+ base0D = "8caaee"; # blue
+ base0E = "ca9ee6"; # mauve
+ base0F = "eebebe"; # flamingo
+}
diff --git a/modules/themes/catppuccin/latte.nix b/modules/themes/catppuccin/latte.nix
new file mode 100644
index 0000000..476e123
--- /dev/null
+++ b/modules/themes/catppuccin/latte.nix
@@ -0,0 +1,21 @@
+{
+ name = "Catppuccin Latte";
+ author = "https://github.com/catppuccin/catppuccin";
+
+ base00 = "eff1f5"; # base
+ base01 = "e6e9ef"; # mantle
+ base02 = "ccd0da"; # surface0
+ base03 = "bcc0cc"; # surface1
+ base04 = "acb0be"; # surface2
+ base05 = "4c4f69"; # text
+ base06 = "dc8a78"; # rosewater
+ base07 = "7287fd"; # lavender
+ base08 = "d20f39"; # red
+ base09 = "fe640b"; # peach
+ base0A = "df8e1d"; # yellow
+ base0B = "40a02b"; # green
+ base0C = "179299"; # teal
+ base0D = "1e66f5"; # blue
+ base0E = "8839ef"; # mauve
+ base0F = "dd7878"; # flamingo
+}
diff --git a/modules/themes/catppuccin/macchiato.nix b/modules/themes/catppuccin/macchiato.nix
new file mode 100644
index 0000000..1f401be
--- /dev/null
+++ b/modules/themes/catppuccin/macchiato.nix
@@ -0,0 +1,21 @@
+{
+ name = "Catppuccin Macchiato";
+ author = "https://github.com/catppuccin/catppuccin";
+
+ base00 = "24273a"; # base
+ base01 = "1e2030"; # mantle
+ base02 = "363a4f"; # surface0
+ base03 = "494d64"; # surface1
+ base04 = "5b6078"; # surface2
+ base05 = "cad3f5"; # text
+ base06 = "f4dbd6"; # rosewater
+ base07 = "b7bdf8"; # lavender
+ base08 = "ed8796"; # red
+ base09 = "f5a97f"; # peach
+ base0A = "eed49f"; # yellow
+ base0B = "a6da95"; # green
+ base0C = "8bd5ca"; # teal
+ base0D = "8aadf4"; # blue
+ base0E = "c6a0f6"; # mauve
+ base0F = "f0c6c6"; # flamingo
+}
diff --git a/modules/themes/catppuccin/mocha.nix b/modules/themes/catppuccin/mocha.nix
new file mode 100644
index 0000000..950bf3c
--- /dev/null
+++ b/modules/themes/catppuccin/mocha.nix
@@ -0,0 +1,21 @@
+{
+ name = "Catppuccin Mocha";
+ author = "https://github.com/catppuccin/catppuccin";
+
+ base00 = "1e1e2e"; # base
+ base01 = "181825"; # mantle
+ base02 = "313244"; # surface0
+ base03 = "45475a"; # surface1
+ base04 = "585b70"; # surface2
+ base05 = "cdd6f4"; # text
+ base06 = "f5e0dc"; # rosewater
+ base07 = "b4befe"; # lavender
+ base08 = "f38ba8"; # red
+ base09 = "fab387"; # peach
+ base0A = "f9e2af"; # yellow
+ base0B = "a6e3a1"; # green
+ base0C = "94e2d5"; # teal
+ base0D = "89b4fa"; # blue
+ base0E = "f5c2e7"; # pink
+ base0F = "f2cdcd"; # flamingo
+}
diff --git a/modules/themes/default.nix b/modules/themes/default.nix
new file mode 100644
index 0000000..6018fa8
--- /dev/null
+++ b/modules/themes/default.nix
@@ -0,0 +1,3 @@
+{
+ catppuccin = import ./catppuccin;
+}