misc: initial commit
This commit is contained in:
commit
964b99b28d
32 changed files with 1675 additions and 0 deletions
21
dev-shell/default.nix
Normal file
21
dev-shell/default.nix
Normal file
|
@ -0,0 +1,21 @@
|
|||
{...}: {
|
||||
perSystem = {
|
||||
pkgs,
|
||||
inputs',
|
||||
...
|
||||
}: {
|
||||
devShells.default = pkgs.mkShell {
|
||||
packages = with pkgs; [
|
||||
just
|
||||
alejandra
|
||||
nixpkgs-fmt
|
||||
nix-tree
|
||||
nix-diff
|
||||
nvd
|
||||
nix-inspect
|
||||
nix-du
|
||||
nix-output-monitor
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
64
flake.lock
generated
Normal file
64
flake.lock
generated
Normal file
|
@ -0,0 +1,64 @@
|
|||
{
|
||||
"nodes": {
|
||||
"disko": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1735048446,
|
||||
"narHash": "sha256-Tc35Y8H+krA6rZeOIczsaGAtobSSBPqR32AfNTeHDRc=",
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"rev": "3a4de9fa3a78ba7b7170dda6bd8b4cdab87c0b21",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixos-facter-modules": {
|
||||
"locked": {
|
||||
"lastModified": 1734596637,
|
||||
"narHash": "sha256-MRqwVAe3gsb88u4ME1UidmZFVCx+FEnoob0zkpO9DMY=",
|
||||
"owner": "numtide",
|
||||
"repo": "nixos-facter-modules",
|
||||
"rev": "536472754982bf03079b4b4e0261838a760587c0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "nixos-facter-modules",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1735268880,
|
||||
"narHash": "sha256-7QEFnKkzD13SPxs+UFR5bUFN2fRw+GlL0am72ZjNre4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "7cc0bff31a3a705d3ac4fdceb030a17239412210",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"disko": "disko",
|
||||
"nixos-facter-modules": "nixos-facter-modules",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
33
flake.nix
Normal file
33
flake.nix
Normal file
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
|
||||
nixos-hardware.url = "github:NixOS/nixos-hardware";
|
||||
disko.url = "github:nix-community/disko";
|
||||
disko.inputs.nixpkgs.follows = "nixpkgs";
|
||||
nixos-facter-modules.url = "github:numtide/nixos-facter-modules";
|
||||
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
impermanence.url = "github:nix-community/impermanence";
|
||||
nix-index-database = {
|
||||
url = "github:nix-community/nix-index-database";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
ags.url = "github:Aylur/ags";
|
||||
anyrun.url = "github:Kirottu/anyrun";
|
||||
muse-sounds-manager = {
|
||||
url = "github:thilobillerbeck/muse-sounds-manager-nix/06b0da28c54331d5af73efd2ebf264ce914e5936";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = inputs @ {flake-parts, ...}:
|
||||
flake-parts.lib.mkFlake {inherit inputs;} {
|
||||
systems = ["x86_64-linux"];
|
||||
imports = [
|
||||
./systems
|
||||
./dev-shell
|
||||
];
|
||||
};
|
||||
}
|
26
hardware-configuration.nix
Normal file
26
hardware-configuration.nix
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usbhid" "usb_storage" "sd_mod" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ "kvm-amd" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp196s0f3u2u3.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.wlp4s0.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
125
home/apps.nix
Normal file
125
home/apps.nix
Normal file
|
@ -0,0 +1,125 @@
|
|||
{
|
||||
pkgs,
|
||||
inputs,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./apps/firefox.nix
|
||||
./apps/syncthing.nix
|
||||
];
|
||||
|
||||
home.packages = [
|
||||
pkgs.pavucontrol
|
||||
pkgs.signal-desktop
|
||||
pkgs.webcord # pkgs.webcord-vencord
|
||||
pkgs.telegram-desktop
|
||||
#pkgs.kdePackages.neochat
|
||||
pkgs.keepassxc
|
||||
#pkgs.blender-hip
|
||||
pkgs.buku
|
||||
pkgs.libreoffice
|
||||
pkgs.darktable
|
||||
pkgs.gimp
|
||||
pkgs.inkscape
|
||||
pkgs.krita
|
||||
pkgs.okular
|
||||
pkgs.localsend
|
||||
|
||||
pkgs.ffmpeg # Generally useful
|
||||
|
||||
# Music
|
||||
#pkgs.feishin # sonixd replacement
|
||||
pkgs.supersonic # Music player by Navidrome author
|
||||
pkgs.sonixd # Music player; desktop app for Navidrome. Replace w/ Feishin when that supports Subsonic API.
|
||||
pkgs.spotube # Use Spotify metadata & user to play from YouTube
|
||||
pkgs.spotify # Proprietary
|
||||
pkgs.strawberry-qt6 # Fork of Clementine
|
||||
pkgs.clementine
|
||||
pkgs.lollypop
|
||||
# muffon https://muffon.netlify.app/
|
||||
pkgs.picard # Edit audio metadata, w/ MusicBrainz integration
|
||||
pkgs.puddletag # Edit audio metadata
|
||||
pkgs.deadbeef-with-plugins
|
||||
# pkgs.tauon
|
||||
pkgs.audacious
|
||||
# pkgs.asunder # Ripping
|
||||
pkgs.cyanrip # Ripping
|
||||
# pkgs.whipper # Ripping
|
||||
|
||||
#pkgs.anki # Dep python3.12-pyqt-6.7.0 doesn't build
|
||||
pkgs.memento # Japanese
|
||||
|
||||
# Documents
|
||||
pkgs.typst # TeX alternative
|
||||
pkgs.tinymist # LSP for Typst
|
||||
|
||||
# Dev
|
||||
pkgs.vscodium # Consider vscodium-fhs
|
||||
#pkgs.jetbrains.rider
|
||||
#pkgs.jetbrains.rust-rover
|
||||
pkgs.helix
|
||||
pkgs.zed-editor
|
||||
|
||||
# Internet
|
||||
pkgs.fragments
|
||||
pkgs.uget # Download manager
|
||||
# From master because PR #290892 is merged but at the time of writing hasn't made it to unstable yet
|
||||
# Need it to solve issue #263764
|
||||
# https://github.com/NixOS/nixpkgs/issues/263764
|
||||
# https://github.com/NixOS/nixpkgs/pull/290892
|
||||
# https://github.com/NixOS/nixpkgs/commit/999e0cf59288584616a241c0d8bb7c3c3f1fb417
|
||||
pkgs.obsidian
|
||||
pkgs.obs-studio
|
||||
pkgs.kdePackages.plasmatube
|
||||
#pkgs.nyxt
|
||||
|
||||
pkgs.mpvScripts.uosc
|
||||
pkgs.mpvScripts.sponsorblock
|
||||
|
||||
pkgs.musescore
|
||||
# inputs.muse-sounds-manager.packages.${pkgs.system}.muse-sounds-manager
|
||||
pkgs.helio-workstation # music editor
|
||||
pkgs.lmms # DAW
|
||||
pkgs.carla # VST host
|
||||
pkgs.yabridge # Windows VST host
|
||||
pkgs.yabridgectl
|
||||
pkgs.surge-XT # VST
|
||||
];
|
||||
|
||||
programs.imv.enable = true;
|
||||
|
||||
programs.mangohud = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
programs.mpv.enable = true;
|
||||
|
||||
programs.thunderbird = {
|
||||
enable = true;
|
||||
profiles.default = {
|
||||
isDefault = true;
|
||||
};
|
||||
};
|
||||
|
||||
programs.vscode = {
|
||||
enable = true;
|
||||
package = pkgs.vscodium;
|
||||
enableUpdateCheck = false;
|
||||
userSettings = {
|
||||
"window.menuBarVisibility" = "toggle";
|
||||
"rust-analyzer.server.path" = "rust-analyzer"; # look in env
|
||||
|
||||
# Library sources for rust-analyzer shall be read-only
|
||||
"files.readonlyInclude" = {
|
||||
"**/.cargo/registry/src/**/*.rs" = true;
|
||||
"**/lib/rustlib/src/rust/library/**/*.rs" = true;
|
||||
};
|
||||
};
|
||||
extensions = with pkgs.vscode-extensions; [
|
||||
mkhl.direnv
|
||||
jnoortheen.nix-ide
|
||||
];
|
||||
};
|
||||
|
||||
programs.zathura.enable = true;
|
||||
}
|
83
home/apps/firefox.nix
Normal file
83
home/apps/firefox.nix
Normal file
|
@ -0,0 +1,83 @@
|
|||
{
|
||||
lib,
|
||||
pkgs,
|
||||
osConfig,
|
||||
...
|
||||
}: let
|
||||
enablePlasma = osConfig.services.desktopManager.plasma6.enable;
|
||||
|
||||
extension = shortId: uuid: {
|
||||
name = uuid;
|
||||
value = {
|
||||
install_url = "https://addons.mozilla.org/en-US/firefox/downloads/latest/${shortId}/latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
};
|
||||
oldExtensions = builtins.listToAttrs;
|
||||
|
||||
ext = shortId: {
|
||||
install_url = "https://addons.mozilla.org/en-US/firefox/downloads/latest/${shortId}/latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
exts = builtins.mapAttrs (_: ext);
|
||||
in {
|
||||
programs.firefox = {
|
||||
enable = true;
|
||||
nativeMessagingHosts = [
|
||||
pkgs.tridactyl-native
|
||||
];
|
||||
|
||||
policies.ExtensionSettings = lib.mkMerge [
|
||||
(oldExtensions [
|
||||
# languagetool?
|
||||
#(extension "tree-style-tab" "treestyletab@piro.sakura.ne.jp")
|
||||
(extension "sidebery" "{3c078156-979c-498b-8990-85f7987dd929}") # has no email id
|
||||
(extension "kagi-search-for-firefox" "search@kagi.com")
|
||||
(extension "ublock-origin" "uBlock0@raymondhill.net")
|
||||
#(extension "umatrix" "uMatrix@raymondhill.net")
|
||||
(extension "privacy-badger17" "jid1-MnnxcxisBPnSXQ@jetpack")
|
||||
(extension "i-dont-care-about-cookies" "jid1-KKzOGWgsW3Ao4Q@jetpack")
|
||||
# (extension "clearurls" "{74145f27-f039-47ce-a470-a662b129930a}") # has no email id
|
||||
(extension "keepassxc-browser" "keepassxc-browser@keepassxc.org")
|
||||
#(extension "bitwarden-password-manager" "{446900e4-71c2-419f-a6a7-df9c091e268b}")
|
||||
#(extension "tabliss" "extension@tabliss.io")
|
||||
|
||||
# (extension "bukubrow" "bukubrow@samhh.com")
|
||||
# (extension "multi-account-containers" "@testpilot-containers")
|
||||
# (extension "rust-search-extension" "{04188724-64d3-497b-a4fd-7caffe6eab29}") # has no email id
|
||||
# (extension "tridactyl-vim" "tridactyl.vim@cmcaine.co.uk")
|
||||
# site-specific
|
||||
# (extension "libredirect" "7esoorv3@alefvanoon.anonaddy.me")
|
||||
(extension "toolkit-for-ynab" "{4F1FB113-D7D8-40AE-A5BA-9300EAEA0F51}") # has no email id
|
||||
(extension "sponsorblock" "sponsorBlocker@ajay.app")
|
||||
# (extension "steam-database" "firefox-extension@steamdb.info")
|
||||
])
|
||||
# TODO: Can we get this from nixpkgs instead?
|
||||
(lib.mkIf enablePlasma (exts {
|
||||
"plasma-browser-integration@kde.org" = "plasma-integration";
|
||||
}))
|
||||
];
|
||||
# To add additional extensions, find it on addons.mozilla.org, find
|
||||
# the short ID in the url (like https://addons.mozilla.org/en-US/firefox/addon/!SHORT_ID!/)
|
||||
# Then, download the XPI by filling it in to the install_url template, unzip it,
|
||||
# run `jq .browser_specific_settings.gecko.id manifest.json` or
|
||||
# `jq .applications.gecko.id manifest.json` to get the UUID
|
||||
# You don’t need to get the UUID from the xpi. You can install it then find the UUID in about:debugging#/runtime/this-firefox.
|
||||
|
||||
profiles.default = {
|
||||
settings = {
|
||||
"app.normandy.first_run" = false;
|
||||
"app.shield.optoutstudies.enabled" = false;
|
||||
"app.update.channel" = "default";
|
||||
# "browser.link.open_newwindow" = true;
|
||||
"browser.shell.checkDefaultBrowser" = true;
|
||||
"browser.urlbar.showSearchSuggestionsFirst" = false;
|
||||
"browser.vpn_promo.enabled" = false;
|
||||
# "extensions.activeThemeID" = "firefox-alpenglow@mozilla.org";
|
||||
# "extensions.extensions.activeThemeID" = "firefox-alpenglow@mozilla.org";
|
||||
"extensions.pocket.enabled" = false;
|
||||
"media.ffmpeg.vaapi.enabled" = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
18
home/apps/syncthing.nix
Normal file
18
home/apps/syncthing.nix
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
lib,
|
||||
pkgs,
|
||||
osConfig,
|
||||
...
|
||||
}: let
|
||||
enablePlasma = osConfig.services.desktopManager.plasma6.enable;
|
||||
enableGnome = osConfig.services.xserver.desktopManager.gnome.enable;
|
||||
in {
|
||||
services.syncthing = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
home.packages = lib.mkMerge [
|
||||
(lib.mkIf enablePlasma [pkgs.syncthingtray-qt6])
|
||||
(lib.mkIf enableGnome [pkgs.gnomeExtensions.syncthing-indicator])
|
||||
];
|
||||
}
|
103
home/default.nix
Normal file
103
home/default.nix
Normal file
|
@ -0,0 +1,103 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
inputs,
|
||||
osConfig,
|
||||
...
|
||||
}: let
|
||||
variables = {
|
||||
# VISUAL = "emacs";
|
||||
EDITOR = "nvim";
|
||||
|
||||
SSH_ASKPASS_REQUIRE = "prefer";
|
||||
SSH_ASKPASS = "${pkgs.ksshaskpass}/bin/ksshaskpass";
|
||||
};
|
||||
in {
|
||||
imports = [
|
||||
./xdg.nix
|
||||
./terminal.nix
|
||||
./desktop.nix
|
||||
# ./emacs.nix
|
||||
./apps.nix
|
||||
];
|
||||
|
||||
home.sessionVariables = variables;
|
||||
systemd.user.sessionVariables = variables;
|
||||
|
||||
fonts.fontconfig.enable = true;
|
||||
|
||||
xdg.enable = true;
|
||||
|
||||
home.packages = with pkgs; [
|
||||
noto-fonts-cjk-sans
|
||||
noto-fonts-cjk-serif
|
||||
noto-fonts-color-emoji
|
||||
];
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
delta = {
|
||||
enable = true;
|
||||
options = {
|
||||
side-by-side = true;
|
||||
};
|
||||
};
|
||||
# WISH: Figure out difftastic
|
||||
# difftastic.enable = true;
|
||||
# https://difftastic.wilfred.me.uk/git.html
|
||||
# https://tsdh.org/posts/2022-08-01-difftastic-diffing-with-magit.html
|
||||
userEmail = "git@evar.dev";
|
||||
userName = "Evar";
|
||||
extraConfig = {
|
||||
init.defaultBranch = "main";
|
||||
|
||||
# Consider https://jvns.ca/blog/2024/02/16/popular-git-config-options/#pull-ff-only-or-pull-rebase-true
|
||||
|
||||
# Make merge conflicts more readable
|
||||
merge.conflictstyle = "zdiff3";
|
||||
|
||||
rebase.autosquash = true;
|
||||
rebase.autostash = true;
|
||||
|
||||
# Consider https://jvns.ca/blog/2024/02/16/popular-git-config-options/#push-default-simple-push-default-current-push-autosetupremote-true
|
||||
|
||||
# Add whole commit diff in text editor when writing commit message
|
||||
#commit.verbose = true;
|
||||
|
||||
# Remember how merge conflicts were resolved to restore later
|
||||
rerere.enabled = true;
|
||||
|
||||
# Better diffs
|
||||
diff.algorithm = "histogram";
|
||||
|
||||
status.submoduleSummary = true;
|
||||
diff.submodule = "log";
|
||||
submodule.recurse = true;
|
||||
|
||||
merge.keepbackup = false;
|
||||
#merge.tool = "${pkgs.meld}/bin/meld";
|
||||
};
|
||||
};
|
||||
|
||||
# programs.ssh
|
||||
programs.ssh = {
|
||||
enable = true;
|
||||
addKeysToAgent = "1h";
|
||||
};
|
||||
services.ssh-agent.enable = true;
|
||||
|
||||
programs.yt-dlp.enable = true;
|
||||
|
||||
# This value determines the Home Manager release that your
|
||||
# configuration is compatible with. This helps avoid breakage
|
||||
# when a new Home Manager release introduces backwards
|
||||
# incompatible changes.
|
||||
#
|
||||
# You can update Home Manager without changing this value. See
|
||||
# the Home Manager release notes for a list of state version
|
||||
# changes in each release.
|
||||
home.stateVersion = "23.11";
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
#programs.home-manager.enable = true;
|
||||
}
|
30
home/desktop.nix
Normal file
30
home/desktop.nix
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
config,
|
||||
options,
|
||||
lib,
|
||||
pkgs,
|
||||
inputs,
|
||||
osConfig,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./desktop/shared/wayland.nix
|
||||
./desktop/hyprland.nix
|
||||
./desktop/plasma.nix
|
||||
];
|
||||
|
||||
# my.desktop.hyprland.enable = true;
|
||||
my.desktop.plasma.enable = true;
|
||||
|
||||
programs.foot = {
|
||||
enable = true;
|
||||
settings.main = {
|
||||
shell = "fish";
|
||||
font = "monospace:size=10";
|
||||
app-id = "foot";
|
||||
pad = "10x8 center";
|
||||
};
|
||||
settings.url.osc8-underline = "always";
|
||||
settings.cursor.style = "beam";
|
||||
};
|
||||
}
|
172
home/desktop/hyprland.nix
Normal file
172
home/desktop/hyprland.nix
Normal file
|
@ -0,0 +1,172 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
options,
|
||||
inputs,
|
||||
osConfig,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
inputs.ags.homeManagerModules.default
|
||||
inputs.anyrun.homeManagerModules.default
|
||||
];
|
||||
|
||||
options.my.desktop.hyprland.enable = lib.mkEnableOption "my Hyprland based desktop environment";
|
||||
|
||||
config = lib.mkIf config.my.desktop.hyprland.enable {
|
||||
my.desktop.wayland = true;
|
||||
|
||||
wayland.windowManager.hyprland = {
|
||||
enable = true;
|
||||
package = osConfig.programs.hyprland.package;
|
||||
extraConfig = ''
|
||||
source=${./hyprland}/hyprland.conf
|
||||
'';
|
||||
systemd.variables = options.wayland.windowManager.hyprland.systemd.variables.default ++ ["XDG_SESSION_TYPE"];
|
||||
};
|
||||
|
||||
services.cliphist = {
|
||||
enable = true;
|
||||
systemdTarget = "hyprland-session.target"; # defaults to graphical-session.target
|
||||
};
|
||||
|
||||
systemd.user.targets.hyprland-session.Unit.Wants = ["plasma-polkit-agent.service"];
|
||||
|
||||
programs.ags = {
|
||||
enable = true;
|
||||
configDir = ./ags;
|
||||
};
|
||||
systemd.user.services.ags = {
|
||||
Unit.Description = "Aylur's Gtk Shell";
|
||||
Unit.PartOf = ["hyprland-session.target"];
|
||||
Install.WantedBy = ["hyprland-session.target"];
|
||||
Service = let
|
||||
app = pkgs.writeShellApplication {
|
||||
name = "ags-wrapped";
|
||||
runtimeInputs = [config.programs.ags.package pkgs.coreutils];
|
||||
text = ''ags "$@"'';
|
||||
};
|
||||
in {
|
||||
# Service = {
|
||||
BusName = "com.github.Aylur.ags.ags";
|
||||
# ExecStart = "${config.programs.ags.package}/bin/ags --config ${config.programs.ags.configDir}/config.js";
|
||||
ExecStart = "${app}/bin/ags-wrapped --config ${config.programs.ags.configDir}/config.js";
|
||||
OOMScoreAdjust = -500;
|
||||
};
|
||||
# TODO: reloadTriggers?
|
||||
# restartTriggers = [ config.programs.ags.configDir ];
|
||||
};
|
||||
|
||||
programs.anyrun = {
|
||||
enable = true;
|
||||
config.plugins = with inputs.anyrun.packages.${pkgs.stdenv.hostPlatform.system}; [
|
||||
applications
|
||||
dictionary
|
||||
# kidex
|
||||
randr
|
||||
rink
|
||||
shell
|
||||
# stdin
|
||||
symbols
|
||||
# translate
|
||||
# websearch
|
||||
];
|
||||
};
|
||||
|
||||
programs.swaylock = {
|
||||
enable = true;
|
||||
settings = {
|
||||
color = "808080";
|
||||
font-size = 24;
|
||||
indicator-idle-visible = false;
|
||||
indicator-radius = 100;
|
||||
line-color = "ffffff";
|
||||
show-failed-attempts = true;
|
||||
};
|
||||
};
|
||||
|
||||
services.swayidle = let
|
||||
swaylock = "${config.programs.swaylock.package}/bin/swaylock";
|
||||
hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl";
|
||||
in {
|
||||
enable = true;
|
||||
systemdTarget = "hyprland-session.target"; # defaults to graphical-session.target
|
||||
extraArgs = [
|
||||
"-w" # Wait for command to finish executing before continuing
|
||||
"idlehint"
|
||||
"300"
|
||||
];
|
||||
events = [
|
||||
{
|
||||
event = "before-sleep";
|
||||
command = "${swaylock} -f";
|
||||
}
|
||||
# after-resume
|
||||
{
|
||||
event = "lock";
|
||||
command = "${swaylock} -f";
|
||||
}
|
||||
{
|
||||
event = "unlock";
|
||||
command = "kill -s USR1 swaylock";
|
||||
}
|
||||
];
|
||||
timeouts = [
|
||||
{
|
||||
timeout = 300;
|
||||
command = "${swaylock} -f";
|
||||
} # 300
|
||||
{
|
||||
timeout = 600;
|
||||
command = "${hyprctl} dispatch dpms off";
|
||||
resumeCommand = "${hyprctl} dispatch dpms on";
|
||||
}
|
||||
# { timeout = 900; command = "${pkgs.systemd}/bin/systemctl suspend"; }
|
||||
];
|
||||
};
|
||||
# TDOD: replace with ags
|
||||
services.swayosd.enable = true;
|
||||
|
||||
services.udiskie.enable = osConfig.services.udisks2.enable;
|
||||
|
||||
systemd.user.services.swww = {
|
||||
Unit.Description = "Animated wallpaper daemon for wayland";
|
||||
Unit.Documentation = ["man:swww(1)"];
|
||||
Unit.PartOf = ["hyprland-session.target"];
|
||||
Install.WantedBy = ["hyprland-session.target"];
|
||||
# Service.ExecStart = "${pkgs.swww}/bin/swww init --no-daemon";
|
||||
Service.ExecStart = let
|
||||
app = pkgs.writeShellApplication {
|
||||
name = "swww-wrapped";
|
||||
runtimeInputs = [pkgs.swww];
|
||||
text = ''
|
||||
swww init --no-daemon
|
||||
'';
|
||||
};
|
||||
in "${app}/bin/swww-wrapped";
|
||||
};
|
||||
|
||||
systemd.user.services.wayvnc = {
|
||||
Unit.Description = "Wayland VNC server";
|
||||
Unit.PartOf = ["graphical-session.target"];
|
||||
Service.ExecStart = "${pkgs.wayvnc}/bin/wayvnc";
|
||||
};
|
||||
|
||||
# Not sure if this should be per desktop
|
||||
services.mpris-proxy.enable = true;
|
||||
|
||||
programs.foot.settings.colors.alpha = 0.6;
|
||||
|
||||
home.packages = [
|
||||
pkgs.swww
|
||||
pkgs.wofi
|
||||
pkgs.polkit-kde-agent
|
||||
pkgs.libsForQt5.qtwayland
|
||||
pkgs.qt6Packages.qtwayland
|
||||
pkgs.grimblast # screenshots on hyprland
|
||||
pkgs.gnome.gnome-system-monitor
|
||||
pkgs.gnome.nautilus
|
||||
];
|
||||
};
|
||||
}
|
28
home/desktop/plasma.nix
Normal file
28
home/desktop/plasma.nix
Normal file
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
polonium = pkgs.callPackage ../../pkgs/polonium.nix {};
|
||||
in {
|
||||
options.my.desktop.plasma.enable = lib.mkEnableOption "my Plasma based desktop environment";
|
||||
|
||||
config = lib.mkIf config.my.desktop.plasma.enable {
|
||||
my.desktop.wayland = true;
|
||||
|
||||
home.packages = [
|
||||
polonium
|
||||
];
|
||||
|
||||
programs.firefox.policies.ExtensionSettings = let
|
||||
extension = shortId: {
|
||||
install_url = "https://addons.mozilla.org/en-US/firefox/downloads/latest/${shortId}/latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
in
|
||||
builtins.mapAttrs (_: extension) {
|
||||
"plasma-browser-integration@kde.org" = "plasma-integration";
|
||||
};
|
||||
};
|
||||
}
|
18
home/desktop/shared/wayland.nix
Normal file
18
home/desktop/shared/wayland.nix
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
variables = {
|
||||
NIXOS_OZONE_WL = "1";
|
||||
STEAM_FORCE_DESKTOPUI_SCALING = "1.5";
|
||||
};
|
||||
in {
|
||||
options.my.desktop.wayland = lib.mkEnableOption "my Wayland options";
|
||||
|
||||
config = lib.mkIf config.my.desktop.wayland {
|
||||
home.sessionVariables = variables;
|
||||
systemd.user.sessionVariables = variables;
|
||||
};
|
||||
}
|
119
home/terminal.nix
Normal file
119
home/terminal.nix
Normal file
|
@ -0,0 +1,119 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
inputs,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
inputs.nix-index-database.hmModules.nix-index
|
||||
];
|
||||
|
||||
home.packages = [
|
||||
pkgs.file
|
||||
pkgs.pciutils # lspci
|
||||
pkgs.usbutils # lsusb
|
||||
|
||||
pkgs.bottom
|
||||
pkgs.htop
|
||||
pkgs.lsof
|
||||
pkgs.lm_sensors
|
||||
pkgs.amdgpu_top
|
||||
#pkgs.rocmPackages.rocm-smi
|
||||
pkgs.ryzenadj
|
||||
pkgs.powertop
|
||||
pkgs.procs
|
||||
|
||||
pkgs.sshfs
|
||||
|
||||
pkgs.fd
|
||||
pkgs.libqalculate
|
||||
# pkgs.havn # port scanner
|
||||
pkgs.gdu # count code
|
||||
pkgs.tokei # count code
|
||||
pkgs.ov # pager
|
||||
pkgs.zoxide # cd
|
||||
pkgs.dua
|
||||
|
||||
pkgs.unzip
|
||||
pkgs.unrar-wrapper
|
||||
pkgs.p7zip
|
||||
pkgs.atool
|
||||
|
||||
pkgs.fastfetch
|
||||
pkgs.hyfetch
|
||||
|
||||
pkgs.helix # `hx` editor
|
||||
pkgs.jujutsu # `jj` vcs
|
||||
];
|
||||
|
||||
programs.atuin = {
|
||||
enable = true;
|
||||
settings.update_check = false;
|
||||
settings.enter_accept = true;
|
||||
};
|
||||
|
||||
programs.autojump.enable = true;
|
||||
|
||||
programs.bat.enable = true;
|
||||
|
||||
# maybe move boxxy here?
|
||||
|
||||
programs.broot.enable = true;
|
||||
|
||||
programs.direnv = {
|
||||
enable = true;
|
||||
nix-direnv.enable = true;
|
||||
# Externally located cache
|
||||
stdlib = ''
|
||||
declare -A direnv_layout_dirs
|
||||
direnv_layout_dir() {
|
||||
local hash path
|
||||
echo "''${direnv_layout_dirs[$PWD]:=$(
|
||||
hash="$(sha1sum - <<< "$PWD" | head -c40)"
|
||||
path="''${PWD//[^a-zA-Z0-9]/-}"
|
||||
echo "${config.xdg.cacheHome}/direnv/layouts/''${hash}''${path}"
|
||||
)}"
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
programs.eza = {
|
||||
enable = true;
|
||||
git = true;
|
||||
icons = "auto";
|
||||
};
|
||||
|
||||
programs.fish = {
|
||||
enable = true;
|
||||
functions = {
|
||||
#__fish_command_not_found_handler = {
|
||||
# body = "__fish_default_command_not_found_handler $argv[1]";
|
||||
# onEvent = "fish_command_not_found";
|
||||
#};
|
||||
};
|
||||
shellInit = "set fish_greeting";
|
||||
};
|
||||
|
||||
# maybe move git here?
|
||||
|
||||
programs.jq.enable = true;
|
||||
|
||||
programs.nix-index.enable = true;
|
||||
programs.nix-index-database.comma.enable = true;
|
||||
|
||||
programs.ripgrep.enable = true;
|
||||
|
||||
programs.skim.enable = true;
|
||||
|
||||
programs.starship = {
|
||||
enable = true;
|
||||
enableTransience = true;
|
||||
settings.nix_shell.format = "❄️️";
|
||||
};
|
||||
|
||||
# programs.yazi = {
|
||||
# enable = true;
|
||||
# settings.preview.cache_dir = "${config.xdg.cacheHome}/thumbnails/yazi";
|
||||
# };
|
||||
}
|
31
home/xdg.nix
Normal file
31
home/xdg.nix
Normal file
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
inherit (config.xdg) stateHome dataHome configHome cacheHome;
|
||||
variables = {
|
||||
# Bash (.bash_history)
|
||||
HISTFILE = "${stateHome}/bash/history";
|
||||
|
||||
# Rust (.cargo)
|
||||
CARGO_HOME = "${dataHome}/cargo";
|
||||
RUSTUP_HOME = "${dataHome}/rustup";
|
||||
|
||||
# GTK2 (.gtkrc-2.0)
|
||||
GTK2_RC_FILES = "${configHome}/gtk-2.0/gtkrc";
|
||||
|
||||
# XCompose (.compose-cache)
|
||||
XCOMPOSECACHE = "${cacheHome}/X11/xcompose";
|
||||
|
||||
# NuGet (.nuget/packages)
|
||||
NUGET_PACKAGES = "${dataHome}/NuGetPackages";
|
||||
};
|
||||
in {
|
||||
home.sessionVariables = variables;
|
||||
systemd.user.sessionVariables = variables;
|
||||
|
||||
# Run `xdg-ninja` to check fixable dotfiles
|
||||
home.packages = [pkgs.xdg-ninja];
|
||||
}
|
37
nixos/audio/pipewire-low-latency.nix
Normal file
37
nixos/audio/pipewire-low-latency.nix
Normal file
|
@ -0,0 +1,37 @@
|
|||
{config, ...}: {
|
||||
assertions = [
|
||||
{
|
||||
assertion = config.services.pipewire.enable;
|
||||
message = "PipeWire must be enabled for low-latency PipeWire";
|
||||
}
|
||||
];
|
||||
|
||||
services.pipewire.extraConfig = {
|
||||
pipewire."92-low-latency" = {
|
||||
context.properties = {
|
||||
default.clock.rate = 48000;
|
||||
default.clock.quantum = 32;
|
||||
default.clock.min-quantum = 32;
|
||||
default.clock.max-quantum = 32;
|
||||
};
|
||||
};
|
||||
pipewire-pulse."92-low-latency" = {
|
||||
context.modules = [
|
||||
{
|
||||
name = "libpipewire-module-protocol-pulse";
|
||||
args = {
|
||||
pulse.min.req = "32/48000";
|
||||
pulse.default.req = "32/48000";
|
||||
pulse.max.req = "32/48000";
|
||||
pulse.min.quantum = "32/48000";
|
||||
pulse.max.quantum = "32/48000";
|
||||
};
|
||||
}
|
||||
];
|
||||
stream.properties = {
|
||||
node.latency = "32/48000";
|
||||
resample.quality = 1;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
17
nixos/audio/pipewire.nix
Normal file
17
nixos/audio/pipewire.nix
Normal file
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
security.rtkit.enable = true;
|
||||
services.pipewire = {
|
||||
enable = true;
|
||||
alsa = {
|
||||
enable = true;
|
||||
support32Bit = true;
|
||||
};
|
||||
pulse.enable = true;
|
||||
jack.enable = true;
|
||||
};
|
||||
}
|
52
nixos/common/flake-support.nix
Normal file
52
nixos/common/flake-support.nix
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Configuration for any flake-based NixOS system
|
||||
# Try our darndest to get nixpkgs into path & registry properly
|
||||
#
|
||||
# Maybe write a blog post about it?
|
||||
#
|
||||
# In theory NixOS 24.05 does this for us?
|
||||
# > On flake-based NixOS configurations using nixpkgs.lib.nixosSystem, NixOS will automatically set NIX_PATH and the system-wide flake registry (/etc/nix/registry.json) to point <nixpkgs> and the unqualified flake path nixpkgs to the version of nixpkgs used to build the system.
|
||||
# > This makes nix run nixpkgs#hello and nix-build '<nixpkgs>' -A hello work out of the box with no added configuration, reusing dependencies already on the system.
|
||||
# > This may be undesirable if nix commands are not going to be run on the built system since it adds nixpkgs to the system closure. For such closure-size-constrained non-interactive systems, this setting should be disabled.
|
||||
# > To disable this, set nixpkgs.flake.setNixPath and nixpkgs.flake.setFlakeRegistry to false.
|
||||
# https://nixos.org/manual/nixos/unstable/release-notes#sec-release-24.05-highlights
|
||||
#
|
||||
# Some reading:
|
||||
# https://nixos-and-flakes.thiscute.world/best-practices/nix-path-and-flake-registry#custom-nix-path-and-flake-registry-1
|
||||
# https://github.com/NixOS/nix/issues/9574
|
||||
#
|
||||
# https://discourse.nixos.org/t/questions-on-using-nixos-desktop-with-flakes/16285/5
|
||||
#
|
||||
# I think there are two separate problems.
|
||||
#
|
||||
# # Getting lookup paths (like <nixpkgs>) to resolve
|
||||
#
|
||||
# This comment mentions how they work:
|
||||
# https://discourse.nixos.org/t/nix-path-is-not-recognized/38404/6
|
||||
#
|
||||
# # Getting `indirect` flake refs (like "nixpkgs") to resolve
|
||||
# · indirect: Indirections through the flake registry. These have the form
|
||||
#
|
||||
# | [flake:]<flake-id>(/<rev-or-ref>(/rev)?)?
|
||||
#
|
||||
# These perform a lookup of <flake-id> in the flake registry. For example, nixpkgs and nixpkgs/release-20.09 are indirect flake references. The specified rev and/or ref are merged with the entry in
|
||||
# the registry; see nix registry for details.
|
||||
{
|
||||
inputs,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
inherit (inputs) nixpkgs;
|
||||
in {
|
||||
# Enable flake features
|
||||
nix.settings.experimental-features = ["nix-command" "flakes"];
|
||||
nix.channel.enable = false; # remove nix-channel related tools & configs, we use flakes instead.
|
||||
|
||||
programs.command-not-found.enable = false; # Doesn't work well past channels
|
||||
|
||||
nix.registry.nixpkgs.flake = nixpkgs;
|
||||
# but NIX_PATH is still used by many useful tools, so we set it to the same value as the one used by this flake.
|
||||
# Make `nix repl '<nixpkgs>'` use the same nixpkgs as the one used by this flake.
|
||||
environment.etc."nix/inputs/nixpkgs".source = "${nixpkgs}";
|
||||
# https://github.com/NixOS/nix/issues/9574
|
||||
nix.settings.nix-path = lib.mkForce "nixpkgs=/etc/nix/inputs/nixpkgs";
|
||||
}
|
167
nixos/default.nix
Normal file
167
nixos/default.nix
Normal file
|
@ -0,0 +1,167 @@
|
|||
{
|
||||
config,
|
||||
options,
|
||||
lib,
|
||||
pkgs,
|
||||
inputs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
inputs.disko.nixosModules.disko
|
||||
|
||||
./device.nix
|
||||
./disk-config.nix
|
||||
./hardware-configuration.nix
|
||||
./audio/pipewire.nix
|
||||
./impermanence.nix
|
||||
./nix-maintenance.nix
|
||||
# ./hardening.nix
|
||||
|
||||
./desktop/plasma
|
||||
./tailscale.nix
|
||||
|
||||
./users.nix
|
||||
./user-system-config.nix
|
||||
];
|
||||
|
||||
# Allows referring to this flake by the shorthand `nixos-config`, which lets you do e.g.
|
||||
# nix repl nixos-config
|
||||
nix.registry.nixos-config.to = {
|
||||
type = "git";
|
||||
url = "file://${config.users.users.evar.home}/dev/nix/config";
|
||||
};
|
||||
|
||||
# In order to catch all logs, we need to mount this early enough in the boot process.
|
||||
fileSystems."/var/log".neededForBoot = true;
|
||||
|
||||
zramSwap = {
|
||||
enable = true;
|
||||
memoryPercent = 25;
|
||||
};
|
||||
|
||||
# This is not ideal for a laptop.
|
||||
# For solution watch https://github.com/nix-community/impermanence/issues/153
|
||||
time.timeZone = "America/New_York";
|
||||
|
||||
nix.settings = {
|
||||
# unclutters home folder
|
||||
use-xdg-base-directories = true;
|
||||
|
||||
# adding a community binary cache
|
||||
substituters = [
|
||||
"https://nix-community.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||
];
|
||||
};
|
||||
|
||||
nixpkgs.config.allowUnfreePredicate = pkg:
|
||||
builtins.elem (lib.getName pkg)
|
||||
[
|
||||
"steam"
|
||||
# "steam-original"
|
||||
# "steam-run"
|
||||
"steam-unwrapped"
|
||||
"obsidian"
|
||||
"rider"
|
||||
"rust-rover"
|
||||
"spotify"
|
||||
];
|
||||
|
||||
# basically agrees to some license stuff
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
|
||||
### Boot
|
||||
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
|
||||
boot.initrd.systemd.enable = true;
|
||||
|
||||
### Session management
|
||||
|
||||
services.displayManager.autoLogin = {
|
||||
# only if there's any encripted disks
|
||||
enable = config.boot.initrd.luks.devices != {};
|
||||
user = "evar";
|
||||
};
|
||||
|
||||
### Networking
|
||||
|
||||
networking.networkmanager = {
|
||||
enable = true;
|
||||
# Per https://kokada.dev/blog/an-unordered-list-of-hidden-gems-inside-nixos/
|
||||
# May improve reliability
|
||||
wifi.backend = "iwd";
|
||||
};
|
||||
services.openssh.enable = true;
|
||||
|
||||
### System software
|
||||
|
||||
environment.systemPackages = [
|
||||
pkgs.git
|
||||
pkgs.gdu
|
||||
|
||||
pkgs.exfatprogs # for mkfs.exfat
|
||||
pkgs.parted # for partprobe
|
||||
|
||||
pkgs.gparted
|
||||
|
||||
# For thinkorswim
|
||||
# TODO: Should be elsewhere
|
||||
pkgs.distrobox
|
||||
];
|
||||
|
||||
virtualisation.podman = {
|
||||
enable = true;
|
||||
dockerCompat = true;
|
||||
};
|
||||
|
||||
programs.adb.enable = true;
|
||||
|
||||
# Miscellaneous
|
||||
|
||||
# helps some things access battery info
|
||||
services.upower.enable = true;
|
||||
# dynamic mounting of connected devices
|
||||
services.udisks2.enable = true;
|
||||
services.printing.enable = true;
|
||||
# service discovery, hostname lookups, etc.
|
||||
services.avahi = {
|
||||
enable = true;
|
||||
nssmdns4 = true;
|
||||
openFirewall = true;
|
||||
};
|
||||
# For the music server
|
||||
networking.firewall.allowedUDPPorts = [
|
||||
# DLNA discovery (SSDP)
|
||||
1900
|
||||
];
|
||||
|
||||
hardware.bluetooth = {
|
||||
powerOnBoot = true;
|
||||
settings.General.Experimental = "true";
|
||||
};
|
||||
# allows connecting to virtualized directories
|
||||
services.gvfs.enable = true;
|
||||
|
||||
# This option defines the first version of NixOS you have installed on this particular machine,
|
||||
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
|
||||
#
|
||||
# Most users should NEVER change this value after the initial install, for any reason,
|
||||
# even if you've upgraded your system to a new NixOS release.
|
||||
#
|
||||
# This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
|
||||
# so changing it will NOT upgrade your system.
|
||||
#
|
||||
# This value being lower than the current NixOS release does NOT mean your system is
|
||||
# out of date, out of support, or vulnerable.
|
||||
#
|
||||
# Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
|
||||
# and migrated your data accordingly.
|
||||
#
|
||||
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
|
||||
system.stateVersion = "23.11"; # Did you read the comment?
|
||||
}
|
45
nixos/desktop/gnome/default.nix
Normal file
45
nixos/desktop/gnome/default.nix
Normal file
|
@ -0,0 +1,45 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
inputs,
|
||||
...
|
||||
}: {
|
||||
services.xserver.enable = true;
|
||||
# services.xserver.displayManager.defaultSession = "gnome";
|
||||
# https://github.com/NixOS/nixpkgs/issues/103746#issuecomment-945091229
|
||||
systemd.services."getty@tty1".enable = false;
|
||||
systemd.services."autovt@tty1".enable = false;
|
||||
services.xserver.displayManager.gdm.enable = true;
|
||||
services.xserver.desktopManager.gnome.enable = true;
|
||||
hardware.pulseaudio.enable = false;
|
||||
# xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
|
||||
environment.systemPackages = [
|
||||
pkgs.gnomeExtensions.appindicator
|
||||
pkgs.gnomeExtensions.dash-to-dock
|
||||
pkgs.gnomeExtensions.dash-to-panel
|
||||
pkgs.mission-center
|
||||
pkgs.gnome.nautilus
|
||||
];
|
||||
environment.gnome.excludePackages = [
|
||||
pkgs.gnome-tour
|
||||
pkgs.gnome.cheese # Camera
|
||||
pkgs.gnome.gnome-system-monitor
|
||||
#pkgs.gnome.gnome-music
|
||||
pkgs.gnome.gnome-terminal # Console
|
||||
pkgs.gnome.gnome-contacts
|
||||
pkgs.gedit # Text Editor
|
||||
pkgs.gnome.epiphany # Web
|
||||
pkgs.gnome.geary
|
||||
pkgs.gnome.totem # Videos
|
||||
];
|
||||
services.udev.packages = [
|
||||
pkgs.gnome.gnome-settings-daemon
|
||||
];
|
||||
|
||||
services.xserver.desktopManager.gnome.extraGSettingsOverrides = ''
|
||||
[org.gnome.mutter]
|
||||
experimental-features=['scale-monitor-framebuffer']
|
||||
'';
|
||||
services.xserver.desktopManager.gnome.extraGSettingsOverridePackages = [pkgs.gnome.mutter];
|
||||
}
|
35
nixos/desktop/hypr/default.nix
Normal file
35
nixos/desktop/hypr/default.nix
Normal file
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
inputs,
|
||||
...
|
||||
}: {
|
||||
nix.settings = {
|
||||
builders-use-substitutes = true; # unknown, suggested by anyrun
|
||||
substituters = [
|
||||
"https://hyprland.cachix.org"
|
||||
"https://anyrun.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
|
||||
"anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s="
|
||||
];
|
||||
};
|
||||
|
||||
services.xserver.enable = true;
|
||||
services.xserver.displayManager.defaultSession = "hyprland";
|
||||
# https://github.com/NixOS/nixpkgs/issues/103746#issuecomment-945091229
|
||||
systemd.services."getty@tty1".enable = false;
|
||||
systemd.services."autovt@tty1".enable = false;
|
||||
services.xserver.displayManager.gdm.enable = true;
|
||||
security.pam.services.swaylock = {};
|
||||
|
||||
programs.hyprland = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
xdg.portal.extraPortals = [pkgs.xdg-desktop-portal-gtk];
|
||||
|
||||
services.blueman.enable = true;
|
||||
}
|
20
nixos/desktop/plasma/default.nix
Normal file
20
nixos/desktop/plasma/default.nix
Normal file
|
@ -0,0 +1,20 @@
|
|||
{config, lib, pkgs, ...}:
|
||||
let
|
||||
autologin = config.services.displayManager.autoLogin.enable;
|
||||
in
|
||||
{
|
||||
services.displayManager.sddm.enable = true;
|
||||
services.displayManager.sddm.wayland.enable = true;
|
||||
services.desktopManager.plasma6.enable = true;
|
||||
|
||||
programs.dconf.enable = true;
|
||||
|
||||
# The user is expected to have Emacs instead
|
||||
environment.plasma6.excludePackages = with pkgs.kdePackages; [
|
||||
elisa
|
||||
];
|
||||
|
||||
# https://github.com/NixOS/nixpkgs/issues/103746#issuecomment-2495681146
|
||||
systemd.services."getty@tty1".enable = lib.mkIf autologin false;
|
||||
systemd.services."autovt@tty1".enable = lib.mkIf autologin false;
|
||||
}
|
62
nixos/device.nix
Normal file
62
nixos/device.nix
Normal file
|
@ -0,0 +1,62 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
inputs,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
inputs.nixos-hardware.nixosModules.framework-16-7040-amd
|
||||
];
|
||||
|
||||
# Set the Wireless Regulatory Domain
|
||||
# https://github.com/NixOS/nixpkgs/issues/25378
|
||||
boot.extraModprobeConfig = ''
|
||||
options cfg80211 ieee80211_regdom="US"
|
||||
'';
|
||||
|
||||
services.fwupd.enable = true;
|
||||
|
||||
hardware.bluetooth.enable = true;
|
||||
|
||||
boot.kernelPackages =
|
||||
lib.mkIf
|
||||
(lib.versionOlder pkgs.linux.version "6.9")
|
||||
pkgs.linuxPackages_latest;
|
||||
|
||||
# Not needed on NixOS 24.05+
|
||||
# Disable pcr for linux kernel testing 6.9-rc4+
|
||||
# Per https://community.frame.work/t/tracking-framework-16-linux-6-9-0-rc4-rc5-extreme-screen-flickering-anyone-else/49467/44
|
||||
boot.kernelParams = let
|
||||
affectedVersions = ["6.9-rc4" "6.9-rc5" "6.9-rc6"];
|
||||
version = config.boot.kernelPackages.kernel.version;
|
||||
affected = builtins.elem version affectedVersions;
|
||||
in
|
||||
lib.mkIf affected ["amdgpu.dcdebugmask=0x400"];
|
||||
|
||||
environment.systemPackages = lib.mkMerge [
|
||||
(with pkgs; [
|
||||
fw-ectool
|
||||
framework-tool
|
||||
])
|
||||
# Show EasyEffects status in GNOME
|
||||
(lib.mkIf config.services.xserver.desktopManager.gnome.enable [
|
||||
pkgs.gnomeExtensions.easyeffects-preset-selector
|
||||
])
|
||||
];
|
||||
|
||||
# The FWL benefits from modifying its speakers
|
||||
home-manager.sharedModules = [
|
||||
{
|
||||
services.easyeffects.enable = true;
|
||||
}
|
||||
];
|
||||
# EasyEffects needs this
|
||||
programs.dconf.enable = true;
|
||||
|
||||
# RGB LED Matrix
|
||||
services.hardware.openrgb = {
|
||||
enable = true;
|
||||
package = pkgs.openrgb-with-all-plugins;
|
||||
};
|
||||
}
|
69
nixos/disk-config.nix
Normal file
69
nixos/disk-config.nix
Normal file
|
@ -0,0 +1,69 @@
|
|||
{
|
||||
# checkout the example folder for how to configure different disko layouts
|
||||
disko.devices = {
|
||||
disk.fw16-2280 = {
|
||||
device = "/dev/disk/by-path/pci-0000:05:00.0-nvme-1";
|
||||
content = {
|
||||
type = "gpt";
|
||||
partitions = {
|
||||
esp = {
|
||||
size = "2G";
|
||||
type = "EF00";
|
||||
content = {
|
||||
type = "filesystem";
|
||||
format = "vfat";
|
||||
mountpoint = "/boot";
|
||||
mountOptions = ["noatime" "fmask=0077" "dmask=0077"];
|
||||
};
|
||||
};
|
||||
cryptall = {
|
||||
size = "100%";
|
||||
content = {
|
||||
type = "luks";
|
||||
name = "all";
|
||||
settings = {
|
||||
# allowDiscards = true;
|
||||
# keyFile = "/tmp/secret.key";
|
||||
};
|
||||
content = {
|
||||
type = "btrfs";
|
||||
extraArgs = ["-f"];
|
||||
subvolumes = {
|
||||
# System state which should be persistent across reboots and possibly backed up.
|
||||
"/@nixos-persist" = {
|
||||
mountpoint = "/persist";
|
||||
mountOptions = ["noatime" "compress=zstd"];
|
||||
};
|
||||
# I’m not so interested in backing up logs but I want them to be preserved across reboots,
|
||||
# so I’m dedicating a subvolume to logs rather than using the persist subvolume.
|
||||
"/@nixos-varlog" = {
|
||||
mountpoint = "/var/log";
|
||||
mountOptions = ["noatime" "compress=zstd"];
|
||||
};
|
||||
# Needs to be persistent but is not worth backing up, as it’s trivial to reconstruct.
|
||||
"/@nixos-nix" = {
|
||||
mountpoint = "/nix";
|
||||
mountOptions = ["noatime" "compress=zstd"];
|
||||
};
|
||||
|
||||
"/@data" = {
|
||||
mountpoint = "/data";
|
||||
mountOptions = ["noatime" "compress=zstd"];
|
||||
};
|
||||
"/@home-evar" = {
|
||||
mountpoint = "/home/evar";
|
||||
mountOptions = ["noatime" "compress=zstd"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
nodev."/" = {
|
||||
fsType = "tmpfs";
|
||||
mountOptions = ["size=25%" "mode=755"];
|
||||
};
|
||||
};
|
||||
}
|
23
nixos/hardening.nix
Normal file
23
nixos/hardening.nix
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
nix.settings.allowed-users = ["@wheel"];
|
||||
security.sudo.execWheelOnly = true;
|
||||
services.openssh = {
|
||||
allowSFTP = false;
|
||||
settings = {
|
||||
ChallengeResponseAuthentication = false;
|
||||
PasswordAuthentication = false;
|
||||
};
|
||||
extraConfig = ''
|
||||
AllowTcpForwarding yes
|
||||
X11Forwarding no
|
||||
AllowAgentForwarding no
|
||||
AllowStreamLocalForwarding no
|
||||
AuthenticationMethods publickey
|
||||
'';
|
||||
};
|
||||
}
|
26
nixos/hardware-configuration.nix
Normal file
26
nixos/hardware-configuration.nix
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usbhid" "usb_storage" "sd_mod" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ "kvm-amd" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp196s0f3u2u3.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.wlp4s0.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
52
nixos/impermanence.nix
Normal file
52
nixos/impermanence.nix
Normal file
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
inputs,
|
||||
options,
|
||||
...
|
||||
}: {
|
||||
imports = [inputs.impermanence.nixosModules.impermanence];
|
||||
|
||||
# There are bind mounts into here that are important for boot.
|
||||
fileSystems."/persist".neededForBoot = true;
|
||||
|
||||
environment.persistence."/persist" = {
|
||||
hideMounts = true;
|
||||
directories = [
|
||||
"/var/lib/nixos"
|
||||
"/var/lib/bluetooth"
|
||||
"/var/lib/fprint"
|
||||
"/var/lib/upower"
|
||||
"/var/lib/tailscale"
|
||||
"/var/lib/systemd/coredump"
|
||||
"/etc/NetworkManager/system-connections"
|
||||
"/var/lib/iwd" # Known networks and keys
|
||||
{
|
||||
directory = "/var/lib/colord";
|
||||
user = "colord";
|
||||
group = "colord";
|
||||
mode = "u=rwx,g=rx,o=";
|
||||
}
|
||||
# TODO: cups?
|
||||
];
|
||||
files = [
|
||||
"/etc/machine-id"
|
||||
#{ file = "/var/keys/secret_file"; parentDirectory = { mode = "u=rwx,g=,o="; }; }
|
||||
"/var/lib/NetworkManager/secret_key"
|
||||
"/var/lib/NetworkManager/seen-bssids"
|
||||
"/var/lib/NetworkManager/timestamps"
|
||||
];
|
||||
};
|
||||
|
||||
# /etc/{passwd,shadow} are not persisted
|
||||
users.mutableUsers = false;
|
||||
|
||||
# Some report issues with impermanence file config for host keys, so just change their location
|
||||
services.openssh.hostKeys =
|
||||
builtins.map
|
||||
(x: x // {path = "/persist" + x.path;})
|
||||
options.services.openssh.hostKeys.default;
|
||||
|
||||
# sudo lecture db is not persisted, turn it off
|
||||
security.sudo.extraConfig = ''
|
||||
Defaults lecture = never
|
||||
'';
|
||||
}
|
14
nixos/nix-maintenance.nix
Normal file
14
nixos/nix-maintenance.nix
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
nix = {
|
||||
settings.auto-optimise-store = true;
|
||||
optimise = {
|
||||
automatic = true;
|
||||
dates = ["weekly"];
|
||||
};
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
options = "--delete-older-than 14d";
|
||||
};
|
||||
};
|
||||
}
|
14
nixos/tailscale.nix
Normal file
14
nixos/tailscale.nix
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
services.tailscale = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
};
|
||||
|
||||
# Implicitly trust packets routed over Tailscale
|
||||
networking.firewall.trustedInterfaces = [config.services.tailscale.interfaceName];
|
||||
}
|
54
nixos/user-system-config.nix
Normal file
54
nixos/user-system-config.nix
Normal file
|
@ -0,0 +1,54 @@
|
|||
# Configuration that really wants to be per-user,
|
||||
# but can't be defined from Home Manager.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
networking.firewall = lib.mkMerge [
|
||||
# User-mode Syncthing
|
||||
{
|
||||
allowedTCPPorts = [22000];
|
||||
allowedUDPPorts = [21027 22000];
|
||||
}
|
||||
|
||||
# LocalSend
|
||||
{allowedTCPPorts = [53317];}
|
||||
];
|
||||
|
||||
environment.systemPackages = lib.mkMerge [
|
||||
[pkgs.ryujinx]
|
||||
[
|
||||
(pkgs.lutris.override {
|
||||
extraLibraries = pkgs: [
|
||||
pkgs.libvdpau
|
||||
pkgs.openal
|
||||
pkgs.speex
|
||||
pkgs.libgudev
|
||||
];
|
||||
})
|
||||
pkgs.wineWowPackages.waylandFull
|
||||
]
|
||||
# For gamemode status in GNOME
|
||||
(lib.mkIf (config.services.xserver.desktopManager.gnome.enable) [
|
||||
pkgs.gnomeExtensions.gamemode-indicator-in-system-settings
|
||||
])
|
||||
];
|
||||
|
||||
programs.steam = {
|
||||
enable = true;
|
||||
remotePlay.openFirewall = true;
|
||||
gamescopeSession.enable = true;
|
||||
};
|
||||
programs.gamemode = {
|
||||
enable = true;
|
||||
enableRenice = true;
|
||||
settings = {
|
||||
general = {
|
||||
softrealtime = "auto";
|
||||
renice = 10;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
44
nixos/users.nix
Normal file
44
nixos/users.nix
Normal file
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
inputs,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
imports = [inputs.home-manager.nixosModules.home-manager];
|
||||
|
||||
home-manager = {
|
||||
useGlobalPkgs = true;
|
||||
useUserPackages = true;
|
||||
extraSpecialArgs = {inherit inputs;};
|
||||
};
|
||||
|
||||
# TODO: Remove
|
||||
# Allow root login with same password as primary user
|
||||
users.users.root.hashedPasswordFile = let
|
||||
primaryUser = "evar";
|
||||
in
|
||||
config.users.users.${primaryUser}.hashedPasswordFile;
|
||||
|
||||
users.users.evar = {
|
||||
hashedPassword = "$y$j9T$4TYc8brm3.oJUbkktbbEq/$cTlZRmAVxb2GtttEXSoSGw9y.qm.vUs/yXgwLjlTk46";
|
||||
uid = 1000;
|
||||
isNormalUser = true;
|
||||
extraGroups = [
|
||||
"wheel"
|
||||
"networkmanager"
|
||||
"video"
|
||||
"input"
|
||||
"audio"
|
||||
"adbusers"
|
||||
"uucp"
|
||||
"dialout"
|
||||
];
|
||||
# openssh.authorizedKeys.keys = [
|
||||
# "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINhBR2Kg0VR1+p9jNYmuaaGXTMjHwQSbvmzIjwhOOmNG emily@intras 2022-10-26"
|
||||
# ];
|
||||
};
|
||||
home-manager.users.evar = {
|
||||
imports = [../home];
|
||||
};
|
||||
}
|
60
pkgs/polonium.nix
Normal file
60
pkgs/polonium.nix
Normal file
|
@ -0,0 +1,60 @@
|
|||
# TODO: replace with nixpkgs version when it has one
|
||||
{
|
||||
lib,
|
||||
fetchFromGitHub,
|
||||
buildNpmPackage,
|
||||
plasma5Packages ? null,
|
||||
kdePackages ? null,
|
||||
}:
|
||||
# how to update:
|
||||
# 1. check out the tag for the version in question
|
||||
# 2. run `prefetch-npm-deps package-lock.json`
|
||||
# 3. update npmDepsHash with the output of the previous step
|
||||
let
|
||||
inherit (kdePackages) qtbase;
|
||||
in
|
||||
buildNpmPackage {
|
||||
name = "polonium-git";
|
||||
pname = "polonium";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "zeroxoneafour";
|
||||
repo = "polonium";
|
||||
rev = "83084c9f2bf44a22966c0534726498975183830e";
|
||||
hash = "sha256-kZMq4m4nACRelqgKsZVkmV9qqFw7dcMZHQF9dhdxCbQ=";
|
||||
};
|
||||
|
||||
npmDepsHash = "sha256-kaT3Uyq+/JkmebakG9xQuR4Kjo7vk6BzI1/LffOj/eo=";
|
||||
|
||||
# the installer does a bunch of stuff that fails in our sandbox, so just build here and then we
|
||||
# manually do the install
|
||||
postPatch = ''
|
||||
substituteInPlace Makefile \
|
||||
--replace-fail "build install cleanall" "res src"
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [
|
||||
kdePackages.kpackage
|
||||
];
|
||||
|
||||
dontNpmBuild = true;
|
||||
|
||||
dontWrapQtApps = true;
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
kpackagetool6 --install pkg --packageroot $out/share/kwin/scripts
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
env.LANG = "C.UTF-8";
|
||||
|
||||
meta = with lib; {
|
||||
description = "Auto-tiler that uses KWin 6+ tiling functionality";
|
||||
license = licenses.mit;
|
||||
maintainers = with maintainers; [peterhoeg];
|
||||
inherit (kdePackages.kpackage.meta) platforms;
|
||||
};
|
||||
}
|
13
systems/default.nix
Normal file
13
systems/default.nix
Normal file
|
@ -0,0 +1,13 @@
|
|||
{inputs, ...}: let
|
||||
inherit (inputs) nixpkgs;
|
||||
inherit (nixpkgs.lib) nixosSystem;
|
||||
in {
|
||||
flake.nixosConfigurations.atreus = nixosSystem {
|
||||
specialArgs = {inherit inputs;};
|
||||
modules = [
|
||||
{networking.hostName = "atreus";}
|
||||
../nixos/common/flake-support.nix
|
||||
../nixos
|
||||
];
|
||||
};
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue