diff options
author | Tim Keller <tjk@tjkeller.xyz> | 2025-08-26 21:36:16 -0500 |
---|---|---|
committer | Tim Keller <tjk@tjkeller.xyz> | 2025-08-26 21:36:16 -0500 |
commit | c3c3d6f1fd19a5da015c9a9d3ae5c54f2d177be0 (patch) | |
tree | 559a0d9385df907f471b9bdd2bf708ec4650c718 /home-manager | |
parent | 125313aabedb17516d735a718968bfad1289f12b (diff) | |
download | nixos-master.tar.xz nixos-master.zip |
reogranize files more only working on optiplex for now prepare for home manager refactoringHEADmaster
Diffstat (limited to 'home-manager')
-rw-r--r-- | home-manager/default.nix | 25 | ||||
-rw-r--r-- | home-manager/firefox.nix | 83 | ||||
-rw-r--r-- | home-manager/git.nix | 7 | ||||
-rw-r--r-- | home-manager/gtk-bookmarks.nix | 17 | ||||
-rw-r--r-- | home-manager/htop.nix | 38 | ||||
-rw-r--r-- | home-manager/initial-home-setup.nix | 22 | ||||
-rw-r--r-- | home-manager/pcmanfm.nix | 6 | ||||
-rw-r--r-- | home-manager/resources/activation-scripts/clone-repos.sh | 30 | ||||
-rw-r--r-- | home-manager/resources/firefox/uiCustomization.json | 1 | ||||
-rw-r--r-- | home-manager/resources/firefox/userChrome.css | 204 | ||||
-rw-r--r-- | home-manager/resources/pcmanfm/root.desktop | 11 | ||||
-rw-r--r-- | home-manager/theme-st.nix | 22 | ||||
-rw-r--r-- | home-manager/theme.nix | 101 | ||||
-rw-r--r-- | home-manager/userdirs.nix | 5 | ||||
-rw-r--r-- | home-manager/wallpapers.nix | 14 |
15 files changed, 586 insertions, 0 deletions
diff --git a/home-manager/default.nix b/home-manager/default.nix new file mode 100644 index 0000000..bcd99eb --- /dev/null +++ b/home-manager/default.nix @@ -0,0 +1,25 @@ +{ lib, userDetails, homeStateVersion, ... }: { + home = { + username = userDetails.username; + homeDirectory = lib.mkForce userDetails.home; + stateVersion = homeStateVersion; + }; + + imports = [ + ./firefox.nix + ./git.nix + ./gtk-bookmarks.nix + ./htop.nix + ./initial-home-setup.nix + ./pcmanfm.nix # TODO mk name changeable & doesn't seem to work right now + ./theme-st.nix + ./theme.nix + ./userdirs.nix + ./wallpapers.nix + ]; + + theme.enable = lib.mkDefault true; + theme.st.enable = lib.mkDefault false; + theme.mint.enable = lib.mkDefault true; + wallpapers.enable = lib.mkDefault false; +} diff --git a/home-manager/firefox.nix b/home-manager/firefox.nix new file mode 100644 index 0000000..8aa1af3 --- /dev/null +++ b/home-manager/firefox.nix @@ -0,0 +1,83 @@ +{ lib, pkgs, userDetails, ... }: { + programs.firefox = { + enable = lib.mkDefault true; + arkenfox.enable = true; + profiles = let + search = { + engines = { + "Timmy Search" = { + urls = [{ + template = "https://search.tjkeller.xyz/search"; + params = [ { name = "q"; value = "{searchTerms}"; } ]; + }]; + iconURI = "https://search.tjkeller.xyz/static/themes/simple/img/favicon.svg"; # TODO doesn't seem to work + }; + "Nix Packages" = { + urls = [{ + template = "https://search.nixos.org/packages"; + params = [ { name = "query"; value = "{searchTerms}"; } ]; + }]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@np" ]; + }; + "NixOS Options" = { + urls = [{ + template = "https://search.nixos.org/options"; + params = [ { name = "query"; value = "{searchTerms}"; } ]; + }]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@no" ]; + }; + }; + default = "Timmy Search"; + privateDefault = "Timmy Search"; + force = true; # Overwrite old + }; + userChrome = builtins.readFile ./resources/firefox/userChrome.css; + arkenfox = { + enable = true; + enableAllSections = true; + "0100"."0102"."browser.startup.page".value = 3; # 0=blank, 1=home, 2=last visited page, 3=resume previous session + "0100"."0103"."browser.startup.homepage".enable = false; + "0100"."0104"."browser.newtabpage.enabled".enable = false; + #"2800"."2811"."privacy.clearOnShutdown.history".enable = false; + }; + settings = { + "browser.compactmode.show" = true; + "browser.uiCustomization.state" = builtins.readFile ./resources/firefox/uiCustomization.json; # Toolbar etc. + "browser.uidensity" = 1; # Compact + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; # userchrome + + "app.normandy.first_run" = false; + "browser.aboutConfig.showWarning" = false; # arkenfox does + #"browser.download.dir" = userDetails.userDirs.downloads; + "browser.newtabpage.activity-stream.feeds.section.topstories" = false; + "browser.newtabpage.activity-stream.feeds.topsites" = false; + "browser.urlbar.suggest.topsites" = false; + "devtools.toolbox.host" = "window"; + "dom.push.enabled" = false; # + "extensions.pocket.enabled" = false; + "general.smoothScroll" = false; + }; + workSettings = settings // { + "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org"; # Use builtin dark theme instead of system theme + }; + in { + Personal = { + id = 0; + isDefault = true; + inherit search; + inherit userChrome; + inherit arkenfox; + inherit settings; + }; + Work = { + id = 1; + inherit search; + inherit userChrome; + inherit arkenfox; + settings = workSettings; + }; + }; + }; +} diff --git a/home-manager/git.nix b/home-manager/git.nix new file mode 100644 index 0000000..9d15a90 --- /dev/null +++ b/home-manager/git.nix @@ -0,0 +1,7 @@ +{ userDetails, ... }: { + programs.git = { + enable = true; + userName = userDetails.fullname; + userEmail = userDetails.email; + }; +} diff --git a/home-manager/gtk-bookmarks.nix b/home-manager/gtk-bookmarks.nix new file mode 100644 index 0000000..24c6563 --- /dev/null +++ b/home-manager/gtk-bookmarks.nix @@ -0,0 +1,17 @@ +{ config, lib, userDetails, ... }: { + options = { + additional-gtk-bookmarks = lib.mkOption { + type = with lib.types; listOf str; + default = []; + description = "gtk bookmarks for file managers, etc."; + }; + }; + + config = { + gtk.gtk3.bookmarks = ( + lib.mapAttrsToList (name: path: + "file://${path} ${lib.toUpper (lib.substring 0 1 name)}${lib.substring 1 (-1) name}" + ) userDetails.userDirs + ) ++ config.additional-gtk-bookmarks; + }; +} diff --git a/home-manager/htop.nix b/home-manager/htop.nix new file mode 100644 index 0000000..523fee8 --- /dev/null +++ b/home-manager/htop.nix @@ -0,0 +1,38 @@ +{ config, ... }: { + programs.htop.enable = true; + programs.htop.settings = { + fields = with config.lib.htop.fields; [ + PID + USER + 124 # EXE + PERCENT_CPU + PERCENT_MEM + STARTTIME + ELAPSED # time elapsed since process start + IO_READ_RATE + RBYTES # num read bytes + IO_WRITE_RATE + WBYTES # num written bytes + TIME + STIME # sys time + CSTIME # child sys time + NICE + STATE + PRIORITY + 125 # CWD + ]; + } // (with config.lib.htop; leftMeters [ + (bar "AllCPUs2") + (bar "CPU") + (bar "Memory") + (bar "DiskIO") + (bar "NetworkIO") + ]) // (with config.lib.htop; rightMeters [ + (text "Hostname") + (text "Clock") + (text "Uptime") + (text "Battery") + (text "LoadAverage") + (text "Tasks") + ]); +} diff --git a/home-manager/initial-home-setup.nix b/home-manager/initial-home-setup.nix new file mode 100644 index 0000000..4132386 --- /dev/null +++ b/home-manager/initial-home-setup.nix @@ -0,0 +1,22 @@ +{ config, lib, pkgs, userDetails, ... }: { + home.activation = { + cloneRepos = lib.hm.dag.entryAfter ["writeBoundary"] '' + export PATH="${config.home.path}/bin:$PATH" + ${builtins.readFile ./resources/activation-scripts/clone-repos.sh} + ''; + linkZshProfile = lib.hm.dag.entryAfter ["writeBoundary"] '' + run ln -sf $VERBOSE_ARG $HOME/.config/zsh/zprofile $HOME/.zprofile + ''; + cleanupHome = lib.hm.dag.entryAfter ["writeBoundary"] '' + run rm -f $VERBOSE_ARG $HOME/{.zcompdump,.zshrc,.zsh_history,.bash_history} + ''; + mimewiz = lib.hm.dag.entryAfter ["writeBoundary"] '' + export PATH="${pkgs.xdg-utils}/bin:$PATH" + export PATH="$HOME/.local/bin/misc:$PATH" + run mimewiz -i # already verbose + ''; + createDirs = lib.hm.dag.entryAfter ["writeBoundary"] '' + run mkdir -p $VERBOSE_ARG ${ lib.concatStringsSep " " (lib.attrValues userDetails.userDirs) } + ''; + }; +} diff --git a/home-manager/pcmanfm.nix b/home-manager/pcmanfm.nix new file mode 100644 index 0000000..3c70521 --- /dev/null +++ b/home-manager/pcmanfm.nix @@ -0,0 +1,6 @@ +{ + home.file.pcmanfm-root = { + target = ".local/share/file-manager/actions/root.desktop"; + source = ./resources/pcmanfm/root.desktop; + }; +} diff --git a/home-manager/resources/activation-scripts/clone-repos.sh b/home-manager/resources/activation-scripts/clone-repos.sh new file mode 100644 index 0000000..eaee4dc --- /dev/null +++ b/home-manager/resources/activation-scripts/clone-repos.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +server="https://git.tjkeller.xyz/" + +clonemissing() { + # pull and return if already existing + if [ -d "$2"/.git ]; then + run cd $VERBOSE_ARG "$2" + run git pull $VERBOSE_ARG || echo "$2: failed to pull from remote" + return + fi + + # clone to $2 + run mkdir -p $VERBOSE_ARG "$2" + run git clone $VERBOSE_ARG "$server$1" "$2" + + # link to $3 + [ -z "$3" ] && return + run mkdir -p $VERBOSE_ARG "$3" + run ln -sf $VERBOSE_ARG "$2"/* "$3" +} + +# # repo # clone to # link to +clonemissing scripts $HOME/docs/src/scripts $HOME/.local/bin +clonemissing dotconfig $HOME/docs/src/config $HOME/.config +clonemissing userscripts $HOME/docs/src/userscripts '' +clonemissing nixos $HOME/docs/src/nixos '' +clonemissing awesome $HOME/.config/awesome '' +clonemissing nvim $HOME/.config/nvim '' +clonemissing zsh $HOME/.config/zsh '' diff --git a/home-manager/resources/firefox/uiCustomization.json b/home-manager/resources/firefox/uiCustomization.json new file mode 100644 index 0000000..339b716 --- /dev/null +++ b/home-manager/resources/firefox/uiCustomization.json @@ -0,0 +1 @@ +{"placements":{"widget-overflow-fixed-list":[],"unified-extensions-area":["ublock0_raymondhill_net-browser-action","sponsorblocker_ajay_app-browser-action","_e6e36c9a-8323-446c-b720-a176017e38ff_-browser-action","dearrow_ajay_app-browser-action","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","idcac-pub_guus_ninja-browser-action","addon_darkreader_org-browser-action","_74145f27-f039-47ce-a470-a662b129930a_-browser-action","_762f9885-5a13-4abd-9c77-433dcd38b8fd_-browser-action","jid1-bofifl9vbdl2zq_jetpack-browser-action","addon_fastforward_team-browser-action","jid1-tsgsxbhncspbwq_jetpack-browser-action","_aecec67f-0d10-4fa7-b7c7-609a2db280cf_-browser-action"],"nav-bar":["back-button","forward-button","stop-reload-button","home-button","urlbar-container","downloads-button","unified-extensions-button"],"toolbar-menubar":["menubar-items"],"TabsToolbar":["tabbrowser-tabs","new-tab-button","alltabs-button"],"PersonalToolbar":["personal-bookmarks"]},"seen":["save-to-pocket-button","developer-button","dearrow_ajay_app-browser-action","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","_e6e36c9a-8323-446c-b720-a176017e38ff_-browser-action","sponsorblocker_ajay_app-browser-action","ublock0_raymondhill_net-browser-action","idcac-pub_guus_ninja-browser-action","addon_darkreader_org-browser-action","_74145f27-f039-47ce-a470-a662b129930a_-browser-action","_762f9885-5a13-4abd-9c77-433dcd38b8fd_-browser-action","jid1-bofifl9vbdl2zq_jetpack-browser-action","addon_fastforward_team-browser-action","jid1-tsgsxbhncspbwq_jetpack-browser-action","_aecec67f-0d10-4fa7-b7c7-609a2db280cf_-browser-action"],"dirtyAreaCache":["nav-bar","PersonalToolbar","unified-extensions-area","toolbar-menubar","TabsToolbar"],"currentVersion":20,"newElementCount":5} diff --git a/home-manager/resources/firefox/userChrome.css b/home-manager/resources/firefox/userChrome.css new file mode 100644 index 0000000..624ab26 --- /dev/null +++ b/home-manager/resources/firefox/userChrome.css @@ -0,0 +1,204 @@ +/* TOP BAR */ +#navigator-toolbox { + --uc-navigationbar-width: 40vw; +} + +/* Remove overflow button */ +#nav-bar-overflow-button { display: none; } + +/* remove alltabs button */ +#alltabs-button { display: none; } + +/* Change background color of toolbar */ +#navigator-toolbox-background { + background: var(--toolbar-field-border-color) !important; +} + +/* Change background color of bookmarks toolbar */ +#PersonalToolbar { + background: var(--toolbox-bgcolor) !important; +} + +/* Adjust spacing of toolbar items */ +#PlacesToolbarItems { + gap: .35rem; + margin-block: .2rem; +} + +/* Fix vertical spacing of tabs */ +#TabsToolbar { + margin-top: -1px; +} + +/* Move new tab to far right */ +#tabbrowser-arrowscrollbox-periphery { + margin-left: auto; +} + +/* Fix spacing around tabs by removing nav bar top border */ +#nav-bar { + border: none !important; +} + +/* Media queries for width of nav bar */ +@media screen and (max-width: 1000px) { + #navigator-toolbox { + --uc-navigationbar-width: 50vw; + } +} +@media screen and (max-width: 800px) { + #navigator-toolbox { + --uc-navigationbar-width: 60vw; + } +} + +/* Change look of tabs in smaller view */ +@media screen and (max-width: 800px) { + .tab-background { + margin-block: .2em !important; + } + #TabsToolbar { + margin-left: 5px; + } +} + + +/* COMBINE TOP BAR */ +/* Combine top bar into single line if width >= 800px */ +@media screen and (min-width: 800px) { + :root { + --uc-toolbar-height: 36px; /* Half height bar */ + } + + /* Modify these to change relative widths or default height */ + #navigator-toolbox { + margin-bottom: 0px; + padding-top: 1px; /* Top bar is cut off otherwise */ + } + + #TabsToolbar { + margin-left: calc(var(--uc-navigationbar-width) + 2px); /* Resize tab bar */ + margin-top: -4px; + margin-bottom: 2px; + } + + /* Tabs extend to bottom of bar */ + .tab-background { + margin-bottom: 0 !important; + margin-top: 3px !important; /* See above navigator-toolbox rule. Avoid cutting off top */ + } + + /* Center tab buttons */ + #tabs-newtab-button, + #alltabs-button + { + margin-top: 4px !important; + } + + /* Integrate url / nav bar */ + #nav-bar { + margin-right:calc(100vw - var(--uc-navigationbar-width)); + margin-top: calc(0px - var(--uc-toolbar-height)); + border-radius: 0 var(--tab-border-radius) var(--tab-border-radius) 0; + border-right: 1px solid ThreeDShadow !important; + box-shadow: 0 0 4px rgba(0,0,0,.4) !important; + } + + /* 1px margin on touch density causes tabs to be too high */ + .tab-close-button { + margin-top: 0 !important + } + + /* Make opened urlbar overlay the toolbar */ + #urlbar[open]:focus-within { + min-width: 50vw !important; + } + + /* Remove min and max width of urlbar */ + #urlbar-container { + width: 0 !important; + } + + /* Fix customization view */ + #customization-panelWrapper .panel-arrowbox .panel-arrow { + margin-inline-end: initial !important; + } + + /* Shorten findbar */ + findbar { + width: 600px !important; + border-radius: 0 0 0 5px; + border-bottom: none !important; + box-shadow: 0 2px 4px rgba(0,0,0,.4); /* Move down 2px so it doesn't go over the tab bar */ + } +} + + +/* FINDBAR */ +findbar { + width: 100vw; + position: absolute; + top: 0; + right: 0; + padding: 0 !important; + padding-top: 1px !important; + background: -moz-headerbar Field !important; + border-top-width: 0px !important; + border-bottom: 1px solid ThreeDShadow; +} + +findbar .findbar-container { + padding-bottom: 5px !important; /* Move search bar closer to left edge */ + padding-top: 2px !important; /* Move search bar closer to left edge */ + height: max-content !important; + gap: 2px; + justify-content: space-between; + flex-wrap: wrap; +} + +/* Force textbox to fill up first line */ +findbar .findbar-textbox { + width: 100% !important; + background: Field !important; /* Set the background color to be consistent with found-matches label when unfocused */ +} + +/* Hide description showing wrap conditions etc. */ +findbar description { + display: none; +} + +/* Move found matches label (roughly) into the textbox */ +findbar label.found-matches, +findbar description { + position: absolute; + top: 6.5px; + right: 110px; + color: color-mix(in srgb, -moz-headerbartext, transparent 46%) !important; + /* So this text overrides the text below, TODO find a more elegant solution */ + padding-inline: 1ex; + background: Field; +} + +/* Show description when it says "Phrase Not Found" */ +findbar description[status=notfound] { + display: inline-block; +} + +/* Force checkboxes onto second line */ +findbar .findbar-container hbox { + width: 100%; +} + + +/* BOOKMARK BAR */ +@-moz-document url(chrome://browser/content/browser.xhtml) { + #PersonalToolbar { + background: -moz-headerbar Field !important; + border-top: 1px solid ThreeDShadow !important; + z-index: 1000; /* To not be affected by shadow from navbar */ + } + /* Space out bookmark items */ + .bookmark-item .toolbarbutton-text { + padding: 2.5px 4px; + } +} diff --git a/home-manager/resources/pcmanfm/root.desktop b/home-manager/resources/pcmanfm/root.desktop new file mode 100644 index 0000000..4b4d263 --- /dev/null +++ b/home-manager/resources/pcmanfm/root.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Action +Tooltip=Open Directory As Root +Name=Open Directory As Root +Profiles=profile-zero; +Icon=gtk-dialog-authentication + +[X-Action-Profile profile-zero] +MimeTypes=inode/directory; +Exec=/home/timmy/.local/bin/x11/xsudo /usr/bin/pcmanfm %u +Name=Default profile diff --git a/home-manager/theme-st.nix b/home-manager/theme-st.nix new file mode 100644 index 0000000..0a06cd0 --- /dev/null +++ b/home-manager/theme-st.nix @@ -0,0 +1,22 @@ +{ config, lib, pkgs, ... }: { + options = { + theme.st = { + enable = lib.mkEnableOption "enables theming st with home manager"; + font = lib.mkOption { + type = lib.types.str; + default = "JetBrainsMonoNL Nerd Font Mono:size=12:antialias=true:autohint=true"; + }; + }; + }; + config = let + themed-st = pkgs.st.overrideAttrs (old: { + buildInputs = old.buildInputs or [] ++ [ pkgs.makeWrapper ]; + postInstall = old.postInstall or "" + '' + wrapProgram $out/bin/st \ + --add-flags '-f"${config.theme.st.font}"' + ''; + }); + in lib.mkIf config.theme.enable { + home.packages = [ themed-st ]; + }; +} diff --git a/home-manager/theme.nix b/home-manager/theme.nix new file mode 100644 index 0000000..9e4edae --- /dev/null +++ b/home-manager/theme.nix @@ -0,0 +1,101 @@ +{ config, lib, pkgs, ... }: +let + transformColorValue = color : + if color == "Green" then "Mint-Y" + else if color == "Dark-Green" then "Mint-Y-Dark" + else "Mint-Y-${color}" + ; +in { + options = { + theme.enable = lib.mkEnableOption "enables theming"; + theme.mint = { + enable = lib.mkEnableOption "enables mint theme"; + # TODO add theme.dark option instead of specifying Dark-Color + theme.color = lib.mkOption { + type = lib.types.enum [ + "Aqua" "Blue" "Green" "Grey" "Orange" "Pink" "Purple" "Red" + "Sand" "Teal" "Dark-Aqua" "Dark-Blue" "Dark-Green" + "Dark-Grey" "Dark-Orange" "Dark-Pink" "Dark-Purple" + "Dark-Red" "Dark-Sand" "Dark-Teal" + ]; + default = "Dark-Aqua"; + description = "mint-y theme color eg. 'Dark-Aqua' or 'Red'"; + }; + icons.color = lib.mkOption { + type = lib.types.enum [ + "Aqua" "Blue" "Green" "Grey" "Orange" "Pink" "Purple" "Red" + "Sand" "Teal" + ]; + default = "Aqua"; + description = "mint-y icons color eg. 'Aqua' or 'Red'"; + }; + }; + theme.font = { + sansSerif = lib.mkOption { + type = lib.types.str; + default = "Inter"; + description = "default sans serif font"; + }; + monospace = lib.mkOption { + type = lib.types.str; + default = "CommitMono"; + description = "default monospace font"; + }; + gtk = { + name = lib.mkOption { + type = lib.types.str; + default = "sans-serif"; + description = "default gtk font"; + }; + size = lib.mkOption { + type = with lib.types; nullOr int; + default = null; + description = "default gtk font size"; + }; + }; + }; + theme.cursor = { + name = lib.mkOption { + type = lib.types.str; + default = "Adwaita"; + description = "gtk cursor theme"; + }; + size = lib.mkOption { + type = with lib.types; nullOr int; + default = null; + description = "gtk cursor size"; + }; + }; + }; + + config = lib.mkIf config.theme.enable { + gtk = { + enable = true; + theme = lib.mkIf config.theme.mint.enable { + package = pkgs.mint-themes; + name = transformColorValue config.theme.mint.theme.color; + }; + iconTheme = lib.mkIf config.theme.mint.enable { + package = pkgs.mint-y-icons; + name = transformColorValue config.theme.mint.icons.color; + }; + font = { + name = config.theme.font.gtk.name; + size = config.theme.font.gtk.size; + }; + cursorTheme = { + name = config.theme.cursor.name; + size = config.theme.cursor.size; + }; + gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; + }; + qt = { + enable = true; + platformTheme.name = "gtk3"; + }; + fonts.fontconfig.defaultFonts = { + sansSerif = [ config.theme.font.sansSerif ]; + monospace = [ config.theme.font.monospace ]; + }; + }; +} diff --git a/home-manager/userdirs.nix b/home-manager/userdirs.nix new file mode 100644 index 0000000..58c1d59 --- /dev/null +++ b/home-manager/userdirs.nix @@ -0,0 +1,5 @@ +{ userDetails, ... }: { + xdg.userDirs = { + enable = true; + } // userDetails.userDirs; +} diff --git a/home-manager/wallpapers.nix b/home-manager/wallpapers.nix new file mode 100644 index 0000000..d7e067a --- /dev/null +++ b/home-manager/wallpapers.nix @@ -0,0 +1,14 @@ +{ lib, config, pkgs, ... }: { + options = { + wallpapers.enable = lib.mkEnableOption "enables all wallpapers"; + }; + + config = lib.mkIf config.wallpapers.enable { + home.file.".local/share/wallpaper" = { + source = pkgs.fetchzip { + url = "https://tjkeller.xyz/permalinks/wallpapers.tar"; + hash = "sha256-lhj9wUMZfd0XOrUtWY9HB64oXrS/EjsvsaJHzu4ucFg="; + }; + }; + }; +} |