diff --git a/.gitignore b/.gitignore index 31f728a..81b47aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ ISSUES/ secrets/ +nib/ result rebuild*.log diff --git a/SCREENSHARING b/SCREENSHARING new file mode 100644 index 0000000..d3046f6 --- /dev/null +++ b/SCREENSHARING @@ -0,0 +1,11 @@ +Excellent Resource +https://gist.github.com/brunoanc/2dea6ddf6974ba4e5d26c3139ffb7580#install-xdg-desktop-portal-and-friends + +Hyprland official page on screensharing +https://wiki.hyprland.org/Useful-Utilities/Screen-Sharing/ + + +Multiple sources seem to think that use xdg-desktop-portal-wlr works (but I can't stream individual applications) +but I suppose that's better than nothing? + +Also check out xwaylandvideobridge diff --git a/TODO b/TODO.md similarity index 98% rename from TODO rename to TODO.md index bb8e65c..6b9f235 100644 --- a/TODO +++ b/TODO.md @@ -1,5 +1,4 @@ ## Next Up -0. Rename TODO -> TODO.md 1. Rename user "ae" to "cry" or "vps" 2. Add 404 page to nginx on hyrule 3. Add a user called "mirror" that stores important mirrors (inspiration: https://git.gay/mirror) diff --git a/banner b/banner new file mode 100644 index 0000000..67e1bd9 --- /dev/null +++ b/banner @@ -0,0 +1,6 @@ + .------------. + | oh my | + '------------' + ^ (\_(\ + '----- ( -.-) + o_(")(") diff --git a/config.temp/hyprland.conf b/config.temp/hyprland.conf index 864b184..4876e8a 100755 --- a/config.temp/hyprland.conf +++ b/config.temp/hyprland.conf @@ -25,8 +25,9 @@ monitor=eDP-1, highres@highrr, auto, 1.0 # Set programs that you use $terminal = ghostty #rio $fileManager = thunar -#$menu = wofi --show drun -$menu = ags -t "applauncher" +# $menu = wofi --show drun +# $menu = ags -t "applauncher" +$menu = fuzzel $colorpicker = hyprpicker | head -c 7 | wl-copy ################# @@ -40,6 +41,7 @@ $colorpicker = hyprpicker | head -c 7 | wl-copy # exec-once = nm-applet & # exec-once = waybar & hyprpaper & firefox exec-once = swww-daemon & +exec-once = mako & # TODO: or do I do `swww init` or `swww restore`? # █▀▀ █▄░█ █░█   █░█ ▄▀█ █▀█ diff --git a/flake.lock b/flake.lock index 4785725..e1ab303 100644 --- a/flake.lock +++ b/flake.lock @@ -1,30 +1,11 @@ { "nodes": { - "ags": { - "inputs": { - "nixpkgs": "nixpkgs", - "systems": "systems" - }, - "locked": { - "lastModified": 1728326430, - "narHash": "sha256-tV1ABHuA1HItMdCTuNdA8fMB+qw7LpjvI945VwMSABI=", - "owner": "Aylur", - "repo": "ags", - "rev": "60180a184cfb32b61a1d871c058b31a3b9b0743d", - "type": "github" - }, - "original": { - "owner": "Aylur", - "repo": "ags", - "type": "github" - } - }, "colmena": { "inputs": { "flake-compat": "flake-compat", "flake-utils": "flake-utils", "nix-github-actions": "nix-github-actions", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "stable": "stable" }, "locked": { @@ -75,14 +56,14 @@ }, "grub2-themes": { "inputs": { - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1730004881, - "narHash": "sha256-8xVIqIW25o2uCL0fxAmP4Sj9sdebarQXmd1+64yMe8o=", + "lastModified": 1757136219, + "narHash": "sha256-tKU+vq34KHu/A2wD7WdgP5A4/RCmSD8hB0TyQAUlixA=", "owner": "vinceliuice", "repo": "grub2-themes", - "rev": "42c232dfb46bf93c17506cbc1a574e5e89b5e09f", + "rev": "80dd04ddf3ba7b284a7b1a5df2b1e95ee2aad606", "type": "github" }, "original": { @@ -113,38 +94,6 @@ } }, "nixpkgs": { - "locked": { - "lastModified": 1725634671, - "narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable": { - "locked": { - "lastModified": 1753939845, - "narHash": "sha256-K2ViRJfdVGE8tpJejs8Qpvvejks1+A4GQej/lBk5y7I=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "94def634a20494ee057c76998843c015909d6311", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { "locked": { "lastModified": 1734119587, "narHash": "sha256-AKU6qqskl0yf2+JdRdD0cfxX4b9x3KKV5RqA6wijmPM=", @@ -160,13 +109,29 @@ "type": "github" } }, - "nixpkgs_3": { + "nixpkgs-unstable": { "locked": { - "lastModified": 1730808093, - "narHash": "sha256-oOenwoxpzQsBNi7KltgnXqq6e0+CxlfNXKn3k27w6cQ=", + "lastModified": 1761114652, + "narHash": "sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d+dAiC3H+CDle4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c1a390f74b2c93f69a6805142f11a215a689cec1", + "rev": "01f116e4df6a15f4ccdffb1bcd41096869fb385c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1761269590, + "narHash": "sha256-yTr+PCi4wGbOEidrm8XyXBobLxLMqIBsbUyhwsN6wrc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d792a6e0cd4ba35c90ea787b717d72410f56dc40", "type": "github" }, "original": { @@ -176,13 +141,13 @@ "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_3": { "locked": { - "lastModified": 1752620740, - "narHash": "sha256-f3pO+9lg66mV7IMmmIqG4PL3223TYMlnlw+pnpelbss=", + "lastModified": 1761016216, + "narHash": "sha256-G/iC4t/9j/52i/nm+0/4ybBmAF4hzR8CNHC75qEhjHo=", "owner": "nixos", "repo": "nixpkgs", - "rev": "32a4e87942101f1c9f9865e04dc3ddb175f5f32e", + "rev": "481cf557888e05d3128a76f14c76397b7d7cc869", "type": "github" }, "original": { @@ -194,10 +159,9 @@ }, "root": { "inputs": { - "ags": "ags", "colmena": "colmena", "grub2-themes": "grub2-themes", - "nixpkgs": "nixpkgs_4", + "nixpkgs": "nixpkgs_3", "nixpkgs-unstable": "nixpkgs-unstable" } }, @@ -216,21 +180,6 @@ "repo": "nixpkgs", "type": "github" } - }, - "systems": { - "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", - "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default-linux", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 382bca6..e339ce6 100644 --- a/flake.nix +++ b/flake.nix @@ -5,16 +5,9 @@ nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; - #home-manager = { - # url = "github:nix-community/home-manager"; - # inputs.nixpkgs.follows = "nixpkgs"; - #}; + colmena.url = "github:zhaofengli/colmena/?rev=47b6414d800c8471e98ca072bc0835345741a56a"; grub2-themes.url = "github:vinceliuice/grub2-themes"; - - ags.url = "github:Aylur/ags"; - - colmena.url = "github:zhaofengli/colmena/?rev=47b6414d800c8471e98ca072bc0835345741a56a"; }; outputs = { diff --git a/homes/me/default.nix b/homes/me/default.nix index fac7454..6998e63 100755 --- a/homes/me/default.nix +++ b/homes/me/default.nix @@ -6,26 +6,33 @@ pkgs, pkgs-unstable, ... -}: { +} @ args: { imports = [ + ../modules/fish.nix + ../modules/btop.nix + ../modules/tmux.nix + ../modules/term/foot.nix ../modules/git.nix ../modules/bat.nix - ../modules/fish.nix - ../modules/editor/helix.nix - # ../modules/editor/vscodium.nix - ../modules/btop.nix - ../modules/term/ghostty.nix - ../modules/term/foot.nix - # ../modules/term/rio.nix + ../modules/editor/helix.nix + (import ../modules/editor/vscode.nix args) + ../modules/firefox.nix + ../modules/apps/thunderbird.nix #../modules/wm/hypr/hypridle.nix ../modules/wm/hypr/hyprlock.nix ../modules/kanshi.nix ../modules/ags + ../modules/mako.nix ]; + nixpkgs.config.allowUnfreePredicate = pkg: + builtins.elem (lib.GetName pkg) [ + "vscode-extension-ms-dotnettools-csharp" + ]; + home = { username = "me"; homeDirectory = "/home/me"; @@ -35,6 +42,10 @@ man = "batman"; # bat + man }; + sessionVariables = { + NIX_SHELL_PRESERVE_PROMPT = 1; + }; + pointerCursor = { gtk.enable = true; # x11.enable = true # dont enable since im on hyprland @@ -42,6 +53,18 @@ name = "Bibata-Modern-Ice"; size = 16; }; + + packages = with pkgs; [ + # for services.gnome-keyring + pkgs.gcr # provides org.gnome.keyring.SystemPrompter + seahorse # gui + + tor-browser + + fuzzel + + speedtest-cli + ]; }; gtk = { @@ -136,8 +159,12 @@ }; }; - # enable OpenSSH private key agent - services.ssh-agent.enable = true; + services = { + # enable OpenSSH private key agent + ssh-agent.enable = true; + + gnome-keyring.enable = true; + }; # the ssh-agent won't set this for itself... systemd.user.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent"; # Nicely reload system units when changing configs diff --git a/homes/modules/apps/thunderbird.nix b/homes/modules/apps/thunderbird.nix new file mode 100644 index 0000000..dd4f861 --- /dev/null +++ b/homes/modules/apps/thunderbird.nix @@ -0,0 +1,10 @@ +{...}: { + programs.thunderbird = { + enable = true; + profiles = { + "me" = { + isDefault = true; + }; + }; + }; +} diff --git a/homes/modules/editor/helix.nix b/homes/modules/editor/helix.nix index e7d6003..8d6e22c 100755 --- a/homes/modules/editor/helix.nix +++ b/homes/modules/editor/helix.nix @@ -136,6 +136,28 @@ formatter.command = "${pkgs.clang-tools}/bin/clang-format"; language-servers = ["clangd"]; } + { + name = "haskell"; + auto-format = true; + formatter.command = "${pkgs.ormolu}/bin/ormolu"; + language-servers = ["haskell-language-server"]; + } + # { + # name = "c-sharp"; + # source = "source.cs"; + # file-types = ["cs"]; + # indent = { + # tab-width = 4; + # unit = " "; + # }; + # block-comment-tokens = { + # start = "/*"; + # end = "*/"; + # }; + # # auto-format = false; + # # formatter.command = "${pkgs.omnisharp-roslyn}/bin/OmniSharp"; + # # language-servers = ["OmniSharp"]; + # } ]; language-server = { @@ -149,6 +171,15 @@ clangd = { command = "${pkgs.clang-tools}/bin/clangd"; }; + + haskell-language-server = { + command = "${pkgs.haskell-language-server}/bin/haskell-language-server-wrapper"; + }; + + # C# language services + OmniSharp = { + command = "${pkgs.omnisharp-roslyn}/bin/OmniSharp"; + }; }; }; }; diff --git a/homes/modules/editor/vscode.nix b/homes/modules/editor/vscode.nix new file mode 100644 index 0000000..f824b1c --- /dev/null +++ b/homes/modules/editor/vscode.nix @@ -0,0 +1,134 @@ +{ + config, + lib, + pkgs, + vscodium ? false, + secret-service ? "gnome-libsecret", + vscode-argv ? ".vscode/argv.json", + ... +}: { + nixpkgs.overlays = [ + ( + self: super: { + vscode-extensions = super.vscode-extensions.overrideAttrs (prev: let + mkVscMarketplaceExtension = { + publisher, + name, + version, + hash, + description ? "", + homepage ? null, + changelog ? null, + license ? null, + maintainers ? [lib.maintainers.emileclarkb], + }: + with pkgs.vscode-utils.buildVscodeMarketplaceExtension; { + ${publisher}.${name} = buildVscodeMarketplaceExtension { + mktplcRef = { + inherit + publisher + name + version + hash + ; + }; + + meta = { + inherit + ( + if license != null + then {license = license;} + else {} + ) + description + homepage + maintainers + ; + downloadPage = "https://marketplace.visualstudio.com/items?itemName=${publisher}.${name}"; + changelog = + if changelog != null + then changelog + else "https://marketplace.visualstudio.com/items/${publisher}.${name}/changelog"; + }; + }; + }; + in + lib.mergeAttrsList [ + (mkVscMarketplaceExtension { + publisher = "ms-dotnettools"; + name = "dotnet-maui"; + version = "1.11.14"; + hash = lib.fakeHash; + + description = "Extend C# Dev Kit with tools for building .NET Multi-platform App UI (MAUI) apps"; + homepage = "https://github.com/microsoft/vscode-dotnettools"; + license = lib.licenses.unfree; + }) + ]); + } + ) + ]; + + # REF: https://home-manager-options.extranix.com/?query=vscode&release=release-25.05 + programs.vscode = { + enable = true; + # TODO: clean up + package = + ( + if vscodium + then pkgs.vscodium + else pkgs.vscode + ).overrideAttrs (oldAttrs: { + # runtimeDependencies = oldAttrs.runtimeDependencies ++ [] + }); + + mutableExtensionsDir = true; + + profiles.default = { + enableUpdateCheck = false; + enableExtensionUpdateCheck = false; + # extension format: USER.PACKAGENAME + extensions = with pkgs.vscode-extensions; [ + # .NET + ms-dotnettools.csharp + ms-dotnettools.csdevkit + ms-dotnettools.vscode-dotnet-runtime + # TODO: these extensions aren't packaged :( + # deitry.solution-syntax + # ms-dotnettools.vscode-dotnet-pack + # ms-dotnettools.dotnet-maui + + # Python + ms-python.python + + # GitLens by GitKraken + eamodio.gitlens + ms-azuretools.vscode-docker + + github.copilot + github.copilot-chat + + # Colors & Themes + dracula-theme.theme-dracula + catppuccin.catppuccin-vsc + catppuccin.catppuccin-vsc-icons + mvllow.rose-pine + ]; + + userSettings = { + "workbench.colorTheme" = "Dracula Theme"; + "github.copilot.nextEditSuggestions.enabled" = true; + }; + }; + }; + + # TODO: this is super ugly, make sure the JSON is formatted!! + home.file.${vscode-argv}.text = builtins.toJSON { + password-store = secret-service; + + disable-hardware-acceleration = false; + disable-color-correct-rendering = false; + enable-crash-reporter = false; + # crash-report-id = ...; + }; +} diff --git a/homes/modules/editor/vscodium.nix b/homes/modules/editor/vscodium.nix index c5daf64..ecde271 100644 --- a/homes/modules/editor/vscodium.nix +++ b/homes/modules/editor/vscodium.nix @@ -1,9 +1,37 @@ -{pkgs, ...}: { +{ + lib, + pkgs, + ... +}: { + # REF: https://home-manager-options.extranix.com/?query=vscode&release=release-25.05 programs.vscode = { enable = true; package = pkgs.vscodium; - extensions = with pkgs.vscode-extensions; [ - ]; + mutableExtensionsDir = true; + + profiles.default = { + enableUpdateCheck = false; + enableExtensionUpdateCheck = false; + # extension format: USER.PACKAGENAME + extensions = with pkgs.vscode-extensions; [ + # .NET + ms-dotnettools.csharp + ms-dotnettools.csdevkit + ms-dotnettools.vscode-dotnet-runtime + # ms-dotnettools.vscode-dotnet-pack + # ms-dotnettools.dotnet-maui + + # Colors & Themes + dracula-theme.theme-dracula + catppuccin.catppuccin-vsc + catppuccin.catppuccin-vsc-icons + mvllow.rose-pine + ]; + + userSettings = { + "workbench.colorTheme" = "Dracula Theme"; + }; + }; }; } diff --git a/homes/modules/fish.nix b/homes/modules/fish.nix index 51a40f4..801fa0f 100755 --- a/homes/modules/fish.nix +++ b/homes/modules/fish.nix @@ -12,6 +12,14 @@ config = { programs.fish = { enable = true; + generateCompletions = true; + + # vendor = { + # config.enable = true; + # functions.enable = true; + # completions.enable = true; + # }; + interactiveShellInit = '' # add dotnet completions if it exists (ie we're in a virtual environment) if type -q dotnet @@ -27,6 +35,15 @@ echo -n $greetings[(random 1 (count $greetings))] end + function gitignore -a type + curl -sL "https://www.gitignore.io/api/$type" + end + + # ripgrep on files + function rgf + rg --files | rg $args + end + set -g fish_greeting (rand_greet) diff --git a/homes/modules/git.nix b/homes/modules/git.nix index 3e0cfb0..fdf6afb 100755 --- a/homes/modules/git.nix +++ b/homes/modules/git.nix @@ -5,6 +5,19 @@ }: { programs.git = { enable = true; + lfs.enable = true; + + userName = "Emile Clark-Boman"; + userEmail = "eclarkboman@gmail.com"; + + aliases = { + s = "status"; + d = "diff"; + l = "log"; + c = "commit"; + p = "push"; + }; + extraConfig = { color.ui = true; core.editor = "hx"; @@ -20,10 +33,20 @@ "github:" ]; }; + "https://gitlab.com/" = { + insteadOf = [ + "gl:" + "gitlab:" + ]; + }; }; }; - userName = "Emile Clark-Boman"; - userEmail = "eclarkboman@gmail.com"; + includes = [ + { + path = "/home/me/agribit/.gitconfig"; + condition = "gitdir:/home/me/agribit/**"; + } + ]; }; } diff --git a/homes/modules/mako.nix b/homes/modules/mako.nix new file mode 100644 index 0000000..762cd96 --- /dev/null +++ b/homes/modules/mako.nix @@ -0,0 +1,54 @@ +{...}: let + dracula = rec { + background = "#282A36"; + border = cyan; + + cyan = "#8BE9FD"; + yellow = "#F1FA8C"; + red = "#FF5555"; + }; + + theme = dracula; +in { + # notification daemon for Wayland + services.mako = { + enable = true; + settings = { + actions = true; + anchor = "top-right"; + layer = "overlay"; + sort = "-time"; + + height = 100; + width = 300; + margin = 50; + background-color = theme.background; + border-color = theme.border; + border-radius = 20; + border-size = 4; + font = "monospace 10"; + + markup = true; + icons = true; + max-icon-size = 64; + + default-timeout = 5000; + ignore-timeout = false; + + "actionable=true" = { + anchor = "top-left"; + }; + + "urgency=low" = { + border-color = theme.border; + }; + "urgency=normal" = { + border-color = theme.yellow; + }; + "urgency=high" = { + default-timeout = 0; + border-color = theme.red; + }; + }; + }; +} diff --git a/homes/modules/tmux.nix b/homes/modules/tmux.nix new file mode 100644 index 0000000..e5946c0 --- /dev/null +++ b/homes/modules/tmux.nix @@ -0,0 +1,5 @@ +{...}: { + programs.tmux = { + enable = true; + }; +} diff --git a/homes/modules/wm/hypr/hyprland.nix b/homes/modules/wm/hypr/hyprland.nix index 40a1d99..b9ca1f7 100755 --- a/homes/modules/wm/hypr/hyprland.nix +++ b/homes/modules/wm/hypr/hyprland.nix @@ -1,2 +1,43 @@ # NOTE: hyprland must be enabled in BOTH your host config (for running hyprland) # and your home-manager config (for managing hyprland's config files) +{ + pkgs, + pkgs-unstable, + inputs, + config, + lib, + ... +}: { + options.hyprland = { + enable = lib.mkEnableOption "Hyprland"; + }; + + config = lib.mkIf config.hyprland.enable { + wayland.windowManager.hyprland = { + enable = true; + package = pkgs.hyprland; # pkgs-unstable.hyprland; + + xwayland.enable = true; + + systemd = { + enable = true; + # enable autostart of applications + # REF: `man 8 systemd-xdg-autostart-generator` + enableXdgAutostart = true; + }; + + plugins = with inputs; [ + split-monitor-workspaces.packages.${pkgs.system}.split + ]; + }; + + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-gtk + ]; + }; + + # TODO: finish this + }; +} diff --git a/hosts/hyrule/default.nix b/hosts/hyrule/default.nix index 6ac57a5..325e467 100755 --- a/hosts/hyrule/default.nix +++ b/hosts/hyrule/default.nix @@ -7,15 +7,16 @@ }: let home-manager = builtins.fetchTarball { url = "https://github.com/nix-community/home-manager/archive/release-25.05.tar.gz"; - sha256 = "026rvynmzmpigax9f8gy9z67lsl6dhzv2p6s8wz4w06v3gjvspm1"; + sha256 = "0d41gr0c89a4y4lllzdgmbm54h9kn9fjnmavwpgw0w9xwqwnzpax"; }; in { imports = [ ./hardware-configuration.nix (import "${home-manager}/nixos") - ./mailserver.nix # TEMP: location - ./minecraft-server.nix # TEMP: location + # ./mailserver.nix # TEMP: location + # ./minecraft-server.nix # TEMP: location + #../modules/server/nginx.nix #../modules/server/ssh.nix #../modules/server/fail2ban.nix diff --git a/hosts/lolcathost/default.nix b/hosts/lolcathost/default.nix index 5ba7704..dbf965d 100755 --- a/hosts/lolcathost/default.nix +++ b/hosts/lolcathost/default.nix @@ -15,6 +15,8 @@ in { ./hardware-configuration.nix (import "${home-manager}/nixos") + ../modules/bashistrans.nix + ../modules/wm/hyprland.nix # ../modules/wm/river.nix ../modules/wm/crywl.nix @@ -33,14 +35,31 @@ in { ]; nixpkgs.config.allowUnfreePredicate = let - whitelist = map lib.getName [ - pkgs.obsidian - pkgs.gitkraken - pkgs.steam - pkgs.steamcmd - pkgs.steam-unwrapped - pkgs.dwarf-fortress - ]; + vscext = pkgs.vscode-extensions; + whitelist = with pkgs; + map lib.getName [ + discord + steam + steamcmd + steam-unwrapped + + winbox + + obsidian + gitkraken + + vscode + vscext.ms-dotnettools.csharp + vscext.ms-dotnettools.csdevkit + vscext.github.copilot + vscext.github.copilot-chat + + # XXX: DEBUG + # rider-override + # XXX: DEBUG + + # jetbrains.rider + ]; in pkg: builtins.elem (lib.getName pkg) whitelist; @@ -100,10 +119,30 @@ in { networkmanager.enable = true; firewall.enable = false; + + # Use CloudFlare's WARP+ 1.1.1.1 DNS service + nameservers = [ + "1.1.1.1#one.one.one.one" + "1.0.0.1#one.one.one.one" + ]; }; # ----- SERVICES ----- services = { + # systemd-resolved provides network name resolution + # to local processes via a D-Bus interface. + resolved = { + enable = true; + dnssec = "true"; + domains = ["~."]; + # Use CloudFlare's WARP+ 1.1.1.1 DNS service + fallbackDns = [ + "1.1.1.1#one.one.one.one" + "1.0.0.1#one.one.one.one" + ]; + dnsovertls = "true"; + }; + # Set display manager (login screen) displayManager = { # sddm relies on pkgs.libsForQt5.qt5.qtgraphicaleffects @@ -121,11 +160,11 @@ in { ); }; - dbus = { - # NOTE: programs.uwsm.enable sets implementation to dbus-broker, - # NOTE: however this seems to break dbus - implementation = lib.mkForce "dbus"; - }; + # dbus = { + # # NOTE: programs.uwsm.enable sets implementation to dbus-broker, + # # NOTE: however this seems to break dbus + # implementation = lib.mkForce "dbus"; + # }; # Multimedia Framework # With backwards compatability for alsa/pulseaudio/jack @@ -198,12 +237,17 @@ in { }; # ---- ENVIRONMENT VARIABLES ---- - environment.sessionVariables = { - # folder names with capitalisation look awful! - XDG_DOWNLOAD_DIR = "$HOME/downloads"; + environment = { + # always install "dev" derivation outputs + extraOutputsToInstall = ["dev" "man"]; - # Hint Electrons apps to use Wayland - NIXOS_OZONE_WL = "1"; + sessionVariables = { + # folder names with capitalisation look awful! + XDG_DOWNLOAD_DIR = "$HOME/downloads"; + + # Hint Electrons apps to use Wayland + NIXOS_OZONE_WL = "1"; + }; }; # ---- SYSTEM PACKAGES ----- @@ -229,23 +273,49 @@ in { fish shellcheck grc # colorise command outputs + moreutils # Systems Emulation qemu # Fellice Bellard's Quick Emulator # GNU Utils gnumake + # Binaries binutils + strace + ltrace + perf-tools # ftrace + perf + radare2 + gdb + hexyl + # ASM + nasm + (callPackage ../packages/x86-manpages {}) # C Family gcc clang + clang-tools # Rust cargo rustc - # Nim - nim # Go go + # Nim + nim + nimble + # Haskell + ghc + ghcid + haskell-language-server + ormolu + + # Nix + # TODO: once upgraded past Nix-24.07 this line won't be necessary (I think) + # helix will support nixd by default + # SOURCE: https://github.com/nix-community/nixd/blob/main/nixd/docs/editor-setup.md#Helix + nixd # lsp for nix + nix-prefetch-git + nix-index # Python python312 # I use 3.12 since it's in a pretty stable state now @@ -254,6 +324,11 @@ in { # Sage sageWithDoc # SageMath + HTML Documentation + # .NET + dotnetCorePackages.dotnet_9.sdk + dotnetCorePackages.dotnet_9.aspnetcore + dotnetCorePackages.dotnet_9.runtime + openvpn inetutils @@ -270,23 +345,18 @@ in { zoxide doggo tldr - # btop + btop eza yazi lazygit ripgrep viddy # modern `watch` command thefuck - - # TODO: once upgraded past Nix-24.07 this line won't be necessary (I think) - # helix will support nixd by default - # SOURCE: https://github.com/nix-community/nixd/blob/main/nixd/docs/editor-setup.md#Helix - nixd # lsp for nix + timg # terminal image (sixel) viewer # Pretty necessary git git-filter-repo - nix-prefetch-git brightnessctl acpi # upower @@ -298,8 +368,10 @@ in { file wget tree + pstree unzip unrar-free + lz4 man-pages man-pages-posix @@ -309,8 +381,6 @@ in { libargon2 # Games - mindustry - dwarf-fortress prismlauncher # minecraft ]; @@ -326,22 +396,6 @@ in { nix-ld.enable = true; - # I want to use fish as my login shell but it always goes terrible - # cause it isn't POSIX compliant, so instead Bash is my login and - # will just exec fish (^-^) - bash = { - blesh.enable = false; # ble.sh replacement for GNU readline - completion.enable = true; - - interactiveShellInit = '' - if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] - then - shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" - exec ${pkgs.fish}/bin/fish $LOGIN_OPTION - fi - ''; - }; - # Thunar also uses: `services.tumbler` & `services.gvfs` thunar = { enable = true; diff --git a/hosts/modules/apps/rider.nix b/hosts/modules/apps/rider.nix new file mode 100644 index 0000000..adf8885 --- /dev/null +++ b/hosts/modules/apps/rider.nix @@ -0,0 +1,36 @@ +{ + pkgs, + pkgs-unstable, + ... +}: { + environment.systemPackages = with pkgs; [ + # Ensure latest stable Rider version (not necessarily stable on NixOS) + pkgs-unstable.jetbrains.rider + + # NOTE: Blazor requires a Chromium-based browser + chromium + # arc-browser + + # .NET + dotnetCorePackages.dotnet_9.sdk + dotnetCorePackages.dotnet_9.aspnetcore + dotnetCorePackages.dotnet_9.runtime + + # Mono + mono + # NOTE: nixpkgs-unstable uses .NET8 SDK + # WARNING: nixpkgs-25.05 uses .NET6 SDK (now marked insecure) + pkgs-unstable.msbuild + + # .NET Framework Tools/Services + omnisharp-roslyn + netcoredbg + ]; + + programs.nix-ld = { + enable = true; + libraries = with pkgs; [ + icu + ]; + }; +} diff --git a/hosts/modules/apps/winbox.nix b/hosts/modules/apps/winbox.nix new file mode 100644 index 0000000..eaf8b7c --- /dev/null +++ b/hosts/modules/apps/winbox.nix @@ -0,0 +1,6 @@ +{...}: { + programs.winbox = { + enable = true; + openFirewall = false; # port: 5678 + }; +} diff --git a/hosts/modules/bashistrans.nix b/hosts/modules/bashistrans.nix new file mode 100644 index 0000000..d3b285c --- /dev/null +++ b/hosts/modules/bashistrans.nix @@ -0,0 +1,23 @@ +{pkgs, ...}: { + # I want to use fish as my login shell but it always goes terrible + # cause it isn't POSIX compliant, so instead Bash is my login and + # will just exec fish (^-^) + programs.bash = { + blesh.enable = false; # ble.sh replacement for GNU readline + completion.enable = true; + + interactiveShellInit = '' + # help bash transition into a beautiful fish! + if [[ -z $CRY_BASH_IS_TRANS ]] + then + if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] + then + shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" + exec ${pkgs.fish}/bin/fish $LOGIN_OPTION + fi + fi + # bash is trans now! (no more transitioning required) + export CRY_BASH_IS_TRANS=true + ''; + }; +} diff --git a/hosts/modules/steam.nix b/hosts/modules/steam.nix index 07f3ae1..e554441 100644 --- a/hosts/modules/steam.nix +++ b/hosts/modules/steam.nix @@ -3,22 +3,38 @@ lib, ... }: { - nixpkgs.config.allowUnfreePredicate = pkg: - builtins.elem (lib.getName pkg) [ - "steam" - "steam-original" - "steam-unwrapped" - "steam-run" - ]; + # nixpkgs.config.allowUnfreePredicate = pkg: + # builtins.elem (lib.getName pkg) [ + # "steam" + # "steam-original" + # "steam-unwrapped" + # "steam-run" + # ]; + nixpkgs.overlays = [ + (self: super: { + lutris = super.lutris.overrideAttrs (final: prev: { + # WARNING: pkgs.mbedtls_2 is marked insecure! + # Replace pkgs.mbedtls_2 (v2.28.10) with pkgs.mbedtls (v3.6.4) + targetPkgs = pkgs: ( + (builtins.filter (p: p != pkgs.mbedtls_2) (prev.targetPkgs pkgs)) + ++ [pkgs.mbedtls] + ); + }); + }) + ]; programs = { steam = { enable = true; - gamescopeSession.enable = true; + gamescopeSession.enable = false; # .desktop entry for gamescope remotePlay.openFirewall = true; dedicatedServer.openFirewall = true; localNetworkGameTransfers.openFirewall = true; + + extraCompatPackages = with pkgs; [ + proton-ge-bin + ]; }; gamemode.enable = true; @@ -29,7 +45,12 @@ mangohud protonup-qt - lutris + + # XXX: DEBUG: disable lutris + # XXX: NOTE: pkgs.lutris depends on pkgs.mbedtls_2 which is marked insecure! + # XXX: NOTE: Use the provided overlay to patch pkgs.mbedtls_2 -> pkgs.mbedtls + # lutris + bottles heroic ]; diff --git a/hosts/modules/wm/hyprland.nix b/hosts/modules/wm/hyprland.nix index f2960ed..c83caa1 100644 --- a/hosts/modules/wm/hyprland.nix +++ b/hosts/modules/wm/hyprland.nix @@ -1,4 +1,8 @@ -{...}: { +{pkgs, ...}: { + environment.defaultPackages = with pkgs; [ + hyprsunset + ]; + programs = { hyprland = { enable = true; diff --git a/hosts/myputer/default.nix b/hosts/myputer/default.nix index 404a1c8..6986a31 100755 --- a/hosts/myputer/default.nix +++ b/hosts/myputer/default.nix @@ -1,42 +1,75 @@ { lib, pkgs, + pkgs-unstable, inputs, config, ... }: let home-manager = builtins.fetchTarball { url = "https://github.com/nix-community/home-manager/archive/release-25.05.tar.gz"; - sha256 = "026rvynmzmpigax9f8gy9z67lsl6dhzv2p6s8wz4w06v3gjvspm1"; + sha256 = "0q3lv288xlzxczh6lc5lcw0zj9qskvjw3pzsrgvdh8rl8ibyq75s"; }; in { imports = [ ./hardware-configuration.nix (import "${home-manager}/nixos") + ../modules/bashistrans.nix + ../modules/wm/hyprland.nix ../modules/steam.nix + ../modules/obsidian.nix + ../modules/apps/rider.nix + ../modules/apps/winbox.nix - ../modules/flipperzero.nix - ../modules/chameleonultragui.nix + #../modules/flipperzero.nix + #../modules/chameleonultragui.nix ]; - nix.settings.experimental-features = [ - "nix-command" - "flakes" - ]; + nix.settings = { + experimental-features = [ + "nix-command" + "flakes" + ]; + download-buffer-size = 524288000; # 500 MiB + }; + # nixpkgs.overlays = [ + # (self: super: { + # jdk17 = super.jdk17.override (prev: { + # enableJavaFX = true; + # }); + # }) + # ]; nixpkgs.config.allowUnfreePredicate = let - whitelist = map lib.getName [ - pkgs.obsidian - pkgs.gitkraken - pkgs.steam - pkgs.steamcmd - pkgs.steam-unwrapped - pkgs.dwarf-fortress - ]; + vscext = pkgs.vscode-extensions; + whitelist = with pkgs; + map lib.getName [ + discord + steam + steamcmd + steam-unwrapped + + winbox + + obsidian + gitkraken + + vscode + vscext.ms-dotnettools.csharp + vscext.ms-dotnettools.csdevkit + vscext.github.copilot + vscext.github.copilot-chat + + # XXX: DEBUG + # rider-override + # XXX: DEBUG + + # jetbrains.rider + ]; in pkg: builtins.elem (lib.getName pkg) whitelist; @@ -96,7 +129,16 @@ in { hostName = "myputer"; networkmanager.enable = true; - firewall.enable = true; + firewall = { + enable = true; + allowedTCPPorts = [ + 22 # SSH + 80 # HTTP + 443 # HTTPS + 5678 # MikroTik WinBox + 25565 # Minecraft LAN + ]; + }; }; # ----- SERVICES ----- @@ -183,18 +225,24 @@ in { home-manager = { users.me = import ../../homes/me; + extraSpecialArgs = {inherit inputs pkgs pkgs-unstable;}; sharedModules = [ inputs.ags.homeManagerModules.default ]; }; # ---- ENVIRONMENT VARIABLES ---- - environment.sessionVariables = { - # folder names with capitalisation look awful! - XDG_DOWNLOAD_DIR = "$HOME/downloads"; + environment = { + # always install "dev" derivation outputs + extraOutputsToInstall = ["dev" "man"]; - # Hint Electrons apps to use Wayland - NIXOS_OZONE_WL = "1"; + sessionVariables = { + # folder names with capitalisation look awful! + XDG_DOWNLOAD_DIR = "$HOME/downloads"; + + # Hint Electrons apps to use Wayland + NIXOS_OZONE_WL = "1"; + }; }; # ---- SYSTEM PACKAGES ----- @@ -208,8 +256,16 @@ in { bluetui wl-clipboard # clipboard for wayland hyprpicker + hyprshot # screenshot utility qbittorrent signal-desktop + kdePackages.gwenview # image viewer + libreoffice + + # TEST: WARNING + # ospd-openvas + # openvas-scanner + # openvas-smb (callPackage ../sddm-theme-corners.nix {}).sddm-theme-corners # dependencies for my sddm theme: @@ -220,23 +276,52 @@ in { fish shellcheck grc # colorise command outputs + moreutils - # Systems Emulation + # Systems Programming & Compilation qemu # Fellice Bellard's Quick Emulator # GNU Utils gnumake + # Binaries binutils + strace + ltrace + perf-tools # ftrace + perf + radare2 + gdb + # ASM + nasm + (callPackage ../packages/x86-manpages {}) # C Family gcc clang clang-tools + # Rust cargo rustc - # Nim - nim # Go go + # Nim + nim + nimble + # Haskell + ghc + ghcid + haskell-language-server + ormolu + + # Java + # jdk17 + # (jre8.overrideAttrs + # (oldAttrs: { + # enableJavaFX = true; + # })) + # (jdk8.overrideAttrs + # (oldAttrs: { + # enableJavaFX = true; + # })) + visualvm # Python python312 # I use 3.12 since it's in a pretty stable state now @@ -290,8 +375,10 @@ in { file wget tree + pstree unzip unrar-free + lz4 man-pages man-pages-posix @@ -340,21 +427,6 @@ in { }; }; - # I want to use fish as my login shell but it always goes terrible - # cause it isn't POSIX compliant, so instead Bash is my login and - # will just exec fish (^-^) - bash = { - completion.enable = true; - - interactiveShellInit = '' - if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]] - then - shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION="" - exec ${pkgs.fish}/bin/fish $LOGIN_OPTION - fi - ''; - }; - # Thunar also (optionally) requires: `services.tumbler` & `services.gvfs` thunar = { enable = true; @@ -367,6 +439,18 @@ in { # mozilla's email client thunderbird.enable = true; + + java = let + # XXX: WARNING: TEST :WARNING: XXX + # Test for CrazyCraft VoidLauncher + myjdk = pkgs.jdk17.override { + enableJavaFX = true; + # openjfx_jdk = pkgs.openjfx17.override {withWebKit = true;}; + }; + in { + enable = true; + package = myjdk; + }; }; # ----- FONTS ----- diff --git a/hosts/packages/huggingface_hub/flake.nix b/hosts/packages/huggingface_hub/flake.nix new file mode 100644 index 0000000..37814d9 --- /dev/null +++ b/hosts/packages/huggingface_hub/flake.nix @@ -0,0 +1,35 @@ +# Template: https://nixos-and-flakes.thiscute.world/development/intro +{ + description = "Humanity's Last Exam - Devshell"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; + }; + + outputs = {nixpkgs, ...}: let + system = "x86_64-linux"; + pkgs = import nixpkgs { + inherit system; + }; + python = pkgs.python312.override { + self = python; + packageOverrides = pyfinal: pyprev: { + huggingface-hub = pyfinal.callPackage ./huggingface_hub.nix {}; + hf-xet = pyfinal.callPackage ./hf-xet.nix {}; + }; + }; + in { + devShells."${system}".default = pkgs.mkShell { + packages = [ + (python.withPackages (pypkgs: [ + pypkgs.huggingface-hub + ])) + ]; + + shell = "${pkgs.bash}/bin/bash"; + shellHook = '' + alias hf=huggingface-cli + ''; + }; + }; +} diff --git a/hosts/packages/huggingface_hub/hf-xet.nix b/hosts/packages/huggingface_hub/hf-xet.nix new file mode 100644 index 0000000..0f4c631 --- /dev/null +++ b/hosts/packages/huggingface_hub/hf-xet.nix @@ -0,0 +1,56 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + pkg-config, + rustPlatform, + openssl, +}: +buildPythonPackage rec { + pname = "hf-xet"; + version = "1.1.5"; + pyproject = true; + + src = fetchFromGitHub { + owner = "huggingface"; + repo = "xet-core"; + tag = "v${version}"; + hash = "sha256-udjZcXTH+Mc4Gvj6bSPv1xi4MyXrLeCYav+7CzKWyhY="; + }; + + sourceRoot = "${src.name}/hf_xet"; + + cargoDeps = rustPlatform.fetchCargoVendor { + inherit + pname + version + src + sourceRoot + ; + hash = "sha256-PTzYubJHFvhq6T3314R4aqBAJlwehOqF7SbpLu4Jo6E="; + }; + + nativeBuildInputs = [ + pkg-config + rustPlatform.cargoSetupHook + rustPlatform.maturinBuildHook + ]; + + buildInputs = [ + openssl + ]; + + env.OPENSSL_NO_VENDOR = 1; + + pythonImportsCheck = ["hf_xet"]; + + # No tests (yet?) + doCheck = false; + + meta = { + description = "Xet client tech, used in huggingface_hub"; + homepage = "https://github.com/huggingface/xet-core/tree/main/hf_xet"; + changelog = "https://github.com/huggingface/xet-core/releases/tag/v${version}"; + license = lib.licenses.asl20; + }; +} diff --git a/hosts/packages/huggingface_hub/huggingface_hub.nix b/hosts/packages/huggingface_hub/huggingface_hub.nix new file mode 100644 index 0000000..02b03b7 --- /dev/null +++ b/hosts/packages/huggingface_hub/huggingface_hub.nix @@ -0,0 +1,62 @@ +/* +* WARNING: Just use `pkgs.python312Packages.huggingface-hub` (or change python version) +* WARNING: I didn't realise it existed when I packaged this. +* +* Nix Resources: +* 1. https://wiki.nixos.org/wiki/Python +* 2. https://nixos.org/manual/nixpkgs/unstable/#developing-with-python +* +* Hugging Face Resources: +* 1. https://github.com/huggingface/huggingface_hub +* 2. https://huggingface.co/docs/huggingface_hub/main/en/guides/cli +*/ +{ + lib, + buildPythonPackage, + fetchPypi, + # build time dependencies + setuptools, + # runtime dependencies + filelock, + fsspec, + hf-xet, + pyyaml, + requests, + tqdm, + typing-extensions, +}: +buildPythonPackage rec { + pname = "huggingface_hub"; + version = "0.34.3"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-1YEw/VqnQISAaBR1SRwKvX6DVEIIL7w+9NRbbDn4OFM="; + }; + + pyproject = true; + doCheck = false; # skip unit testing + pythonImportsCheck = ["huggingface_hub"]; + + # buildtime dependencies + build-system = [ + setuptools + ]; + # runtime dependencies + dependencies = [ + filelock + fsspec + hf-xet + pyyaml + requests + tqdm + typing-extensions + ]; + + meta = rec { + description = "The official Python client for the Huggingface Hub."; + homepage = "https://github.com/huggingface/huggingface_hub"; + changelog = "${homepage}/releases/tag/v${version}"; + license = lib.licenses.asl20; # Apache License 2.0 + }; +} diff --git a/hosts/packages/x86-manpages/default.nix b/hosts/packages/x86-manpages/default.nix new file mode 100644 index 0000000..b687422 --- /dev/null +++ b/hosts/packages/x86-manpages/default.nix @@ -0,0 +1,32 @@ +{pkgs, ...}: +pkgs.stdenv.mkDerivation { + pname = "x86-manpages"; + version = "0.0.1"; + + src = pkgs.fetchFromGitHub { + owner = "ttmo-O"; + repo = "x86-manpages"; + + ## Recommended + # rev = "0e199a8b4d90be7eb715291c21cf41de8527beac"; + # sha256 = "0im596j0pf90npg933gkq6wpw23c47fcwv0n64qfqn5mcy92qbcb"; + rev = "94902f9c45de0efe803c32b6c3e88d6623881866"; + sha256 = "0k6nsfabzqwnhjiyw2kyg0z49nzrsxn515f6dcjh1rn7bzih5562"; + }; + + installPhase = '' + mkdir -p $out/man/man7 + + shopt -u nullglob + for m in man7/*.7; do + install -m 644 "$m" "$out/man/man7" + done + ''; + + meta = with pkgs.lib; { + description = "Manpages for x86 instructions"; + homepage = "https://github.com/ttmo-O/x86-manpages"; + license = licenses.mit; + platforms = platforms.all; + }; +} diff --git a/scripts/box b/scripts/box new file mode 100755 index 0000000..7f69cb0 --- /dev/null +++ b/scripts/box @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +USAGE="Usage: box [--enter]" + +# ===== Configuration ===== # +DATA_DIR="$HOME/.data/box" +# ========================= # + +function setup { + mkdir -p "$DATA_DIR" &>/dev/null +} + +function box { + mktemp -d + # TODO: use a custom name instead +} + +set -euo pipefail + +ENTER=false +for arg in $@; do + case "$arg" in + -e|--enter) + ENTER=true + shift + ;; + -h|--help) + echo "$USAGE" + ;; + -*) + echo "[!] Unknown opt \"$arg\"" >&2 + ;; + *) + echo "[!] Unknown arg \"$arg\"" >&2 + ;; + esac +done + +setup + +BOX=$(box) + +if [[ "$ENTER" == true ]]; then + cd "$BOX" +fi diff --git a/scripts/lsyscalls b/scripts/lsyscalls new file mode 100755 index 0000000..5cbd744 --- /dev/null +++ b/scripts/lsyscalls @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# USAGE: lsyscalls | sort [-nk2] + +echo -e '#include '\ + | cpp -dM \ + | grep "#define __NR_.*[0-9]$" \ + | cut -d_ -f 4-