diff --git a/.gitignore b/.gitignore index c2a2fda..43f7455 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ +secrets/ dotfiles/zsh/.zcompdump dotfiles/nvim/lazy-lock.json -result -keys.txt diff --git a/README.md b/README.md index 9d1e8d8..954af14 100644 --- a/README.md +++ b/README.md @@ -1,213 +1,83 @@ -# caenix +# nixos-system-config +My modular NixOS configuration. - - - - - - - - - -
- About - - Screenshot -
- This repository contains my personal NixOS configuration. - Feel free to do whatever with it. - - Screenshot of my desktop -
+## About +This is the NixOS configuration that I daily drive on my system. Feel free to use, +modify and share this configuration to your heart's content, no attribution required. + +## Screenshots +|KDE Plasma|Hyprland| +|---|---| +|![plasma screenshot](assets/screenshots/kde.png)|![hyprland screenshot](assets/screenshots/hyprland.png)| ## Layout ``` -. -├── .gitattributes -├── .gitignore -├── README.md -├── assets ; Binary assets such as screenshots and wallpapers -│ └── ... +├── assets ; Binary assets tracked in git +│   ├── screenshot.png +│   └── wallpaper.jpg +├── dotfiles ; Distro agnostic dotfiles +│   └── ... ; Stores configurations that do not depend on Nix ├── flake.lock -├── flake.nix -├── hosts ; Host configurations -│ ├── puter -│ │ ├── default.nix ; Host specific configuration options -│ │ ├── disko.nix ; Host specific partitioning layout -│ │ └── packages.nix ; Host specific package set -│ └── ... -├── install.sh -├── lib ; Custom helper functions -│ └── ... -├── modules ; Configuration modules -│ ├── home ; Home-manager modules -│ │ └── caem ; User home-manager modules -│ │ ├── default.nix ; User specific configuration options -│ │ ├── packages.nix ; User specific package set -│ │ └── ... -│ └── nixos ; NixOS modules -│ ├── user ; User definition -│ │ └── caem.nix -│ └── ... -└── overlays ; Overlays - └── ... +├── flake.nix ; Entry point +├── home ; home-manager configuration +│   ├── default.nix ; User and home-manager options +│   ├── packages ; Per-package home-manager configuration +│   │   └── ... +│   └── persist.nix ; Home opt-in state directories and files +├── hosts ; Host configurations +│   └── workstation +│   ├── default.nix ; Host configuration.nix equivalent +│   ├── hardware-configuration.nix ; Host hardware specific configuration +│   └── persist.nix ; System wide opt-in state directories and files +├── lib ; Custom helper functions +│   ├── default.nix +│   └── ... +├── modules ; System modules and sets of packages +│   ├── desktop +│   │   ├── apps +│   │   │   └── ... +│   │   └── environments +│   │   └── ... +│   └── system +│   └── ... +├── README.md +└── secrets ; Location of secrets not tracked in the git tree + └── pass ``` -## Installation +## Installing +This configuration uses impermanence with btrfs snapshots so you'll have to partition +your system in a certain way. -### Setting up your secrets repository +First you'll need this partition layout, assuming you're installing on `nvme0n1`. +``` +DEVICE FILESYSTEM PURPOSE +/dev/nvme0n1 +├─/dev/nvme0n1p1 vfat EFI partition +└─/dev/nvme0n1p2 btrfs Partition to house all the subvolumes +``` -This step is required to install the system as it is built around nix-sops -with encrypted files in a private repository in order to not expose even the -encrypted secrets to the public. You don't need to be in a NixOS livecd or -system in order to complete this step as long as you can install all -requirements from step 1. +Inside of the btrfs root volume we're going to need 2 subvolumes. +``` +SUBVOLUME MOUNT PURPOSE +root / Impermanent data +nix /nix Permanent data +``` -#### 1. Ensure all required dependencies are present +You'll also need to create a read-only snapshot of the `root` subvolume +and call it `root-blank`. +After you've mounted all the subvolumes and EFI partition (`/boot`) in `/mnt` +clone this repository in to `/mnt/nix/config`. Adjust all the block ids of the partitions +in `hardware-configuration.nix` and create a hashed password using `mkpasswd` and store it +in the `secrets` directory as `pass`. + +Finally, in the config directory run `nixos-install --flake '.#'`, reboot and you're done. + +## Updating +This configuration sets up [nh](https://github.com/viperML/nh) for a prettier and more convenient +way of keeping the system up to date. To update you can simply run: ```sh -nix-shell -p sops age git wl-clipboard +nix flake update /nix/config +nh os switch ``` - -#### 2. Initialize your secrets repo - -```sh -mkdir secrets -cd secrets -git init -``` - -#### 3. Create your gitignore - -You want this to make sure that you do not accidentally push your private key. - -```sh -echo "keys.txt" > .gitignore -``` - -#### 4. Generate your private key - -```sh -age-keygen -o ./keys.txt -``` - -#### 5. Create your sops configuration file - -```sh -cat < .sops.yaml -keys: - - &master $(age-keygen -y ./keys.txt) -creation_rules: - - path_regex: .*\.(yaml|json|env|ini)$ - key_groups: - - age: - - *master -EOF -``` - -#### 6. Create your secrets file - -```sh -mkpasswd | wl-copy -sops upasswd.yaml -``` - -Then edit the file to look like this -```yaml -upasswd: [The pasted password from mkpasswd] -``` - -#### 7. Create the flake to expose the secrets - -```sh -cat < flake.nix -{ - outputs = { self, ... }: { - paths = { - upasswd = self + "/upasswd.yaml"; - }; - }; -} -EOF -``` - -#### 8. Commit and push your changes - -If your git forge supports creating the repository on push you can -simply run the commands below, if it does not, like GitHub, create a private -repository named "secrets" first before running the below commands. - -```sh -git remote add origin git@git.example.net:username/secrets -git add . -git commit -m "batman" -git push --set-upstream origin master -``` - -#### 9. Back up your keys.txt - -**THIS STEP IS VERY IMPORTANT** - -Back up your keys.txt in a safe location where you can later transfer it on to the livecd. -Keep it safe afterwards as it is required to decrypt your secrets. Do not share this with -anyone else as it'd allow them to decrypt all your secrets. - -You also need to have a copy of your ssh private key or (preferably) deployment key to the repository -ready to later clone your secrets repository. - -### Installing the system - -#### 0. Boot in to a livcd image - -Any of the official NixOS livecds will work as long as you're able securely transfer files on to -it. Non-nixos livecds might work if you install the required tools manually but is out of scope -of this document. - -#### 1. Clone this repository - -```sh -git clone https://github.com/c4em/caenix.git -cd caenix -``` - -#### 2. Fetch your keys.txt and ssh key - -Fetch your keys.txt from wherever you've stored them and **place them at the root of the configuration directory**. -If you place them anywhere else the installation will fail. Do not move them later either. - -For your ssh key, place it in `~/.ssh` and create a symlink for the root user. -```sh -sudo ln -sf /home/nixos/.ssh /root/.ssh -``` - -And start a instance of ssh-agent. -```sh -eval $(ssh-agent -s) -ssh-add ~/.ssh/[your key] -``` - -#### 3. Update the flake input for your secret - -In `flake.nix`, replace -```nix - inputs = { - secrets.url = "git+ssh://git@git.caem.dev/caem/secrets"; -``` -with your url. -```nix - inputs = { - secrets.url = "git+ssh://git@git.example.com/username/secrets"; -``` - -#### 4. Update flake.lock (optional) -This is very useful and will also tell you if cloning your secrets work, -rather than only telling you after already having partitioned the drive. -```sh -nix --extra-experimental-features 'nix-command flakes' flake update -``` - -#### 5. Run the installation script -```sh -./install.sh --host [your host] --device [the device to install NixOS on] -``` - diff --git a/assets/README.md b/assets/README.md deleted file mode 100644 index 2dce282..0000000 --- a/assets/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# assets - -The wallpaper used here is watermarked, the purchased version is stored in the secrets, inaccessible to the public. -If you too want the watermark-free version you can [purchase it from the artist](https://wboss.huotan.com/p/TEcHBI) -for mere ¥12. The artwork looks great, I'd highly recommend it. diff --git a/assets/screenshot.png b/assets/screenshot.png deleted file mode 100644 index 985fcf4..0000000 Binary files a/assets/screenshot.png and /dev/null differ diff --git a/assets/screenshots/hyprland.png b/assets/screenshots/hyprland.png new file mode 100644 index 0000000..3c7667e Binary files /dev/null and b/assets/screenshots/hyprland.png differ diff --git a/assets/screenshots/kde.png b/assets/screenshots/kde.png new file mode 100644 index 0000000..48eebf3 Binary files /dev/null and b/assets/screenshots/kde.png differ diff --git a/assets/wallpaper.jpg b/assets/wallpaper.jpg deleted file mode 100644 index 77c180b..0000000 Binary files a/assets/wallpaper.jpg and /dev/null differ diff --git a/assets/wallpapers/hyprland.jpg b/assets/wallpapers/hyprland.jpg new file mode 100644 index 0000000..c371260 Binary files /dev/null and b/assets/wallpapers/hyprland.jpg differ diff --git a/assets/wallpapers/kde.png b/assets/wallpapers/kde.png new file mode 100644 index 0000000..d67050f Binary files /dev/null and b/assets/wallpapers/kde.png differ diff --git a/assets/wallpapers/river.png b/assets/wallpapers/river.png new file mode 100644 index 0000000..879b65a Binary files /dev/null and b/assets/wallpapers/river.png differ diff --git a/dotfiles/deploy.sh b/dotfiles/deploy.sh new file mode 100755 index 0000000..046bd5a --- /dev/null +++ b/dotfiles/deploy.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +for f in *; do + [ -d "$f" ] && ln -svf "$PWD/$f" "$HOME/.config" +done + diff --git a/dotfiles/nvim/ftplugin/lua.lua b/dotfiles/nvim/ftplugin/lua.lua new file mode 100644 index 0000000..4f74ce9 --- /dev/null +++ b/dotfiles/nvim/ftplugin/lua.lua @@ -0,0 +1,3 @@ +vim.bo.tabstop = 2 +vim.bo.softtabstop = 2 +vim.bo.shiftwidth = 2 diff --git a/dotfiles/nvim/ftplugin/nix.lua b/dotfiles/nvim/ftplugin/nix.lua new file mode 100644 index 0000000..4f74ce9 --- /dev/null +++ b/dotfiles/nvim/ftplugin/nix.lua @@ -0,0 +1,3 @@ +vim.bo.tabstop = 2 +vim.bo.softtabstop = 2 +vim.bo.shiftwidth = 2 diff --git a/dotfiles/nvim/init.lua b/dotfiles/nvim/init.lua new file mode 100644 index 0000000..bd26c3b --- /dev/null +++ b/dotfiles/nvim/init.lua @@ -0,0 +1,3 @@ +require"settings" +require"plugins" + diff --git a/dotfiles/nvim/lua/plugins/cmp.lua b/dotfiles/nvim/lua/plugins/cmp.lua new file mode 100644 index 0000000..1c5d700 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/cmp.lua @@ -0,0 +1,55 @@ +return { + "hrsh7th/nvim-cmp", + dependencies = { + "L3MON4D3/LuaSnip", + "saadparwaiz1/cmp_luasnip", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "hrsh7th/cmp-nvim-lsp", + { + "tamago324/cmp-zsh", + config = function() + require"cmp_zsh".setup { + zshrc = true, + filetypes = { "bash", "zsh", "sh" }, + } + end, + }, + "ray-x/cmp-treesitter", + "hrsh7th/cmp-nvim-lua", + "andersevenrud/cmp-tmux", + }, + config = function() + local cmp = require"cmp" + cmp.setup { + snippet = { + expand = function(args) + require"luasnip".lsp_expand(args.body) + end, + }, + view = { + entries = "native", + }, + mapping = cmp.mapping.preset.insert { + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.confirm({ select = true }), + [''] = cmp.mapping.abort(), + }, + sources = { + { name = "path" }, + { name = "luasnip" }, + { name = "zsh" }, + { name = "nvim_lsp" }, + { name = "buffer" }, + { name = "treesitter" }, + { name = "nvim-lua" }, + { name = "tmux" }, + }, + } + end +} + diff --git a/dotfiles/nvim/lua/plugins/comment.lua b/dotfiles/nvim/lua/plugins/comment.lua new file mode 100644 index 0000000..72d3b83 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/comment.lua @@ -0,0 +1,5 @@ +return { + "numToStr/Comment.nvim", + opts = {}, + lazy = false +} diff --git a/dotfiles/nvim/lua/plugins/dressing.lua b/dotfiles/nvim/lua/plugins/dressing.lua new file mode 100644 index 0000000..8d3e951 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/dressing.lua @@ -0,0 +1,7 @@ +return { + "stevearc/dressing.nvim", + config = function() + require"dressing".setup { + } + end +} diff --git a/dotfiles/nvim/lua/plugins/ibl.lua b/dotfiles/nvim/lua/plugins/ibl.lua new file mode 100644 index 0000000..fa22141 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/ibl.lua @@ -0,0 +1,11 @@ +return { + "lukas-reineke/indent-blankline.nvim", + main = "ibl", + opts = {}, + opts = { + indent = { + char = "▏" + } + } +} + diff --git a/dotfiles/nvim/lua/plugins/init.lua b/dotfiles/nvim/lua/plugins/init.lua new file mode 100644 index 0000000..9875d36 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/init.lua @@ -0,0 +1,22 @@ +if vim.fn.executable("git") ~= 1 then + vim.notify("git is not installed. Skipping plugins.", vim.log.levels.WARN) + return +end + +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) + +plugins = require"util.require_dir"(vim.fn.stdpath("config").."/lua/plugins/", true) + +require"lazy".setup(plugins) + diff --git a/dotfiles/nvim/lua/plugins/kanagawa.lua b/dotfiles/nvim/lua/plugins/kanagawa.lua new file mode 100644 index 0000000..06ffeb6 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/kanagawa.lua @@ -0,0 +1,49 @@ +return { + "rebelot/kanagawa.nvim", + config = function() + require"kanagawa".setup { + theme = "dragon", + background = { + dark = "dragon", + light = "lotus", + }, + transparent = true, + colors = { + theme = { + all = { + ui = { + bg_gutter = "none", + }, + }, + }, + }, + overrides = function(colors) + local theme = colors.theme + return { + NormalFloat = { bg = "none" }, + FloatBorder = { bg = "none" }, + FloatTitle = { bg = "none" }, + + -- Save an hlgroup with dark background and dimmed foreground + -- so that you can use it where your still want darker windows. + -- E.g.: autocmd TermOpen * setlocal winhighlight=Normal:NormalDark + NormalDark = { fg = theme.ui.fg_dim, bg = theme.ui.bg_m3 }, + + -- Popular plugins that open floats will link to NormalFloat by default; + -- set their background accordingly if you wish to keep them dark and borderless + LazyNormal = { bg = theme.ui.bg_m3, fg = theme.ui.fg_dim }, + MasonNormal = { bg = theme.ui.bg_m3, fg = theme.ui.fg_dim }, + TelescopeTitle = { fg = theme.ui.special, bold = true }, + TelescopePromptNormal = { bg = theme.ui.bg_p1 }, + TelescopePromptBorder = { fg = theme.ui.bg_p1, bg = theme.ui.bg_p1 }, + TelescopeResultsNormal = { fg = theme.ui.fg_dim, bg = theme.ui.bg_m1 }, + TelescopeResultsBorder = { fg = theme.ui.bg_m1, bg = theme.ui.bg_m1 }, + TelescopePreviewNormal = { bg = theme.ui.bg_dim }, + TelescopePreviewBorder = { bg = theme.ui.bg_dim, fg = theme.ui.bg_dim }, + } + end, + } + vim.cmd"colorscheme kanagawa" + end +} + diff --git a/dotfiles/nvim/lua/plugins/lsp/c.lua b/dotfiles/nvim/lua/plugins/lsp/c.lua new file mode 100644 index 0000000..c0a7c09 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/c.lua @@ -0,0 +1,8 @@ +return function () + require"lspconfig".ccls.setup { + capabilities = require"cmp_nvim_lsp".default_capabilities(), + filetypes = { + "c" + } + } +end diff --git a/dotfiles/nvim/lua/plugins/lsp/cxx.lua b/dotfiles/nvim/lua/plugins/lsp/cxx.lua new file mode 100644 index 0000000..3560eb4 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/cxx.lua @@ -0,0 +1,8 @@ +return function () + require"lspconfig".clangd.setup { + capabilities = require"cmp_nvim_lsp".default_capabilities(), + filetypes = { + "cpp", "objc", "objcpp", "cuda", "proto" + } + } +end diff --git a/dotfiles/nvim/lua/plugins/lsp/haskell.lua b/dotfiles/nvim/lua/plugins/lsp/haskell.lua new file mode 100644 index 0000000..7def886 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/haskell.lua @@ -0,0 +1,4 @@ +return function() + require"lspconfig".hls.setup {} +end + diff --git a/dotfiles/nvim/lua/plugins/lsp/js.lua b/dotfiles/nvim/lua/plugins/lsp/js.lua new file mode 100644 index 0000000..56d22a8 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/js.lua @@ -0,0 +1,5 @@ +return function () + require"lspconfig".ts_ls.setup { + capabilities = require"cmp_nvim_lsp".default_capabilities() + } +end diff --git a/dotfiles/nvim/lua/plugins/lsp/latex.lua b/dotfiles/nvim/lua/plugins/lsp/latex.lua new file mode 100644 index 0000000..3ffe941 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/latex.lua @@ -0,0 +1,5 @@ +return function () + require"lspconfig".texlab.setup { + capabilities = require"cmp_nvim_lsp".default_capabilities() + } +end diff --git a/dotfiles/nvim/lua/plugins/lsp/lua.lua b/dotfiles/nvim/lua/plugins/lsp/lua.lua new file mode 100644 index 0000000..3d7ad98 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/lua.lua @@ -0,0 +1,24 @@ +return function() + require'lspconfig'.lua_ls.setup { + capabilities = require"cmp_nvim_lsp".default_capabilities(), + on_init = function(client) + local path = client.workspace_folders[1].name + if vim.loop.fs_stat(path..'/.luarc.json') or vim.loop.fs_stat(path..'/.luarc.jsonc') then + return + end + + client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { + runtime = { + version = 'LuaJIT' + }, + workspace = { + checkThirdParty = false, + library = vim.api.nvim_get_runtime_file("", true) + } + }) + end, + settings = { + Lua = {} + } + } +end diff --git a/dotfiles/nvim/lua/plugins/lsp/nix.lua b/dotfiles/nvim/lua/plugins/lsp/nix.lua new file mode 100644 index 0000000..6c326bd --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/nix.lua @@ -0,0 +1,6 @@ +return function () + require"lspconfig".nil_ls.setup { + capabilities = require"cmp_nvim_lsp".default_capabilities() + } +end + diff --git a/dotfiles/nvim/lua/plugins/lsp/php.lua b/dotfiles/nvim/lua/plugins/lsp/php.lua new file mode 100644 index 0000000..d45800c --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/php.lua @@ -0,0 +1,5 @@ +return function () + require"lspconfig".intelephense. setup { + capabilities = require"cmp_nvim_lsp".default_capabilities(), + } +end diff --git a/dotfiles/nvim/lua/plugins/lsp/python.lua b/dotfiles/nvim/lua/plugins/lsp/python.lua new file mode 100644 index 0000000..f8c2dcc --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/python.lua @@ -0,0 +1,10 @@ +return function() + require"lspconfig".basedpyright.setup { + settings = { + python = { + pythonPath = vim.fn.exepath("python3"), + }, + }, + } +end + diff --git a/dotfiles/nvim/lua/plugins/lsp/rust.lua b/dotfiles/nvim/lua/plugins/lsp/rust.lua new file mode 100644 index 0000000..a320631 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/rust.lua @@ -0,0 +1,11 @@ +return function() + require"lspconfig".rust_analyzer.setup { + settings = { + ["rust-analyzer"] = { + diagnostics = { + enable = false, + }, + }, + }, + } +end diff --git a/dotfiles/nvim/lua/plugins/lsp/shell.lua b/dotfiles/nvim/lua/plugins/lsp/shell.lua new file mode 100644 index 0000000..72772f2 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lsp/shell.lua @@ -0,0 +1,5 @@ +return function() + require"lspconfig".bashls.setup { + capabilities = require"cmp_nvim_lsp".default_capabilities(), + } +end diff --git a/dotfiles/nvim/lua/plugins/lspconfig.lua b/dotfiles/nvim/lua/plugins/lspconfig.lua new file mode 100644 index 0000000..f764ee3 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lspconfig.lua @@ -0,0 +1,29 @@ +return { + "neovim/nvim-lspconfig", + config = function() + local require_dir = require"util.require_dir" + local lspees = require_dir(vim.fn.stdpath("config").."/lua/plugins/lsp/", "plugins.lsp") + for _, lspee in ipairs(lspees) do + lspee() + end + + local map = require"util.map" + local vlb = vim.lsp.buf + local format = function() + vlb.format { async = true } + end + vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("UserLspConfig", {}), + callback = function() + map("n", "lgD", vlb.declaration, "[l]sp [g]o to [D]eclaration") + map("n", "lgd", vlb.definition, "[l]sp [g]o to [d]definition") + map("n", "lgi", vlb.implementation, "[l]sp [g]o to [i]mplementation") + map("n", "lgr", vlb.references, "[l]sp [g]o to [r]eferences") + map("n", "lh", vlb.hover, "[l]sp [h]over over selection") + map("n", "lfm", format, "[l]sp [f]or[m]at file") + map("n", "lca", vlb.code_action, "[l]sp [C]ode [a]ction") + end, + }) + end +} + diff --git a/dotfiles/nvim/lua/plugins/lualine.lua b/dotfiles/nvim/lua/plugins/lualine.lua new file mode 100644 index 0000000..a54b7c5 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/lualine.lua @@ -0,0 +1,139 @@ +return { + "nvim-lualine/lualine.nvim", + dependencies = { + "nvim-tree/nvim-web-devicons", + }, + config = function() + -- Inspired by https://github.com/nvim-lualine/lualine.nvim/blob/master/examples/evil_lualine.lua + local rgb_to_hex = require"util.rgb_to_hex" + local hl = require"util.hl" + local config = { + options = { + component_separators = "", + section_separators = "", + theme = { + normal = { + c = { + fg = rgb_to_hex(hl("Normal").fg), + bg = "none", + }, + }, + inactive = { + c = { + fg = rgb_to_hex(hl("Normal").fg), + bg = "none", + }, + }, + }, + }, + sections = { + lualine_a = {}, lualine_b = {}, lualine_y = {}, lualine_z = {}, -- Remove defaults + lualine_c = {}, lualine_x = {}, -- Extend these later + }, + inactive_sections = { + lualine_a = {}, lualine_b = {}, lualine_c = {}, lualine_x = {}, lualine_y = {}, lualine_z = {}, + }, + } + + local function buffer_not_empty() + return vim.fn.empty(vim.fn.expand("%:t")) ~= 1 + end + + local function ins_l(component) + table.insert(config.sections.lualine_c, component) + end + + local function ins_r(component) + table.insert(config.sections.lualine_x, component) + end + + local distro = require"util.get_distro"() + + ins_l { + function() + return "▊" + end, + padding = { + left = 0, + right = 0, + }, + color = { + fg = rgb_to_hex(hl("Comment").fg), + }, + } + + ins_l { + function() + return distro.traits.icon + end, + color = { + fg = distro.traits.color, + }, + } + + ins_l { + "filename", + cond = buffer_not_empty, + color = { + fg = rgb_to_hex(hl("Operator").fg), + } + } + + ins_l { + "filesize", + cond = buffer_not_empty, + } + + ins_l { + "o:encoding", + cond = buffer_not_empty, + } + + ins_l { + "fileformat", + icons_enabled = false, + cond = buffer_not_empty, + } + + ins_r { "diagnostics" } + ins_r { "diff" } + + ins_r { + "branch", + padding = { + right = 0, + }, + color = { + fg = rgb_to_hex(hl("Constant").fg) + } + } + + ins_r { + "location", + } + + ins_r { + "mode", + fmt = string.lower, + color = { + fg = rgb_to_hex(hl("String").fg), + } + } + + ins_r { + function() + return "▊" + end, + padding = { + left = 0, + right = 0, + }, + color = { + fg = rgb_to_hex(hl("Comment").fg), + } + } + + require"lualine".setup(config) + end +} + diff --git a/dotfiles/nvim/lua/plugins/nvim-colorizer.lua b/dotfiles/nvim/lua/plugins/nvim-colorizer.lua new file mode 100644 index 0000000..2fa30e4 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/nvim-colorizer.lua @@ -0,0 +1,6 @@ +return { + "norcalli/nvim-colorizer.lua", + config = function() + require"colorizer".setup() + end, +} diff --git a/dotfiles/nvim/lua/plugins/telescope.lua b/dotfiles/nvim/lua/plugins/telescope.lua new file mode 100644 index 0000000..e93dbb0 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/telescope.lua @@ -0,0 +1,24 @@ +return { + "nvim-telescope/telescope.nvim", + dependencies = { "nvim-lua/plenary.nvim" }, + config = function() + require"telescope".setup {} + + local tb = require"telescope.builtin" + local map = require"util.map" + + -- Default pickers + map("n", "tf", tb.find_files,"[T]elescope [f]iles") + map("n", "tg", tb.live_grep, "[T]elescope [g]rep") + map("n", "tb", tb.buffers, "[T]elescope [b]uffers") + map("n", "tm", function() + tb.man_pages({ "ALL" }) + end, "[T]elescope [m]an pages") + map("n", "tk", tb.keymaps, "[T]elescope [k]eymaps") + map("n", "tk", tb.keymaps, "[T]elescope [k]eymaps") + + -- LSP pickers + map("n", "tld", tb.diagnostics, "[T]elescope [l]sp [d]iagnostics") + map("n", "tlr", tb.lsp_references, "[T]elescope [l]sp [r]eferences") + end, +} diff --git a/dotfiles/nvim/lua/plugins/treesitter.lua b/dotfiles/nvim/lua/plugins/treesitter.lua new file mode 100644 index 0000000..e50163a --- /dev/null +++ b/dotfiles/nvim/lua/plugins/treesitter.lua @@ -0,0 +1,15 @@ +return { + "nvim-treesitter/nvim-treesitter", + config = function() + require"nvim-treesitter.configs".setup { + ensure_installed = "all", -- pipebomb + highlight = { + enable = true, + }, + indent = { + enable = true, + }, + } + end, + run = ":TSUpdate", +} diff --git a/dotfiles/nvim/lua/plugins/vimtex.lua b/dotfiles/nvim/lua/plugins/vimtex.lua new file mode 100644 index 0000000..d388535 --- /dev/null +++ b/dotfiles/nvim/lua/plugins/vimtex.lua @@ -0,0 +1,8 @@ +return { + "lervag/vimtex", + lazy = false, + init = function() + vim.g.vimtex_view_method = "zathura" + end +} + diff --git a/dotfiles/nvim/lua/settings/autocmds.lua b/dotfiles/nvim/lua/settings/autocmds.lua new file mode 100644 index 0000000..471a38c --- /dev/null +++ b/dotfiles/nvim/lua/settings/autocmds.lua @@ -0,0 +1,37 @@ +vim.api.nvim_create_autocmd("BufReadPost", { + pattern = "*.h", + callback = function() + -- Toggle .h files between being interpreted as C and C++ + -- in case I have to work on a C++ header that was saved + -- (incorrectly) as a C header file. + vim.api.nvim_create_user_command("Fytwmmrt", function() + if not vim.b.fu then + vim.b.fu = true + vim.bo.filetype = "cpp" + vim.cmd([[ + LspStop ccls + LspStart clangd + ]]) + else + vim.b.fu = false + vim.bo.filetype = "c" + vim.cmd([[ + LspStop ccls + LspStart clangd + ]]) + end + end, { desc = "Fuck you to whoever made me run this."}) + + -- Set all .h files to be interpreted as C by default instead + -- of C++. If you use .h for your C++ headers instead of .hpp + -- you should be ashamed of yourself and change and grow as a + -- person as to not repeat such heretical offenses. + if not vim.b.fu then + vim.bo.filetype = "c" + vim.cmd([[ + LspStop clangd + LspStart ccls + ]]) + end + end, +}) diff --git a/dotfiles/nvim/lua/settings/init.lua b/dotfiles/nvim/lua/settings/init.lua new file mode 100644 index 0000000..9bb29a0 --- /dev/null +++ b/dotfiles/nvim/lua/settings/init.lua @@ -0,0 +1,3 @@ +require"settings.options" +require"settings.autocmds" +require"settings.keymaps" diff --git a/dotfiles/nvim/lua/settings/keymaps.lua b/dotfiles/nvim/lua/settings/keymaps.lua new file mode 100644 index 0000000..56c002f --- /dev/null +++ b/dotfiles/nvim/lua/settings/keymaps.lua @@ -0,0 +1,7 @@ +local map = require"util.map" + +map("n", "", "", "Mapleader") +vim.g.mapleader = " " + +map("n", "df", vim.diagnostic.open_float, "[D]iagnostics [f]loat") + diff --git a/dotfiles/nvim/lua/settings/options.lua b/dotfiles/nvim/lua/settings/options.lua new file mode 100644 index 0000000..99c1318 --- /dev/null +++ b/dotfiles/nvim/lua/settings/options.lua @@ -0,0 +1,28 @@ +local options = { + tabstop = 4, + softtabstop = 4, + shiftwidth = 4, + expandtab = true, + number = true, + relativenumber = true, + fileencoding = "utf-8", + cursorline = true, + wrap = false, + signcolumn = "yes", + swapfile = false, + errorbells = false, + undofile = true, + incsearch = true, + hlsearch = false, + backup = false, + termguicolors = true, + scrolloff = 8, + sidescrolloff = 8, +} + +for option, value in pairs(options) do + pcall(function() + vim.opt[option] = value + end) +end + diff --git a/dotfiles/nvim/lua/util/get_distro.lua b/dotfiles/nvim/lua/util/get_distro.lua new file mode 100644 index 0000000..7bc39a8 --- /dev/null +++ b/dotfiles/nvim/lua/util/get_distro.lua @@ -0,0 +1,73 @@ +local function distro_traits(name) + local icons = { + [ "unknown" ] = { + icon = "", + color = "#f3be25", + }, + [ "debian" ] = { + icon = "", + color = "#d70a53", + }, + [ "gentoo" ] = { + icon = "", + color = "#54487A", + }, + [ "nixos" ] = { + icon = "", + color = "#5277C3", + }, + [ "\"opensuse-tumbleweed\"" ] = { + icon = "", + color = "#73ba25", + }, + } + + if os.getenv("CONTAINER_ID") ~= nil then + icons["distrobox"] = { + icon = "[󰏗 " .. os.getenv("CONTAINER_ID") .. "]", + color = "#917d62", + } + end + + local icon = icons[name] + if icon == nil then + icon = icons["unknown"] + end + + return icon +end + +return function() + if os.getenv("CONTAINER_ID") ~= nil then + return { + name = "distrobox", + traits = distro_traits("distrobox"), + } + end + + local release_file = io.open("/etc/os-release", "rb") + if release_file == nil then + return { + name = "unknown", + traits = distro_traits("unknown"), + } + end + + local content = vim.split(release_file:read("*a"), "\n") + local distro_id = nil + for _, line in ipairs(content) do + if string.sub(line, 0, 3) == "ID=" then + distro_id = string.sub(line, 4, -1) + goto distro_id_found + end + end + ::distro_id_found:: + + release_file:close() + + return { + name = distro_id, + traits = distro_traits(distro_id) + } +end + diff --git a/dotfiles/nvim/lua/util/hl.lua b/dotfiles/nvim/lua/util/hl.lua new file mode 100644 index 0000000..d7c95c1 --- /dev/null +++ b/dotfiles/nvim/lua/util/hl.lua @@ -0,0 +1,7 @@ +return function (name) + local hl = vim.api.nvim_get_hl(0, { name = name }) + while hl.link ~= nil do + hl = vim.api.nvim_get_hl(0, { name = hl.link }) + end + return hl +end diff --git a/dotfiles/nvim/lua/util/map.lua b/dotfiles/nvim/lua/util/map.lua new file mode 100644 index 0000000..26d4468 --- /dev/null +++ b/dotfiles/nvim/lua/util/map.lua @@ -0,0 +1,9 @@ +return function(mode, key, mapping, comment) + local opts = { + noremap = true, + silent = true, + desc = comment + } + vim.keymap.set(mode, key, mapping, opts) +end + diff --git a/dotfiles/nvim/lua/util/require_dir.lua b/dotfiles/nvim/lua/util/require_dir.lua new file mode 100644 index 0000000..11b39af --- /dev/null +++ b/dotfiles/nvim/lua/util/require_dir.lua @@ -0,0 +1,27 @@ +return function(dir, skip_init) + local returns = {} + local lua_files = vim.split(vim.fn.glob(dir.."/*.lua"), "\n") + local namespace = string.gsub(dir, vim.fn.stdpath("config").."/lua/", "") + namespace = string.gsub(namespace, "%/", ".") + + for _, file in ipairs(lua_files) do + file = string.gsub(file, "%.lua", "") + file = string.gsub(file, dir.."/", namespace) + + if skip_init and file == namespace.."init" then + goto continue + end + + local require_ok, require_return = pcall(require, file) + if require_ok then + table.insert(returns, require_return) + else + vim.notify("Could not require file: '"..file.."': "..require_return, vim.log.levels.WARNING) + end + + ::continue:: + end + + return returns +end + diff --git a/dotfiles/nvim/lua/util/rgb_to_hex.lua b/dotfiles/nvim/lua/util/rgb_to_hex.lua new file mode 100644 index 0000000..33bd99d --- /dev/null +++ b/dotfiles/nvim/lua/util/rgb_to_hex.lua @@ -0,0 +1,11 @@ +return function(rgb) + if rgb == nil then + return nil + end + + local r = string.format("%02x", (rgb / 65536) % 256) + local g = string.format("%02x", (rgb / 256) % 256) + local b = string.format("%02x", rgb % 256) + + return "#"..r..g..b +end diff --git a/dotfiles/zsh/.zshrc b/dotfiles/zsh/.zshrc new file mode 100755 index 0000000..d468434 --- /dev/null +++ b/dotfiles/zsh/.zshrc @@ -0,0 +1,12 @@ +#!/usr/bin/env zsh + +# Prefetch paths +source "$ZDOTDIR/conf.d/path.zsh" + +for file in $ZDOTDIR/conf.d/*; do + if [[ "$file" == *"path.zsh" ]]; then + continue + fi + source "$file" +done + diff --git a/dotfiles/zsh/conf.d/alias.zsh b/dotfiles/zsh/conf.d/alias.zsh new file mode 100644 index 0000000..5079bde --- /dev/null +++ b/dotfiles/zsh/conf.d/alias.zsh @@ -0,0 +1,8 @@ +#!/usr/bin/env zsh + +alias reload="exec zsh" + +if [ -x "$(command -v nix)" ]; then + alias nix-develop="nix develop -c $SHELL" +fi + diff --git a/dotfiles/zsh/conf.d/color.zsh b/dotfiles/zsh/conf.d/color.zsh new file mode 100755 index 0000000..e1de862 --- /dev/null +++ b/dotfiles/zsh/conf.d/color.zsh @@ -0,0 +1,11 @@ +#!/usr/bin/env zsh + +alias ls='ls --color=auto' +alias ll='ls -lah --color=auto' +alias grep='grep --color=auto' + +term_name=$(ps -o comm= "$PPID") +if [ "$term_name" = "xterm" ] && [ -n "$(command -v "transset")" ]; then + transset -a 0.95 > /dev/null +fi + diff --git a/dotfiles/zsh/conf.d/completions.zsh b/dotfiles/zsh/conf.d/completions.zsh new file mode 100755 index 0000000..a367270 --- /dev/null +++ b/dotfiles/zsh/conf.d/completions.zsh @@ -0,0 +1,20 @@ +#!/usr/bin/env zsh + +if [ -z "$FZF_TAB_PLUGIN" ]; then + if [ ! -d "$HOME/.cache/fzf-tab" ]; then + echo "Installing fzf-tab" + git clone "https://github.com/Aloxaf/fzf-tab" "$HOME/.cache/fzf-tab" + fi + FZF_TAB_PLUGIN="$HOME/.cache/fzf-tab/fzf-tab.plugin.zsh" +fi + +autoload -Uz compinit +compinit + +source "$FZF_TAB_PLUGIN" +zstyle ':completion:*:git-checkout:*' sort false + +if [ -n "$TMUX" ]; then + zstyle ':fzf-tab:*' fzf-command ftb-tmux-popup +fi + diff --git a/dotfiles/zsh/conf.d/distrobox.zsh b/dotfiles/zsh/conf.d/distrobox.zsh new file mode 100644 index 0000000..1f4e6e4 --- /dev/null +++ b/dotfiles/zsh/conf.d/distrobox.zsh @@ -0,0 +1,3 @@ +#!/usr/bin/env zsh + +# TODO: Script to prompt which environment the user wants to enter in to diff --git a/dotfiles/zsh/conf.d/env.zsh b/dotfiles/zsh/conf.d/env.zsh new file mode 100755 index 0000000..5e7d8a7 --- /dev/null +++ b/dotfiles/zsh/conf.d/env.zsh @@ -0,0 +1,6 @@ +#!/usr/bin/env zsh + +if [ -n "$(command -v qt5ct)" ] && [ -z "$DESKTOP_SESSION" ]; then + export QT_QPA_PLATFORMTHEME=qt5ct +fi + diff --git a/dotfiles/zsh/conf.d/fuck.zsh b/dotfiles/zsh/conf.d/fuck.zsh new file mode 100755 index 0000000..de46864 --- /dev/null +++ b/dotfiles/zsh/conf.d/fuck.zsh @@ -0,0 +1,9 @@ +#!/usr/bin/env zsh + +if [ -n "$(command -v thefuck)" ]; then + fuck() { + eval $(thefuck --alias) + fuck + } +fi + diff --git a/dotfiles/zsh/conf.d/gpg.zsh b/dotfiles/zsh/conf.d/gpg.zsh new file mode 100755 index 0000000..a4bb94b --- /dev/null +++ b/dotfiles/zsh/conf.d/gpg.zsh @@ -0,0 +1,5 @@ +#!/usr/bin/env zsh + +GPG_TTY=$(tty) +export GPG_TTY + diff --git a/dotfiles/zsh/conf.d/manpager.zsh b/dotfiles/zsh/conf.d/manpager.zsh new file mode 100755 index 0000000..ef34d2a --- /dev/null +++ b/dotfiles/zsh/conf.d/manpager.zsh @@ -0,0 +1,7 @@ +#!/usr/bin/env zsh + +if [ -n "$(command -v "nvim")" ]; then + export MANPAGER='nvim +Man!' + export EDITOR="nvim" +fi + diff --git a/dotfiles/zsh/conf.d/nix.zsh b/dotfiles/zsh/conf.d/nix.zsh new file mode 100644 index 0000000..8caaafc --- /dev/null +++ b/dotfiles/zsh/conf.d/nix.zsh @@ -0,0 +1,11 @@ +#!/usr/bin/env zsh + +# Nix specific zsh configuration +if [ -x "$(command -v nix)" ]; then + source "$NIX_SHELL_PLUGIN" + if [ -f "$HOME/.config/user-dirs.dirs" ]; then + source "$HOME/.config/user-dirs.dirs" + fi +fi + + diff --git a/dotfiles/zsh/conf.d/path.zsh b/dotfiles/zsh/conf.d/path.zsh new file mode 100755 index 0000000..c418f2c --- /dev/null +++ b/dotfiles/zsh/conf.d/path.zsh @@ -0,0 +1,50 @@ +#!/usr/bin/env zsh + +add_to_path() { + if [ -d "$1" ] && [[ "$PATH" != *"$1"* ]]; then + PATH="$PATH:$1" + fi +} + +add_to_path "$HOME/.local/bin" + +if [ -f "/etc/profile.d/nix.sh" ]; then + source /etc/profile.d/nix.sh +fi + +# Language package mangers +if [ -n "$(command -v go)" ]; then + export GOPATH="$HOME/.local/share/go" + add_to_path "$HOME/.local/share/go/bin" +fi + +if [ -n "$(command -v npm)" ]; then + if [ -f "$HOME/.npmrc" ]; then + if [ -z "$(grep prefix "$HOME/.npmrc")" ]; then + npm config set prefix "$HOME/.local/share/npm" + fi + else + npm config set prefix "$HOME/.local/share/npm" + fi + add_to_path "$HOME/.local/share/npm/bin" +fi + +if [ -n "$(command -v cargo)" ]; then + export CARGO_HOME="$HOME/.local/share/cargo" + add_to_path "$HOME/.local/share/cargo/bin" +fi + +if [ -n "$(command -v pip3)" ] && [ -n "$(command -v virtualenv)" ]; then + if [ ! -d "$HOME/.local/share/python3-venv" ]; then + python3 -m venv "$HOME/.local/share/python3-venv" + fi + + if [ "$(grep "executable" "$HOME/.local/share/python3-venv/pyvenv.cfg" | awk '{print $3}')" \ + != "$(realpath $(command -v python3))" ]; then + python3 -m venv --upgrade "$HOME/.local/share/python3-venv" + fi + + export VIRTUAL_ENV_DISABLE_PROMPT=true + source "$HOME/.local/share/python3-venv/bin/activate" +fi + diff --git a/dotfiles/zsh/conf.d/ps1.zsh b/dotfiles/zsh/conf.d/ps1.zsh new file mode 100755 index 0000000..1155fb2 --- /dev/null +++ b/dotfiles/zsh/conf.d/ps1.zsh @@ -0,0 +1,33 @@ +#!/usr/bin/env zsh + +distro=$(cat /etc/os-release | grep -w 'ID=.*' | sed -e 's/ID=//g' | awk '{print $1}') +case "$distro" in + "debian") dicon="%F{red}%f" ;; + "gentoo") dicon="%F{magenta}%f" ;; + "\"opensuse-tumbleweed\"") dicon="%F{green} %f" ;; + "nixos") dicon="%F{cyan}%f" ;; + *) dicon="%F{yellow}[󰘧]%f" ;; +esac + +if [ -n "$IN_NIX_SHELL" ]; then + if [ -z "$NIX_SHELL_PACKAGES" ]; then + nix_shell_ps1=" %F{red}nix-shell%f" + else + nix_shell_ps1=" %F{red}{ $NIX_SHELL_PACKAGES }%f" + fi +else + nix_shell_ps1="" +fi + +if [ -n "$CONTAINER_ID" ]; then + dicon="%F{bg-yellow}[󰏗 $CONTAINER_ID]%f" +fi + +setopt prompt_subst +autoload -Uz vcs_info +precmd () { vcs_info } +zstyle ':vcs_info:*' formats ' %F{yellow}(%b)%f' + +NL=$'\n' +export PS1='[$dicon %F{green}%3~%f$vcs_info_msg_0_$nix_shell_ps1]# ' + diff --git a/dotfiles/zsh/conf.d/ssh.zsh b/dotfiles/zsh/conf.d/ssh.zsh new file mode 100755 index 0000000..7e2231f --- /dev/null +++ b/dotfiles/zsh/conf.d/ssh.zsh @@ -0,0 +1,13 @@ +#!/usr/bin/env zsh + +if [ -z "$DESKTOP_SESSION" ]; then + if [ -n "$(command -v gnome-keyring-daemon)" ]; then + if [ -z "$(pidof gnome-keyring-daemon)" ]; then + eval $(gnome-keyring-daemon --start) + export SSH_AUTH_SOCK + fi + else + { eval $(ssh-agent -s); } > /dev/null 2>&1 + fi +fi + diff --git a/dotfiles/zsh/conf.d/suggestions.zsh b/dotfiles/zsh/conf.d/suggestions.zsh new file mode 100755 index 0000000..1325a7b --- /dev/null +++ b/dotfiles/zsh/conf.d/suggestions.zsh @@ -0,0 +1,29 @@ +#!/usr/bin/env zsh + +export HISTFILE=~/.cache/zsh_history +export HISTSIZE=10000 +export SAVEHIST=$HISTSIZE + +setopt INC_APPEND_HISTORY +setopt SHARE_HISTORY +setopt HIST_IGNORE_SPACE +setopt HIST_SAVE_NO_DUPS + +if [ -z "$AUTOSUGGEST_PLUGIN" ]; then + import_file="/usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh" +else + import_file="$AUTOSUGGEST_PLUGIN" +fi + +if [ ! -f "$import_file" ]; then + if [ ! -d "$HOME/.cache/zsh-autosuggestions" ]; then + echo "Installing zsh-autosuggestions..." + git clone "https://github.com/zsh-users/zsh-autosuggestions.git" "$HOME/.cache/zsh-autosuggestions" + fi + import_file="$HOME/.cache/zsh-autosuggestions/zsh-autosuggestions.zsh" +fi + +source "$import_file" + +ZSH_AUTOSUGGEST_STRATEGY=(history completion) + diff --git a/dotfiles/zsh/conf.d/syntax.zsh b/dotfiles/zsh/conf.d/syntax.zsh new file mode 100755 index 0000000..752aec3 --- /dev/null +++ b/dotfiles/zsh/conf.d/syntax.zsh @@ -0,0 +1,18 @@ +#!/usr/bin/env zsh + +if [ -z "$SYNTAX_PLUGIN" ]; then + import_file="/usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" +else + import_file="$SYNTAX_PLUGIN" +fi + +if [ ! -f "$import_file" ]; then + if [ ! -d "$HOME/.cache/zsh-syntax-highlighting" ]; then + echo "Installing zsh-syntax-highlighting..." + git clone "https://github.com/zsh-users/zsh-syntax-highlighting.git" "$HOME/.cache/zsh-syntax-highlighting" + fi + import_file="$HOME/.cache/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" +fi + +source "$import_file" + diff --git a/flake.lock b/flake.lock index ec90f2f..c353b96 100644 --- a/flake.lock +++ b/flake.lock @@ -8,41 +8,19 @@ ] }, "locked": { - "lastModified": 1744237139, - "narHash": "sha256-f395cE+MIvKcRfRZubYXc7TJfJJ7edwpt7tYIFDgYQo=", + "lastModified": 1734540176, + "narHash": "sha256-msxbnOw/nh8GJ87YtBEDT1jhVldOBtxHRF2KgvYPeDA=", "owner": "ezKEa", "repo": "aagl-gtk-on-nix", - "rev": "a1a00f83d74988e98af8757e9b86ddf04d2ecdfc", + "rev": "00df3ad02364a6fb8f1105dc72ae770b748c62eb", "type": "github" }, "original": { "owner": "ezKEa", - "ref": "release-24.11", "repo": "aagl-gtk-on-nix", "type": "github" } }, - "disko": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1736864502, - "narHash": "sha256-ItkIZyebGvNH2dK9jVGzJHGPtb6BSWLN8Gmef16NeY0=", - "owner": "nix-community", - "repo": "disko", - "rev": "0141aabed359f063de7413f80d906e1d98c0c123", - "type": "github" - }, - "original": { - "owner": "nix-community", - "ref": "latest", - "repo": "disko", - "type": "github" - } - }, "flake-compat": { "flake": false, "locked": { @@ -59,70 +37,6 @@ "type": "github" } }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib" - }, - "locked": { - "lastModified": 1743550720, - "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "c621e8422220273271f52058f618c94e405bb0f5", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_2": { - "inputs": { - "nixpkgs-lib": [ - "nixpak", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1743550720, - "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "c621e8422220273271f52058f618c94e405bb0f5", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "hercules-ci-effects": { - "inputs": { - "flake-parts": [ - "nixpak", - "flake-parts" - ], - "nixpkgs": [ - "nixpak", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1744693102, - "narHash": "sha256-1Z4WPGVky4w3lrhrgs89OKsLzPdtkbi1bPLNFWsoLfY=", - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "rev": "5b6cec51c9ec095a0d3fd4c8eeb53eb5c59ae33e", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "hercules-ci-effects", - "type": "github" - } - }, "home-manager": { "inputs": { "nixpkgs": [ @@ -130,27 +44,26 @@ ] }, "locked": { - "lastModified": 1744743431, - "narHash": "sha256-iyn/WBYDc7OtjSawbegINDe/gIkok888kQxk3aVnkgg=", + "lastModified": 1736204492, + "narHash": "sha256-CoBPRgkUex9Iz6qGSzi/BFVUQjndB0PmME2B6eEyeCs=", "owner": "nix-community", "repo": "home-manager", - "rev": "c61bfe3ae692f42ce688b5865fac9e0de58e1387", + "rev": "20665c6efa83d71020c8730f26706258ba5c6b2a", "type": "github" }, "original": { "owner": "nix-community", - "ref": "release-24.11", "repo": "home-manager", "type": "github" } }, "impermanence": { "locked": { - "lastModified": 1737831083, - "narHash": "sha256-LJggUHbpyeDvNagTUrdhe/pRVp4pnS6wVKALS782gRI=", + "lastModified": 1734945620, + "narHash": "sha256-olIfsfJK4/GFmPH8mXMmBDAkzVQ1TWJmeGT3wBGfQPY=", "owner": "nix-community", "repo": "impermanence", - "rev": "4b3e914cdf97a5b536a889e939fb2fd2b043a170", + "rev": "d000479f4f41390ff7cf9204979660ad5dd16176", "type": "github" }, "original": { @@ -159,35 +72,13 @@ "type": "github" } }, - "nixpak": { - "inputs": { - "flake-parts": "flake-parts_2", - "hercules-ci-effects": "hercules-ci-effects", - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1744856645, - "narHash": "sha256-TgEsizZRX53LkX8qWIqoRd/d4mgGlCqh3OBEhMbXxvU=", - "owner": "nixpak", - "repo": "nixpak", - "rev": "c99853b3e1973b95b86882e3f49763f9be168596", - "type": "github" - }, - "original": { - "owner": "nixpak", - "repo": "nixpak", - "type": "github" - } - }, "nixpkgs": { "locked": { - "lastModified": 1744440957, - "narHash": "sha256-FHlSkNqFmPxPJvy+6fNLaNeWnF1lZSgqVCl/eWaJRc4=", + "lastModified": 1736061677, + "narHash": "sha256-DjkQPnkAfd7eB522PwnkGhOMuT9QVCZspDpJJYyOj60=", "owner": "nixos", "repo": "nixpkgs", - "rev": "26d499fc9f1d567283d5d56fcf367edd815dba1d", + "rev": "cbd8ec4de4469333c82ff40d057350c30e9f7d36", "type": "github" }, "original": { @@ -197,84 +88,36 @@ "type": "github" } }, - "nixpkgs-lib": { + "plasma-manager": { + "inputs": { + "home-manager": [ + "home-manager" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, "locked": { - "lastModified": 1743296961, - "narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=", + "lastModified": 1735049224, + "narHash": "sha256-fWUd9kyXdepphJ7cCzOsuSo7l0kbFCkUqfgKqZyFZzE=", "owner": "nix-community", - "repo": "nixpkgs.lib", - "rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa", + "repo": "plasma-manager", + "rev": "d16bbded0ae452bc088489e7dca3ef58d8d1830b", "type": "github" }, "original": { "owner": "nix-community", - "repo": "nixpkgs.lib", - "type": "github" - } - }, - "nixpkgs-unstable": { - "locked": { - "lastModified": 1744932701, - "narHash": "sha256-fusHbZCyv126cyArUwwKrLdCkgVAIaa/fQJYFlCEqiU=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", + "repo": "plasma-manager", "type": "github" } }, "root": { "inputs": { "aagl": "aagl", - "disko": "disko", - "flake-parts": "flake-parts", "home-manager": "home-manager", "impermanence": "impermanence", - "nixpak": "nixpak", "nixpkgs": "nixpkgs", - "nixpkgs-unstable": "nixpkgs-unstable", - "secrets": "secrets", - "sops-nix": "sops-nix" - } - }, - "secrets": { - "locked": { - "lastModified": 1737589360, - "narHash": "sha256-s4tCUlvzXpQQ1wJ7ZcslfVuszmQlmnp7bnoZRdnBZuw=", - "ref": "refs/heads/master", - "rev": "2cfed436d84594b4d4a73843095c75c644628dfe", - "revCount": 4, - "type": "git", - "url": "ssh://git@git.caem.dev/caem/secrets.git" - }, - "original": { - "type": "git", - "url": "ssh://git@git.caem.dev/caem/secrets.git" - } - }, - "sops-nix": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1744669848, - "narHash": "sha256-pXyanHLUzLNd3MX9vsWG+6Z2hTU8niyphWstYEP3/GU=", - "owner": "Mic92", - "repo": "sops-nix", - "rev": "61154300d945f0b147b30d24ddcafa159148026a", - "type": "github" - }, - "original": { - "owner": "Mic92", - "repo": "sops-nix", - "type": "github" + "plasma-manager": "plasma-manager" } } }, diff --git a/flake.nix b/flake.nix index 413ba63..2bcbf6e 100644 --- a/flake.nix +++ b/flake.nix @@ -1,78 +1,49 @@ { - description = "My NixOS configuration files."; - inputs = { - secrets.url = "git+ssh://git@git.caem.dev/caem/secrets.git"; - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; - nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; - - flake-parts.url = "github:hercules-ci/flake-parts"; - - home-manager = { - url = "github:nix-community/home-manager/release-24.11"; - inputs.nixpkgs.follows = "nixpkgs"; - }; impermanence.url = "github:nix-community/impermanence"; - disko = { - url = "github:nix-community/disko/latest"; + home-manager = { + url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; - sops-nix = { - url = "github:Mic92/sops-nix"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - - nixpak = { - url = "github:nixpak/nixpak"; + plasma-manager = { + url = "github:nix-community/plasma-manager"; inputs.nixpkgs.follows = "nixpkgs"; + inputs.home-manager.follows = "home-manager"; }; aagl = { - url = "github:ezKEa/aagl-gtk-on-nix/release-24.11"; + url = "github:ezKEa/aagl-gtk-on-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; }; - outputs = { + outputs = { nixpkgs, - nixpkgs-unstable, - flake-parts, impermanence, home-manager, - disko, - sops-nix, - secrets, - nixpak, + plasma-manager, aagl, ... } @ inputs: let - lib = nixpkgs.lib.extend (final: prev: + lib = nixpkgs.lib.extend (final: prev: import ./lib { lib = final; } ); in { nixosConfigurations = lib.mkHosts { + modules = [ + home-manager.nixosModules.home-manager { + home-manager.sharedModules = [ + plasma-manager.homeManagerModules.plasma-manager + ]; + } + impermanence.nixosModules.impermanence + ]; nixpkgs = nixpkgs; inputs = inputs; - user = "caem"; - modules = [ - impermanence.nixosModules.impermanence - disko.nixosModules.disko - sops-nix.nixosModules.sops - aagl.nixosModules.default - home-manager.nixosModules.home-manager { - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - extraSpecialArgs = { - inherit inputs; - }; - }; - } - ]; }; }; } diff --git a/home/default.nix b/home/default.nix new file mode 100644 index 0000000..30ba60d --- /dev/null +++ b/home/default.nix @@ -0,0 +1,39 @@ +{ config, ... }: + +{ + users.users.hu = { + isNormalUser = true; + extraGroups = [ "wheel" ]; + hashedPasswordFile = "/nix/config/secrets/pass"; + }; + + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users.hu = { + home.username = "hu"; + home.homeDirectory = "/home/hu"; + home.stateVersion = config.system.stateVersion; + + xdg = { + enable = true; + userDirs = { + documents = "/home/hu/documents"; + download = "/home/hu/download"; + music = "/home/hu/music"; + pictures = "/home/hu/images"; + videos = "/home/hu/videos"; + + # I will never need this so they're getting hidden + publicShare = "/home/hu/.local/share/xdg/public"; + templates = "/home/hu/.local/share/xdg/templates"; + }; + }; + }; + }; + + imports = [ + ./persist.nix + ]; +} + diff --git a/home/persist.nix b/home/persist.nix new file mode 100644 index 0000000..68a3a2a --- /dev/null +++ b/home/persist.nix @@ -0,0 +1,24 @@ +{ ... }: + +{ + environment.persistence."/nix/persist".users.hu = { + directories = [ + "archives" + "documents" + "programming" + "source" + "games" + "images" + "videos" + + # Program files + { directory = ".gnupg"; mode = "0700"; } + { directory = ".ssh"; mode = "0700"; } + { directory = ".nixops"; mode = "0700"; } + { directory = ".local/share/keyrings"; mode = "0700"; } + { directory = ".pki"; mode = "0700"; } + ".local/share/direnv" + ]; + }; +} + diff --git a/hosts/puter/default.nix b/hosts/puter/default.nix deleted file mode 100644 index cb413cc..0000000 --- a/hosts/puter/default.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ pkgs, lib, username, ... }: - -{ - imports = [ - ./disko.nix - ./packages.nix - ]; - - time.timeZone = "Europe/Berlin"; - - networking = { - hostName = "puter"; - useDHCP = lib.mkDefault true; - }; - - boot = { - loader = { - efi.canTouchEfiVariables = true; - grub = { - enable = true; - # Keep "nodev" for efi systems - device = "nodev"; - efiSupport = true; - gfxmodeEfi = "1920x1080"; - }; - }; - - tmp.useTmpfs = true; - kernelPackages = pkgs.unstable.linuxPackages_xanmod_latest; - supportedFilesystems = [ "btfs" "vfat" "xfs" ]; - initrd = { - availableKernelModules = [ "nvme" "xhci_pci" "ahci" - "usbhid" "usb_storage" "sd_mod" ]; - }; - }; - - services = { - fstrim.enable = true; - btrfs.autoScrub.enable = true; - }; - - fileSystems = { - # These are system specific. If you have any additional drives that are not - # your root device you can add and mount them here. Added nofail so that you can - # install this configuration on a device without it exploding when you don't have - # these specific partitions. - - "/home/${username}/mounts/vault" = { - device = "/dev/disk/by-uuid/048d175b-0e3e-4ec7-955b-3d9a45f9f237"; - options = [ "nofail" ]; - fsType = "xfs"; - }; - - "/home/${username}/mounts/attic" = { - device = "/dev/disk/by-uuid/ec32ce36-9f53-4f44-ac8f-2c9163f0b3d7"; - options = [ "nofail" ]; - fsType = "xfs"; - }; - }; - - system.stateVersion = "24.11"; # [managed by install.sh] { state version } -} - diff --git a/hosts/puter/disko.nix b/hosts/puter/disko.nix deleted file mode 100644 index cc83a35..0000000 --- a/hosts/puter/disko.nix +++ /dev/null @@ -1,58 +0,0 @@ -{ ... }: - -{ - disko.devices = { - disk = { - master = { - type = "disk"; - device = "/dev/nvme0n1"; # [managed by install.sh] - content = { - type = "gpt"; - partitions = { - efi = { - priority = 1; - name = "efi"; - start = "1M"; - end = "1024M"; - type = "EF00"; - content = { - type = "filesystem"; - format = "vfat"; - mountpoint = "/boot"; - mountOptions = [ - "umask=0077" - "noatime" - ]; - }; - }; - root = { - size = "100%"; - content = { - type = "btrfs"; - extraArgs = [ "-f" "-L nixos" ]; - subvolumes = { - /* Do not rename the root partition as it'll break impermanence */ - "/root" = { - mountpoint = "/"; - mountOptions = [ - "noatime" - "compress=zstd" - ]; - }; - - "/nix" = { - mountpoint = "/nix"; - mountOptions = [ - "noatime" - "compress=zstd" - ]; - }; - }; - }; - }; - }; - }; - }; - }; - }; -} diff --git a/hosts/puter/packages.nix b/hosts/puter/packages.nix deleted file mode 100644 index 513689b..0000000 --- a/hosts/puter/packages.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ ... }: - -{ - imports = let - modules = ../../modules/nixos; - in [ - "${modules}/core" - "${modules}/hardware/audio" - "${modules}/hardware/gpu/nvidia" - "${modules}/hardware/cpu/amd" - "${modules}/multimedia" - "${modules}/desktop/gnome" - "${modules}/communication" - "${modules}/development" - "${modules}/edv" - ]; -} - diff --git a/hosts/vm/default.nix b/hosts/vm/default.nix deleted file mode 100644 index c9dd956..0000000 --- a/hosts/vm/default.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ pkgs, lib, modulesPath, ... }: - -{ - imports = [ - ./disko.nix - ./packages.nix - (modulesPath + "/profiles/qemu-guest.nix") - ]; - - time.timeZone = "Europe/Berlin"; - - networking = { - hostName = "vm"; - useDHCP = lib.mkDefault true; - }; - - boot = { - loader = { - grub = { - enable = true; - # device = "/dev/sda"; # [managed by install.sh] - gfxmodeEfi = "1920x1080"; - }; - }; - - tmp.useTmpfs = true; - kernelPackages = pkgs.linuxPackages_xanmod_latest; - supportedFilesystems = [ "btfs" "vfat" "xfs" ]; - initrd = { - availableKernelModules = [ "nvme" "xhci_pci" "ahci" - "usbhid" "usb_storage" "sd_mod" ]; - }; - }; - - services = { - fstrim.enable = true; - btrfs.autoScrub.enable = true; - }; - - fileSystems = { - # These are system specific. If you have any additional drives that are not - # your root device you can add and mount them here. Added nofail so that you can - # install this configuration on a device without it exploding when you don't have - # these specific partitions. - }; - - system.stateVersion = "24.11"; # [managed by install.sh] -} - diff --git a/hosts/vm/disko.nix b/hosts/vm/disko.nix deleted file mode 100644 index 887d609..0000000 --- a/hosts/vm/disko.nix +++ /dev/null @@ -1,54 +0,0 @@ -{ ... }: - -{ - disko.devices = { - disk = { - master = { - type = "disk"; - device = "/dev/vda"; # [managed by install.sh] - content = { - type = "gpt"; - partitions = { - grub_mbr = { - size = "1M"; - type = "EF02"; # for grub MBR - }; - boot = { - size = "1G"; - content = { - type = "filesystem"; - format = "ext4"; - mountpoint = "/boot"; - }; - }; - root = { - size = "100%"; - content = { - type = "btrfs"; - extraArgs = [ "-f" "-L nixos" ]; - subvolumes = { - /* Do not rename the root partition as it'll break impermanence */ - "/root" = { - mountpoint = "/"; - mountOptions = [ - "noatime" - "compress=zstd" - ]; - }; - - "/nix" = { - mountpoint = "/nix"; - mountOptions = [ - "noatime" - "compress=zstd" - ]; - }; - }; - }; - }; - }; - }; - }; - }; - }; -} diff --git a/hosts/vm/packages.nix b/hosts/vm/packages.nix deleted file mode 100644 index c83d3ca..0000000 --- a/hosts/vm/packages.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ ... }: - -{ - imports = let - modules = ../../modules/nixos; - in [ - "${modules}/core" - "${modules}/hardware/audio" - "${modules}/hardware/gpu/graphics.nix" - "${modules}/multimedia" - "${modules}/desktop/gnome" - ]; -} - diff --git a/hosts/workstation/default.nix b/hosts/workstation/default.nix new file mode 100644 index 0000000..6196d91 --- /dev/null +++ b/hosts/workstation/default.nix @@ -0,0 +1,96 @@ +{ config, pkgs, ... }: + +{ + imports = [ + ./hardware-configuration.nix + ./persist.nix + ../../home/default.nix + + ../../modules/desktop/environments/kde.nix + ../../modules/system/basic.nix + ../../modules/system/security.nix + ../../modules/desktop/apps/communication.nix + ../../modules/desktop/apps/games.nix + ../../modules/desktop/apps/multimedia.nix + ../../modules/system/virtualisation.nix + ../../modules/system/development.nix + ../../modules/packages/firefox.nix + ../../modules/packages/zsh.nix + ../../modules/packages/fastfetch.nix + ../../modules/packages/tmux.nix + ]; + + boot.loader.efi.canTouchEfiVariables = true; + boot.loader.grub = { + enable = true; + efiSupport = true; + device = "nodev"; + gfxmodeEfi = "1920x1080"; + }; + boot.kernelPackages = pkgs.linuxPackages_xanmod_latest; + boot.supportedFilesystems = [ "btrfs" "xfs" ]; + + networking = { + hostName = "workstation"; + enableIPv6 = false; + }; + + time.timeZone = "Europe/Berlin"; + + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "uk"; + # useXkbConfig = true; + }; + + nixpkgs.config.allowUnfree = true; + services.xserver.videoDrivers = [ "nvidia" ]; + hardware = { + graphics = { + enable = true; + enable32Bit = true; + }; + nvidia = { + modesetting.enable = true; + open = true; + package = config.boot.kernelPackages.nvidiaPackages.beta; + }; + }; + + programs.mtr.enable = true; + programs.gnupg.agent = { + enable = true; + enableSSHSupport = true; + }; + + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa = { + enable = true; + support32Bit = true; + }; + pulse.enable = true; + jack.enable = true; + }; + + nix = { + settings = { + substituters = [ + "https://cuda-maintainers.cachix.org" + ]; + trusted-public-keys = [ + "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" + ]; + }; + extraOptions = '' + experimental-features = nix-command flakes + ''; + }; + + # nixpkgs.config.cudaSupport = true; + + system.stateVersion = "23.11"; +} + diff --git a/hosts/workstation/hardware-configuration.nix b/hosts/workstation/hardware-configuration.nix new file mode 100644 index 0000000..b2d0307 --- /dev/null +++ b/hosts/workstation/hardware-configuration.nix @@ -0,0 +1,78 @@ +{ config, lib, modulesPath, ... }: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/5cc0482e-ac92-41c7-b2fc-2d9b4a19eeec"; + fsType = "btrfs"; + options = [ "subvol=root" "compress=zstd" "noatime" ]; + }; + + fileSystems."/nix" = { + device = "/dev/disk/by-uuid/5cc0482e-ac92-41c7-b2fc-2d9b4a19eeec"; + fsType = "btrfs"; + options = [ "subvol=nix" "compress=zstd" "noatime" ]; + neededForBoot = true; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/3012-B13E"; + fsType = "vfat"; + }; + + fileSystems."/home/hu/mounts/vault" = { + device = "/dev/disk/by-uuid/048d175b-0e3e-4ec7-955b-3d9a45f9f237"; + fsType = "xfs"; + }; + + fileSystems."/home/hu/mounts/attic" = { + device = "/dev/disk/by-uuid/ec32ce36-9f53-4f44-ac8f-2c9163f0b3d7"; + fsType = "xfs"; + }; + + boot.initrd.availableKernelModules = [ + "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + boot.extraModprobeConfig = "options kvm_amd nested=1"; + boot.kernelParams = [ + "nvidia_drm.fbdev=1" + "nvidia.NVreg_PreserveVideoMemoryAllocations=1" + ]; + + boot.initrd.postDeviceCommands = lib.mkAfter '' + mkdir /btrfs_tmp + mount ${config.fileSystems."/".device} /btrfs_tmp + if [[ -e /btrfs_tmp/root ]]; then + mkdir -p /btrfs_tmp/old_roots + timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") + mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" + fi + + delete_subvolume_recursively() { + IFS=$'\n' + for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do + delete_subvolume_recursively "/btrfs_tmp/$i" + done + btrfs subvolume delete "$1" + } + + for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do + delete_subvolume_recursively "$i" + done + + btrfs subvolume create /btrfs_tmp/root + umount /btrfs_tmp + ''; + + networking.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} + diff --git a/hosts/workstation/persist.nix b/hosts/workstation/persist.nix new file mode 100644 index 0000000..5af2054 --- /dev/null +++ b/hosts/workstation/persist.nix @@ -0,0 +1,23 @@ +{ ... }: + +{ + environment.persistence."/nix/persist" = { + hideMounts = true; + directories = [ + "/var/log" + "/var/lib/nixos" + "/var/lib/systemd/coredump" + { + directory = "/var/lib/colord"; + user = "colord"; + group = "colord"; + mode = "u=rwx,g=rx,o="; + } + "/etc/NetworkManager/system-connections" + ]; + files = [ + "/etc/machine-id" + ]; + }; +} + diff --git a/hosts/x220/default.nix b/hosts/x220/default.nix index 68eff66..5030445 100644 --- a/hosts/x220/default.nix +++ b/hosts/x220/default.nix @@ -1,54 +1,78 @@ -{ pkgs, lib, username, ... }: +{ pkgs, ... }: { imports = [ - ./disko.nix - ./packages.nix + ./hardware-configuration.nix + ./persist.nix + ../../home/default.nix + + ../../modules/desktop/environments/river.nix + ../../modules/system/basic.nix + ../../modules/system/security.nix + ../../modules/desktop/apps/communication.nix + ../../modules/desktop/apps/multimedia.nix + ../../modules/system/development.nix + ../../modules/packages/firefox.nix + ../../modules/packages/zsh.nix + ../../modules/packages/fastfetch.nix + ../../modules/packages/tmux.nix ]; - time.timeZone = "Europe/Berlin"; + hardware.bluetooth.enable = true; - console = { - earlySetup = true; - keyMap = "de"; + boot = { + loader.grub = { + enable = true; + device = "/dev/sda"; + gfxmodeEfi = "1366x768"; + }; + kernelPackages = pkgs.linuxPackages_xanmod_latest; + supportedFilesystems = [ "btrfs" ]; }; networking = { hostName = "x220"; - useDHCP = lib.mkDefault true; + networkmanager.enable = true; }; - boot = { - loader = { - efi.canTouchEfiVariables = true; - grub = { - enable = true; - # device = "/dev/sda"; # [managed by install.sh] - gfxmodeEfi = "1366x768"; - }; - }; - - tmp.useTmpfs = true; - kernelPackages = pkgs.unstable.linuxPackages_xanmod_latest; - supportedFilesystems = [ "btfs" "vfat" "xfs" ]; - initrd = { - availableKernelModules = [ "ehci_pci" "ahci" "xhci_pci" - "usb_storage" "sd_mod" "sdhci_pci" ]; + users.users.hu.extraGroups = [ "networkmanager" ]; + + time.timeZone = "Europe/Berlin"; + + i18n.defaultLocale = "en_US.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "de"; + # useXkbConfig = true; + }; + + nixpkgs.config.allowUnfree = true; + + programs.mtr.enable = true; + programs.gnupg.agent = { + enable = true; + enableSSHSupport = true; + }; + + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa = { + enable = true; + support32Bit = true; }; + pulse.enable = true; + jack.enable = true; }; - services = { - fstrim.enable = true; - btrfs.autoScrub.enable = true; + services.tlp.enable = true; + + nix = { + extraOptions = '' + experimental-features = nix-command flakes + ''; }; - fileSystems = { - # These are system specific. If you have any additional drives that are not - # your root device you can add and mount them here. Added nofail so that you can - # install this configuration on a device without it exploding when you don't have - # these specific partitions. - }; - - system.stateVersion = "24.11"; # [managed by install.sh] { state version } + system.stateVersion = "24.05"; } diff --git a/hosts/x220/disko.nix b/hosts/x220/disko.nix deleted file mode 100644 index e43e24c..0000000 --- a/hosts/x220/disko.nix +++ /dev/null @@ -1,58 +0,0 @@ -{ ... }: - -{ - disko.devices = { - disk = { - master = { - type = "disk"; - device = "/dev/sda"; # [managed by install.sh] - content = { - type = "gpt"; - partitions = { - grub_mbr = { - size = "1M"; - type = "EF02"; - }; - boot = { - size = "1G"; - content = { - type = "filesystem"; - format = "ext4"; - mountpoint = "/boot"; - }; - }; - luks = { - size = "100%"; - content = { - type = "luks"; - name = "crypted"; - content = { - type = "btrfs"; - extraArgs = [ "-f" "-L nixos" ]; - subvolumes = { - /* Do not rename the root partition as it'll break impermanence */ - "/root" = { - mountpoint = "/"; - mountOptions = [ - "noatime" - "compress=zstd" - ]; - }; - - "/nix" = { - mountpoint = "/nix"; - mountOptions = [ - "noatime" - "compress=zstd" - ]; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; -} diff --git a/hosts/x220/hardware-configuration.nix b/hosts/x220/hardware-configuration.nix new file mode 100644 index 0000000..789fd90 --- /dev/null +++ b/hosts/x220/hardware-configuration.nix @@ -0,0 +1,61 @@ +{ config, lib, modulesPath, ... }: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/e0b531cf-b575-4579-b866-9b7265e01b0a"; + fsType = "btrfs"; + options = [ "subvol=root" "compress=zstd" "noatime" "ssd" ]; + }; + + fileSystems."/nix" = { + device = "/dev/disk/by-uuid/e0b531cf-b575-4579-b866-9b7265e01b0a"; + fsType = "btrfs"; + options = [ "subvol=nix" "compress=zstd" "noatime" "ssd" ]; + neededForBoot = true; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/bfe6e556-44e9-427f-9ae6-eddae6c62298"; + fsType = "ext4"; + }; + + boot.initrd.luks.devices."vg".device = "/dev/disk/by-uuid/92b4f484-2c00-47e7-baf6-9f396883e231"; + boot.initrd.availableKernelModules = [ + "ehci_pci" "ahci" "xhci_pci" "usb_storage" "sd_mod" "sdhci_pci" + ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.initrd.postDeviceCommands = lib.mkAfter '' + mkdir /btrfs_tmp + mount ${config.fileSystems."/".device} /btrfs_tmp + if [[ -e /btrfs_tmp/root ]]; then + mkdir -p /btrfs_tmp/old_roots + timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") + mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" + fi + + delete_subvolume_recursively() { + IFS=$'\n' + for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do + delete_subvolume_recursively "/btrfs_tmp/$i" + done + btrfs subvolume delete "$1" + } + + for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do + delete_subvolume_recursively "$i" + done + + btrfs subvolume create /btrfs_tmp/root + umount /btrfs_tmp + ''; + + networking.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} + diff --git a/hosts/x220/packages.nix b/hosts/x220/packages.nix deleted file mode 100644 index d5e2f6f..0000000 --- a/hosts/x220/packages.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ ... }: - -{ - imports = let - modules = ../../modules/nixos; - in [ - "${modules}/core" - "${modules}/hardware/audio" - "${modules}/hardware/cpu/intel" - "${modules}/multimedia/video" - "${modules}/multimedia/art" - "${modules}/multimedia/web" - "${modules}/multimedia/music" - "${modules}/desktop/gnome" - "${modules}/communication" - "${modules}/development" - "${modules}/edv" - ]; -} - diff --git a/hosts/x220/persist.nix b/hosts/x220/persist.nix new file mode 100644 index 0000000..5af2054 --- /dev/null +++ b/hosts/x220/persist.nix @@ -0,0 +1,23 @@ +{ ... }: + +{ + environment.persistence."/nix/persist" = { + hideMounts = true; + directories = [ + "/var/log" + "/var/lib/nixos" + "/var/lib/systemd/coredump" + { + directory = "/var/lib/colord"; + user = "colord"; + group = "colord"; + mode = "u=rwx,g=rx,o="; + } + "/etc/NetworkManager/system-connections" + ]; + files = [ + "/etc/machine-id" + ]; + }; +} + diff --git a/install.sh b/install.sh deleted file mode 100755 index 2c6199b..0000000 --- a/install.sh +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/env sh - -# Author: caem - https://caem.dev - -# install.sh - Installation script for my NixOS configuration -# -# This script aims to automate the deployment of my configuration -# on a new machine. - -args_ensure_extra_arg() { - if [ -z "$2" ] || [ "$(echo "$2" | cut -c 1-1)" = "-" ]; then - >&2 echo "Argument '$1' requires an extra argument. Run --help for more info." - exit 1 - fi -} - -args_ensure_is_set() { - if [ -z "$2" ]; then - >&2 echo "Argument '$1' is required to be set. Please consult the README or run again with --help." - exit 1 - fi -} - -args() { - while [ -n "$1" ]; do - case "$1" in - "-h" | "--help") - echo "" - echo "$0 - Installation script for my NixOS configuration" - echo "" - echo "arguments:" - echo " -h|--help Print this and exit" - echo " -d|--device [device] (required) The device you want to install NixOS on to" - echo " -o|--host [hostname] (required) The host from ./hosts you want to install" - echo " -b|--build Build the system without installing" - echo "" - echo "origin: https://github.com/c4em/caenix" - echo "" - exit 0 - ;; - - "-d" | "--device") - args_ensure_extra_arg "$@" - if [ ! -b "$2" ]; then - >&2 echo "'$2' is not a valid block device. Make sure you selected the right drive" - exit 1 - fi - - CAENIX_INSTALL_DEVICE="$2" - shift 2 - ;; - - "-o" | "--host") - args_ensure_extra_arg "$@" - - if [ ! -d "./hosts/$2" ]; then - >&2 echo "Invalid hostname '$2'. Make sure it exists in ./hosts" - exit 1 - fi - - CAENIX_HOSTNAME="$2" - shift 2 - ;; - "-b" | "--build") - CAENIX_DO_ONLY_BUILD=1 - shift 1 - ;; - *) - >&2 echo "Unrecognized argument '$1'. Run with --help to view accepted arguments." - exit 1 - ;; - esac - done - - args_ensure_is_set "--host" "$CAENIX_HOSTNAME" - if [ -z "$CAENIX_DO_ONLY_BUILD" ]; then - args_ensure_is_set "--device" "$CAENIX_INSTALL_DEVICE" - fi -} - -sed_safe () { - # I got this off of some random StackOverflow answer. Don't put too much trust in this. - printf "%s" "$1" | sed -r 's/([\$\.\*\/\[\\^])/\\\1/g' | sed 's/[]]/\[]]/g' -} - -update_managed_values() { - sed -i 's/\( *device = \)".*"\(; # [managed by install\.sh].*\)/\1"'"$(sed_safe "$CAENIX_INSTALL_DEVICE")"'"\2/' "./hosts/$CAENIX_HOSTNAME/default.nix" - sed -i 's/\( *device = \)".*"\(; #.*\)/\1"'"$(sed_safe "$CAENIX_INSTALL_DEVICE")"'"\2/' "./hosts/$CAENIX_HOSTNAME/disko.nix" - sed -i 's/\( *system.stateVersion = \)".*"\(; #.*\)/\1"'"$(sed_safe "$(nixos-version | cut -f1,2 -d '.')")"'"\2/' "./hosts/$CAENIX_HOSTNAME/default.nix" -} - -build() { - nix build ".#nixosConfigurations.${CAENIX_HOSTNAME}.config.system.build.toplevel" -} - -permissions() { - if [ "$(id -u)" = "0" ]; then - sudo () { - "$@" - } - else - sudo -v - fi -} - -ensure_confirmation() { - printf "\e[1;31m=== ARE YOU SURE YOU WANT TO CONTINUE WITH THE INSTALLATION ===\e[0m\n\n" - printf "This will \e[1;31mIRREVERSIBLY\e[0m wipe all data in '%s'\n" "$CAENIX_INSTALL_DEVICE" - printf "This disk contains following partitions:\n\n" - lsblk -o NAME,SIZE,TYPE,FSTYPE "$CAENIX_INSTALL_DEVICE" - printf "\n" - - printf "Please write 'Yes, do as I say!' to continue with the installation\n> " - read -r install_prompt - if [ "$install_prompt" != "Yes, do as I say!" ]; then - echo "Cancelling installation" - exit 0 - else - CAENIX_CONFIRM_DISK_NUKE="yes" - fi -} - -partition_disk() { - if [ "$CAENIX_CONFIRM_DISK_NUKE" = "yes" ]; then - sudo nix --experimental-features 'flakes nix-command' run github:nix-community/disko/latest -- \ - --mode destroy,format,mount --yes-wipe-all-disks "./hosts/$CAENIX_HOSTNAME/disko.nix" - else - >&2 echo "Aborted installation due to invalid state in the partitioning step." - exit 1 - fi -} - -install() { - yes | sudo nixos-install --no-root-passwd --flake ".#$CAENIX_HOSTNAME" -} - -copy_files_to_new_install() { - username="$(grep user ./flake.nix | sed -e 's/.*user = "\(.*\)";.*/\1/')" - if [ -z "$username" ]; then - >&2 echo "Cannot determine username" - exit 1 - fi - - sudo cp -vr . /mnt/nix/config - sudo mkdir -p "/mnt/nix/persist/home/$username/programming/personal" - sudo ln -svf /nix/config "/mnt/nix/persist/home/$username/programming/personal/caenix" - sudo chown -R 1000:100 "/mnt/nix/persist/home/$username" - sudo chown -R 1000:100 "/mnt/nix/config" -} - -reboot_on_consent() { - printf "\n\nInstallation finished. Would you like to reboot?\n[y/n] > " - read -r do_reboot - if [ "$do_reboot" = "y" ] || [ "$do_reboot" = "Y" ]; then - sudo reboot - fi -} - -main () { - args "$@" - permissions - - if [ -n "$CAENIX_DO_ONLY_BUILD" ]; then - if [ -n "$CAENIX_INSTALL_DEVICE" ]; then - update_managed_values - fi - - build - exit 0 - fi - - ensure_confirmation - update_managed_values - partition_disk - copy_files_to_new_install - install - reboot_on_consent -} - -set -e -main "$@" - diff --git a/lib/default.nix b/lib/default.nix index 89a0986..c62cc11 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,5 +1,7 @@ { lib }: +# todo: Write a function to import all of these automatically + let fs = import ./fs.nix { inherit lib; }; hosts = import ./hosts.nix { inherit lib; }; diff --git a/lib/fs.nix b/lib/fs.nix index 7e44d04..cb8d639 100644 --- a/lib/fs.nix +++ b/lib/fs.nix @@ -5,12 +5,6 @@ path: let dirs = builtins.readDir path; in - builtins.filter (type: dirs.${type} == "directory") (builtins.attrNames dirs); - - getModuleImports = - path: let - files = builtins.attrNames (builtins.removeAttrs (builtins.readDir path) ["default.nix"]); - in - map (file: "${path}/${file}") files; + builtins.filter (name: dirs.${name} == "directory") (builtins.attrNames dirs); } diff --git a/lib/hosts.nix b/lib/hosts.nix index 02cee0a..f94a590 100644 --- a/lib/hosts.nix +++ b/lib/hosts.nix @@ -2,23 +2,15 @@ { mkHosts = { + modules, nixpkgs, inputs, - modules, - user, }: builtins.listToAttrs (builtins.map (host: { name = host; value = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; - modules = modules ++ [ - ../hosts/${host} - ../modules/nixos/user/${user}.nix - ]; - specialArgs = { - inherit inputs lib; - username = user; - cfgPath = ../.; - }; + modules = modules ++ [ ../hosts/${host} ]; + specialArgs = { inherit inputs; }; }; }) (lib.getDirsInDir ../hosts)); } diff --git a/modules/desktop/apps/communication.nix b/modules/desktop/apps/communication.nix new file mode 100644 index 0000000..fe72f8a --- /dev/null +++ b/modules/desktop/apps/communication.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: + +{ + environment.persistence."/nix/persist".users.hu.directories = [ + ".config/Signal" + ".config/vesktop" + ".config/tutanota-desktop" + ".config/tuta_integration" + ".config/Element" + ]; + + environment.systemPackages = with pkgs; [ + tutanota-desktop + signal-desktop + element-desktop + vesktop + ]; +} + diff --git a/modules/desktop/apps/games.nix b/modules/desktop/apps/games.nix new file mode 100644 index 0000000..f380665 --- /dev/null +++ b/modules/desktop/apps/games.nix @@ -0,0 +1,35 @@ +{ pkgs, inputs, ... }: + +{ + environment.persistence."/nix/persist".users.hu.directories = [ + ".steam" + ".local/share/Steam" + ".local/share/honkers-railway-launcher" + ".local/share/anime-game-launcher" + ".local/share/PrismLauncher" + ".xlcore" + ".local/share/Euro Truck Simulator 2" + ".local/share/osu" + ".local/share/Colossal Order" + ]; + + programs.steam = { + enable = true; + remotePlay.openFirewall = false; + dedicatedServer.openFirewall = true; + gamescopeSession.enable = true; + }; + + environment.systemPackages = with pkgs; [ + prismlauncher + protonup-qt + osu-lazer-bin + protontricks + ]; + + imports = [ inputs.aagl.nixosModules.default ]; + nix.settings = inputs.aagl.nixConfig; + + programs.anime-game-launcher.enable = true; +} + diff --git a/modules/desktop/apps/multimedia.nix b/modules/desktop/apps/multimedia.nix new file mode 100644 index 0000000..c11ca5e --- /dev/null +++ b/modules/desktop/apps/multimedia.nix @@ -0,0 +1,41 @@ +{ pkgs, ... }: + +{ + environment.persistence."/nix/persist".users.hu.directories = [ + ".config/OpenTabletDriver" + ".config/tidal-hifi" + ]; + + environment.systemPackages = with pkgs; [ + mpv + imagemagick + ffmpeg-full + yt-dlp + (pkgs.symlinkJoin { + name = "flowblade"; + paths = [ pkgs.flowblade ]; + buildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + rm "$out/bin/flowblade" + echo "#!/bin/sh" > "$out/bin/flowblade" + echo "SDL12COMPAT_NO_QUIT_VIDEO=1 \ + GDK_BACKEND=x11 \ + SDL_VIDEODRIVER=x11 \ + ${pkgs.flowblade}/bin/flowblade" >> "$out/bin/flowblade" + chmod 555 "$out/bin/flowblade" + ''; + }) + gimp + inkscape + krita + tidal-hifi + blender + obs-studio + ]; + + # hardware.opentabletdriver = { + # enable = true; + # daemon.enable = true; + # }; +} + diff --git a/modules/desktop/environments/hyprland.nix b/modules/desktop/environments/hyprland.nix new file mode 100644 index 0000000..459958c --- /dev/null +++ b/modules/desktop/environments/hyprland.nix @@ -0,0 +1,218 @@ +{ pkgs, ...}: + +{ + imports = [ + ../../system/fonts.nix + ../../packages/waybar.nix + ../../packages/rofi.nix + ../../packages/foot.nix + ]; + + environment.systemPackages = with pkgs; [ + hyprpaper + rofi-wayland + foot + wl-clipboard + nautilus + pavucontrol + nvidia-vaapi-driver + ]; + + environment.sessionVariables = { + LIBVA_DRIVER_NAME = "nvidia"; + XDG_SESSION_TYPE = "wayland"; + GBM_BACKEND = "nvidia-drm"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + NVD_BACKEND = "direct"; + MOZ_DISABLE_RDD_SANDBOX = 1; + NIXOS_OZONE_WL = 1; + }; + + programs.hyprland = { + enable = true; + }; + + services.gnome.gnome-keyring.enable = true; + security.pam.services.greetd.enableGnomeKeyring = true; + + systemd.services.greetd.serviceConfig = { + Type = "idle"; + StandardInput = "tty"; + StandardOutput = "tty"; + StandardError = "journal"; + TTYReset = true; + TTYHangup = true; + TTYVTDisallocate = true; + }; + + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --asterisks --cmd hyprland"; + user = "greeter"; + }; + }; + }; + + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-gtk + ]; + }; + + home-manager.users.hu = { + home.pointerCursor = { + gtk.enable = true; + name = "Bibata-Modern-Classic"; + package = pkgs.bibata-cursors; + size = 24; + }; + + dconf.settings = { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + + gtk = { + enable = true; + theme = { + name = "adw-gtk3-dark"; + package = pkgs.adw-gtk3; + }; + + iconTheme = { + name = "Adwaita"; + package = pkgs.adwaita-icon-theme; + }; + }; + + qt = { + enable = true; + platformTheme.name = "adwaita"; + style = { + name = "adwaita-dark"; + package = pkgs.adwaita-qt; + }; + }; + + services.hyprpaper = { + enable = true; + settings = { + ipc = "on"; + splash = false; + preload = [ + "/nix/config/assets/wallpapers/hyprland.jpg" + ]; + wallpaper = [ + ",/nix/config/wallpapers/hyprland.jpg" + ]; + }; + }; + + wayland.windowManager.hyprland = { + enable = true; + systemd = { + enable = true; + variables = [ "--all" ]; + }; + + settings = { + "$mod" = "SUPER"; + "$terminal" = "foot"; + "$menu" = "rofi -show drun"; + + monitor = "DP-1,1920x1080@144,auto,1"; + + cursor = { + no_hardware_cursors = true; + }; + + render = { + explicit_sync = 0; + }; + + input = { + kb_layout = "gb:intl"; + follow_mouse = 1; + }; + + general = { + gaps_in = 3; + gaps_out = 6; + border_size = 2; + layout = "master"; + allow_tearing = true; + "col.inactive_border" = "rgb(242424)"; + "col.active_border" = "rgb(3584E4)"; + }; + + master = { + mfact = 0.5; + }; + + decoration = { + rounding = 5; + blur = { + enabled = true; + size = 4; + passes = 1; + }; + }; + + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + + bind = [ + "$mod, P, exec, $menu" + "$mod, RETURN, exec, $terminal" + ", Scroll_Lock, exec, pavucontrol" + "$mod, f, exec, nautilus" + + ", XF86AudioLowerVolume, exec, wpctl set-volume -l 1.4 @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.4 @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ", Pause, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" + + "$mod SHIFT, C, killactive" + "$mod, SPACE, togglefloating" + "$mod SHIFT, M, exit," + + "$mod SHIFT, RETURN, layoutmsg, swapwithmaster" + "$mod SHIFT, h, layoutmsg, mfact -0.05" + "$mod SHIFT, l, layoutmsg, mfact +0.05" + + "$mod, h, movefocus, l" + "$mod, j, movefocus, d" + "$mod, k, movefocus, u" + "$mod, l, movefocus, r" + + "$mod, 1, workspace, 1" + "$mod, 2, workspace, 2" + "$mod, 3, workspace, 3" + "$mod, 4, workspace, 4" + "$mod, 5, workspace, 5" + "$mod, 6, workspace, 6" + "$mod, 7, workspace, 7" + "$mod, 8, workspace, 8" + "$mod, 9, workspace, 9" + + "$mod SHIFT, 1, movetoworkspace, 1" + "$mod SHIFT, 2, movetoworkspace, 2" + "$mod SHIFT, 3, movetoworkspace, 3" + "$mod SHIFT, 4, movetoworkspace, 4" + "$mod SHIFT, 5, movetoworkspace, 5" + "$mod SHIFT, 6, movetoworkspace, 6" + "$mod SHIFT, 7, movetoworkspace, 7" + "$mod SHIFT, 8, movetoworkspace, 8" + "$mod SHIFT, 9, movetoworkspace, 9" + ]; + }; + }; + }; +} + diff --git a/modules/desktop/environments/kde.nix b/modules/desktop/environments/kde.nix new file mode 100644 index 0000000..ea7bd62 --- /dev/null +++ b/modules/desktop/environments/kde.nix @@ -0,0 +1,209 @@ +{ pkgs, ... }: + +let + sddm-background-drv = pkgs.stdenvNoCC.mkDerivation { + name = "sddm-background-drv"; + src = ../../../assets/wallpapers; + dontUnpack = true; + installPhase = '' + cp $src/kde.png $out + ''; + }; +in { + imports = [ + ../../system/fonts.nix + ]; + + environment.persistence."/nix/persist".directories = [ + "/var/lib/AccountsService/" + ]; + + environment.persistence."/nix/persist".users.hu.directories = [ + ".local/share/kwalletd" + ".local/share/baloo" + ".local/share/dolphin" + ]; + + environment.persistence."/nix/persist".users.hu.files = [ + ".config/kwinoutputconfig.json" # https://github.com/nix-community/plasma-manager/issues/172 + ".local/state/konsolestaterc" + ]; + + networking.networkmanager.enable = true; + users.users.hu.extraGroups = [ "networkmanager" ]; + + environment.sessionVariables = { + LIBVA_DRIVER_NAME = "nvidia"; + XDG_SESSION_TYPE = "wayland"; + GBM_BACKEND = "nvidia-drm"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + NVD_BACKEND = "direct"; + NIXOS_OZONE_WL = 1; + }; + + services.desktopManager.plasma6.enable = true; + services.displayManager.sddm = { + enable = true; + wayland.enable = true; + }; + + environment.plasma6.excludePackages = with pkgs.kdePackages; [ + plasma-browser-integration + khelpcenter + krdp + ]; + + environment.systemPackages = with pkgs; [ + nvidia-vaapi-driver + kdePackages.sddm-kcm + (pkgs.writeTextDir "share/sddm/themes/breeze/theme.conf.user" '' + [General] + background=${sddm-background-drv} + '') + networkmanager-openvpn + wl-clipboard + ]; + + home-manager.users.hu = { + dconf.settings = { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + + gtk = { + gtk2.configLocation = "/home/hu/.config/gtk-2.0/gtkrc"; + enable = true; + theme = { + name = "Breeze"; + package = pkgs.kdePackages.breeze-gtk; + }; + }; + + programs.konsole = { + enable = true; + defaultProfile = "custom"; + customColorSchemes = { + "custom" = ../../packages/konsole/custom.colorscheme; + }; + profiles = { + custom = { + name = "custom"; + colorScheme = "custom"; + font = { + name = "Go Mono Nerd Font"; + size = 12; + }; + }; + }; + }; + + programs.plasma = { + enable = true; + workspace = { + lookAndFeel = "org.kde.breezedark.desktop"; + wallpaper = "/nix/config/assets/wallpapers/kde.png"; + }; + + panels = [ + { + location = "left"; + floating = true; + widgets = [ + { + kickoff = { + icon = "nix-snowflake-white"; + }; + } + { + iconTasks = { + launchers = [ + "applications:org.kde.dolphin.desktop" + "applications:org.kde.konsole.desktop" + "applications:firefox-esr.desktop" + ]; + }; + } + "org.kde.plasma.marginsseparator" + { + systemTray = { + icons = { + spacing = "small"; + }; + }; + } + { + digitalClock = { + calendar.firstDayOfWeek = "monday"; + time.format = "24h"; + date.enable = false; + }; + } + "org.kde.plasma.pager" + ]; + } + ]; + + powerdevil = { + AC = { + autoSuspend.action = "nothing"; + dimDisplay.enable = false; + powerButtonAction = "hibernate"; + }; + }; + + shortcuts = { + kwin = { + "Switch to Desktop 1" = "Meta+1"; + "Switch to Desktop 2" = "Meta+2"; + "Switch to Desktop 3" = "Meta+3"; + "Switch to Desktop 4" = "Meta+4"; + "Switch to Desktop 5" = "Meta+5"; + "Switch to Desktop 6" = "Meta+6"; + "Switch to Desktop 7" = "Meta+7"; + "Switch to Desktop 8" = "Meta+8"; + "Switch to Desktop 9" = "Meta+9"; + + # Don't blame me for this. This is all the doing of kwin. + # You're going to have to adjust this to your layout. + "Window to Desktop 1" = "Meta+!"; + "Window to Desktop 2" = "Meta+\""; + "Window to Desktop 3" = "Meta+£"; + "Window to Desktop 4" = "Meta+$"; + "Window to Desktop 5" = "Meta+%"; + "Window to Desktop 6" = "Meta+^"; + "Window to Desktop 7" = "Meta+&"; + "Window to Desktop 8" = "Meta+*"; + "Window to Desktop 9" = "Meta+("; + }; + }; + + configFile = { + kwinrc = { + Desktops = { + Number = { + value = 9; + }; + Rows = { + value = 3; + }; + }; + }; + + plasmaashellrc = { + PlasmaViews = { + panelOpacity = 2; + }; + }; + + kxkbrc = { + Layout = { + LayoutList = "gb"; + Use = true; + }; + }; + }; + }; + }; +} + diff --git a/modules/desktop/environments/river.nix b/modules/desktop/environments/river.nix new file mode 100644 index 0000000..2b2cd8c --- /dev/null +++ b/modules/desktop/environments/river.nix @@ -0,0 +1,305 @@ +{ pkgs, ...}: + +{ + imports = [ + ../../system/fonts.nix + ../../packages/foot.nix + ]; + + nixpkgs.overlays = [ + (final: prev: { + sandbar = prev.sandbar.overrideAttrs (old: { + src = prev.fetchFromGitHub { + owner = "kolunmi"; + repo = "sandbar"; + rev = "e64a8b788d086cdf4ec44b51e62bdc7b6b5f8165"; + hash = "sha256-dNYYlm5CEdnvLjskrPJgquptIQpYgU+gxOu+bt+7sbw="; + }; + }); + }) + ]; + + environment.systemPackages = with pkgs; [ + foot # to be replaced with ghostty + wl-clipboard + sandbar + pamixer + pavucontrol + tofi + swaybg + fnott + slurp + wf-recorder + grim + libnotify + seahorse + ]; + + environment.sessionVariables = { + NIXOS_OZONE_WL = 1; + }; + + programs.river.enable = true; + + services.gnome.gnome-keyring.enable = true; + security.pam.services.greetd.enableGnomeKeyring = true; + + systemd.services.greetd.serviceConfig = { + Type = "idle"; + StandardInput = "tty"; + StandardOutput = "tty"; + StandardError = "journal"; + TTYReset = true; + TTYHangup = true; + TTYVTDisallocate = true; + }; + + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --asterisks --cmd river"; + user = "greeter"; + }; + }; + }; + + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-gtk + ]; + }; + + home-manager.users.hu = { + home.file."/home/hu/.config/tofi/config" = { + text = '' + width = 100% + height = 100% + border-width = 0 + outline-width = 0 + padding-left = 35% + padding-top = 35% + result-spacing = 25 + num-results = 5 + font = Go Mono Nerd Font + background-color = #000A + ''; + }; + + home.file."/home/hu/.config/river/bar" = { + text = '' + #!/usr/bin/env sh + + FIFO="$XDG_RUNTIME_DIR/sandbar" + [ -e "$FIFO" ] && rm -f "$FIFO" + mkfifo "$FIFO" + + while cat "$FIFO"; do :; done | sandbar \ + -hide-normal-mode \ + -no-layout \ + -font "Go Mono Nerd Font:12" \ + -active-fg-color "#bbbbbb" \ + -active-bg-color "#222222" \ + -inactive-fg-color "#888888" \ + -inactive-bg-color "#111111" \ + -urgent-fg-color "#ab5656" \ + -title-fg-color "#bbbbbb" \ + -title-bg-color "#222222" + ''; + executable = true; + }; + + home.file."/home/hu/.config/river/status" = { + text = '' + #!/usr/bin/env sh + + FIFO="$XDG_RUNTIME_DIR/sandbar" + [ -e "$FIFO" ] || mkfifo "$FIFO" + + bat () { + read -r bat_status < /sys/class/power_supply/BAT0/status + read -r bat_capacity < /sys/class/power_supply/BAT0/capacity + case "$bat_status" in + "Charging") + bat_status="󱟦" + ;; + "Discharging") + bat_status="󱟤" + ;; + "Full") + bat_status="󱟢" + ;; + "Not charging") + bat_status="󱞜" + ;; + "Empty") + bat_status="󱟨" + ;; + + esac + bat="[$bat_status $bat_capacity]" + } + + datetime () { + dat="[$(date "+%H:%M")]" + } + + while true; do + if [ -d /sys/class/power_supply/BAT0/ ]; then + bat + fi + datetime + + echo "all status $bat$dat" > "$FIFO" + sleep 20 + done + ''; + executable = true; + }; + + wayland.windowManager.river = { + enable = true; + systemd.enable = true; + settings = { + map.normal = { + "Super+Shift Return" = "spawn foot"; + "Super+Shift C" = "close"; + "Super J" = "focus-view next"; + "Super K"= "focus-view previous"; + "Super+Shift J" = "swap next"; + "Super+Shift K" = "swap previous"; + "Super Space" = "toggle-float"; + "Super+Shift R" = "spawn ~/.config/river/init"; + "Super+Shift Q" = "exit"; + "Super H" = "send-layout-cmd rivertile 'main-ratio -0.05'"; + "Super L" = "send-layout-cmd rivertile 'main-ratio +0.05'"; + "Super P" = "spawn '$(tofi-drun)'"; + "Super S" = "spawn ~/.config/river/screenshot.sh"; + "Super O" = "spawn ~/.config/river/screencast.sh"; + "Super+Shift O" = "spawn ~/.config/river/screencast.sh audio"; + + "None XF86AudioRaiseVolume" = "spawn 'pamixer -i 5'"; + "None XF86AudioLowerVolume" = "spawn 'pamixer -d 5'"; + "None XF86AudioMute" = "spawn 'pamixer --toggle-mute'"; + "None XF86AudioMicMute" = "spawn 'pamixer --default-source --toggle-mute'"; + }; + + map-pointer.normal = { + "Super BTN_LEFT" = "move-view"; + "Super BTN_RIGHT" = "resize-view"; + }; + + keyboard-layout = "de"; + default-layout = "rivertile"; + rule-add."-app-id" = { + "'bar'" = "csd"; + }; + set-repeat = "50 300"; + spawn = [ + "'swaybg -i /nix/config/assets/wallpapers/river.png'" + "/home/hu/.config/river/status" + "/home/hu/.config/river/bar" + "'fnott --config /home/hu/.config/fnott/fnott.conf.ini'" + "'gnome-keyring-daemon --start'" + ]; + border-width = 1; + border-color-focused = "0x333333"; + border-color-unfocused = "0x000000"; + }; + + extraConfig = " + for i in $(seq 1 9); do + tags=$((1 << ($i - 1))) + riverctl map normal Super $i set-focused-tags $tags + riverctl map normal Super+Shift $i set-view-tags $tags + done + rivertile -main-ratio 0.5 -view-padding 0 -outer-padding 0 + "; + }; + + dconf.settings = { + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; + }; + + gtk = { + enable = true; + theme = { + name = "adw-gtk3-dark"; + package = pkgs.adw-gtk3; + }; + + iconTheme = { + name = "Adwaita"; + package = pkgs.adwaita-icon-theme; + }; + }; + + home.file."/home/hu/.config/river/screenshot.sh" = { + executable = true; + text = '' + #!/usr/bin/env sh + + mkdir -p "$HOME/images/screenshots" + screenshot_file="$HOME/images/screenshots/$(date +%s).png" + area="$(slurp)" + if [ "$area" = "selection cancelled" ]; then + exit 0 + fi + grim -g "$area" "$screenshot_file" + notify-send "Screenshot saved" "$screenshot_file" + wl-copy < "$screenshot_file" + ''; + }; + + home.file."/home/hu/.config/river/screencast.sh" = { + executable = true; + text = '' + #!/usr/bin/env sh + + if [ -n "$(pidof wf-recorder)" ]; then + pkill --signal=SIGINT wf-recorder + notify-send "Screencast saved" "$(cat "$HOME/.cache/last_screencast")" + wl-copy < "$(cat "$HOME/.cache/last_screencast")" + exit 0 + fi + + mkdir -p "$HOME/videos/screencasts/" + screencast_file="$HOME/videos/screencasts/$(date +%s).mp4" + area="$(slurp)" + if [ "$area" = "selection cancelled" ]; then + exit 0 + fi + + echo "$screencast_file" > "$HOME/.cache/last_screencast" + if [ "$1" = "audio" ]; then + wf-recorder -g "$area" --file="$screencast_file" --audio + else + wf-recorder -g "$area" --file="$screencast_file" + fi + ''; + }; + + services.fnott = { + enable = true; + configFile = "/home/hu/.config/fnott/fnott.conf.ini"; + }; + + home.file."/home/hu/.config/fnott/fnott.conf.ini" = { + text = '' + title-font=Go Mono Nerd Font + body-font=Go Mono Nerd Font + + background=111111ff + title-color=888888ff + body-color=888888ff + summary-color=888888ff + + default-timeout=10 + ''; + }; + }; +} + diff --git a/modules/home/caem/core/default.nix b/modules/home/caem/core/default.nix deleted file mode 100644 index 99b31f4..0000000 --- a/modules/home/caem/core/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} - diff --git a/modules/home/caem/core/security.nix b/modules/home/caem/core/security.nix deleted file mode 100644 index 1e9c42b..0000000 --- a/modules/home/caem/core/security.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ config, ... }: - -{ - programs.gpg = { - enable = true; - homedir = "${config.xdg.dataHome}/gnupg"; - }; -} diff --git a/modules/home/caem/core/zsh/conf.d/fzf-tab.zsh b/modules/home/caem/core/zsh/conf.d/fzf-tab.zsh deleted file mode 100644 index 94b43b4..0000000 --- a/modules/home/caem/core/zsh/conf.d/fzf-tab.zsh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env zsh - -zstyle ':completion:*:git-checkout:*' sort false -zstyle ':completion:*:descriptions' format '[%d]' -zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} -zstyle ':completion:*' menu no -zstyle ':fzf-tab:*' fzf-flags --color 16 --bind=tab:accept -[ -n "$TMUX" ] && zstyle ':fzf-tab:*' fzf-command ftb-tmux-popup diff --git a/modules/home/caem/core/zsh/conf.d/ps1.zsh b/modules/home/caem/core/zsh/conf.d/ps1.zsh deleted file mode 100644 index baa60ee..0000000 --- a/modules/home/caem/core/zsh/conf.d/ps1.zsh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env zsh - -local c0=$'%{\e[0m%}' -local c31=$'%{\e[31m%}' -local c33=$'%{\e[33m%}' -local c34=$'%{\e[34m%}' -local c35=$'%{\e[35m%}' -local c38=$'%{\e[38m%}' - -local nix_shell_ps1_t=" $c34{$c33󱄅 shell$c34}$c0" -local path_no_ghostty="$(echo "$PATH" | sed -e 's/:\/nix\/store\/.*-ghostty-.*\/bin://g')" -if [ -n "$IN_NIX_SHELL" ]; then - local nix_shell_ps1="$nix_shell_ps1_t" -elif [[ "$path_no_ghostty" == *"/nix/store"* ]]; then - IN_NIX_SHELL=true - local nix_shell_ps1="$nix_shell_ps1_t" -fi - -setopt prompt_subst -autoload -Uz vcs_info -zstyle ':vcs_info:*' enable git -zstyle ':vcs_info:*' formats " ${c34}${c0}${c31}(%b)${c0}" -precmd () { vcs_info } - -export PS1='${c38}[${c35}%3~${c0}${vcs_info_msg_0_}${nix_shell_ps1}${c38}]${c0}# ' diff --git a/modules/home/caem/core/zsh/default.nix b/modules/home/caem/core/zsh/default.nix deleted file mode 100644 index b145b3c..0000000 --- a/modules/home/caem/core/zsh/default.nix +++ /dev/null @@ -1,87 +0,0 @@ -{ pkgs, config, ... }: - -{ - home.packages = with pkgs; [ - lsd - bat - fd - ripgrep - fzf - tre-command - btop - zsh-completions - nix-zsh-completions - ]; - - programs.bat = { - enable = true; - config = { - theme = "ansi"; - }; - }; - - programs.btop = { - enable = true; - settings = { - color_theme = "TTY"; - }; - }; - - home.file.".zshenv".enable = false; - home.file.".config/zsh/conf.d" = { - source = ./conf.d; - recursive = true; - }; - - programs.zsh = { - enable = true; - enableCompletion = true; - autosuggestion.enable = true; - syntaxHighlighting.enable = true; - dotDir = ".config/zsh"; - autocd = true; - - history.size = 10000; - history.ignoreAllDups = true; - /* Not persisted on purpose */ - history.path = "${config.xdg.cacheHome}/zsh_history"; - - shellAliases = { - cat = "bat --paging=never --wrap=never --style='changes,snip,numbers'"; - ls = "lsd"; - tree = "tre"; - }; - - initExtra = '' - alias -g -- -h='-h 2>&1 | bat --language=help --style=plain' - alias -g -- --help='--help 2>&1 | bat --language=help --style=plain' - - for dotfile in "$ZDOTDIR/conf.d/"*; do - source "$dotfile" - done - ''; - - plugins = [ - { - name = "zsh-nix-shell"; - file = "nix-shell.plugin.zsh"; - src = pkgs.fetchFromGitHub { - owner = "chisui"; - repo = "zsh-nix-shell"; - rev = "v0.8.0"; - sha256 = "1lzrn0n4fxfcgg65v0qhnj7wnybybqzs4adz7xsrkgmcsr0ii8b7"; - }; - } - { - name = "fzf-tab"; - file = "fzf-tab.plugin.zsh"; - src = pkgs.fetchFromGitHub { - owner = "Aloxaf"; - repo = "fzf-tab"; - rev = "v1.2.0"; - sha256 = "sha256-q26XVS/LcyZPRqDNwKKA9exgBByE0muyuNb0Bbar2lY="; - }; - } - ]; - }; -} diff --git a/modules/home/caem/default.nix b/modules/home/caem/default.nix deleted file mode 100644 index 851dbf7..0000000 --- a/modules/home/caem/default.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ lib, config, ... }: - -{ - imports = [ - ./packages.nix - ]; - - home = { - username = "caem"; - homeDirectory = "/home/caem"; - stateVersion = "24.11"; - }; - - home.file."${config.xdg.configHome}/user-dirs.dirs".force = lib.mkForce true; - xdg = { - enable = true; - userDirs = { - enable = true; - - documents = "${config.home.homeDirectory}/documents"; - download = "${config.home.homeDirectory}/download"; - music = "${config.home.homeDirectory}/music"; - pictures = "${config.home.homeDirectory}/images"; - videos = "${config.home.homeDirectory}/videos"; - - /* I do not use these */ - desktop = "${config.xdg.dataHome}/xdg/desktop"; - publicShare = "${config.xdg.dataHome}/xdg/publicShare"; - templates = "${config.xdg.dataHome}/xdg/templates"; - }; - }; -} diff --git a/modules/home/caem/desktop/gnome/default.nix b/modules/home/caem/desktop/gnome/default.nix deleted file mode 100644 index a57294c..0000000 --- a/modules/home/caem/desktop/gnome/default.nix +++ /dev/null @@ -1,124 +0,0 @@ -{ pkgs, lib, inputs, config, ... }: - -let - picture-uri = if builtins.hasAttr "wallpaper" inputs.secrets.paths - then builtins.toString inputs.secrets.paths.wallpaper - else builtins.toString ../../../../../assets/wallpaper.jpg; -in { - xdg.mimeApps = { - enable = true; - defaultApplications = { - "application/pdf" = "org.gnome.Evince.desktop"; - "image/avif" = "org.gnome.Loupe.desktop"; - "image/apng" = "org.gnome.Loupe.desktop"; - "image/bmp" = "org.gnome.Loupe.desktop"; - "image/gif" = "org.gnome.Loupe.desktop"; - "image/jpeg" = "org.gnome.Loupe.desktop"; - "image/vnd.microsoft.icon" = "org.gnome.Loupe.desktop"; - "image/png" = "org.gnome.Loupe.desktop"; - "image/tiff" = "org.gnome.Loupe.desktop"; - "image/webp" = "org.gnome.Loupe.desktop"; - "video/mp4" = "umpv.desktop"; - "video/mpeg" = "umpv.desktop"; - "video/ogg" = "umpv.desktop"; - "video/webm" = "umpv.desktop"; - "video/x-matroska" = "umpv.desktop"; - "video/x-msvideo" = "umpv.desktop"; - "video/quicktime" = "umpv.desktop"; - "x-scheme-handler/mailto" = "tutanota-desktop.desktop"; - }; - }; - - gtk = { - enable = true; - gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; - gtk3.extraConfig = { - gtk-application-prefer-dark-theme = true; - }; - }; - - dconf.settings = { - "org/gnome/desktop/background".picture-uri = picture-uri; - "org/gnome/desktop/background".picture-uri-dark = picture-uri; - "org/gnome/desktop/screensaver".picture-uri = picture-uri; - "org/gnome/desktop/interface" = { - accent-color = "slate"; - color-scheme = "prefer-dark"; - }; - "org/gnome/desktop/input-sources" = { - sources = [ - (lib.hm.gvariant.mkTuple ["xkb" "de"]) - ]; - }; - "org/gnome/desktop/peripherals/mouse" = { - accel-profile = "flat"; - }; - "org/gnome/shell" = { - disable-user-extensions = false; - allow-extension-installation = false; - enabled-extensions = with pkgs.gnomeExtensions; [ - caffeine.extensionUuid - accent-directories.extensionUuid - just-perfection.extensionUuid - quick-settings-tweaker.extensionUuid - ]; - favorite-apps = [ - "firefox-esr.desktop" - "com.mitchellh.ghostty.desktop" - "org.gnome.Nautilus.desktop" - ]; - }; - "org/gnome/shell/extensions/just-perfection" = { - calendar = false; - events-button = false; - quick-settings-dark-mode = false; - world-clock = false; - }; - "org/gnome/shell/extensions/quick-settings-tweaks" = { - notifications-enabled = false; - }; - "org/gnome/desktop/wm/preferences" = { - audible-bell = false; - num-workspaces = 9; - }; - "org/gnome/mutter" = { - dynamic-workspaces = false; - }; - "org/gnome/shell/window-switcher" = { - current-workspace-only = true; - }; - "org/gnome/shell/keybindings" = { - switch-windows = ["Tab"]; - activate-window-menu = []; - switch-to-application-1 = []; - switch-to-application-2 = []; - switch-to-application-3 = []; - switch-to-application-4 = []; - switch-to-application-5 = []; - switch-to-application-6 = []; - switch-to-application-7 = []; - switch-to-application-8 = []; - switch-to-application-9 = []; - }; - "org/gnome/desktop/wm/keybindings" = { - switch-to-workspace-1 = ["1"]; - switch-to-workspace-2 = ["2"]; - switch-to-workspace-3 = ["3"]; - switch-to-workspace-4 = ["4"]; - switch-to-workspace-5 = ["5"]; - switch-to-workspace-6 = ["6"]; - switch-to-workspace-7 = ["7"]; - switch-to-workspace-8 = ["8"]; - switch-to-workspace-9 = ["9"]; - move-to-workspace-1 = ["1"]; - move-to-workspace-2 = ["2"]; - move-to-workspace-3 = ["3"]; - move-to-workspace-4 = ["4"]; - move-to-workspace-5 = ["5"]; - move-to-workspace-6 = ["6"]; - move-to-workspace-7 = ["7"]; - move-to-workspace-8 = ["8"]; - move-to-workspace-9 = ["9"]; - }; - }; -} diff --git a/modules/home/caem/development/default.nix b/modules/home/caem/development/default.nix deleted file mode 100644 index e4fb51f..0000000 --- a/modules/home/caem/development/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} diff --git a/modules/home/caem/development/emacs/default.nix b/modules/home/caem/development/emacs/default.nix deleted file mode 100644 index 7fb5087..0000000 --- a/modules/home/caem/development/emacs/default.nix +++ /dev/null @@ -1,33 +0,0 @@ -{ pkgs, config, ... }: - -let - emacs-package = pkgs.emacs30-pgtk; -in { - services.emacs = { - enable = true; - package = emacs-package; - socketActivation.enable = true; - }; - - programs.emacs = { - enable = true; - package = emacs-package; - extraPackages = epkgs: with epkgs; [ - treesit-grammars.with-all-grammars - vterm - paredit - nix-mode - meson-mode - rainbow-delimiters - darktooth-theme - smex - amx - # Why the fuck would you put a '+' in your package's name - (builtins.getAttr "ido-completing-read+" epkgs) - no-littering - treesit-auto - ]; - }; - - home.file."${config.xdg.configHome}/emacs".source = ./emacs.d; -} diff --git a/modules/home/caem/development/emacs/emacs.d/core/appearance.el b/modules/home/caem/development/emacs/emacs.d/core/appearance.el deleted file mode 100644 index d94f5cd..0000000 --- a/modules/home/caem/development/emacs/emacs.d/core/appearance.el +++ /dev/null @@ -1,27 +0,0 @@ -(tool-bar-mode 0) -(menu-bar-mode 0) -(scroll-bar-mode 0) - -(setq display-line-numbers-type 'relative) -(global-display-line-numbers-mode t) -(global-hl-line-mode t) - -(add-to-list 'default-frame-alist - '(font . "Go Mono Nerd Font-12")) - -(let ((opacity 95)) - (set-frame-parameter nil 'alpha-background opacity) - (add-to-list 'default-frame-alist `(alpha-background . ,opacity))) - -(setq compilation-scroll-output t) - -(use-package rainbow-delimiters - :ensure nil - :hook - ((prog-mode . rainbow-delimiters-mode))) - -(use-package darktooth-theme - :ensure nil - :config - (load-theme 'darktooth-dark t) - (set-face-background 'hl-line "#262626")) diff --git a/modules/home/caem/development/emacs/emacs.d/core/ido.el b/modules/home/caem/development/emacs/emacs.d/core/ido.el deleted file mode 100644 index d008cfc..0000000 --- a/modules/home/caem/development/emacs/emacs.d/core/ido.el +++ /dev/null @@ -1,17 +0,0 @@ -(use-package smex - :ensure nil - :bind - (("M-x" . smex) - ("M-X" . smex-major-mode-commands)) - :config (smex-initialize)) - -(use-package ido-completing-read+ - :ensure nil - :config (ido-ubiquitous-mode 1)) - -(use-package amx - :ensure nil - :config (amx-mode 1)) - -(ido-mode 1) -(ido-everywhere 1) diff --git a/modules/home/caem/development/emacs/emacs.d/core/init.el b/modules/home/caem/development/emacs/emacs.d/core/init.el deleted file mode 100644 index c7fdc53..0000000 --- a/modules/home/caem/development/emacs/emacs.d/core/init.el +++ /dev/null @@ -1,6 +0,0 @@ -(rei/load "nix.el") -(rei/load "repositories.el") -(rei/load "litter.el") -(rei/load "appearance.el") -(rei/load "tree-sitter.el") -(rei/load "ido.el") diff --git a/modules/home/caem/development/emacs/emacs.d/core/litter.el b/modules/home/caem/development/emacs/emacs.d/core/litter.el deleted file mode 100644 index e5622c1..0000000 --- a/modules/home/caem/development/emacs/emacs.d/core/litter.el +++ /dev/null @@ -1,10 +0,0 @@ -(setq custom-file "/dev/null" - inhibit-splash-screen t - backup-by-copying t) - -(use-package no-littering - :ensure nil - :init - (setq no-littering-etc-directory (file-name-concat (xdg-data-home) "emacs") - no-littering-var-directory (file-name-concat (xdg-data-home) "emacs")) - (no-littering-theme-backups)) diff --git a/modules/home/caem/development/emacs/emacs.d/core/nix.el b/modules/home/caem/development/emacs/emacs.d/core/nix.el deleted file mode 100644 index 7966a88..0000000 --- a/modules/home/caem/development/emacs/emacs.d/core/nix.el +++ /dev/null @@ -1,9 +0,0 @@ -;; If we're already using Nix, make sure we're only using -;; the Nix provided packages instead of downloading them from -;; (m)elpa and co as it's not really necassary as we've already -;; got Nix to do this job and this is a much cleaner solution. -(if (file-exists-p "/nix/store") - (setq using-nix t - use-package-always-ensure nil) - (setq using-nix nil - use-package-always-ensure t)) diff --git a/modules/home/caem/development/emacs/emacs.d/core/repositories.el b/modules/home/caem/development/emacs/emacs.d/core/repositories.el deleted file mode 100644 index e47f362..0000000 --- a/modules/home/caem/development/emacs/emacs.d/core/repositories.el +++ /dev/null @@ -1,10 +0,0 @@ -(require 'package) -(setq package-user-dir (file-name-concat (xdg-data-home) "emacs" "elpa")) - -(if using-nix - (progn - (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) - (package-initialize)) - (progn - (setq package-archives nil) - (package-initialize))) diff --git a/modules/home/caem/development/emacs/emacs.d/core/tree-sitter.el b/modules/home/caem/development/emacs/emacs.d/core/tree-sitter.el deleted file mode 100644 index 7d5b714..0000000 --- a/modules/home/caem/development/emacs/emacs.d/core/tree-sitter.el +++ /dev/null @@ -1,11 +0,0 @@ -(require 'treesit) - -(setq treesit-font-lock-level 4) - -(use-package treesit-auto - :ensure nil - :custom - (treesit-auto-install 'prompt) - :config - (treesit-auto-add-to-auto-mode-alist 'all) - (global-treesit-auto-mode)) diff --git a/modules/home/caem/development/emacs/emacs.d/init.el b/modules/home/caem/development/emacs/emacs.d/init.el deleted file mode 100644 index f10a38b..0000000 --- a/modules/home/caem/development/emacs/emacs.d/init.el +++ /dev/null @@ -1,7 +0,0 @@ -(require 'xdg) -(setq user-emacs-directory (file-name-concat (xdg-config-home) "emacs")) -(add-to-list 'load-path user-emacs-directory) - -(require 'rei) -(rei/load "core") -(rei/load "modes") diff --git a/modules/home/caem/development/emacs/emacs.d/modes/c-mode.el b/modules/home/caem/development/emacs/emacs.d/modes/c-mode.el deleted file mode 100644 index 8a0cb2e..0000000 --- a/modules/home/caem/development/emacs/emacs.d/modes/c-mode.el +++ /dev/null @@ -1,4 +0,0 @@ -(add-hook 'c-mode-hook - (lambda () - (setq indent-tabs-mode nil) - (setq tab-width 4))) diff --git a/modules/home/caem/development/emacs/emacs.d/modes/init.el b/modules/home/caem/development/emacs/emacs.d/modes/init.el deleted file mode 100644 index 0ba22b8..0000000 --- a/modules/home/caem/development/emacs/emacs.d/modes/init.el +++ /dev/null @@ -1,12 +0,0 @@ -(use-package paredit - :ensure nil - :hook - ((prog-mode . enable-paredit-mode)) - :config - (show-paren-mode 1) - (setq show-paren-style 'parenthesis)) - -(rei/load "nix-mode.el") -(rei/load "c-mode.el") -(rei/load "lisp") -(rei/load "meson-mode.el") diff --git a/modules/home/caem/development/emacs/emacs.d/modes/lisp/elisp-mode.el b/modules/home/caem/development/emacs/emacs.d/modes/lisp/elisp-mode.el deleted file mode 100644 index 0585081..0000000 --- a/modules/home/caem/development/emacs/emacs.d/modes/lisp/elisp-mode.el +++ /dev/null @@ -1,4 +0,0 @@ -(add-hook 'emacs-lisp-mode-hook - (lambda () - (setq indent-tabs-mode nil) - (setq tab-width 2))) diff --git a/modules/home/caem/development/emacs/emacs.d/modes/lisp/init.el b/modules/home/caem/development/emacs/emacs.d/modes/lisp/init.el deleted file mode 100644 index 2ebd4c4..0000000 --- a/modules/home/caem/development/emacs/emacs.d/modes/lisp/init.el +++ /dev/null @@ -1,2 +0,0 @@ -(rei/load "scheme-mode.el") -(rei/load "elisp-mode.el") diff --git a/modules/home/caem/development/emacs/emacs.d/modes/lisp/scheme-mode.el b/modules/home/caem/development/emacs/emacs.d/modes/lisp/scheme-mode.el deleted file mode 100644 index 9d12381..0000000 --- a/modules/home/caem/development/emacs/emacs.d/modes/lisp/scheme-mode.el +++ /dev/null @@ -1,4 +0,0 @@ -(add-hook 'scheme-mode-hook - (lambda () - (setq indent-tabs-mode nil) - (setq tab-wdith 2))) diff --git a/modules/home/caem/development/emacs/emacs.d/modes/meson-mode.el b/modules/home/caem/development/emacs/emacs.d/modes/meson-mode.el deleted file mode 100644 index f3b261d..0000000 --- a/modules/home/caem/development/emacs/emacs.d/modes/meson-mode.el +++ /dev/null @@ -1,3 +0,0 @@ -(use-package meson-mode - :ensure nil - :mode ("meson\\.build\\'")) diff --git a/modules/home/caem/development/emacs/emacs.d/modes/nix-mode.el b/modules/home/caem/development/emacs/emacs.d/modes/nix-mode.el deleted file mode 100644 index 690373e..0000000 --- a/modules/home/caem/development/emacs/emacs.d/modes/nix-mode.el +++ /dev/null @@ -1,8 +0,0 @@ -(use-package nix-mode - :ensure nil - :mode ("\\.nix\\'" "\\.nix.in\\'") - :hook - (nix-mode . (lambda () - (paredit-mode -1))) - :init - (global-nix-prettify-mode 1)) diff --git a/modules/home/caem/development/emacs/emacs.d/rei.el b/modules/home/caem/development/emacs/emacs.d/rei.el deleted file mode 100644 index 65452f6..0000000 --- a/modules/home/caem/development/emacs/emacs.d/rei.el +++ /dev/null @@ -1,13 +0,0 @@ -(provide 'rei) - -(defun rei/load (path) - "Load a configuraion file relative to the current file. -When the specified path is a directory it will look for a init.el file to load." - (when load-file-name - (let ((fp (file-name-concat (file-name-directory load-file-name) path))) - (if (file-directory-p fp) - (let ((fdp (file-name-concat fp "init.el"))) - (if (file-exists-p fdp) - (load fdp) - (error "Cannot load %s directory as it's missing an init.el file." path))) - (load fp))))) diff --git a/modules/home/caem/development/ghostty.nix b/modules/home/caem/development/ghostty.nix deleted file mode 100644 index 141aa9c..0000000 --- a/modules/home/caem/development/ghostty.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ ... }: - -{ - programs.ghostty = { - enable = true; - enableZshIntegration = true; - settings = let - literally_a_billion_million = 10000000000000; - in { - font-family = "Go Mono Nerd Font"; - font-size = 12; - background-opacity = 0.85; - scrollback-limit = literally_a_billion_million; - theme = "Tomorrow Night Burns"; - window-padding-x = 4; - window-padding-y = 4; - }; - }; -} diff --git a/modules/home/caem/development/git.nix b/modules/home/caem/development/git.nix deleted file mode 100644 index cd79c94..0000000 --- a/modules/home/caem/development/git.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ pkgs, ... }: - -{ - home.packages = with pkgs; [ - git - ]; - - programs.git = { - enable = true; - userName = "caem"; - userEmail = "me@caem.dev"; - signing = { - signByDefault = true; - key = "E50FC66B5062070DC462661C69A830D03203405F"; - }; - extraConfig = { - pull.rebase = true; - init.defaultBranch = "master"; - }; - }; -} diff --git a/modules/home/caem/development/tmux.nix b/modules/home/caem/development/tmux.nix deleted file mode 100644 index 6a46112..0000000 --- a/modules/home/caem/development/tmux.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ pkgs, ... }: - -{ - home.packages = with pkgs; [ - tmux - wl-clipboard - ]; - - programs.tmux = { - enable = true; - baseIndex = 1; - historyLimit = 9999999; - mouse = true; - newSession = true; - terminal = "xterm-256color"; - clock24 = true; - extraConfig = '' - set -s copy-command 'wl-copy' - ''; - }; -} diff --git a/modules/home/caem/misc/default.nix b/modules/home/caem/misc/default.nix deleted file mode 100644 index e4fb51f..0000000 --- a/modules/home/caem/misc/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} diff --git a/modules/home/caem/misc/fastfetch.nix b/modules/home/caem/misc/fastfetch.nix deleted file mode 100644 index 63f0633..0000000 --- a/modules/home/caem/misc/fastfetch.nix +++ /dev/null @@ -1,31 +0,0 @@ -{ pkgs, ... }: - -{ - home.packages = with pkgs; [ - fastfetch - ]; - - programs.fastfetch = { - enable = true; - settings = { - modules = [ - "title" - "separator" - "os" - "kernel" - "initsystem" - "uptime" - "datetime" - "packages" - "terminal" - "wm" - "shell" - "cpu" - "gpu" - "memory" - "break" - "colors" - ]; - }; - }; -} diff --git a/modules/home/caem/multimedia/default.nix b/modules/home/caem/multimedia/default.nix deleted file mode 100644 index e4fb51f..0000000 --- a/modules/home/caem/multimedia/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} diff --git a/modules/home/caem/multimedia/games/default.nix b/modules/home/caem/multimedia/games/default.nix deleted file mode 100644 index e79c637..0000000 --- a/modules/home/caem/multimedia/games/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ ... }: - -{ - -} diff --git a/modules/home/caem/multimedia/web/default.nix b/modules/home/caem/multimedia/web/default.nix deleted file mode 100644 index e4fb51f..0000000 --- a/modules/home/caem/multimedia/web/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} diff --git a/modules/home/caem/multimedia/web/firefox.nix b/modules/home/caem/multimedia/web/firefox.nix deleted file mode 100644 index d8147ea..0000000 --- a/modules/home/caem/multimedia/web/firefox.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ ... }: - -{ - -} diff --git a/modules/home/caem/packages.nix b/modules/home/caem/packages.nix deleted file mode 100644 index f56f672..0000000 --- a/modules/home/caem/packages.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ ... }: - -{ - imports = [ - ./development - ./core - ./desktop/gnome - ./multimedia - ./misc - ]; -} diff --git a/modules/nixos/communication/default.nix b/modules/nixos/communication/default.nix deleted file mode 100644 index 4e5c81e..0000000 --- a/modules/nixos/communication/default.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ pkgs, username, ... }: - -{ - environment.systemPackages = with pkgs; [ - tutanota-desktop - signal-desktop - element-desktop - vesktop - ]; - - environment.persistence."/nix/persist" = { - users."${username}" = { - directories = [ - ".config/Signal" - ".config/vesktop" - ".config/tutanota-desktop" - ".config/tuta_integration" - ".config/Element" - ]; - }; - }; -} diff --git a/modules/nixos/core/default.nix b/modules/nixos/core/default.nix deleted file mode 100644 index 99b31f4..0000000 --- a/modules/nixos/core/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} - diff --git a/modules/nixos/core/fonts.nix b/modules/nixos/core/fonts.nix deleted file mode 100644 index b2020bf..0000000 --- a/modules/nixos/core/fonts.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ pkgs, ... }: - -{ - fonts = { - packages = with pkgs; [ - nerdfonts - ipafont - noto-fonts-emoji - cantarell-fonts - newcomputermodern - ]; - - fontconfig = { - enable = true; - cache32Bit = true; - subpixel.rgba = "rgb"; - defaultFonts = { - monospace = [ "Go Mono Nerd Font" ]; - }; - }; - }; -} - diff --git a/modules/nixos/core/impermanence.nix b/modules/nixos/core/impermanence.nix deleted file mode 100644 index 4f2aee5..0000000 --- a/modules/nixos/core/impermanence.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ config, lib, ... }: - -{ - /* Required to be able to allowOther on user persisted directories */ - programs.fuse.userAllowOther = true; - - boot.initrd.postDeviceCommands = lib.mkAfter '' - mkdir /btrfs_tmp - mount "${config.fileSystems."/".device}" /btrfs_tmp - if [[ -e /btrfs_tmp/root ]]; then - mkdir -p /btrfs_tmp/old_roots - timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") - mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" - fi - - delete_subvolume_recursively() { - IFS=$'\n' - for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do - delete_subvolume_recursively "/btrfs_tmp/$i" - done - btrfs subvolume delete "$1" - } - - for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do - delete_subvolume_recursively "$i" - done - - btrfs subvolume create /btrfs_tmp/root - umount /btrfs_tmp - ''; - - environment.persistence."/nix/persist" = { - hideMounts = true; - directories = [ - "/var/log" - "/var/lib/nixos" - ]; - files = [ - "/etc/machine-id" - ]; - }; -} diff --git a/modules/nixos/core/nix.nix b/modules/nixos/core/nix.nix deleted file mode 100644 index 1d828d0..0000000 --- a/modules/nixos/core/nix.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ pkgs, lib, inputs, cfgPath, ... }: - -let - importOverlays = builtins.map - (overlay: import overlay { - inherit cfgPath lib inputs; - }) - (builtins.filter - (file: builtins.match ".*\.nix" (builtins.toString file) != null) - (lib.filesystem.listFilesRecursive "${cfgPath}/overlays")); -in { - nix = { - settings = { - auto-optimise-store = true; - use-xdg-base-directories = true; - trusted-users = [ "@wheel" ]; - allowed-users = [ "@wheel" ]; - }; - extraOptions = '' - experimental-features = nix-command flakes - ''; - }; - nixpkgs = { - config = { - allowUnfree = true; - }; - hostPlatform = lib.mkDefault "x86_64-linux"; - overlays = importOverlays; - }; -} diff --git a/modules/nixos/core/security.nix b/modules/nixos/core/security.nix deleted file mode 100644 index 41447b2..0000000 --- a/modules/nixos/core/security.nix +++ /dev/null @@ -1,51 +0,0 @@ -{ username, ... }: - -{ - programs.gnupg.agent = { - enable = true; - enableSSHSupport = true; - }; - - /* - * Sudo is scheduled to be replaced by systemd's run0. - * The blocker for this is persistent authentication support. - * - * https://github.com/systemd/systemd/issues/33366 - * https://github.com/polkit-org/polkit/issues/472 - */ - security.sudo = { - enable = true; - execWheelOnly = true; - extraConfig = '' - Defaults lecture="never" - ''; - }; - - security.apparmor.enable = true; - networking.firewall.enable = true; - - /* Disable the root user */ - users = { - users.root.hashedPassword = "!"; - mutableUsers = false; - }; - - sops.age.keyFile = "/nix/config/keys.txt"; - - environment.persistence."/nix/persist" = { - files = [ - "/root/.ssh/known_hosts" - ]; - users."${username}".directories = let - baseAttrs = { - user = "${username}"; - group = "users"; - mode = "u=rwx,g=,o="; - }; - in [ - (baseAttrs // { directory = ".ssh"; }) - (baseAttrs // { directory = ".local/share/gnupg"; }) - (baseAttrs // { directory = ".local/share/keyrings"; }) - ]; - }; -} diff --git a/modules/nixos/core/systemd.nix b/modules/nixos/core/systemd.nix deleted file mode 100644 index af2dd8c..0000000 --- a/modules/nixos/core/systemd.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ ... }: - -{ - /* https://files.catbox.moe/s5diss.mp4 */ - systemd.extraConfig = '' - DefaultTimeoutStopSec=5s - ''; -} diff --git a/modules/nixos/core/zsh.nix b/modules/nixos/core/zsh.nix deleted file mode 100644 index 291dbf9..0000000 --- a/modules/nixos/core/zsh.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ ... }: - -{ - programs.zsh = { - enable = true; - shellInit = '' - export ZDOTDIR=$HOME/.config/zsh - ''; - }; -} diff --git a/modules/nixos/desktop/gnome/default.nix b/modules/nixos/desktop/gnome/default.nix deleted file mode 100644 index 829f39c..0000000 --- a/modules/nixos/desktop/gnome/default.nix +++ /dev/null @@ -1,67 +0,0 @@ -{ pkgs, username, ... }: - -{ - services.xserver = { - enable = false; - displayManager.gdm.enable = true; - desktopManager.gnome.enable = true; - }; - - environment.gnome.excludePackages = with pkgs; [ - orca - geary - gnome-disk-utility - gnome-backgrounds - gnome-user-docs - epiphany - yelp - gnome-software - totem - snapshot - simple-scan - gnome-console - gnome-text-editor - gnome-tour - gnome-bluetooth - gnome-music - gnome-maps - gnome-contacts - gnome-calendar - gnome-connections - gnome-system-monitor - ]; - - environment.systemPackages = with pkgs; [ - ghostty - dconf-editor - resources - newsflash - ffmpegthumbnailer - ] ++ (with pkgs.gnomeExtensions; [ - caffeine - accent-directories - just-perfection - quick-settings-tweaker - forge - ]); - - environment.persistence."/nix/persist" = { - directories = [ - "/var/lib/AccountsService" - ]; - users."${username}" = { - directories = [ - ".config/dconf" - ".local/share/news-flash" - - # Right now I don't really modify much here other than the tab group tab colour - # but I might in the future want to manage these files using home-manager instead - # of having them set imperatively and simply persisted. - ".config/forge" - ]; - files = [ - ".config/monitors.xml" - ]; - }; - }; -} diff --git a/modules/nixos/development/default.nix b/modules/nixos/development/default.nix deleted file mode 100644 index 6c469ae..0000000 --- a/modules/nixos/development/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ username, ... }: - -{ - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".local/share/emacs" - ]; - }; -} \ No newline at end of file diff --git a/modules/nixos/edv/default.nix b/modules/nixos/edv/default.nix deleted file mode 100644 index eef1bea..0000000 --- a/modules/nixos/edv/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ pkgs, username, ... }: - -{ - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".config/libreoffice" - ]; - }; - - environment.systemPackages = with pkgs; [ - libreoffice-fresh - hunspell - hunspellDicts.de_DE - ]; -} diff --git a/modules/nixos/hardware/audio/default.nix b/modules/nixos/hardware/audio/default.nix deleted file mode 100644 index 856e70a..0000000 --- a/modules/nixos/hardware/audio/default.nix +++ /dev/null @@ -1,54 +0,0 @@ -{ ... }: - -{ - boot.kernelParams = [ "preempt=full" ]; - security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa = { - enable = true; - support32Bit = true; - }; - pulse.enable = true; - jack.enable = true; - - # Reduce latency - # https://wiki.nixos.org/wiki/PipeWire#Low-latency_setup - extraConfig = let - rate = builtins.toString 48000; - - # The default value in the wiki is 32 but might result in crackling audio. - # If you get audio crackling try increasing this value until it's gone. - quantum = builtins.toString 128; - in { - pipewire."92-low-latency" = { - "context.properties" = { - "default.clock.rate" = "${rate}"; - "default.clock.quantum" = "${quantum}"; - "default.clock.min-quantum" = "${quantum}"; - "default.clock.max-quantum" = "${quantum}"; - }; - }; - - pipewire-pulse."92-low-latency" = { - "context.properties" = [ - { - name = "libpipewire-module-protocol-pulse"; - args = { }; - } - ]; - "pulse.properties" = { - "pulse.min.req" = "${quantum}/${rate}"; - "pulse.default.req" = "${quantum}/${rate}"; - "pulse.max.req" = "${quantum}/${rate}"; - "pulse.min.quantum" = "${quantum}/${rate}"; - "pulse.max.quantum" = "${quantum}/${rate}"; - }; - "stream.properties" = { - "node.latency" = "${quantum}/${rate}"; - "resample.quality" = 1; - }; - }; - }; - }; -} diff --git a/modules/nixos/hardware/cpu/amd/default.nix b/modules/nixos/hardware/cpu/amd/default.nix deleted file mode 100644 index c46d798..0000000 --- a/modules/nixos/hardware/cpu/amd/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ pkgs, ... }: - -{ - boot = { - kernelModules = [ "kvm-amd" ]; - extraModprobeConfig = "options kvm_amd nested=1"; - }; - - hardware.cpu.amd.updateMicrocode = true; - hardware.firmware = with pkgs; [ linux-firmware ]; -} diff --git a/modules/nixos/hardware/cpu/intel/default.nix b/modules/nixos/hardware/cpu/intel/default.nix deleted file mode 100644 index f0f1ad2..0000000 --- a/modules/nixos/hardware/cpu/intel/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ pkgs, ... }: - -{ - boot = { - kernelModules = [ "kvm-intel"]; - }; - - hardware.cpu.intel.updateMicrocode = true; - hardware.firmware = with pkgs; [ linux-firmware ]; -} diff --git a/modules/nixos/hardware/gpu/graphics.nix b/modules/nixos/hardware/gpu/graphics.nix deleted file mode 100644 index 87d60ec..0000000 --- a/modules/nixos/hardware/gpu/graphics.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ ... }: -{ - hardware = { - graphics = { - enable = true; - enable32Bit = true; - }; - }; -} diff --git a/modules/nixos/hardware/gpu/nvidia/default.nix b/modules/nixos/hardware/gpu/nvidia/default.nix deleted file mode 100644 index 4b97f2c..0000000 --- a/modules/nixos/hardware/gpu/nvidia/default.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ config, pkgs, ... }: - -{ - imports = [ - ../graphics.nix - ]; - - hardware = { - nvidia = { - open = true; - modesetting.enable = true; - package = config.boot.kernelPackages.nvidiaPackages.beta; - nvidiaSettings = false; - powerManagement = { - enable = true; - }; - }; - }; - - boot.kernelParams = [ - "nvidia_drm.fbdev=1" - ]; - - services.xserver.videoDrivers = [ "nvidia" ]; - - environment.sessionVariables = { - LIBVA_DRIVER_NAME = "nvidia"; - GBM_BACKEND = "nvidia-drm"; - __GLX_VENDOR_LIBRARY_NAME = "nvidia"; - NVD_BACKEND = "direct"; - NIXOS_OZONE_WL = 1; - SDL_VIDEODRIVER = "wayland"; - GDK_BACKEND = "wayland"; - CLUTTER_BACKEND = "wayland"; - }; - - nixpkgs.config.cudaSupport = true; - nix = { - settings = { - substituters = [ - "https://nix-community.cachix.org" - ]; - trusted-public-keys = [ - "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" - ]; - }; - }; -} - diff --git a/modules/nixos/multimedia/art/default.nix b/modules/nixos/multimedia/art/default.nix deleted file mode 100644 index 7d16657..0000000 --- a/modules/nixos/multimedia/art/default.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ pkgs, username, ... }: - -{ - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".local/share/krita" - ".config/GIMP" - ".config/OpenTabletDriver" - ]; - }; - - environment.systemPackages = with pkgs; [ - krita - gimp - blender - ]; - - hardware.opentabletdriver = { - enable = true; - daemon.enable = true; - }; -} diff --git a/modules/nixos/multimedia/default.nix b/modules/nixos/multimedia/default.nix deleted file mode 100644 index e4fb51f..0000000 --- a/modules/nixos/multimedia/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} diff --git a/modules/nixos/multimedia/games/default.nix b/modules/nixos/multimedia/games/default.nix deleted file mode 100644 index 7e7e357..0000000 --- a/modules/nixos/multimedia/games/default.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ pkgs, username, inputs, ... }: - -{ - imports = [ - ./steam.nix - ]; - - programs.gamescope.enable = true; - programs.gamemode.enable = true; - users.users."${username}".extraGroups = [ "gamemode" ]; - - nix.settings = inputs.aagl.nixConfig; - programs.anime-game-launcher.enable = true; - - environment.systemPackages = with pkgs; [ - unstable.osu-lazer-bin - ]; - - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".local/share/osu" - ".local/share/anime-game-launcher" - ]; - }; -} diff --git a/modules/nixos/multimedia/games/steam.nix b/modules/nixos/multimedia/games/steam.nix deleted file mode 100644 index 2529d29..0000000 --- a/modules/nixos/multimedia/games/steam.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ pkgs, username, ... }: - -{ - programs.steam = { - enable = true; - gamescopeSession.enable = true; - }; - - environment.systemPackages = with pkgs; [ - protonup-qt - protontricks - ]; - - # Sometimes a Steam game that runs natively on Linux - # creates a folder somewhere in ~/.local/share or ~/.config - # and in the usual case you would have to persist each game - # folder individually but since we set the nix home to this - # directory instead of the actual home directory, it all gets - # stored in here and by persisting the entire path this becomes - # a none issue. - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".local/share/steam_home" - ]; - }; -} diff --git a/modules/nixos/multimedia/music/default.nix b/modules/nixos/multimedia/music/default.nix deleted file mode 100644 index e4fb51f..0000000 --- a/modules/nixos/multimedia/music/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} diff --git a/modules/nixos/multimedia/music/tidal.nix b/modules/nixos/multimedia/music/tidal.nix deleted file mode 100644 index f98f8ea..0000000 --- a/modules/nixos/multimedia/music/tidal.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ pkgs, username, ... }: - -{ - environment.systemPackages = with pkgs; [ - tidal-hifi - ]; - - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".config/tidal-hifi" - ]; - }; -} diff --git a/modules/nixos/multimedia/slop.nix b/modules/nixos/multimedia/slop.nix deleted file mode 100644 index 6f340a4..0000000 --- a/modules/nixos/multimedia/slop.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ pkgs, username, ... }: - -{ - environment.systemPackages = [ - (pkgs.unstable.alpaca.override { - ollama = pkgs.unstable.ollama-cuda; - }) - ]; - - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".config/com.jeffser.Alpaca" - ".local/share/com.jeffser.Alpaca" - ]; - }; -} diff --git a/modules/nixos/multimedia/video/default.nix b/modules/nixos/multimedia/video/default.nix deleted file mode 100644 index f7a6d3f..0000000 --- a/modules/nixos/multimedia/video/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ pkgs, username, ... }: - -{ - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ]; - }; - - environment.systemPackages = with pkgs; [ - mpv - handbrake - parabolic - ]; -} diff --git a/modules/nixos/multimedia/web/default.nix b/modules/nixos/multimedia/web/default.nix deleted file mode 100644 index e4fb51f..0000000 --- a/modules/nixos/multimedia/web/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ lib, ... }: - -{ - imports = lib.getModuleImports ./.; -} diff --git a/modules/nixos/multimedia/web/filesharing.nix b/modules/nixos/multimedia/web/filesharing.nix deleted file mode 100644 index 1fd4305..0000000 --- a/modules/nixos/multimedia/web/filesharing.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ username, ... }: - -{ - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".local/share/org.localsend.localsend_app" - ]; - }; - - programs.localsend = { - enable = true; - openFirewall = true; - }; -} diff --git a/modules/nixos/multimedia/web/firefox/default.nix b/modules/nixos/multimedia/web/firefox/default.nix deleted file mode 100644 index dc9c46e..0000000 --- a/modules/nixos/multimedia/web/firefox/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ username, pkgs, ... }: - -{ - environment.systemPackages = with pkgs; [ - tor-browser - firefox-esr - ]; - - environment.persistence."/nix/persist" = { - users."${username}".directories = [ - ".config/mozilla" - ]; - }; -} diff --git a/modules/nixos/multimedia/web/firefox/policies.nix b/modules/nixos/multimedia/web/firefox/policies.nix deleted file mode 100644 index d1c765e..0000000 --- a/modules/nixos/multimedia/web/firefox/policies.nix +++ /dev/null @@ -1,72 +0,0 @@ -{ - EnableTrackingProtection = { - Value = true; - Cryptomining = true; - Fingerprinting = true; - EmailTracking = true; - Level = "strict"; - }; - - DisableTelemetry = true; - DisablePocket = true; - DisableFirefoxStudies = true; - DisableFirefoxAccounts = false; - DisableAccounts = false; - DontCheckDefaultBrowser = true; - OverrideFirstRunPage = ""; - OverridePostUpdatePage = ""; - NoDefaultBookmarks = true; - Cookies = { - Behaviour = "reject-foreign"; - BehaviourPrivateBrowsing = "reject-foreign"; - }; - - UserMessaging = { - WhatsNew = false; - ExtensionRecommendations = false; - FeatureRecommendations = false; - UrlbarInterventions = false; - UrlbarTopSitesEnabled = false; - SkipOnboarding = true; - MoreFromMozilla = false; - }; - - FirefoxHome = { - Search = false; - TopSites = false; - SponsoredTopSites = false; - Highlights = false; - Pocket = false; - SponsoredPocket = false; - Snippets = false; - Locked = true; - }; - - SearchSuggestEnabled = false; - NewTabPage = false; - - SearchEngines = { # ESR only - Default = "Kagi"; - PreventInstalls = true; - DisableSearchEngineUpdate = true; - Remove = ["Google" "Bing" "Amazon.com" "DuckDuckGo" - "eBay" "Twitter" "Wikipedia (en)"]; - Add = [ - { - Name = "Kagi"; - URLTemplate = "https://kagi.com/search?q={searchTerms}"; - Method = "GET"; - IconURL = "https://kagi.com/favicon.ico"; - Alias = "@k"; - Default = true; - } - ]; - }; - - FirefoxSuggest = { - WebSuggestions = false; - SponsoredSuggestions = false; - ImproveSuggest = false; - Locked = true; - }; -} diff --git a/modules/nixos/multimedia/web/firefox/preferences.nix b/modules/nixos/multimedia/web/firefox/preferences.nix deleted file mode 100644 index daa3cf9..0000000 --- a/modules/nixos/multimedia/web/firefox/preferences.nix +++ /dev/null @@ -1,24 +0,0 @@ -let - prefToString = value: - if builtins.isBool value then - if value then "true" else "false" - else if (builtins.isInt value) || (builtins.isNull value) then - builtins.toString value - else if builtins.isString value then - ''"${value}"'' - else - builtins.throw - "Pref expected one of (Bool, String, Int, Null) got instead ${builtins.typeOf value}"; - - mkPrefs = prefs: builtins.concatStringsSep - "\n" - (builtins.attrValues - (builtins.mapAttrs - (n: v: ''pref("${n}", ${prefToString v});'') prefs)); -in - mkPrefs { - "browser.urlbar.suggest.topsites" = false; - "browser.startup.homepage" = "about:blank"; - "browser.download.useDownloadDir" = false; - "general.autoScroll" = true; - } diff --git a/modules/nixos/user/caem.nix b/modules/nixos/user/caem.nix deleted file mode 100644 index 4046513..0000000 --- a/modules/nixos/user/caem.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ config, pkgs, inputs, ... }: - -{ - sops.secrets.upasswd = { - neededForUsers = true; - sopsFile = inputs.secrets.paths.upasswd; - }; - - environment.persistence."/nix/persist" = { - users.caem = { - directories = [ - "documents" - "download" - "music" - "images" - "videos" - "programming" - ]; - }; - }; - - users.users.caem = { - isNormalUser = true; - shell = pkgs.zsh; - hashedPasswordFile = config.sops.secrets.upasswd.path; - extraGroups = [ - "wheel" - ]; - }; - - home-manager.users.caem = import ../../home/caem; -} diff --git a/modules/packages/fastfetch.nix b/modules/packages/fastfetch.nix new file mode 100644 index 0000000..b6589ba --- /dev/null +++ b/modules/packages/fastfetch.nix @@ -0,0 +1,30 @@ +{ ... }: + +{ + home-manager.users.hu = { + programs.fastfetch = { + enable = true; + settings = { + modules = [ + "title" + "separator" + "os" + "kernel" + "initsystem" + "uptime" + "datetime" + "packages" + "terminal" + "wm" + "shell" + "cpu" + "gpu" + "memory" + "break" + "colors" + ]; + }; + }; + }; +} + diff --git a/modules/packages/firefox.nix b/modules/packages/firefox.nix new file mode 100644 index 0000000..2119757 --- /dev/null +++ b/modules/packages/firefox.nix @@ -0,0 +1,272 @@ +{ pkgs, ... }: + +# You could theoretically, like I did for a while, maintain this file +# to manage your Firefox and waste your time on this or you could just use +# Firefox accounts and become a functioning member of society. This file is +# now only a starting point and will not be kept up to date with my setup. + +{ + environment.persistence."/nix/persist".users.hu.directories = [ + ".mozilla/firefox/shaga" + ]; + + home-manager.users.hu = { + programs.firefox = { + enable = true; + package = pkgs.firefox-esr; + policies = { + EnableTrackingProtection = { + Value = true; + Cryptomining = true; + Fingerprinting = true; + EmailTracking = true; + }; + DisableTelemetry = true; + DisablePocket = true; + DisableFirefoxStudies = true; + DisableFirefoxAccounts = false; + DisableAccounts = false; + DontCheckDefaultBrowser = true; + OverrideFirstRunPage = ""; + OverridePostUpdatePage = ""; + NoDefaultBookmarks = true; + Cookies = { + Behaviour = "reject-foreign"; + BehaviourPrivateBrowsing = "reject-foreign"; + }; + + SearchEngines = { # ESR only + Remove = [ "Bing" "Google" "DuckDuckGo" "Wikipedia (en)" ]; + }; + + # https://discourse.nixos.org/t/declare-firefox-extensions-and-settings/36265/17 + ExtensionSettings = with builtins; + let extension = shortId: uuid: { + name = uuid; + value = { + install_url = "https://addons.mozilla.org/en-US/firefox/downloads/latest/${shortId}/latest.xpi"; + installation_mode = "normal_installed"; + }; + }; + in listToAttrs [ + (extension "ublock-origin" "uBlock0@raymondhill.net") + ]; + + "3rdparty".Extensions = { + "uBlock0@raymondhill.net".adminSettings = { + userSettings = { + importedLists = [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/LegitimateURLShortener.txt" + ]; + externalLists = "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/LegitimateURLShortener.txt"; + }; + selectedFilterLists = [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/LegitimateURLShortener.txt" + "user-filters" "ublock-filters" "ublock-badware" "ublock-privacy" "ublock-quick-fixes" + "ublock-unbreak" "easylist" "adguard-generic" "adguard-mobile" "easyprivacy" "adguard-spyware" + "adguard-spyware-url" "block-lan" "urlhaus-1" "curben-phishing" "plowe-0" "dpollock-0" "fanboy-cookiemonster" + "ublock-cookies-easylist" "adguard-cookies" "ublock-cookies-adguard" "fanboy-social" "adguard-social" + "fanboy-thirdparty_social" "easylist-chat" "easylist-newsletters" "easylist-notifications" + "easylist-annoyances" "adguard-mobile-app-banners" "adguard-other-annoyances" "adguard-popup-overlays" + "adguard-widgets" "ublock-annoyances" "ALB-0" "BGR-0" "CHN-0" "CZE-0" "DEU-0" "EST-0" "ara-0" "spa-1" + "spa-0" "FIN-0" "FRA-0" "GRC-0" "HRV-0" "HUN-0" "IDN-0" "ISR-0" "IND-0" "IRN-0" "ISL-0" "ITA-0" + "JPN-1" "KOR-1" "LTU-0" "LVA-0" "MKD-0" "NLD-0" "NOR-0" "POL-0" "POL-2" "ROU-1" "RUS-0" "SWE-1" + "SVN-0" "THA-0" "TUR-0" "VIE-1" + ]; + }; + }; + }; + + profiles.shaga = { + isDefault = true; + search = { + force = true; + default = "Kagi"; + order = [ "Kagi" "Gruble" "Nix Packages" "Nix Options" "Home-manager options" ]; + engines = { + "Kagi" = { + urls = [ + { + template = "https://kagi.com/search"; + params = [ + { name = "q"; value = "{searchTerms}"; } + ]; + } + ]; + iconUpdateURL = "https://kagi.com/favicon.ico"; + updateInterval = 7 * 24 * 60 * 60 * 1000; # Weekly + definedAliases = [ "@k" ]; + }; + "Gruble" = { + urls = [ + { + template = "https://gruble.de/search"; + params = [ + { name = "q"; value = "{searchTerms}"; } + ]; + } + ]; + iconUpdateURL = "https://gruble.de/favicon.ico"; + updateInterval = 7 * 24 * 60 * 60 * 1000; # Weekly + definedAliases = [ "@g" ]; + }; + "Nix Packages" = { + urls = [{ + template = "https://search.nixos.org/packages"; + params = [ + { name = "type"; value = "packages"; } + { name = "channel"; value = "unstable"; } + { name = "query"; value = "{searchTerms}"; } + ]; + }]; + iconUpdateURL = "https://nixos.org/favicon.png"; + updateInterval = 7 * 24 * 60 * 60 * 1000; # Weekly + definedAliases = [ "@np" ]; + }; + "Nix Options" = { + urls = [{ + template = "https://search.nixos.org/options"; + params = [ + { name = "type"; value = "packages"; } + { name = "channel"; value = "unstable"; } + { name = "query"; value = "{searchTerms}"; } + ]; + }]; + iconUpdateURL = "https://nixos.org/favicon.png"; + updateInterval = 7 * 24 * 60 * 60 * 1000; # Weekly + definedAliases = [ "@no" ]; + }; + "Home-manager options" = { + urls = [{ + template = "https://home-manager-options.extranix.com"; + params = [ + { name = "release"; value = "master"; } + { name = "query"; value = "{searchTerms}"; } + ]; + }]; + iconUpdateURL = "https://home-manager-options.extranix.com/images/favicon.png"; + updateInterval = 7 * 24 * 60 * 60 * 1000; # Weekly + definedAliases = [ "@ho" ]; + }; + }; + }; + + settings = { + "browser.urlbar.quicksuggest.contextualOptIn.topPosition" = false; + "extensions.postDownloadThirdPartyPrompt" = false; + "extensions.getAddons.cache.enabled" = false; + "browser.search.update" = false; + "extensions.autoDisableScopes" = 0; + "browser.startup.page" = 0; + "browser.startup.homepage" = "about:blank"; + "browser.newtabpage.enabled" = false; + "browser.newtabpage.activity-stream.showSponsored" = false; + "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; + "browser.newtabpage.activity-stream.default.sites" = ""; + "geo.provider.use_gpsd" = false; + "extensions.getAddons.showPane" = false; + "htmlaboutaddons.recommendations.enabled" = false; + "discovery.enabled" = false; + "browser.shopping.experience2023.enabled" = false; + "app.shield.optoutstudies.enabled" = false; + "app.normandy.enabled" = false; + "app.normandy.api_url" = ""; + "breakpad.reportURL" = ""; + "browser.newtabpage.activity-stream.feeds.telemetry" = false; + "browser.newtabpage.activity-stream.telemetry" = false; + "browser.search.serpEventTelemetry.enabled" = false; + "dom.security.unexpected_system_load_telemetry_enabled" = false; + "network.trr.confirmation_telemetry_enabled" = false; + "security.app_menu.recordEventTelemetry" = false; + "security.certerrors.recordEventTelemetry" = false; + "security.protectionspopup.recordEventTelemetry" = false; + "toolkit.telemetry.bhrPing.enabled" = false; + "toolkit.telemetry.firstShutdownPing.enabled" = false; + "toolkit.telemetry.newProfilePing.enabled" = false; + "toolkit.telemetry.pioneer-new-studies-available" = false; + "toolkit.telemetry.shutdownPingSender.enabled" = false; + "toolkit.telemetry.unified" = false; + "toolkit.telemetry.updatePing.enabled" = false; + "toolkit.telemetry.server" = "127.0.0.1"; + "browser.newtabpage.activity-stream.telemetry.structuredIngestion.endpoint" = "127.0.0.1"; + "browser.tabs.crashReporting.sendReport" = false; + "browser.crashReports.unsubmittedCheck.autoSubmit2" = false; + "captivedetect.canonicalURL" = ""; + "network.captive-portal-service.enabled" = false; + "network.connectivity-service.enabled" = false; + "browser.safebrowsing.downloads.remote.enabled" = false; + "browser.urlbar.speculativeConnect.enabled" = false; + "browser.search.suggest.enabled" = true; + "browser.urlbar.suggest.quicksuggest.nonsponsored" = false; + "browser.urlbar.suggest.quicksuggest.sponsored" = false; + "browser.urlbar.suggest.searches" = true; + "browser.urlbar.suggest.bookmark" = false; + "browser.urlbar.suggest.addons" = false; + "browser.urlbar.suggest.calculator" = false; + "browser.urlbar.suggest.clipboard" = false; + "browser.urlbar.suggest.engines" = false; + "browser.urlbar.suggest.history" = false; + "browser.urlbar.suggest.mdn" = false; + "browser.urlbar.suggest.openpage" = false; + "browser.urlbar.suggest.pocket" = false; + "browser.urlbar.suggest.recentsearches" = false; + "browser.urlbar.suggest.remotetab" = false; + "browser.urlbar.suggest.topsites" = false; + "browser.urlbar.suggest.trending" = false; + "browser.urlbar.suggest.weather" = false; + "browser.urlbar.suggest.yelp" = false; + "browser.urlbar.richSuggestions.tail" = false; + "browser.urlbar.quicksuggest.shouldShowOnboardingDialog" = false; + "browser.urlbar.quicksuggest.rustEnabled" = false; + "browser.urlbar.richSuggestions.featureGate" = false; + "browser.urlbar.trending.featureGate" = false; + "browser.urlbar.addons.featureGate" = false; + "browser.urlbar.mdn.featureGate" = false; + "browser.urlbar.pocket.featureGate" = false; + "browser.urlbar.weather.featureGate" = false; + "browser.formfill.enable" = false; + "dom.forms.autocomplete.formautofill" = false; + "extensions.formautofill.addresses.capture.enabled" = false; + "extensions.formautofill.creditCards.enabled" = false; + "signon.autofillForms" = false; + "signon.rememberSignons" = false; + "signon.formlessCapture.enabled" = false; + "network.auth.subresource-http-auth-allow" = 1; + "dom.security.https_only_mode" = true; + "network.http.referer.XOriginTrimmingPolicy" = 2; + "privacy.userContext.enabled" = true; + "privacy.userContext.ui.enabled" = true; + "privacy.sanitize.sanitizeOnShutdown" = true; + "privacy.clearHistory.siteSettings" = true; + "media.peerconnection.ice.no_host" = true; + "browser.download.start_downloads_in_tmp_dir" = true; + "browser.helperApps.deleteTempFileOnExit" = true; + "browser.uitour.enabled" = false; + "pdfjs.enableScripting" = false; + "browser.download.useDownloadDir" = false; + "browser.download.alwaysOpenPanel" = true; + "browser.download.manager.addToRecentDocs" = false; + "browser.download.always_ask_before_handling_new_types" = true; + "browser.contentblocking.category" = "strict"; + "privacy.clearOnShutdown.cache" = true; + "privacy.clearOnShutdown.downloads" = true; + "privacy.clearOnShutdown.formdata" = true; + "privacy.clearOnShutdown.history" = true; + "privacy.clearOnShutdown.sessions" = true; + "privacy.clearOnShutdown.cookies" = true; + "privacy.clearOnShutdown.offlineApps" = true; + "privacy.clearSiteData.historyFormDataAndDownloads" = true; + "browser.startup.homepage_override.mstone" = "ignore"; + "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" = false; + "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" = false; + "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org"; + "browser.messaging-system.whatsNewPanel.enabled" = false; + "browser.urlbar.showSearchTerms.enabled" = false; + "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.havePinned" = ""; + "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.searchEngines" = ""; + }; + }; + }; + }; +} + diff --git a/modules/packages/foot.nix b/modules/packages/foot.nix new file mode 100644 index 0000000..2842d72 --- /dev/null +++ b/modules/packages/foot.nix @@ -0,0 +1,54 @@ +{ ... }: + +{ + home-manager.users.hu = { + programs.foot = { + enable = true; + settings = { + main = { + pad = "2x2 center"; + font = "Go Mono Nerd Font:size=12"; + }; + + mouse = { + hide-when-typing = "yes"; + }; + + scrollback = { + lines = 10000; + }; + + colors = { + alpha = 0.9; + + foreground = "c5c9c5"; + background = "181616"; + selection-foreground = "c8c093"; + selection-background = "2d4f67"; + + regular0 = "0d0c0c"; + regular1 = "c4746e"; + regular2 = "8a9a7b"; + regular3 = "c4b28a"; + regular4 = "8ba4b0"; + regular5 = "a292a3"; + regular6 = "8ea4a2"; + regular7 = "c8c093"; + + bright0 = "a6a69c"; + bright1 = "e46876"; + bright2 = "87a987"; + bright3 = "e6c384"; + bright4 = "7fb4ca"; + bright5 = "938aa9"; + bright6 = "7aa89f"; + bright7 = "c5c9c5"; + + "16" = "b6927b"; + "17" = "b98d7b"; + }; + }; + }; + }; +} + diff --git a/modules/packages/git.nix b/modules/packages/git.nix new file mode 100644 index 0000000..b0d49ba --- /dev/null +++ b/modules/packages/git.nix @@ -0,0 +1,49 @@ +{ pkgs, ... }: + +let + ugp = "/nix/config/secrets/git_uni"; +in { + home-manager.users.hu = { + home.file."/home/hu/.config/git/personal" = { + text = '' + [user] + email = "me@caem.dev" + name = "caem" + signingKey = "E50FC66B5062070DC462661C69A830D03203405F" + + [gpg] + program = "${pkgs.gnupg}/bin/gpg2" + + [commit] + gpgSign = true + + [tag] + gpgSign = true + + [init] + defaultBranch = "master" + + [pull] + rebase = true + ''; + }; + + home.file."/home/hu/.config/git/uni" = { + source = ugp; + }; + + home.file."/home/hu/.config/git/config" = { + text = '' + [includeIf "gitdir:~/programming/personal/**"] + path = ~/.config/git/personal + + [includeIf "gitdir:~/programming/forks/**"] + path = ~/.config/git/personal + + [includeIf "gitdir:~/programming/uni/**"] + path = ~/.config/git/uni + ''; + }; + }; +} + diff --git a/modules/packages/konsole/custom.colorscheme b/modules/packages/konsole/custom.colorscheme new file mode 100644 index 0000000..f1a3bcf --- /dev/null +++ b/modules/packages/konsole/custom.colorscheme @@ -0,0 +1,100 @@ +[Background] +Color=35,38,39 + +[BackgroundFaint] +Color=49,54,59 + +[BackgroundIntense] +Color=0,0,0 + +[Color0] +Color=35,38,39 + +[Color0Faint] +Color=49,54,59 + +[Color0Intense] +Color=127,140,141 + +[Color1] +Color=237,21,21 + +[Color1Faint] +Color=120,50,40 + +[Color1Intense] +Color=192,57,43 + +[Color2] +Color=17,209,22 + +[Color2Faint] +Color=23,162,98 + +[Color2Intense] +Color=28,220,154 + +[Color3] +Color=246,116,0 + +[Color3Faint] +Color=182,86,25 + +[Color3Intense] +Color=253,188,75 + +[Color4] +Color=29,153,243 + +[Color4Faint] +Color=27,102,143 + +[Color4Intense] +Color=61,174,233 + +[Color5] +Color=155,89,182 + +[Color5Faint] +Color=97,74,115 + +[Color5Intense] +Color=142,68,173 + +[Color6] +Color=26,188,156 + +[Color6Faint] +Color=24,108,96 + +[Color6Intense] +Color=22,160,133 + +[Color7] +Color=252,252,252 + +[Color7Faint] +Color=99,104,109 + +[Color7Intense] +Color=255,255,255 + +[Foreground] +Color=252,252,252 + +[ForegroundFaint] +Color=239,240,241 + +[ForegroundIntense] +Color=61,174,233 + +[General] +Anchor=0.5,0.5 +Blur=false +ColorRandomization=false +Description=Custom +FillStyle=Tile +Opacity=0.9 +Wallpaper= +WallpaperFlipType=NoFlip +WallpaperOpacity=1 diff --git a/modules/packages/konsole/konsolestaterc b/modules/packages/konsole/konsolestaterc new file mode 100644 index 0000000..8eac825 --- /dev/null +++ b/modules/packages/konsole/konsolestaterc @@ -0,0 +1,4 @@ +[MainWindow] +1920x1080 screen: Height=640 +1920x1080 screen: Width=1138 +State=AAAA/wAAAAD9AAAAAQAAAAAAAAAAAAAAAPwCAAAAAvsAAAAiAFEAdQBpAGMAawBDAG8AbQBtAGEAbgBkAHMARABvAGMAawAAAAAA/////wAAAXIA////+wAAABwAUwBTAEgATQBhAG4AYQBnAGUAcgBEAG8AYwBrAAAAAAD/////AAABEQD///8AAARyAAACgAAAAAQAAAAEAAAACAAAAAj8AAAAAQAAAAIAAAACAAAAFgBtAGEAaQBuAFQAbwBvAGwAQgBhAHIAAAAAAP////8AAAAAAAAAAAAAABwAcwBlAHMAcwBpAG8AbgBUAG8AbwBsAGIAYQByAAAAAAD/////AAAAAAAAAAA= diff --git a/modules/packages/nvim.nix b/modules/packages/nvim.nix new file mode 100644 index 0000000..6c629fd --- /dev/null +++ b/modules/packages/nvim.nix @@ -0,0 +1,50 @@ +{ pkgs, ... }: + +{ + environment.persistence."/nix/persist".users.hu.directories = [ + ".local/share/nvim" + ".local/state/nvim" + ]; + + environment.variables = { + EDITOR = "nvim"; + }; + + home-manager.users.hu = { + programs.neovim = { + enable = true; + defaultEditor = true; + extraPackages = with pkgs; [ + lua-language-server + nodePackages.intelephense + nodePackages.typescript-language-server + (llvmPackages_19.clang-tools.override { + enableLibcxx = true; + }) + ccls + ripgrep + nil + gcc14 + basedpyright + rust-analyzer + zathura + git + texliveFull + luajitPackages.jsregexp + luajitPackages.luarocks + fd + texlab + haskell-language-server + rustc + shellcheck + bash-language-server + ]; + }; + + home.file."/home/hu/.config/nvim" = { + source = ../../dotfiles/nvim; + recursive = true; + }; + }; +} + diff --git a/modules/packages/rofi.nix b/modules/packages/rofi.nix new file mode 100644 index 0000000..3471aa6 --- /dev/null +++ b/modules/packages/rofi.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: + +{ + home-manager.users.hu = { + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + theme = "sidebar"; + }; + }; +} diff --git a/modules/packages/tmux.nix b/modules/packages/tmux.nix new file mode 100644 index 0000000..960e832 --- /dev/null +++ b/modules/packages/tmux.nix @@ -0,0 +1,43 @@ +{ pkgs, ... }: + +{ + programs.tmux = { + enable = true; + customPaneNavigationAndResize = true; + baseIndex = 1; + plugins = with pkgs; [ + tmuxPlugins.resurrect + ]; + extraConfig = '' + # Enable mouse + setw -g mouse on + + # Neovim + set-option -sg escape-time 10 + set-option -g focus-events on + # https://stackoverflow.com/questions/60309665/neovim-colorscheme-does-not-look-right-when-using-nvim-inside-tmux#comment124479399_60313682 + set-option -ga terminal-overrides ",xterm-256color:Tc" + + # vi mode + set -g mode-keys vi + set -g status-keys vi + + # Rebind prefix key to C-a + set -g prefix C-a + bind C-a send-prefix + unbind C-b + + # Clipboard + set -ga update-environment WAYLAND_DISPLAY + bind Escape copy-mode + bind p run-shell 'tmux set-buffer -- "$(wl-paste -t "text/plain;charset=utf-8")"; tmux paste-buffer' + bind -T copy-mode-vi 'v' send -X begin-selection + bind -T copy-mode-vi 'y' send -X copy-pipe 'wl-copy' + set -s set-clipboard off + + # Status bar + set -g status-style bg=default + set -g status-fg 4 + ''; + }; +} diff --git a/modules/packages/waybar.nix b/modules/packages/waybar.nix new file mode 100644 index 0000000..5ef14b7 --- /dev/null +++ b/modules/packages/waybar.nix @@ -0,0 +1,55 @@ +{ ... }: + +{ + home-manager.users.hu = { + programs.waybar = { + enable = true; + systemd = { + enable = true; + }; + + settings = { + bar = { + layer = "top"; + position = "top"; + height = 32; + output = [ + "DP-1" + ]; + + modules-left = [ "hyprland/workspaces" "hyprland/submap" ]; + modules-center = [ "hyprland/window" ]; + modules-right = [ "tray" "clock" ]; + }; + }; + style = '' + * { + all: unset; + border-radius: 0; + font-family: "Go Mono Nerd Font"; + font-size: 11pt; + min-height: 0; + } + + window#waybar { + color: #c5c9c5; + background: #181616; + border-bottom: 2px solid rgba(53,132,228, 1); + } + + #workspaces button { + padding: 0 8pt 0 8pt; + } + + #workspaces button.active { + color: #3584e4; + } + + #clock { + padding: 0 8pt 0 8pt; + } + ''; + }; + }; +} + diff --git a/modules/packages/zsh.nix b/modules/packages/zsh.nix new file mode 100644 index 0000000..8b7ed1c --- /dev/null +++ b/modules/packages/zsh.nix @@ -0,0 +1,43 @@ +{ pkgs, ... }: + +{ + users.users.hu.shell = pkgs.zsh; + + environment.variables = { + ZDOTDIR = "/home/hu/.config/zsh"; + }; + + home-manager.users.hu = { + home.packages = with pkgs; [ + fzf + thefuck + zsh-fzf-tab + zsh-completions + zsh-autosuggestions + zsh-syntax-highlighting + nix-zsh-completions + zsh-nix-shell + ]; + + home.sessionVariables = { + ZDOTDIR = "/home/hu/.config/zsh"; + }; + + home.file."/home/hu/.config/zsh/conf.d" = { + source = ../../dotfiles/zsh/conf.d; + recursive = true; + }; + + home.file."/home/hu/.config/zsh/.zshrc" = { + text = '' + #!/usr/bin/env zsh + + SYNTAX_PLUGIN="${pkgs.zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" + AUTOSUGGEST_PLUGIN="${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh" + NIX_SHELL_PLUGIN="${pkgs.zsh-nix-shell}/share/zsh-nix-shell/nix-shell.plugin.zsh" + FZF_TAB_PLUGIN="${pkgs.zsh-fzf-tab}/share/fzf-tab/fzf-tab.plugin.zsh" + '' + (builtins.readFile ../../dotfiles/zsh/.zshrc); + }; + }; +} + diff --git a/modules/system/basic.nix b/modules/system/basic.nix new file mode 100644 index 0000000..531ed0f --- /dev/null +++ b/modules/system/basic.nix @@ -0,0 +1,21 @@ +{ pkgs, ... }: + +{ + programs.zsh.enable = true; + + programs.nh = { + enable = true; + flake = "/nix/config"; + }; + + environment.systemPackages = with pkgs; [ + fastfetch + wget + unzip + git + tree + dos2unix + neovim + libqalculate + ]; +} diff --git a/modules/system/development.nix b/modules/system/development.nix new file mode 100644 index 0000000..a711c57 --- /dev/null +++ b/modules/system/development.nix @@ -0,0 +1,17 @@ +{ pkgs, ... }: + +{ + imports = [ + ../packages/git.nix + ../packages/nvim.nix + ]; + + environment.systemPackages = with pkgs; [ + wireshark + seer + mars-mips + ]; + + users.users.hu.extraGroups = [ "wireshark" ]; +} + diff --git a/modules/system/fonts.nix b/modules/system/fonts.nix new file mode 100644 index 0000000..8ee1c4e --- /dev/null +++ b/modules/system/fonts.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: + +{ + fonts.packages = with pkgs; [ + nerdfonts + ]; +} + diff --git a/modules/system/security.nix b/modules/system/security.nix new file mode 100644 index 0000000..11415de --- /dev/null +++ b/modules/system/security.nix @@ -0,0 +1,16 @@ +{ ... }: + +{ + security.sudo.extraConfig = '' + Defaults lecture="never" + ''; + + security.apparmor = { + enable = true; + }; + + nixpkgs.config.permittedInsecurePackages = [ + "jitsi-meet-1.0.8043" + ]; +} + diff --git a/modules/system/virtualisation.nix b/modules/system/virtualisation.nix new file mode 100644 index 0000000..891a978 --- /dev/null +++ b/modules/system/virtualisation.nix @@ -0,0 +1,18 @@ +{ ... }: + +{ + virtualisation.libvirtd.enable = true; + programs.virt-manager.enable = true; + + users.users.hu.extraGroups = [ "libvirtd" ]; + + home-manager.users.hu = { + dconf.settings = { + "org/virt-manager/virt-manager/connections" = { + autoconnect = ["qemu:///system"]; + uris = ["qemu:///system"]; + }; + }; + }; +} + diff --git a/overlays/nixpak/default.nix b/overlays/nixpak/default.nix deleted file mode 100644 index be99ce8..0000000 --- a/overlays/nixpak/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ inputs, lib, ... }: final: prev: { - mkNixPak = let - pkgs = prev; - in inputs.nixpak.lib.nixpak { - inherit (pkgs) lib; - inherit pkgs; - }; -} diff --git a/overlays/nixpak/firefox-esr.nix b/overlays/nixpak/firefox-esr.nix deleted file mode 100644 index bd23c01..0000000 --- a/overlays/nixpak/firefox-esr.nix +++ /dev/null @@ -1,94 +0,0 @@ -# Shamelessly stolen most parts from here: -# https://github.com/ryan4yin/nix-config/blob/7deed26cc5a3af2072b8c89a688f265607babc80/hardening/nixpaks/firefox.nix -# https://github.com/schizofox/schizofox/blob/cdf69b2a445ff12680657a3bd44ce7c406bf2ae6/flake/modules/home-manager/default.nix - -# NOTE: This overlay package is not compatible with the `programs.firefox` module -# for both NixOS and home-manager. If you want to modify the configuration of -# Firefox, you have to do it through modifying the overrides for the intermediary -# package below. This configuration already sets sane defaults so it shouldn't be needed -# but it is there in case you want it. - -{ cfgPath, ... }: final: prev: { - firefox-esr = let - intermediary-firefox-esr = let - policiesFile = "${cfgPath}/modules/nixos/multimedia/web/firefox/policies.nix"; - prefsFile = "${cfgPath}/modules/nixos/multimedia/web/firefox/preferences.nix"; - in prev.firefox-esr.override { - extraPolicies = import policiesFile; - extraPrefs = import prefsFile; - }; - - sandboxed-firefox-esr = prev.mkNixPak { - config = { sloth, ... }: { - app.package = intermediary-firefox-esr; - app.binPath = "bin/firefox-esr"; - flatpak.appId = "org.mozilla.firefox-esr"; - - dbus.policies = { - "org.a11y.Bus" = "talk"; - "org.gnome.SessionManager" = "talk"; - "org.freedesktop.ScreenSaver" = "talk"; - "org.gtk.vfs.*" = "talk"; - "org.gtk.vfs" = "talk"; - "org.freedesktop.Notifications" = "talk"; - "org.freedesktop.portal.FileChooser" = "talk"; - "org.freedesktop.portal.Settings" = "talk"; - "org.mpris.MediaPlayer2.firefox.*" = "own"; - "org.mozilla.firefox.*" = "own"; - "org.mozilla.firefox_beta.*" = "own"; - "org.freedesktop.DBus" = "talk"; - "org.freedesktop.DBus.*" = "talk"; - "ca.desrt.dconf" = "talk"; - "org.freedesktop.portal.*" = "talk"; - "org.freedesktop.NetworkManager" = "talk"; - "org.freedesktop.FileManager1" = "talk"; - }; - - gpu.enable = true; - gpu.provider = "bundle"; - fonts.enable = true; - locale.enable = true; - etc.sslCertificates.enable = true; - - bubblewrap = let - envSuffix = envKey: sloth.concat' (sloth.env envKey); - in { - bind.dev = [ "/dev/shm" ]; - tmpfs = [ "/tmp" ]; - - bind.rw = [ - (envSuffix "XDG_RUNTIME_DIR" "/at-spi/bus") - (envSuffix "XDG_RUNTIME_DIR" "/gvfsd") - (envSuffix "XDG_RUNTIME_DIR" "/pulse") - (envSuffix "XDG_RUNTIME_DIR" "/doc") - (envSuffix "XDG_RUNTIME_DIR" "/dconf") - - [(sloth.mkdir (sloth.concat' sloth.xdgConfigHome "/mozilla")) (sloth.concat' sloth.homeDir "/.mozilla")] - ]; - - bind.ro = [ - "/sys/bus/pci" - "/etc/resolv.conf" - "/etc/localtime" - "/etc/fonts" - ["${intermediary-firefox-esr}/lib/firefox" "/app/etc/firefox"] - (sloth.concat' sloth.xdgConfigHome "/dconf") - (sloth.concat' sloth.xdgConfigHome "/gtk-2.0") - (sloth.concat' sloth.xdgConfigHome "/gtk-3.0") - (sloth.concat' sloth.xdgConfigHome "/gtk-4.0") - (sloth.concat' sloth.xdgConfigHome "/dconf") - "/run/current-system/sw/share/icons" - "/run/current-system/sw/share/themes" - ]; - - sockets = { - x11 = false; - wayland = true; - pipewire = true; - }; - }; - }; - }; - in - sandboxed-firefox-esr.config.env; -} diff --git a/overlays/nixpak/tor-browser.nix b/overlays/nixpak/tor-browser.nix deleted file mode 100644 index 5a98c75..0000000 --- a/overlays/nixpak/tor-browser.nix +++ /dev/null @@ -1,59 +0,0 @@ -# Refer to firefox.nix in the same directory for more information and a -# better version of this. This is barebones on purpose. - -# TODO: Fix file permissions. Right now it for some reason can't download anywhere. - -{ ... }: final: prev: { - tor-browser = let - sandboxed-tor-browser = prev.mkNixPak { - config = { sloth, ... }: { - app.package = prev.tor-browser; - app.binPath = "bin/tor-browser"; - flatpak.appId = "org.torproject.tor-browser"; - - dbus.policies = { - "org.a11y.Bus" = "talk"; - "org.gnome.SessionManager" = "talk"; - "org.freedesktop.ScreenSaver" = "talk"; - "org.gtk.vfs.*" = "talk"; - "org.gtk.vfs" = "talk"; - "org.freedesktop.Notifications" = "talk"; - "org.freedesktop.portal.FileChooser" = "talk"; - "org.freedesktop.portal.Settings" = "talk"; - "org.torproject.tor-browser.*" = "own"; - "org.freedesktop.DBus" = "talk"; - "org.freedesktop.DBus.*" = "talk"; - "org.freedesktop.portal.*" = "talk"; - "org.freedesktop.NetworkManager" = "talk"; - "org.freedesktop.FileManager1" = "talk"; - }; - - gpu.enable = true; - gpu.provider = "bundle"; - - bubblewrap = let - envSuffix = envKey: sloth.concat' (sloth.env envKey); - in { - bind.dev = [ "/dev/shm" ]; - - bind.rw = [ - (envSuffix "XDG_RUNTIME_DIR" "/gvfsd") - [(sloth.mkdir "/tmp/tor-browser") (sloth.concat' sloth.homeDir "/.tor project")] - ]; - - bind.ro = [ - "/sys/bus/pci" - ["${prev.tor-browser}/lib/firefox" "/app/etc/firefox"] - ]; - - sockets = { - x11 = false; - wayland = true; - pipewire = true; - }; - }; - }; - }; - in - sandboxed-tor-browser.config.env; -} diff --git a/overlays/nixpkgs/unstable.nix b/overlays/nixpkgs/unstable.nix deleted file mode 100644 index 7450370..0000000 --- a/overlays/nixpkgs/unstable.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ inputs, ... }: final: prev: { - unstable = import inputs.nixpkgs-unstable { - inherit (prev) system config overlays; - }; -} diff --git a/overlays/steam.nix b/overlays/steam.nix deleted file mode 100644 index 44893af..0000000 --- a/overlays/steam.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ ... }: final: prev: { - steam = prev.steam.override { - extraBwrapArgs = [ - "--bind $HOME/.local/share/steam_home $HOME" - "--bind $HOME/mounts $HOME/mounts" - "--unsetenv XDG_CACHE_HOME" - "--unsetenv XDG_CONFIG_HOME" - "--unsetenv XDG_DATA_HOME" - "--unsetenv XDG_STATE_HOME" - ]; - }; -} -