Compare commits

..
42 changed files with 427 additions and 1960 deletions
-40
View File
@@ -1,40 +0,0 @@
name: Update flake lock
on:
schedule:
# Gitea cron schedules use UTC. 07:00 UTC is 03:00 EDT.
- cron: "0 7 * * 0"
workflow_dispatch:
permissions:
contents: write
jobs:
update-flake-lock:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Install upstream Nix
uses: cachix/install-nix-action@v31
- name: Update flake lock
run: nix flake update
- name: Commit and push changes
shell: bash
run: |
set -euo pipefail
if git diff --quiet -- flake.lock; then
echo "flake.lock is already up to date"
exit 0
fi
git config user.name "gitea-actions[bot]"
git config user.email "gitea-actions[bot]@noreply.localhost"
git add flake.lock
git commit -m "chore: update flake lock"
git push
-100
View File
@@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
logoColor: '#cba6f7'
prompt:
fgColor: '#cdd6f4'
bgColor: '#181825'
suggestColor: '#89b4fa'
help:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
sectionColor: '#a6e3a1'
keyColor: '#89b4fa'
numKeyColor: '#eba0ac'
frame:
title:
fgColor: '#94e2d5'
bgColor: '#1e1e2e'
highlightColor: '#f5c2e7'
counterColor: '#f9e2af'
filterColor: '#a6e3a1'
border:
fgColor: '#cba6f7'
focusColor: '#b4befe'
menu:
fgColor: '#cdd6f4'
keyColor: '#89b4fa'
numKeyColor: '#eba0ac'
crumbs:
fgColor: '#1e1e2e'
bgColor: '#eba0ac'
activeColor: '#f2cdcd'
status:
newColor: '#89b4fa'
modifyColor: '#b4befe'
addColor: '#a6e3a1'
pendingColor: '#fab387'
errorColor: '#f38ba8'
highlightColor: '#89dceb'
killColor: '#cba6f7'
completedColor: '#6c7086'
info:
fgColor: '#fab387'
sectionColor: '#cdd6f4'
views:
table:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
cursorFgColor: '#313244'
cursorBgColor: '#45475a'
markColor: '#f5e0dc'
header:
fgColor: '#f9e2af'
bgColor: '#1e1e2e'
sorterColor: '#89dceb'
xray:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
cursorColor: '#45475a'
cursorTextColor: '#1e1e2e'
graphicColor: '#f5c2e7'
charts:
bgColor: '#1e1e2e'
chartBgColor: '#1e1e2e'
dialBgColor: '#1e1e2e'
defaultDialColors:
- '#a6e3a1'
- '#f38ba8'
defaultChartColors:
- '#a6e3a1'
- '#f38ba8'
resourceColors:
cpu:
- '#cba6f7'
- '#89b4fa'
mem:
- '#f9e2af'
- '#fab387'
yaml:
keyColor: '#89b4fa'
valueColor: '#cdd6f4'
colonColor: '#a6adc8'
logs:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
indicator:
fgColor: '#b4befe'
bgColor: '#1e1e2e'
toggleOnColor: '#a6e3a1'
toggleOffColor: '#a6adc8'
dialog:
fgColor: '#f9e2af'
bgColor: '#9399b2'
buttonFgColor: '#1e1e2e'
buttonBgColor: '#7f849c'
buttonFocusFgColor: '#1e1e2e'
buttonFocusBgColor: '#f5c2e7'
labelFgColor: '#f5e0dc'
fieldFgColor: '#cdd6f4'
-3
View File
@@ -12,9 +12,6 @@ return {
-- { import = "astrocommunity.pack.go "}, -- golang support -- { import = "astrocommunity.pack.go "}, -- golang support
{ import = "astrocommunity.pack.fish" }, -- fish support { import = "astrocommunity.pack.fish" }, -- fish support
-- { import = "astrocommunity.pack.cs" }, -- csharp/dotnet support -- { import = "astrocommunity.pack.cs" }, -- csharp/dotnet support
{ import = "astrocommunity.completion.copilot-lua" }, -- copilot
{ import = "astrocommunity.completion.copilot-lua-cmp" }, -- copilot
{ import = "astrocommunity.recipes.heirline-mode-text-statusline" }, -- statusline customization
-- import/override with your plugins folder -- import/override with your plugins folder
} }
-56
View File
@@ -1,56 +0,0 @@
local function toggle_tui(cmd, direction, size)
local terminal
local dir = direction or "float"
local term_size = size
return function()
if not terminal then
local Terminal = require("toggleterm.terminal").Terminal
terminal = Terminal:new {
cmd = cmd,
hidden = true,
close_on_exit = true,
direction = dir,
on_open = function() vim.cmd "startinsert!" end,
}
end
terminal:toggle(term_size, dir)
end
end
local toggle_k9s = toggle_tui "k9s"
local toggle_ghdash = toggle_tui "gh-dash"
local toggle_ai_opencode = toggle_tui("opencode", "vertical", 80)
local toggle_ai_copilot = toggle_tui("copilot", "vertical", 80)
return {
{
"AstroNvim/astrocore",
---@type AstroCoreOpts
opts = {
mappings = {
n = {
["<Leader>k"] = { desc = "Kubernetes" },
["<Leader>ki"] = {
toggle_k9s,
desc = "K9s",
},
["<Leader>gD"] = {
toggle_ghdash,
desc = "GitHub dashboard",
},
["<Leader>a"] = { desc = "AI" },
["<Leader>ao"] = {
toggle_ai_opencode,
desc = "opencode",
},
["<Leader>ag"] = {
toggle_ai_copilot,
desc = "GH Copilot",
},
},
},
},
},
}
+82 -7
View File
@@ -1,10 +1,85 @@
if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE
-- You can also add or configure plugins by creating files in this `plugins/` folder
-- Here are some examples:
---@type LazySpec ---@type LazySpec
return { return {
{ "nvim-treesitter/nvim-treesitter" },
{ "neovim/nvim-lspconfig" }, -- == Examples of Adding Plugins ==
{ "kylechui/nvim-surround" },
{ "nvim-neo-tree/neo-tree.nvim" }, "andweeb/presence.nvim",
{ "akinsho/toggleterm.nvim" }, {
{ "nvimtools/none-ls.nvim" }, "ray-x/lsp_signature.nvim",
{ "rebelot/heirline.nvim" }, event = "BufRead",
config = function() require("lsp_signature").setup() end,
},
-- == Examples of Overriding Plugins ==
-- customize alpha options
{
"goolord/alpha-nvim",
opts = function(_, opts)
-- customize the dashboard header
opts.section.header.val = {
" █████ ███████ ████████ ██████ ██████",
"██ ██ ██ ██ ██ ██ ██ ██",
"███████ ███████ ██ ██████ ██ ██",
"██ ██ ██ ██ ██ ██ ██ ██",
"██ ██ ███████ ██ ██ ██ ██████",
" ",
" ███  ██ ██  ██ ██ ███  ███",
" ████  ██ ██  ██ ██ ████  ████",
" ██ ██  ██ ██  ██ ██ ██ ████ ██",
" ██  ██ ██  ██  ██  ██ ██  ██  ██",
" ██   ████   ████   ██ ██      ██",
}
return opts
end,
},
-- You can disable default plugins as follows:
{ "max397574/better-escape.nvim", enabled = false },
-- You can also easily customize additional setup of plugins that is outside of the plugin's setup call
{
"L3MON4D3/LuaSnip",
config = function(plugin, opts)
require "astronvim.plugins.configs.luasnip"(plugin, opts) -- include the default astronvim config that calls the setup call
-- add more custom luasnip configuration such as filetype extend or custom snippets
local luasnip = require "luasnip"
luasnip.filetype_extend("javascript", { "javascriptreact" })
end,
},
{
"windwp/nvim-autopairs",
config = function(plugin, opts)
require "astronvim.plugins.configs.nvim-autopairs"(plugin, opts) -- include the default astronvim config that calls the setup call
-- add more custom autopairs configuration such as custom rules
local npairs = require "nvim-autopairs"
local Rule = require "nvim-autopairs.rule"
local cond = require "nvim-autopairs.conds"
npairs.add_rules(
{
Rule("$", "$", { "tex", "latex" })
-- don't add a pair if the next character is %
:with_pair(cond.not_after_regex "%%")
-- don't add a pair if the previous character is xxx
:with_pair(
cond.not_before_regex("xxx", 3)
)
-- don't move right when repeat character
:with_move(cond.none())
-- don't delete if the next character is xx
:with_del(cond.not_after_regex "xx")
-- disable adding a newline when you press <cr>
:with_cr(cond.none()),
},
-- disable for .vim files, but it work for another filetypes
Rule("a", "a", "-vim")
)
end,
},
} }
+2 -2
View File
@@ -198,8 +198,8 @@ bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
bindsym XF86AudioPlay exec playerctl play-pause bindsym XF86AudioPlay exec playerctl play-pause
bindsym XF86AudioNext exec playerctl next bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous bindsym XF86AudioPrev exec playerctl previous
bindsym XF86MonBrightnessUp exec brightnessctl set +5% bindsym XF86MonBrightnessUp exec light -A 5
bindsym XF86MonBrightnessDown exec brightnessctl set 5%- bindsym XF86MonBrightnessDown exec light -U 5
### Lock the screen ### Lock the screen
bindsym $mod+Ctrl+q 'swaylock -f -i /home/wyatt/.wallpaper/.wallpaper_lock.png' bindsym $mod+Ctrl+q 'swaylock -f -i /home/wyatt/.wallpaper/.wallpaper_lock.png'
+6 -14
View File
@@ -2,7 +2,7 @@
"layer": "top", "layer": "top",
"modules-left": ["sway/workspaces"], "modules-left": ["sway/workspaces"],
"modules-center": ["clock"], "modules-center": ["clock"],
"modules-right": ["custom/playerctl", "custom/weather", "pulseaudio", "custom/network", "custom/ollama", "tray"], "modules-right": ["custom/playerctl", "custom/weather", "pulseaudio", "network", "tray"],
"sway/workspaces": { "sway/workspaces": {
"disable-scroll": true, "disable-scroll": true,
"all-outputs": true, "all-outputs": true,
@@ -34,22 +34,14 @@
"exec": "wttrbar --fahrenheit --main-indicator 'temp_F' --location 'Grand Rapids'", "exec": "wttrbar --fahrenheit --main-indicator 'temp_F' --location 'Grand Rapids'",
"return-type": "json" "return-type": "json"
}, },
"custom/network": { "network": {
"format": "{text}", "format-wifi": " {essid} ({signalStrength}%)",
"return-type": "json", "format-ethernet": " {ipaddr}",
"exec": "bash $HOME/.config/waybar/network.sh", "format-disconnected": "⚠ Disconnected",
"on-click": "bash $HOME/.config/waybar/network.sh toggle", "family": "ipv4",
"interval": 5, "interval": 5,
"tooltip": false "tooltip": false
}, },
"custom/ollama": {
"format": "{text}",
"return-type": "json",
"exec": "bash $HOME/.config/waybar/ollama.sh",
"on-click": "bash $HOME/.config/waybar/ollama.sh toggle",
"interval": 2,
"tooltip": true
},
"pulseaudio": { "pulseaudio": {
"format": "{icon} {volume}%", "format": "{icon} {volume}%",
"format-bluetooth": "{icon} {volume}%", "format-bluetooth": "{icon} {volume}%",
-54
View File
@@ -1,54 +0,0 @@
#!/usr/bin/env bash
set -u
state_dir="${XDG_RUNTIME_DIR:-/tmp}/waybar-${UID}"
state_file="$state_dir/public-ip"
if [[ ${1:-} == toggle ]]; then
mkdir -p -m 700 "$state_dir"
if [[ -s $state_file ]]; then
: > "$state_file"
else
public_ip=$(curl -4fsS --max-time 5 https://wtfismyip.com/json 2>/dev/null |
jq -er '.YourFuckingIPAddress | select(type == "string") | split(".") |
select(length == 4 and all(.[]; test("^[0-9]{1,3}$") and (tonumber <= 255))) |
join(".")' 2>/dev/null) || exit 0
printf '%s\n' "$public_ip" > "$state_file"
fi
exit 0
fi
route=$(ip -4 route get 1.1.1.1 2>/dev/null) || route=
if [[ ! $route =~ [[:space:]]dev[[:space:]]([^[:space:]]+) ]]; then
jq -cn '{text: "⚠ Disconnected", class: "disconnected"}'
exit 0
fi
interface=${BASH_REMATCH[1]}
if [[ ! $route =~ [[:space:]]src[[:space:]]([0-9.]+) ]]; then
jq -cn '{text: "⚠ Disconnected", class: "disconnected"}'
exit 0
fi
local_ip=${BASH_REMATCH[1]}
if [[ -s $state_file ]]; then
jq -cn --rawfile ip "$state_file" '{text: (" " + ($ip | rtrimstr("\n"))), class: "public"}'
exit 0
fi
if [[ $(nmcli -g GENERAL.TYPE device show "$interface" 2>/dev/null) == wifi ]]; then
essid=$(nmcli -g GENERAL.CONNECTION device show "$interface" 2>/dev/null | head -n 1)
signal=$(nmcli -t -f IN-USE,SIGNAL device wifi list ifname "$interface" --rescan no 2>/dev/null |
awk -F: '$1 == "*" { print $2; exit }')
if [[ -n $essid && $essid != -- ]]; then
text="$essid"
[[ -n $signal ]] && text="${text} (${signal}%)"
else
text="$local_ip"
fi
else
text="$local_ip"
fi
jq -cn --arg text "$text" '{text: $text, class: "connected"}'
-24
View File
@@ -1,24 +0,0 @@
#!/usr/bin/env bash
set -u
service=ollama.service
# The shared Waybar config is also used by hosts without Ollama.
if ! systemctl --user cat "$service" >/dev/null 2>&1; then
exit 0
fi
if [[ ${1:-} == toggle ]]; then
if systemctl --user is-active --quiet "$service"; then
systemctl --user stop "$service"
else
systemctl --user start "$service"
fi
exit $?
fi
if systemctl --user is-active --quiet "$service"; then
printf '%s\n' '{"text":"<span foreground=\"#9ece6a\">●</span> Local AI","tooltip":"Ollama is running. Click to stop it.","class":"running"}'
else
printf '%s\n' '{"text":"<span foreground=\"#f7768e\">●</span> Local AI","tooltip":"Ollama is stopped. Click to start it.","class":"stopped"}'
fi
+3 -4
View File
@@ -31,12 +31,11 @@ window#waybar {
#cpu, #cpu,
#memory, #memory,
#pulseaudio, #pulseaudio,
#custom-network, #network,
#custom-ollama,
#battery, #battery,
#clock, #clock,
#custom-playerctl { #custom-playerctl {
padding: 0 5px; padding: 0 10px;
margin: 0 5px; margin: 0 5px;
} }
@@ -66,7 +65,7 @@ window#waybar {
animation-direction: alternate; animation-direction: alternate;
} }
#custom-network.disconnected { #network.disconnected {
color: #cc241d; color: #cc241d;
} }
Generated
+83 -464
View File
@@ -9,11 +9,11 @@
"rust-overlay": "rust-overlay" "rust-overlay": "rust-overlay"
}, },
"locked": { "locked": {
"lastModified": 1789138122, "lastModified": 1771170334,
"narHash": "sha256-mh+ZiGCtHAo0xIi1yaNjHsftfnlWz9JiYwHCyT16yIE=", "narHash": "sha256-tCgoCWORfNHaRXTh2QS44LwxlV8q28jVvjN5ioMicv8=",
"owner": "ezKEa", "owner": "ezKEa",
"repo": "aagl-gtk-on-nix", "repo": "aagl-gtk-on-nix",
"rev": "d82d6d6f66caf4b63fb154e62fad83c627874127", "rev": "821b4f92c2c0981ea5b571b03403df87d2b2e2ae",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -22,29 +22,6 @@
"type": "github" "type": "github"
} }
}, },
"caitsith": {
"inputs": {
"flake-schemas": "flake-schemas",
"nixpkgs": [
"nur",
"nixpkgs"
],
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1790492877,
"narHash": "sha256-RK9eeRQv9l3pQ8qNCdJ8fpkFCp/+QpNn7lR7Kkfrv8w=",
"ref": "refs/heads/master",
"rev": "d3216bbe660f8265f1393ecf263ab5f8662f5a58",
"revCount": 26,
"type": "git",
"url": "https://scm.wyattjmiller.com/wymiller/caitsith.git"
},
"original": {
"type": "git",
"url": "https://scm.wyattjmiller.com/wymiller/caitsith.git"
}
},
"darwin": { "darwin": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -52,37 +29,16 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1783744694, "lastModified": 1767634391,
"narHash": "sha256-2cp6N3rrwnGYLTx9l6N+NI+kwrCWxvJUbj5WJhvB29A=", "narHash": "sha256-owcSz2ICqTSvhBbhPP+1eWzi88e54rRZtfCNE5E/wwg=",
"owner": "lnl7", "owner": "lnl7",
"repo": "nix-darwin", "repo": "nix-darwin",
"rev": "c3e90c89649b07d1a96e4b9dd6cd0d6e44b91a74", "rev": "08585aacc3d6d6c280a02da195fdbd4b9cf083c2",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "lnl7", "owner": "lnl7",
"ref": "nix-darwin-26.05", "ref": "nix-darwin-25.11",
"repo": "nix-darwin",
"type": "github"
}
},
"darwin_2": {
"inputs": {
"nixpkgs": [
"nur",
"nixpkgs"
]
},
"locked": {
"lastModified": 1786845137,
"narHash": "sha256-oQFip+v0luP8NIxJzmiW4Wu8bILsbFWom5l0zonl8hQ=",
"owner": "LnL7",
"repo": "nix-darwin",
"rev": "4cff07de74b50e64bdd68cd4e722ab5b6b35ee48",
"type": "github"
},
"original": {
"owner": "LnL7",
"repo": "nix-darwin", "repo": "nix-darwin",
"type": "github" "type": "github"
} }
@@ -103,62 +59,14 @@
"type": "github" "type": "github"
} }
}, },
"flake-compat_2": {
"flake": false,
"locked": {
"lastModified": 1767039857,
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "NixOS",
"repo": "flake-compat",
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "flake-compat",
"type": "github"
}
},
"flake-compat_3": {
"flake": false,
"locked": {
"lastModified": 1767039857,
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "NixOS",
"repo": "flake-compat",
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "flake-compat",
"type": "github"
}
},
"flake-compat_4": {
"flake": false,
"locked": {
"lastModified": 1777699697,
"narHash": "sha256-Eg9b/rq/ECYwNwEXs5i9wHyhxNI0JrYx2srdI2uZMaQ=",
"ref": "refs/heads/main",
"rev": "382052b74656a369c5408822af3f2501e9b1af81",
"revCount": 94,
"type": "git",
"url": "https://git.lix.systems/lix-project/flake-compat.git"
},
"original": {
"type": "git",
"url": "https://git.lix.systems/lix-project/flake-compat.git"
}
},
"flake-schemas": { "flake-schemas": {
"locked": { "locked": {
"lastModified": 1780327564, "lastModified": 1761577921,
"narHash": "sha256-HiRPtA0spK+Dkgbhz/1zW9glXxNVB+L4Rj2VYmdawb8=", "narHash": "sha256-eK3/xbUOrxp9fFlei09XNjqcdiHXxndzrTXp7jFpOk8=",
"rev": "6cc9bd98891b1fc6bb2b8cb3277df8bc72799ca6", "rev": "47849c7625e223d36766968cc6dc23ba0e135922",
"revCount": 149, "revCount": 107,
"type": "tarball", "type": "tarball",
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.5.0/019e83cf-9af3-78b1-ac5b-70e68ad1efe1/source.tar.gz" "url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.2.0/019a4a84-544d-7c59-b26d-e334e320c932/source.tar.gz"
}, },
"original": { "original": {
"type": "tarball", "type": "tarball",
@@ -167,165 +75,18 @@
}, },
"flake-schemas_2": { "flake-schemas_2": {
"locked": { "locked": {
"lastModified": 1780327564, "lastModified": 1761577921,
"narHash": "sha256-HiRPtA0spK+Dkgbhz/1zW9glXxNVB+L4Rj2VYmdawb8=", "narHash": "sha256-eK3/xbUOrxp9fFlei09XNjqcdiHXxndzrTXp7jFpOk8=",
"rev": "6cc9bd98891b1fc6bb2b8cb3277df8bc72799ca6", "rev": "47849c7625e223d36766968cc6dc23ba0e135922",
"revCount": 149, "revCount": 107,
"type": "tarball", "type": "tarball",
"url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.5.0/019e83cf-9af3-78b1-ac5b-70e68ad1efe1/source.tar.gz" "url": "https://api.flakehub.com/f/pinned/DeterminateSystems/flake-schemas/0.2.0/019a4a84-544d-7c59-b26d-e334e320c932/source.tar.gz"
}, },
"original": { "original": {
"type": "tarball", "type": "tarball",
"url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%2A" "url": "https://flakehub.com/f/DeterminateSystems/flake-schemas/%2A"
} }
}, },
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"git-hooks": {
"inputs": {
"flake-compat": "flake-compat_2",
"nixpkgs": [
"go-overlay",
"nixpkgs"
]
},
"locked": {
"lastModified": 1788267358,
"narHash": "sha256-nt+lUqYVpc9Y6JeMd2WmXzCDojasdadKo0mWcluvY2Y=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "27555e2624241fb116b49095df4caaee85a25691",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"git-hooks_2": {
"inputs": {
"flake-compat": "flake-compat_3",
"nixpkgs": [
"nur",
"go-overlay",
"nixpkgs"
]
},
"locked": {
"lastModified": 1788267358,
"narHash": "sha256-nt+lUqYVpc9Y6JeMd2WmXzCDojasdadKo0mWcluvY2Y=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "27555e2624241fb116b49095df4caaee85a25691",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"go-overlay": {
"inputs": {
"flake-utils": "flake-utils",
"git-hooks": "git-hooks",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1790872110,
"narHash": "sha256-dXrMwUGE/9pT0J7MeW1BuYxpnnPPc52/oLxfqQF/5q8=",
"owner": "purpleclay",
"repo": "go-overlay",
"rev": "8e136930a2a34c501d612f7b7b0ee8806531768f",
"type": "github"
},
"original": {
"owner": "purpleclay",
"repo": "go-overlay",
"type": "github"
}
},
"go-overlay_2": {
"inputs": {
"flake-utils": "flake-utils_2",
"git-hooks": "git-hooks_2",
"nixpkgs": [
"nur",
"nixpkgs"
]
},
"locked": {
"lastModified": 1790872110,
"narHash": "sha256-dXrMwUGE/9pT0J7MeW1BuYxpnnPPc52/oLxfqQF/5q8=",
"owner": "purpleclay",
"repo": "go-overlay",
"rev": "8e136930a2a34c501d612f7b7b0ee8806531768f",
"type": "github"
},
"original": {
"owner": "purpleclay",
"repo": "go-overlay",
"type": "github"
}
},
"hildibrand": {
"inputs": {
"flake-schemas": "flake-schemas_2",
"nixpkgs": [
"nur",
"nixpkgs"
],
"rust-overlay": "rust-overlay_3"
},
"locked": {
"lastModified": 1790492923,
"narHash": "sha256-pi8p2jRW9pprb0ZFH50/Z9Bxv0bKgddMXbLZ0D03L3w=",
"ref": "refs/heads/master",
"rev": "580082101efc0807637529e539886ee6c5f95672",
"revCount": 15,
"type": "git",
"url": "https://scm.wyattjmiller.com/wymiller/hildibrand.git"
},
"original": {
"type": "git",
"url": "https://scm.wyattjmiller.com/wymiller/hildibrand.git"
}
},
"home-manager": { "home-manager": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -333,56 +94,20 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1790996401, "lastModified": 1770260404,
"narHash": "sha256-f+kOxEmOUnQazVAmGg0i8hzwgd1kX/geY+k/Dpheye8=", "narHash": "sha256-3iVX1+7YUIt23hBx1WZsUllhbmP2EnXrV8tCRbLxHc8=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "db7d5e2332710f5abb088f6b5de927d7f9511b35", "rev": "0d782ee42c86b196acff08acfbf41bb7d13eed5b",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "nix-community",
"ref": "release-26.05", "ref": "release-25.11",
"repo": "home-manager", "repo": "home-manager",
"type": "github" "type": "github"
} }
}, },
"home-manager_2": {
"inputs": {
"nixpkgs": [
"nur",
"nixpkgs"
]
},
"locked": {
"lastModified": 1790989254,
"narHash": "sha256-ZN+riaeFuE+DZ5zfqJiXlM12jLwZzeIXiNkU1YeHMXI=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "acd21c5a3420a9d5fd0ed06299b10828267ef9ba",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
},
"mnw": {
"locked": {
"lastModified": 1784154424,
"narHash": "sha256-HRn4O1X2ShYtbq5Egji72/aemyc2cIQicjRZD9hBqM8=",
"owner": "Gerg-L",
"repo": "mnw",
"rev": "0151d9fa87992cbeb67c86616fb9170dcec830b6",
"type": "github"
},
"original": {
"owner": "Gerg-L",
"repo": "mnw",
"type": "github"
}
},
"nix-flatpak": { "nix-flatpak": {
"locked": { "locked": {
"lastModified": 1739444422, "lastModified": 1739444422,
@@ -401,66 +126,37 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1789286504, "lastModified": 1744536153,
"narHash": "sha256-eiEK7cKZORNEvX0GeF3RtNEF/JXhgf2RqSp3230q13E=", "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
"owner": "nixos", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "ef34387ddd751e1ab8857adf4676492d32eb24ec", "rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "NixOS",
"ref": "nixos-unstable", "ref": "nixpkgs-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1790920529, "lastModified": 1771043024,
"narHash": "sha256-nQyFkMR78WP6PiXKkDW2SjqzLf/spQqjRuxRGSbcV8k=", "narHash": "sha256-O1XDr7EWbRp+kHrNNgLWgIrB0/US5wvw9K6RERWAj6I=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "774debe7a0d1b496e35677ad955a1011c6ff74f3", "rev": "3aadb7ca9eac2891d52a9dec199d9580a6e2bf44",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-26.05", "ref": "nixos-25.11",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs_3": { "nixpkgs_3": {
"locked": {
"lastModified": 1790920529,
"narHash": "sha256-nQyFkMR78WP6PiXKkDW2SjqzLf/spQqjRuxRGSbcV8k=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "774debe7a0d1b496e35677ad955a1011c6ff74f3",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-26.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1790046670,
"narHash": "sha256-OJe62m8gZx4xEAQnMcqH1u31/uu4Xf0q2ykAEHZfgrg=",
"rev": "6774f7bc253789b113a4f39285dc0fa100abeacc",
"type": "tarball",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1077996.6774f7bc2537/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
"url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
}
},
"nixpkgs_5": {
"locked": { "locked": {
"lastModified": 1744536153, "lastModified": 1744536153,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
@@ -476,76 +172,56 @@
"type": "github" "type": "github"
} }
}, },
"nur": { "nixpkgs_4": {
"inputs": {
"caitsith": "caitsith",
"darwin": "darwin_2",
"go-overlay": "go-overlay_2",
"hildibrand": "hildibrand",
"home-manager": "home-manager_2",
"nixpkgs": "nixpkgs_3",
"rust-overlay": "rust-overlay_4"
},
"locked": { "locked": {
"lastModified": 1791097561, "lastModified": 1766201043,
"narHash": "sha256-AmeVVy0WbW/y/sZv7ZGYn3dY6HuHPqvUgYorahAe4lM=", "narHash": "sha256-eplAP+rorKKd0gNjV3rA6+0WMzb1X1i16F5m5pASnjA=",
"ref": "refs/heads/master", "rev": "b3aad468604d3e488d627c0b43984eb60e75e782",
"rev": "55e8c40fbcd0c848c38002fdefb37de7084715be", "revCount": 904049,
"revCount": 107, "type": "tarball",
"type": "git", "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.904049%2Brev-b3aad468604d3e488d627c0b43984eb60e75e782/019b3f6c-8b33-7edb-b858-9979590f270b/source.tar.gz"
"url": "https://scm.wyattjmiller.com/wymiller/nur.git"
}, },
"original": { "original": {
"type": "git", "type": "tarball",
"url": "https://scm.wyattjmiller.com/wymiller/nur.git" "url": "https://flakehub.com/f/NixOS/nixpkgs/%2A"
} }
}, },
"nvf": { "nixpkgs_5": {
"inputs": {
"flake-compat": "flake-compat_4",
"mnw": "mnw",
"nixpkgs": "nixpkgs_4"
},
"locked": { "locked": {
"lastModified": 1790797021, "lastModified": 1769089682,
"narHash": "sha256-H2vA5yUaS58Wtdp46piMbRqSQe3Qn716i/oZPYoyhp8=", "narHash": "sha256-9yA/LIuAVQq0lXelrZPjLuLVuZdm03p8tfmHhnDIkms=",
"owner": "notashelf", "rev": "078d69f03934859a181e81ba987c2bb033eebfc5",
"repo": "nvf", "revCount": 906333,
"rev": "2477cb0a5f394df36ddc72867c2657225d93d157", "type": "tarball",
"type": "github" "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.906333%2Brev-078d69f03934859a181e81ba987c2bb033eebfc5/019bebf2-031c-7119-8fdc-ce9d29d005fa/source.tar.gz"
}, },
"original": { "original": {
"owner": "notashelf", "type": "tarball",
"repo": "nvf", "url": "https://flakehub.com/f/NixOS/nixpkgs/%2A"
"type": "github"
} }
}, },
"root": { "root": {
"inputs": { "inputs": {
"aagl": "aagl", "aagl": "aagl",
"darwin": "darwin", "darwin": "darwin",
"go-overlay": "go-overlay",
"home-manager": "home-manager", "home-manager": "home-manager",
"nix-flatpak": "nix-flatpak", "nix-flatpak": "nix-flatpak",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_2",
"nur": "nur", "rust-overlay": "rust-overlay_2",
"nvf": "nvf", "swaytreesave": "swaytreesave",
"rust-overlay": "rust-overlay_5" "vintage-story": "vintage-story"
} }
}, },
"rust-overlay": { "rust-overlay": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": "nixpkgs"
"aagl",
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1785476452, "lastModified": 1770952264,
"narHash": "sha256-/CXwCFPS41rb/JI2VitKCgVK6V5E6/sfw5ke3B9zyVQ=", "narHash": "sha256-CjymNrJZWBtpavyuTkfPVPaZkwzIzGaf0E/3WgcwM14=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "6ef009bf4c4873cdc1a621826722bdea7c03e62c", "rev": "ec6a3d5cdf14bb5a1dd03652bd3f6351004d2188",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -556,18 +232,14 @@
}, },
"rust-overlay_2": { "rust-overlay_2": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": "nixpkgs_3"
"nur",
"caitsith",
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1790407471, "lastModified": 1771211437,
"narHash": "sha256-M8elY2UShg4ZuLTiRLEHO+ae5xQFp3/ReQdxp/R+1UU=", "narHash": "sha256-lcNK438i4DGtyA+bPXXyVLHVmJjYpVKmpux9WASa3ro=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "4e9bb05a9ab6c37dc74c22974ebed6e36dc73eb2", "rev": "c62195b3d6e1bb11e0c2fb2a494117d3b55d410f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -576,95 +248,42 @@
"type": "github" "type": "github"
} }
}, },
"rust-overlay_3": { "swaytreesave": {
"inputs": { "inputs": {
"nixpkgs": [ "flake-schemas": "flake-schemas",
"nur", "nixpkgs": "nixpkgs_4"
"hildibrand",
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1790407471, "lastModified": 1767148467,
"narHash": "sha256-M8elY2UShg4ZuLTiRLEHO+ae5xQFp3/ReQdxp/R+1UU=", "narHash": "sha256-W0O7SWq8ucokt4ctEAEvRvNoSM/oF7fBfb2kTN+lwTs=",
"owner": "oxalica", "ref": "refs/heads/master",
"repo": "rust-overlay", "rev": "0f4bb9bb450b28aa4f29d5eb2062deac6c26687a",
"rev": "4e9bb05a9ab6c37dc74c22974ebed6e36dc73eb2", "revCount": 4,
"type": "github" "type": "git",
"url": "https://scm.wyattjmiller.com/wymiller/swaytreesave-nix.git"
}, },
"original": { "original": {
"owner": "oxalica", "type": "git",
"repo": "rust-overlay", "url": "https://scm.wyattjmiller.com/wymiller/swaytreesave-nix.git"
"type": "github"
} }
}, },
"rust-overlay_4": { "vintage-story": {
"inputs": {
"nixpkgs": [
"nur",
"nixpkgs"
]
},
"locked": {
"lastModified": 1791013993,
"narHash": "sha256-BiFPwFsbFnZH5GfWbQFKYuQNg+67aNQCoRSRNTeJFQc=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "7470661ba2b51156048af08464b82020223dc942",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"rust-overlay_5": {
"inputs": { "inputs": {
"flake-schemas": "flake-schemas_2",
"nixpkgs": "nixpkgs_5" "nixpkgs": "nixpkgs_5"
}, },
"locked": { "locked": {
"lastModified": 1791013993, "lastModified": 1769397199,
"narHash": "sha256-BiFPwFsbFnZH5GfWbQFKYuQNg+67aNQCoRSRNTeJFQc=", "narHash": "sha256-MSajncUGZtlpl88rqFdj42eGGyWnk2jw84VbK3AgUBA=",
"owner": "oxalica", "ref": "refs/heads/master",
"repo": "rust-overlay", "rev": "4d2313c50933645040a0d12556016fc2916bfa65",
"rev": "7470661ba2b51156048af08464b82020223dc942", "revCount": 1,
"type": "github" "type": "git",
"url": "https://scm.wyattjmiller.com/wymiller/vintage-story-nix.git"
}, },
"original": { "original": {
"owner": "oxalica", "type": "git",
"repo": "rust-overlay", "url": "https://scm.wyattjmiller.com/wymiller/vintage-story-nix.git"
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
} }
} }
}, },
+14 -99
View File
@@ -1,24 +1,25 @@
{ {
description = "Wyatt's nix configuration suite"; description = "Wyatt's nix configuration suite";
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05"; nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.6.0"; nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.6.0";
home-manager = { home-manager = {
url = "github:nix-community/home-manager/release-26.05"; url = "github:nix-community/home-manager/release-25.11";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
darwin = { darwin = {
url = "github:lnl7/nix-darwin/nix-darwin-26.05"; url = "github:lnl7/nix-darwin/nix-darwin-25.11";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
rust-overlay.url = "github:oxalica/rust-overlay"; rust-overlay.url = "github:oxalica/rust-overlay";
go-overlay.url = "github:purpleclay/go-overlay";
aagl = { aagl = {
url = "github:ezKEa/aagl-gtk-on-nix"; url = "github:ezKEa/aagl-gtk-on-nix";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
nvf.url = "github:notashelf/nvf";
nur.url = "git+https://scm.wyattjmiller.com/wymiller/nur.git"; # My personal flakes
swaytreesave.url = "git+https://scm.wyattjmiller.com/wymiller/swaytreesave-nix.git";
vintage-story.url = "git+https://scm.wyattjmiller.com/wymiller/vintage-story-nix.git";
}; };
outputs = inputs @ { outputs = inputs @ {
@@ -28,32 +29,26 @@
darwin, darwin,
home-manager, home-manager,
rust-overlay, rust-overlay,
go-overlay,
aagl, aagl,
nur, swaytreesave,
nvf, vintage-story,
... ...
}: let }: let
userName = "wyatt"; userName = "wyatt";
userEmail = "wyatt@wyattjmiller.com"; userEmail = "wyatt@wyattjmiller.com";
extraSpecialArgs = { extraSpecialArgs = {
inherit userName userEmail nur nvf; inherit userName userEmail swaytreesave;
}; };
myOverlays = { ... }: { myOverlays = { ... }: {
nixpkgs.overlays = [ nixpkgs.overlays = [
rust-overlay.overlays.default rust-overlay.overlays.default
go-overlay.overlays.default
aagl.overlays.default aagl.overlays.default
self.common.overlays self.common.overlays
]; ];
}; };
in { in {
meta = import ./meta; meta = import ./meta;
formatter = nixpkgs.lib.genAttrs [
"x86_64-linux"
"aarch64-darwin"
] (system: nixpkgs.legacyPackages.${system}.nixfmt);
common = { common = {
overlays = import ./modules/common/overlays.nix; overlays = import ./modules/common/overlays.nix;
@@ -88,7 +83,7 @@
nixosConfigurations."cloud" = nixpkgs.lib.nixosSystem { nixosConfigurations."cloud" = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
specialArgs = { specialArgs = {
inherit userName userEmail aagl nur; inherit userName userEmail aagl vintage-story;
hostname = "cloud"; hostname = "cloud";
role = "workstation"; role = "workstation";
}; };
@@ -128,7 +123,7 @@
{ {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = extraSpecialArgs // { isNixOS = true; role = "workstation"; }; home-manager.extraSpecialArgs = extraSpecialArgs;
home-manager.backupFileExtension = "bak"; home-manager.backupFileExtension = "bak";
home-manager.users.${userName}.imports = [ home-manager.users.${userName}.imports = [
./home ./home
@@ -167,63 +162,10 @@
# ]; # ];
}; };
# Vintage story server
nixosConfigurations."thancred" = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
inherit userName userEmail nur;
hostname = "thancred";
role = "server";
};
modules = [
myOverlays
./modules/common
./modules/machine/thancred
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = extraSpecialArgs // { isNixOS = true; role = "server"; };
home-manager.backupFileExtension = "bak";
home-manager.users.${userName}.imports = [
./home
];
}
];
};
# Vintage story server - for a friend
nixosConfigurations."raubahn" = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
inherit userName userEmail nur;
hostname = "raubahn";
role = "server";
};
modules = [
myOverlays
./modules/common
./modules/machine/raubahn
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = extraSpecialArgs // { isNixOS = true; role = "server"; };
home-manager.backupFileExtension = "bak";
home-manager.users.${userName}.imports = [
./home
];
}
];
};
# Matrix and Mastodon server
nixosConfigurations."yshtola" = nixpkgs.lib.nixosSystem { nixosConfigurations."yshtola" = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
specialArgs = { specialArgs = {
inherit userName userEmail nur; inherit userName userEmail;
hostname = "yshtola"; hostname = "yshtola";
role = "server"; role = "server";
}; };
@@ -245,32 +187,6 @@
]; ];
}; };
# Discord bot server
nixosConfigurations."estinien" = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
inherit userName userEmail nur;
hostname = "estinien";
role = "server";
};
modules = [
myOverlays
./modules/common
./modules/machine/estinien
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = extraSpecialArgs // { isNixOS = true; role = "server"; };
home-manager.backupFileExtension = "bak";
home-manager.users.${userName}.imports = [
./home
];
}
];
};
# generic non-NixOS Linux machine # generic non-NixOS Linux machine
homeConfigurations."generic" = let homeConfigurations."generic" = let
hostname = builtins.getEnv "HOSTNAME"; hostname = builtins.getEnv "HOSTNAME";
@@ -279,7 +195,7 @@
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nixpkgs.legacyPackages.${system};
extraSpecialArgs = { extraSpecialArgs = {
inherit userName userEmail hostname nvf; inherit userName userEmail hostname;
isNixOS = false; isNixOS = false;
role = "workstation"; role = "workstation";
}; };
@@ -287,7 +203,6 @@
{ {
nixpkgs.overlays = [ nixpkgs.overlays = [
rust-overlay.overlays.default rust-overlay.overlays.default
go-overlay.overlays.default
self.common.overlays self.common.overlays
]; ];
} }
+15
View File
@@ -1,6 +1,8 @@
{ lib { lib
, pkgs , pkgs
, userName , userName
, swaytreesave
, isNixOS ? true
, ... , ...
}: let }: let
# Have a file sturcture that holds all the configuration files that can't be configured by Nix # Have a file sturcture that holds all the configuration files that can't be configured by Nix
@@ -30,6 +32,19 @@ in
stateVersion = "24.11"; stateVersion = "24.11";
} }
(lib.mkIf isNixOS {
sessionVariables = {
XDG_CURRENT_DESKTOP = "sway";
XDG_SESSION_TYPE = "wayland";
XDG_SESSION_DESKTOP = "sway";
XDG_CONFIG_HOME = "$HOME/.config";
XDG_CACHE_HOME = "$HOME/.cache";
XDG_DATA_HOME = "$HOME/.local/share";
XDG_STATE_HOME = "$HOME/.local/state";
NIXOS_OZONE_WL = "1";
};
})
(lib.mkIf pkgs.stdenv.isLinux { (lib.mkIf pkgs.stdenv.isLinux {
pointerCursor = { pointerCursor = {
gtk.enable = true; gtk.enable = true;
+2 -12
View File
@@ -13,15 +13,11 @@
userEmail = userEmail; userEmail = userEmail;
extraConfig = { extraConfig = {
commit.gpgsign = true;
gpg.format = "ssh";
gpg.ssh.allowedSignersFile = "~/.config/git/allowed_signers";
init.defaultBranch = "master"; init.defaultBranch = "master";
merge.tool = "nvimdiff";
mergetool.keepBackup = false;
push.autoSetupRemote = true; push.autoSetupRemote = true;
pull.rebase = false; pull.rebase = false;
user.signingkey = "~/.ssh/id_ed25519_sk.pub"; merge.tool = "nvimdiff";
mergetool.keepBackup = false;
}; };
ignores = [ ignores = [
@@ -35,7 +31,6 @@
a = "add"; a = "add";
ap = "add -p"; ap = "add -p";
br = "branch"; br = "branch";
cb = "checkout -b";
co = "checkout"; co = "checkout";
st = "status -sb"; st = "status -sb";
status = "status -sb"; status = "status -sb";
@@ -45,11 +40,6 @@
ca = "commit -am"; ca = "commit -am";
dc = "diff --cached"; dc = "diff --cached";
amend = "commit --amend -m"; amend = "commit --amend -m";
wipe = "reset --hard";
gg = "reset --hard";
ggs = "reset --hard";
sw = "switch";
r = "restore";
# aliases for submodules # aliases for submodules
update = "submodule update --init --recursive"; update = "submodule update --init --recursive";
+1 -1
View File
@@ -7,7 +7,7 @@
liveViewAutoRefresh = false; liveViewAutoRefresh = false;
apiServerTimeout = "30s"; apiServerTimeout = "30s";
maxConnRetry = 5; maxConnRetry = 5;
# readOnly = true; readOnly = true;
noExitOnCtrlC = false; noExitOnCtrlC = false;
portForwardAddress = "localhost"; portForwardAddress = "localhost";
skipLatestRevCheck = false; skipLatestRevCheck = false;
-1
View File
@@ -4,7 +4,6 @@
package = pkgs.lazygitLatest; package = pkgs.lazygitLatest;
settings = { settings = {
gui.skipDiscardChangeWarning = true;
gui.theme = { gui.theme = {
activeBorderColor = ["#a6e3a1" "bold"]; activeBorderColor = ["#a6e3a1" "bold"];
inactiveBorderColor = ["#a6adc8"]; inactiveBorderColor = ["#a6adc8"];
+11 -108
View File
@@ -1,115 +1,18 @@
{ nvf, ... }: { {...}: let
imports = [ dirs = {
nvf.homeManagerModules.default defaults = ../defaults;
]; };
in {
programs.nvf = { programs.neovim = {
enable = true; enable = true;
settings = { defaultEditor = true;
vim = {
viAlias = true;
vimAlias = true; vimAlias = true;
lsp.enable = true;
treesitter.enable = true;
autocomplete.nvim-cmp.enable = true;
autopairs.nvim-autopairs.enable = true;
languages = {
nix.enable = true;
rust.enable = true;
go.enable = true;
python.enable = true;
markdown.enable = true;
css.enable = true;
scss.enable = true;
tsx.enable = true;
typescript = {
enable = true;
lsp.servers = [ "typescript-language-server" "deno" ];
};
csharp = {
enable = true;
lsp.servers = [ "omnisharp" ];
};
}; };
utility.surround.enable = true; xdg.configFile = {
telescope.enable = true; nvim = {
mini.icons.enable = true; onChange = "nvim --headless -c 'if exists(\":LuaCacheClear\") | :LuaCacheClear' +quitall";
notes.obsidian = { source = dirs.defaults + /nvim;
enable = true;
setupOpts.workspaces = [
{
name = "personal";
path = "~/Documents/Obsidian/notes";
}
];
};
terminal.toggleterm = {
enable = true;
lazygit = {
enable = true;
mappings.open = "<leader>gg";
};
};
filetree.neo-tree.enable = true;
binds.whichKey.enable = true;
clipboard = {
enable = true;
registers = "unnamedplus";
providers = {
wl-copy.enable = true;
xclip.enable = true;
};
};
lsp.null-ls = {
enable = true;
setupOpts = {};
};
lsp.trouble.enable = true;
theme = {
enable = true;
name = "catppuccin";
style = "mocha";
transparent = false;
};
dashboard.alpha.enable = true;
statusline.lualine.enable = true;
tabline.nvimBufferline.enable = true;
keymaps = [
{
key = "<C-s>";
mode = "n";
action = "<cmd>w<CR>";
silent = true;
noremap = true;
}
{ key = "<leader>o"; mode = "n"; action = "<cmd>Neotree toggle<CR>"; silent = true; noremap = true; }
{ key = "<leader>tf"; mode = "n"; action = "<cmd>ToggleTerm direction=float<CR>"; silent = true; noremap = true; }
{ key = "<leader>th"; mode = "n"; action = "<cmd>ToggleTerm direction=horizontal<CR>"; silent = true; noremap = true; }
{ key = "<leader>tv"; mode = "n"; action = "<cmd>ToggleTerm direction=vertical<CR>"; silent = true; noremap = true; }
{ key = "<leader>n"; mode = "n"; action = "<nop>"; desc = "Notes"; silent = true; noremap = true; }
{ key = "<leader>nd"; mode = "n"; action = "<cmd>Obsidian today<CR>"; desc = "Obsidian daily note"; silent = true; noremap = true; }
{ key = "<leader>nf"; mode = "n"; action = "<cmd>Obsidian quick_switch<CR>"; desc = "Obsidian find note"; silent = true; noremap = true; }
{ key = "<leader>ns"; mode = "n"; action = "<cmd>Obsidian search<CR>"; desc = "Obsidian search notes"; silent = true; noremap = true; }
{ key = "<leader>nn"; mode = "n"; action = "<cmd>Obsidian new<CR>"; desc = "Obsidian new note"; silent = true; noremap = true; }
{ key = "<leader>ff"; mode = "n"; action = "<cmd>Telescope find_files<CR>"; silent = true; noremap = true; }
{ key = "<leader>fD"; mode = "n"; action = "<cmd>lua require('telescope.builtin').find_files({ cwd = vim.fn.input('Dir: ', vim.loop.cwd() .. '/', 'dir') })<CR>"; silent = true; noremap = true; }
{ key = "<leader>fg"; mode = "n"; action = "<cmd>Telescope live_grep<CR>"; silent = true; noremap = true; }
{ key = "<leader>/"; mode = "n"; action = "<cmd>Telescope current_buffer_fuzzy_find<CR>"; silent = true; noremap = true; }
{ key = "<leader>gb"; mode = "n"; action = "<cmd>Telescope git_branches<CR>"; silent = true; noremap = true; }
{ key = "<leader>gc"; mode = "n"; action = "<cmd>Telescope git_commits<CR>"; silent = true; noremap = true; }
{ key = "<leader>gl"; mode = "n"; action = "<cmd>Telescope git_bcommits<CR>"; silent = true; noremap = true; }
{ key = "<leader>gr"; mode = "n"; action = "<cmd>Telescope git_status<CR>"; silent = true; noremap = true; }
];
};
}; };
}; };
} }
+1 -18
View File
@@ -1,21 +1,4 @@
{ lib, pkgs, isNixOS ? true, ... }: { lib, pkgs, isNixOS ? true, ... }:
lib.mkIf pkgs.stdenv.isLinux { lib.mkIf pkgs.stdenv.isLinux {
home.packages = with pkgs; [
imv
xdg-utils
] ++ lib.optionals isNixOS [
vesktop
thunar
thunar-volman
thunar-shares-plugin
thunar-vcs-plugin
thunar-archive-plugin
thunar-media-tags-plugin
pavucontrol
zathura
gpu-screen-recorder
gpu-screen-recorder-gtk
inetutils
easyeffects
];
} }
+1 -5
View File
@@ -18,6 +18,7 @@
fh fh
kubectl # kube config is deliberately not included kubectl # kube config is deliberately not included
kubectx kubectx
obsidian
vscode vscode
yt-dlp yt-dlp
weechat weechat
@@ -28,10 +29,5 @@
deadnix deadnix
alejandra alejandra
statix statix
gh
ghDashLatest
diffNavLatest
] ++ lib.optionals isNixOS [
obsidian
]; ];
} }
+3 -7
View File
@@ -31,6 +31,7 @@
body = '' body = ''
set memes \ set memes \
"Crazy? I was crazy once. They locked me in a room. A rubber room. A rubber room with rats. And rats make me crazy." \ "Crazy? I was crazy once. They locked me in a room. A rubber room. A rubber room with rats. And rats make me crazy." \
"Daddy, chill!" \
"What the hell is even that?!" \ "What the hell is even that?!" \
"Road work ahead? Yeah, I sure hope it does!" \ "Road work ahead? Yeah, I sure hope it does!" \
"Look at all those chickens!" \ "Look at all those chickens!" \
@@ -39,6 +40,7 @@
"I didn't get no sleep cause of y'all, y'all not gone get any sleep cause of me!" \ "I didn't get no sleep cause of y'all, y'all not gone get any sleep cause of me!" \
"This is the dollar store, how good can it be?" \ "This is the dollar store, how good can it be?" \
"That was legitness" \ "That was legitness" \
"Deez nuts" \
"I wanna be a cowboy baby" \ "I wanna be a cowboy baby" \
"Can I get a waffle? Can I please get a waffle?" \ "Can I get a waffle? Can I please get a waffle?" \
"I'm lesbian. I thought you were American." \ "I'm lesbian. I thought you were American." \
@@ -60,13 +62,7 @@
"If you’ve brought your ivory standard, I’ll be happy to tell you where you can stick it" \ "If you’ve brought your ivory standard, I’ll be happy to tell you where you can stick it" \
"Speeches? Oh, yes, I love them. There's nothing like a good exposition when you're having trouble sleeping!" \ "Speeches? Oh, yes, I love them. There's nothing like a good exposition when you're having trouble sleeping!" \
"Somehow, the boy just isn't very buoyant" \ "Somehow, the boy just isn't very buoyant" \
"I am...not interested, little sun. Try again when you have become a man" \ "I am...not interested, little sun. Try again when you have become a man"
"I am rightousness! And rightousness shall previal!" \
"Ahhh such bliss!" \
"The gods themselves will be my meal. Your dear companions my dessert. Upon this world I'll feast, and death shall follow in my wake. All your hate, all your rage, you will render unto me." \
"Boring, boring, boring" \
"Would you be 'happier' had I a 'good reason'?" \
"A test of your reflexes!"
set choose_meme (random)"%"(count $memes) set choose_meme (random)"%"(count $memes)
+4 -7
View File
@@ -1,7 +1,7 @@
{ {
lib, lib,
pkgs, pkgs,
nur, swaytreesave,
... ...
}: let }: let
dirs = { dirs = {
@@ -17,7 +17,7 @@
}; };
in { in {
imports = [ imports = [
nur.homeManagerModules.swaytreesave swaytreesave.homeManagerModules.default
]; ];
programs.swaytreesave.enable = if pkgs.stdenv.isLinux then true else false; programs.swaytreesave.enable = if pkgs.stdenv.isLinux then true else false;
@@ -36,10 +36,6 @@ in {
xdg.configFile."sway/config".source = lib.mkForce (dirs.defaults + /sway/config); xdg.configFile."sway/config".source = lib.mkForce (dirs.defaults + /sway/config);
xdg.configFile."waybar/config".source = lib.mkForce (dirs.defaults + /waybar/config); xdg.configFile."waybar/config".source = lib.mkForce (dirs.defaults + /waybar/config);
xdg.configFile."waybar/style.css".source = lib.mkForce (dirs.defaults + /waybar/style.css); xdg.configFile."waybar/style.css".source = lib.mkForce (dirs.defaults + /waybar/style.css);
xdg.configFile."waybar/network.sh".source = dirs.defaults + /waybar/network.sh;
xdg.configFile."waybar/ollama.sh".source = dirs.defaults + /waybar/ollama.sh;
home.packages = with pkgs; [ curl iproute2 networkmanager ];
programs.wofi = { programs.wofi = {
enable = pkgs.stdenv.isLinux; enable = pkgs.stdenv.isLinux;
@@ -157,6 +153,7 @@ in {
programs.waybar = { programs.waybar = {
enable = pkgs.stdenv.isLinux; enable = pkgs.stdenv.isLinux;
systemd.enable = false; systemd.enable = true;
}; };
} }
+14 -33
View File
@@ -3,7 +3,7 @@
lib, lib,
pkgs, pkgs,
aagl, aagl,
nur, vintage-story,
... ...
}: let }: let
cfg = config.gaming; cfg = config.gaming;
@@ -76,16 +76,6 @@ in {
enable = lib.mkEnableOption "OpenGL/Vulkan overlay tool shown in games presenting FPS, CPU/GPU/memory utilization, load, etc."; enable = lib.mkEnableOption "OpenGL/Vulkan overlay tool shown in games presenting FPS, CPU/GPU/memory utilization, load, etc.";
}; };
proton = {
enable = lib.mkEnableOption "Proton compatibility tool management";
manager = lib.mkOption {
type = lib.types.enum ["protonplus" "protonup-qt"];
default = "protonup-qt";
description = "Graphical Proton compatibility tool manager to install";
};
};
lutris = { lutris = {
enable = lib.mkEnableOption "Lutris game manager and launcher"; enable = lib.mkEnableOption "Lutris game manager and launcher";
package = lib.mkOption { package = lib.mkOption {
@@ -103,7 +93,14 @@ in {
}; };
}; };
# Compatibility layers for Lutris
compatibility = { compatibility = {
protonSupport = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable Proton-like compatibility layers for Lutris";
};
extraTools = lib.mkOption { extraTools = lib.mkOption {
type = lib.types.listOf lib.types.package; type = lib.types.listOf lib.types.package;
default = []; default = [];
@@ -152,31 +149,13 @@ in {
vintage-story = { vintage-story = {
enable = lib.mkEnableOption "Vintage Story client and server"; enable = lib.mkEnableOption "Vintage Story client and server";
}; };
archon = {
enable = lib.mkEnableOption "Archon from NUR";
};
opengoal = {
enable = lib.mkEnableOption "OpenGOAL, a game engine used in a certain PlayStation 2 franchise";
};
}; };
config = let config = let
agl = cfg.aagl; agl = cfg.aagl;
nurPkgs = import "${nur.outPath}/pkgs" { inherit pkgs; };
protonManager = {
protonplus = pkgs.protonplus;
protonup-qt = pkgs.protonup-qt;
}.${cfg.proton.manager};
in { in {
programs.steam = lib.mkIf cfg.steam.enable { programs.steam = lib.mkIf cfg.steam.enable {
enable = true; enable = true;
extraPackages = with pkgs; [
gamescope
gamemode
];
remotePlay.openFirewall = cfg.steam.firewall.remotePlay; remotePlay.openFirewall = cfg.steam.firewall.remotePlay;
localNetworkGameTransfers.openFirewall = cfg.steam.firewall.localNetworkGameTransfers; localNetworkGameTransfers.openFirewall = cfg.steam.firewall.localNetworkGameTransfers;
}; };
@@ -230,14 +209,16 @@ in {
cfg.lutris.wine.package cfg.lutris.wine.package
pkgs.winetricks pkgs.winetricks
]) ++ ]) ++
(lib.optionals cfg.lutris.compatibility.protonSupport [
pkgs.protonup-ng
pkgs.protonup-qt
]) ++
cfg.lutris.compatibility.extraTools ++ cfg.lutris.compatibility.extraTools ++
cfg.lutris.extraPackages cfg.lutris.extraPackages
)) ++ )) ++
(lib.optionals cfg.proton.enable [protonManager]) ++
(lib.optionals cfg.minecraft.enable [pkgs.prismlauncher]) ++ (lib.optionals cfg.minecraft.enable [pkgs.prismlauncher]) ++
(lib.optionals cfg.ffxiv.enable [pkgs.xivlauncher pkgs.fflogs]) ++ (lib.optionals cfg.ffxiv.enable [pkgs.xivlauncher pkgs.fflogs]) ++
(lib.optionals cfg.vintage-story.enable [nurPkgs.vintage-story]) ++ (lib.optionals cfg.vintage-story.enable [vintage-story.packages.${pkgs.system}.default]) ++
(lib.optionals cfg.archon.enable [nurPkgs.archon]) ++
(lib.optionals cfg.vkbasalt.enable [pkgs.vkbasalt pkgs.vkbasalt-cli]) ++ (lib.optionals cfg.vkbasalt.enable [pkgs.vkbasalt pkgs.vkbasalt-cli]) ++
(lib.optionals cfg.mangohud.enable [pkgs.mangohud]) ++ (lib.optionals cfg.mangohud.enable [pkgs.mangohud]) ++
(lib.optionals (cfg.vkbasalt.enable || cfg.mangohud.enable) [pkgs.goverlay pkgs.mesa-demos pkgs.vulkan-tools]); (lib.optionals (cfg.vkbasalt.enable || cfg.mangohud.enable) [pkgs.goverlay pkgs.mesa-demos pkgs.vulkan-tools]);
@@ -245,7 +226,7 @@ in {
nix.settings = let nix.settings = let
inherit agl; inherit agl;
in (lib.mkIf in (lib.mkIf
(agl.anime-game-launcher.enable || agl.honkers-railway-launcher.enable || agl.honkers-launcher.enable || agl.wavey-launcher.enable || agl.sleepy-launcher.enable) (agl.anime-game-launcher.enable || agl.honkers-railway-laucher.enable || agl.honkers-launcher.enable || agl.wavey-launcher.enable || agl.sleepy-launcher.enable)
{ {
substituters = [ "https://ezkea.cachix.org" ]; substituters = [ "https://ezkea.cachix.org" ];
trusted-public-keys = [ "ezkea.cachix.org-1:ioBmUbJTZIKsHmWWXPe1FSFbeVe+afhfgqgTSNd34eI=" ]; trusted-public-keys = [ "ezkea.cachix.org-1:ioBmUbJTZIKsHmWWXPe1FSFbeVe+afhfgqgTSNd34eI=" ];
View File
+6 -69
View File
@@ -1,23 +1,19 @@
final: prev: let final: prev: let
# Use latest rust from overlay which should work on non-NixOS
rust_latest = prev.rust-bin.stable.latest.default; rust_latest = prev.rust-bin.stable.latest.default;
golang_latest = prev.go-bin.latestStable;
buildGoModuleLatest = prev.buildGoModule.override {
go = golang_latest;
};
myRustPlatform = prev.makeRustPlatform { myRustPlatform = prev.makeRustPlatform {
cargo = rust_latest; cargo = rust_latest;
rustc = rust_latest; rustc = rust_latest;
}; };
in { in {
lazygitLatest = prev.lazygit.overrideAttrs (_: rec { lazygitLatest = prev.lazygit.overrideAttrs (_: rec {
version = "0.61.0"; version = "0.55.1";
src = prev.fetchFromGitHub { src = prev.fetchFromGitHub {
owner = "jesseduffield"; owner = "jesseduffield";
repo = "lazygit"; repo = "lazygit";
rev = "v${version}"; rev = "v${version}";
hash = "sha256-G7JulCK9WUVWbp1V7lYuM3fehCdn1cNAJHYjr3aKDvQ="; hash = "sha256-UofhgILZhVXnYiGpb25m4Ct4sbu5pRmjVgj3oEf5Uyk=";
}; };
vendorHash = null; vendorHash = null;
subPackages = [ "." ]; subPackages = [ "." ];
ldflags = [ ldflags = [
@@ -29,31 +25,21 @@ in {
atuinLatest = (prev.atuin.override { atuinLatest = (prev.atuin.override {
rustPlatform = myRustPlatform; rustPlatform = myRustPlatform;
}).overrideAttrs (oldAttrs: rec { }).overrideAttrs (oldAttrs: rec {
version = "18.13.6"; version = "18.10.0";
src = prev.fetchFromGitHub { src = prev.fetchFromGitHub {
owner = "atuinsh"; owner = "atuinsh";
repo = "atuin"; repo = "atuin";
rev = "v${version}"; rev = "v${version}";
hash = "sha256-yAw+ty6FUnFbiRTdAe2QQHzj6uU24fZ/bEIXcHl/thg="; hash = "sha256-bfSa3RtVXxHt3usDqqpE/oXKKDUZOrf+tD9uL59fr6M=";
}; };
cargoDeps = myRustPlatform.fetchCargoVendor { cargoDeps = myRustPlatform.fetchCargoVendor {
# name = "atuin-${version}-vendor.tar.gz"; # name = "atuin-${version}-vendor.tar.gz";
inherit src; inherit src;
hash = "sha256-jirVe0+N5+UHZWioj8AipUhawMBameqEJJpa8HPTnfw="; hash = "sha256-67ffivZVCly1GWA3fJ9mT8nGv2EGd6eCthbaIu/IW3M=";
}; };
cargoBuildFeatures = [
"ai"
"client"
"clipboard"
"daemon"
"hex"
"sync"
];
cargoCheckFeatures = cargoBuildFeatures;
preCheck = (oldAttrs.preCheck or "") + '' preCheck = (oldAttrs.preCheck or "") + ''
export HOME="$TMPDIR" export HOME="$TMPDIR"
export XDG_CONFIG_HOME="$TMPDIR/.config" export XDG_CONFIG_HOME="$TMPDIR/.config"
@@ -76,53 +62,4 @@ in {
# "-X github.com/derailed/k9s/version.BuildSource=nix" # "-X github.com/derailed/k9s/version.BuildSource=nix"
# ]; # ];
# }); # });
ghDashLatest = (prev.gh-dash.override {
buildGoModule = buildGoModuleLatest;
}).overrideAttrs (oldAttrs: rec {
version = "4.23.2";
src = prev.fetchFromGitHub {
owner = "dlvhdr";
repo = "gh-dash";
rev = "v${version}";
hash = "sha256-C06LPVoE23ITJpMG0x75Djgeup+eb5uYwA8wL7xxvWU=";
};
vendorHash = "sha256-4AbeoH0l7eIS7d0yyJxM7+woC7Q/FCh0BOJj3d1zyX4=";
doCheck = false;
checkFlags = [
"-skip=TestFullOutput"
];
ldflags = [
"-s"
"-w"
"-X github.com/dlvhdr/gh-dash/v4/cmd.Version=${version}"
];
passthru = (oldAttrs.passthru or {}) // {
tests = {
version = oldAttrs.testers.testVersion { package = final.ghDashLatest; };
};
};
});
diffNavLatest = (prev.diffnav.override {
buildGoModule = buildGoModuleLatest;
}).overrideAttrs (_: rec {
version = "0.10.0";
src = prev.fetchFromGitHub {
owner = "dlvhdr";
repo = "diffnav";
rev = "v${version}";
hash = "sha256-6VtAQzZNLQrf8QYVXxLUgb3F6xguFDbwaE9kahPhbSE=";
};
vendorHash = "sha256-gmmckzR0D1oFuTG5TAb6gLMoNbcZl9EsjbFjhPfJqnQ=";
ldflags = [
"-s"
"-w"
];
});
} }
-178
View File
@@ -1,178 +0,0 @@
{
config,
lib,
pkgs,
...
}: let
cfg = config.desktop;
defaultWaylandPackages = with pkgs; [
brightnessctl
cliphist
foot
grim
libnotify
mako
networkmanagerapplet
playerctl
polkit_gnome
pavucontrol
rofi
slurp
waybar
wl-clipboard
xdg-utils
];
defaultSwayPackages =
defaultWaylandPackages
++ (with pkgs; [
pulseaudio
swayidle
swaylock
wmenu
]);
resolvedDisplayManager =
if cfg.displayManager != "auto"
then cfg.displayManager
else if cfg.gnome.enable
then "gdm"
else if cfg.xfce.enable
then "lightdm"
else "none";
in {
imports = [./xdg.nix];
options.desktop = {
displayManager = lib.mkOption {
type = lib.types.enum ["auto" "none" "gdm" "lightdm" "ly"];
default = "auto";
description = ''
Display manager to enable. In auto mode, GDM is used when GNOME is
enabled, LightDM is used when XFCE is enabled, and no display manager
is enabled for compositor-only configurations.
'';
};
gnome.enable = lib.mkEnableOption "the vanilla GNOME desktop environment";
xfce.enable = lib.mkEnableOption "the vanilla XFCE desktop environment";
sway = {
enable = lib.mkEnableOption "the Sway Wayland compositor";
extraPackages = lib.mkOption {
type = with lib.types; listOf package;
default = defaultSwayPackages;
defaultText = lib.literalExpression ''
with pkgs; [
brightnessctl
cliphist
foot
grim
libnotify
mako
networkmanagerapplet
playerctl
polkit_gnome
pulseaudio
pavucontrol
rofi
slurp
swayidle
swaylock
waybar
wl-clipboard
wmenu
xdg-utils
]
'';
description = "Packages installed alongside Sway.";
};
};
hyprland = {
enable = lib.mkEnableOption "the Hyprland Wayland compositor";
extraPackages = lib.mkOption {
type = with lib.types; listOf package;
default = defaultWaylandPackages;
defaultText = lib.literalExpression ''
with pkgs; [
brightnessctl
cliphist
foot
grim
libnotify
mako
networkmanagerapplet
playerctl
polkit_gnome
pavucontrol
rofi
slurp
waybar
wl-clipboard
xdg-utils
]
'';
description = ''
Packages installed alongside Hyprland. Hyprlock and Hypridle are
enabled separately so their NixOS integration, including PAM, is
configured as well.
'';
};
};
};
config = lib.mkMerge [
(lib.mkIf cfg.gnome.enable {
services.desktopManager.gnome.enable = true;
})
(lib.mkIf cfg.xfce.enable {
services.xserver = {
enable = true;
desktopManager.xfce.enable = true;
};
})
(lib.mkIf cfg.sway.enable {
programs.sway = {
enable = true;
wrapperFeatures.gtk = true;
extraPackages = cfg.sway.extraPackages;
extraSessionCommands = ''
export XDG_SESSION_TYPE=wayland
export XDG_SESSION_DESKTOP=sway
export NIXOS_OZONE_WL=1
'';
};
})
(lib.mkIf cfg.hyprland.enable {
programs = {
hyprland.enable = true;
hyprlock.enable = lib.mkDefault true;
};
environment.systemPackages = cfg.hyprland.extraPackages;
})
(lib.mkIf (resolvedDisplayManager == "gdm") {
services.displayManager.gdm.enable = true;
})
(lib.mkIf (resolvedDisplayManager == "lightdm") {
services.xserver = {
enable = true;
displayManager.lightdm.enable = true;
};
})
(lib.mkIf (resolvedDisplayManager == "ly") {
services.displayManager.ly.enable = true;
})
];
}
-49
View File
@@ -1,49 +0,0 @@
{
config,
lib,
pkgs,
...
}: let
cfg = config.desktop;
needsGtkPortal = cfg.xfce.enable || cfg.hyprland.enable;
usesPortal = cfg.gnome.enable || cfg.xfce.enable || cfg.sway.enable || cfg.hyprland.enable;
in {
config = lib.mkMerge [
# GNOME and Sway configure their own portals in NixOS. XFCE needs a
# portal; Hyprland benefits from GTK as a fallback to its native one.
(lib.mkIf needsGtkPortal {
xdg.portal = {
enable = true;
extraPortals = [pkgs.xdg-desktop-portal-gtk];
};
})
(lib.mkIf (cfg.sway.enable || needsGtkPortal) {
xdg.portal.config.common.default = ["gtk"];
})
(lib.mkIf cfg.sway.enable {
xdg.portal.wlr.settings.screencast = {
chooser_type = "dmenu";
chooser_cmd = "${pkgs.wmenu}/bin/wmenu -l 10 -p 'Select screen to share:'";
};
})
(lib.mkIf (usesPortal && config.services.gnome.gnome-keyring.enable) {
xdg.portal.config.common."org.freedesktop.impl.portal.Secret" = ["gnome-keyring"];
})
(lib.mkIf (cfg.sway.enable && config.services.gnome.gnome-keyring.enable) {
xdg.portal.config.sway."org.freedesktop.impl.portal.Secret" = ["gnome-keyring"];
})
# A per-desktop config takes precedence over Hyprland's packaged config,
# so include its native portal whenever adding a Secret preference.
(lib.mkIf (cfg.hyprland.enable && config.services.gnome.gnome-keyring.enable) {
xdg.portal.config.hyprland = {
default = ["hyprland" "gtk"];
"org.freedesktop.impl.portal.Secret" = ["gnome-keyring"];
};
})
];
}
+4 -5
View File
@@ -43,11 +43,6 @@ in {
vulkan-tools vulkan-tools
mesa-demos mesa-demos
]; ];
hardware.graphics = {
enable = true;
enable32Bit = true;
};
} }
(mkIf (cfg.gpuVendor == "nvidia") { (mkIf (cfg.gpuVendor == "nvidia") {
@@ -66,6 +61,9 @@ in {
(mkIf (cfg.gpuVendor == "amd") { (mkIf (cfg.gpuVendor == "amd") {
services.xserver.videoDrivers = ["amdgpu"]; services.xserver.videoDrivers = ["amdgpu"];
# hardware.graphics.extraPackages = with pkgs; [
# amdvlk
# ];
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
radeontop radeontop
]; ];
@@ -84,6 +82,7 @@ in {
environment.sessionVariables = { environment.sessionVariables = {
MOZ_ENABLE_WAYLAND = "1"; MOZ_ENABLE_WAYLAND = "1";
QT_QPA_PLATFORM = "wayland"; QT_QPA_PLATFORM = "wayland";
SDL_VIDEODRIVER = "wayland";
}; };
}) })
+1 -5
View File
@@ -10,10 +10,6 @@ I like Final Fantasy, alright? Isn't everyone supposed to have a hobby?
These are named after Final Fantasy VII characters. These are named after Final Fantasy VII characters.
### Servers/Network Infrastructure (bare metal) ### Servers/Network Infrastructure
These are named after Final Fantasy summons. There is some infrastructure missing here like my routers and switches that I also name after summons. These are named after Final Fantasy summons. There is some infrastructure missing here like my routers and switches that I also name after summons.
### Servers/Network Infrastructure (virtual machines)
These are named after Final Fantasy XIV Online characters (currently, these are named after the Scions of the Seventh Dawn).
+28 -45
View File
@@ -22,11 +22,9 @@ in {
}) })
../../apps/gaming.nix ../../apps/gaming.nix
../../apps/appimage.nix ../../apps/appimage.nix
../../desktop
../../graphics ../../graphics
../../pwrMgmt ../../pwrMgmt
../../networking/core.nix ../../networking/core.nix
../../security/yubico.nix
../../sound/pipewire.nix ../../sound/pipewire.nix
../../sound/shairport.nix ../../sound/shairport.nix
../../sound/focusrite.nix ../../sound/focusrite.nix
@@ -35,20 +33,7 @@ in {
]; ];
# Enable flakes for NixOS # Enable flakes for NixOS
nix.settings = { nix.settings.experimental-features = ["nix-command" "flakes"];
experimental-features = ["nix-command" "flakes"];
substituters = [
"https://attic.home.wyattjmiller.com/wyatt"
];
trusted-substituters = [
"https://attic.home.wyattjmiller.com/wyatt"
];
trusted-public-keys = [
"wyatt:KBM2U2fVUomYUdMsxeNp0MDrUrCU5BECZHLF72o8TOI="
];
};
# Custom kernel/boot stuff # Custom kernel/boot stuff
boot = { boot = {
@@ -71,40 +56,22 @@ in {
grim grim
slurp slurp
playerctl playerctl
# light - UNMAINTAINED, brightnessctl is the replacement light
brightnessctl brightnessctl
wttrbar wttrbar
cliphist cliphist
xdg-desktop-portal-gtk
xdg-utils xdg-utils
flatpak-xdg-utils flatpak-xdg-utils
desktop-file-utils desktop-file-utils
shared-mime-info shared-mime-info
wl-clipboard wl-clipboard
wl-clip-persist wl-clip-persist
ollama-rocm
newelle
vlc
]; ];
systemd.user.services.ollama = {
description = "Ollama local AI server";
serviceConfig = {
ExecStart = "${pkgs.ollama-rocm}/bin/ollama serve";
Restart = "on-failure";
Environment = [
"OLLAMA_HOST=0.0.0.0:11434"
"OLLAMA_CONTEXT_LENGTH=64000"
];
};
};
# Enable Polkit # Enable Polkit
security.polkit.enable = true; security.polkit.enable = true;
# Enable desktop support (sway)
desktop.sway.enable = true;
desktop.displayManager = "ly";
# Graphics module (../../graphics/default.nix) # Graphics module (../../graphics/default.nix)
graphics = { graphics = {
enable = true; enable = true;
@@ -126,25 +93,23 @@ in {
gamemode.enable = true; gamemode.enable = true;
gamescope.enable = true; gamescope.enable = true;
mangohud.enable = true; mangohud.enable = true;
proton = {
enable = true;
manager = "protonplus";
};
lutris = { lutris = {
enable = true; enable = true;
wine = { wine = {
enable = true; enable = true;
package = pkgs.wine-staging; package = pkgs.wine-staging;
}; };
compatibility = {
protonSupport = true;
};
}; };
ffxiv.enable = true; ffxiv.enable = true;
archon.enable = true;
minecraft.enable = true; minecraft.enable = true;
aagl.anime-game-launcher.enable = true;
vintage-story.enable = true; vintage-story.enable = true;
}; };
# Power management (see ../../pwrMgmt/default.nix) # Power management (see ../../pwrMgmt/default.nix)
pwrMgmt = { pwrMgmt = {
enable = true; enable = true;
@@ -205,6 +170,27 @@ in {
# AppImage support # AppImage support
appimage.enable = true; appimage.enable = true;
# XDG stuff
xdg = {
portal = {
enable = true;
config = {
sway = {
default = ["wlr" "gtk"];
"org.freedesktop.impl.portal.Secret" = ["gnome-keyring"];
};
common = {
default = ["gtk"];
"org.freedesktop.impl.portal.Secret" = ["gnome-keyring"];
};
};
extraPortals = with pkgs; [
xdg-desktop-portal-wlr
xdg-desktop-portal-gtk
];
};
};
# sched_ext userspace CPU scheduling stuff - idk # sched_ext userspace CPU scheduling stuff - idk
services.scx = { services.scx = {
enable = true; enable = true;
@@ -223,8 +209,5 @@ in {
]; ];
}; };
# Tailscale service
services.tailscale.enable = true;
system.stateVersion = "24.11"; system.stateVersion = "24.11";
} }
-100
View File
@@ -1,100 +0,0 @@
{
pkgs,
userName,
nur,
...
}: let
hildibrand = nur.packages.${pkgs.stdenv.hostPlatform.system}.hildibrand;
in {
imports = [
../../pwrMgmt
../../networking/core.nix
];
# Enable flakes for NixOS
nix.settings.experimental-features = ["nix-command" "flakes"];
# Custom kernel/boot stuff
boot.kernelPackages = pkgs.linuxPackages_latest;
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
# Set your timezone
time.timeZone = "America/Detroit";
# Enable OpenSSH
services.openssh.enable = true;
# Enable keyring
services.gnome.gnome-keyring.enable = true;
# Enable GnuPG
programs.gnupg.agent = {
enable = true;
enableSSHSupport = true;
};
# Enable SUID wrappers (some programs need them)
programs.mtr.enable = true;
# Enable Polkit
security.polkit.enable = true;
# Power management (see ../../pwrMgmt/default.nix)
pwrMgmt = {
enable = true;
cpuFreqGovernor = "performance";
powertop.enable = false;
};
network = {
firewall = {
enable = true;
};
networkManager.enable = true;
};
environment.systemPackages = [
hildibrand
];
systemd.services.hildibrand = {
description = "Hildibrand - trivia buzzer bot";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
Type = "simple";
User = userName;
WorkingDirectory = "/home/${userName}";
ExecStart = "${hildibrand}/bin/hildebrand";
Restart = "on-failure";
RestartSec = "5s";
};
};
# Add username to groups "wheel" and "video" - more may be added here later
users = {
users = {
${userName} = {
extraGroups = [ "wheel" "network" ];
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFV9eSc9L+aJLoKoexq2f/jb5rpyZnhuGiyhS8YQAbaS wyatt@wyattjmiller.com"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4WKvKnnYpTbzZHFEslOKyfiiMqWxhW3AfX6E7ACmYU wyatt@wyattjmiller.com"
];
};
};
};
services.fail2ban = {
enable = true;
package = pkgs.fail2ban;
maxretry = 5;
bantime = "3h";
bantime-increment = {
enable = true;
rndtime = "10m";
};
};
system.stateVersion = "24.11";
}
-6
View File
@@ -1,6 +0,0 @@
{ ... }: {
imports = [
./configuration.nix
./hardware-configuration.nix
];
}
@@ -1,32 +0,0 @@
# Do not modify this file! It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/profiles/qemu-guest.nix")
];
boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "virtio_scsi" "sr_mod" "virtio_blk" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/498ce176-f090-46d8-96bf-9e6141cffa19";
fsType = "ext4";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/09A6-B803";
fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ];
};
swapDevices =
[ { device = "/dev/disk/by-uuid/4a64a2ee-2b32-4e53-b00f-7b1f127162aa"; }
];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}
-105
View File
@@ -1,105 +0,0 @@
{
pkgs,
userName,
nur,
...
}: {
imports = [
../../pwrMgmt
../../networking/core.nix
../../virtualization/podman.nix
];
# Enable flakes for NixOS
nix.settings.experimental-features = ["nix-command" "flakes"];
# Custom kernel/boot stuff
boot.kernelPackages = pkgs.linuxPackages_latest;
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
# Set your timezone
time.timeZone = "America/Detroit";
# Enable OpenSSH
services.openssh.enable = true;
# Enable keyring
services.gnome.gnome-keyring.enable = true;
# Enable GnuPG
programs.gnupg.agent = {
enable = true;
enableSSHSupport = true;
};
# Enable SUID wrappers (some programs need them)
programs.mtr.enable = true;
# Enable Polkit
security.polkit.enable = true;
# Power management (see ../../pwrMgmt/default.nix)
pwrMgmt = {
enable = true;
cpuFreqGovernor = "performance";
powertop.enable = false;
};
network = {
firewall = {
enable = true;
tcpPorts = {
allowedPorts = [ 42420 ];
};
udpPorts = {
allowedPorts = [ 42420 ];
};
};
networkManager.enable = true;
};
environment.systemPackages = [
nur.packages.${pkgs.system}.vintage-story
];
systemd.services.vintagestory-server = {
description = "Vintage Story Server";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
Type = "simple";
User = userName;
WorkingDirectory = "/home/${userName}";
ExecStart = "${nur.packages.${pkgs.system}.vintage-story}/bin/vintagestory-server";
Restart = "on-failure";
RestartSec = "5s";
};
};
# Add username to groups "wheel" and "video" - more may be added here later
users = {
users = {
${userName} = {
extraGroups = [ "wheel" "network" ];
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFV9eSc9L+aJLoKoexq2f/jb5rpyZnhuGiyhS8YQAbaS wyatt@wyattjmiller.com"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4WKvKnnYpTbzZHFEslOKyfiiMqWxhW3AfX6E7ACmYU wyatt@wyattjmiller.com"
];
};
};
};
services.fail2ban = {
enable = true;
package = pkgs.fail2ban;
maxretry = 5;
bantime = "3h";
bantime-increment = {
enable = true;
rndtime = "10m";
};
};
system.stateVersion = "24.11";
}
-6
View File
@@ -1,6 +0,0 @@
{ ... }: {
imports = [
./configuration.nix
./hardware-configuration.nix
];
}
@@ -1,32 +0,0 @@
# Do not modify this file! It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/profiles/qemu-guest.nix")
];
boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "virtio_scsi" "sr_mod" "virtio_blk" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/ec4c43ec-efcc-40ea-a4c8-411e60ee7c4e";
fsType = "ext4";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/140E-FE19";
fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ];
};
swapDevices =
[ { device = "/dev/disk/by-uuid/547bbd78-85be-4d17-a519-c4a2a923bdab"; }
];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}
-1
View File
@@ -2,7 +2,6 @@
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
neovim neovim
git git
tailscale
]; ];
environment.variables.EDITOR = "nvim"; environment.variables.EDITOR = "nvim";
-121
View File
@@ -1,121 +0,0 @@
{
pkgs,
userName,
nur,
...
}: {
imports = [
../../pwrMgmt
../../networking/core.nix
../../virtualization/podman.nix
];
# Enable flakes for NixOS
nix.settings.experimental-features = ["nix-command" "flakes"];
# Custom kernel/boot stuff
boot.kernelPackages = pkgs.linuxPackages_latest;
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
# Set your timezone
time.timeZone = "America/Detroit";
# Enable OpenSSH
services.openssh.enable = true;
# Enable keyring
services.gnome.gnome-keyring.enable = true;
# Enable GnuPG
programs.gnupg.agent = {
enable = true;
enableSSHSupport = true;
};
# Enable SUID wrappers (some programs need them)
programs.mtr.enable = true;
# Enable Polkit
security.polkit.enable = true;
# Power management (see ../../pwrMgmt/default.nix)
pwrMgmt = {
enable = true;
cpuFreqGovernor = "performance";
powertop.enable = false;
};
network = {
firewall = {
enable = true;
tcpPorts = {
allowedPorts = [ 42420 ];
};
udpPorts = {
allowedPorts = [ 42420 ];
};
};
networkManager.enable = true;
};
environment.systemPackages = [
nur.packages.${pkgs.system}.vintage-story
];
systemd.services.vintagestory-server = {
description = "Vintage Story Server";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
Type = "simple";
User = userName;
WorkingDirectory = "/home/${userName}";
ExecStart = "${nur.packages.${pkgs.system}.vintage-story}/bin/vintagestory-server";
Restart = "on-failure";
RestartSec = "5s";
};
};
# Add username to groups "wheel" and "video" - more may be added here later
users = {
groups.hazel = {};
users = {
${userName} = {
extraGroups = [ "wheel" "network" ];
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFV9eSc9L+aJLoKoexq2f/jb5rpyZnhuGiyhS8YQAbaS wyatt@wyattjmiller.com"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4WKvKnnYpTbzZHFEslOKyfiiMqWxhW3AfX6E7ACmYU wyatt@wyattjmiller.com"
];
};
"hazel" = {
home = "/home/hazel";
group = "hazel";
extraGroups = [ "wheel" ];
description = "hazel";
isNormalUser = true;
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZnyiQx+k1ygX8E1lsUCB6aTdMc+OKzlZ4admlzknc5ulj0YrtUyqhbNhkNd6pP0QDBFMnXO/rzUvHp4TAyZXKFfpcBCa4zhK97ufymAfvzAjM4vRBqRNcr2n+2iRzxtolbklfjs3ocBQVxXW+pRT5wWxTgK2fcmP2xviDVldr7qte37x5YkQb5SAhYNH8tqJRnuGPe+Q0A3oN4HyHZFnrMq/HlbL5yg/0VKPTtF/IgHf+2dDz5OQQpBx3/N9u/QLwuIm9lkyOG03s0TGmE7up/i0jX2vIqp2BbGSnwdQEL/eSVZx73qQB/J62VFafg13P5yQWDJ33WSoiwhac6bg26HPmPOnCJp5R3c+7jM8N1F1ZbtsKicHSVsRg1RQSree4lchPy7FOPkCuUrB7LNE71mbpOzZNR767S6UAPaXxRw6QNYGBaDqQBwhlU8ZDF5F7EW6ahSUMOI6ECyoibzIMb56xs9osuNeUhB/BcL5sHSFpJjIbdcDLNkEKggrBl6s="
];
};
};
};
services.fail2ban = {
enable = true;
package = pkgs.fail2ban;
maxretry = 5;
bantime = "3h";
bantime-increment = {
enable = true;
rndtime = "10m";
};
};
services.tailscale = {
enable = true;
package = pkgs.tailscale;
};
system.stateVersion = "24.11";
}
-6
View File
@@ -1,6 +0,0 @@
{ ... }: {
imports = [
./configuration.nix
./hardware-configuration.nix
];
}
@@ -1,32 +0,0 @@
# Do not modify this file! It was generated by ‘nixos-generate-config’
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{
imports =
[ (modulesPath + "/profiles/qemu-guest.nix")
];
boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "virtio_scsi" "sr_mod" "virtio_blk" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/e2e621c1-0090-472a-99d9-61c6a87bd068";
fsType = "ext4";
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/663E-15C0";
fsType = "vfat";
options = [ "fmask=0022" "dmask=0022" ];
};
swapDevices =
[ { device = "/dev/disk/by-uuid/60104b1a-4285-4dd1-be5e-3c3dee24515a"; }
];
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}
+135 -84
View File
@@ -1,10 +1,10 @@
{ {
nur, lib,
pkgs, pkgs,
config,
userName, userName,
... ...
}: }: let
let
# INFO: set these to your liking # INFO: set these to your liking
matrixFqdn = "chat.wyattjmiller.com"; matrixFqdn = "chat.wyattjmiller.com";
rtcFqdn = "rtc.wyattjmiller.com"; rtcFqdn = "rtc.wyattjmiller.com";
@@ -12,47 +12,23 @@ let
supportEmail = "wyatt@wyattjmiller.com"; supportEmail = "wyatt@wyattjmiller.com";
livekitKeyFile = "/var/lib/livekit/livekit.key"; livekitKeyFile = "/var/lib/livekit/livekit.key";
matrixRegistrationTokenFile = "/var/lib/matrix.key"; matrixRegistrationTokenFile = "/var/lib/matrix.key";
mastodonFqdn = "social.wyattjmiller.com";
mastodonSecretsDir = "/var/lib/mastodon/secrets";
sableWeb = nur.packages.${pkgs.stdenv.hostPlatform.system}.sable-web; # After deploying Mastodon, register an OAuth application at
# https://social.wyattjmiller.com/settings/applications and write the
sableConfig = pkgs.writeTextDir "config.json" ( # client ID / secret to these paths (chmod 400, owned by the tuwunel user):
builtins.toJSON { mastodonOauthClientIdFile = "/var/lib/private/tuwunel/matrix-oauth-client-id";
defaultHomeserver = 0; mastodonOauthClientSecretFile = "/var/lib/private/tuwunel/matrix-oauth-client-secret";
homeserverList = [ matrixFqdn ]; mastodonOauthClientId = builtins.readFile mastodonOauthClientIdFile;
allowCustomHomeservers = false; mastodonOauthClientSecret = builtins.readFile mastodonOauthClientSecretFile;
in {
disableAccountSwitcher = false;
hideUsernamePasswordFields = false;
hashRouter = {
enabled = false;
basename = "/";
};
featuredCommunities = {
spaces = [
"#seventhdawn:chat.wyattjmiller.com"
];
rooms = [
"#general:chat.wyattjmiller.com"
"#gposeglams:chat.wyattjmiller.com"
"#lobby-vc:chat.wyattjmiller.com"
"#annoucements:chat.wyattjmiller.com"
];
};
}
);
in
{
imports = [ imports = [
../../pwrMgmt ../../pwrMgmt
]; ];
# Enable flakes for NixOS # Enable flakes for NixOS
nix.settings.experimental-features = [ nix.settings.experimental-features = ["nix-command" "flakes"];
"nix-command"
"flakes"
];
nix.settings = { nix.settings = {
download-buffer-size = 134217728; # 128 MiB in bytes download-buffer-size = 134217728; # 128 MiB in bytes
@@ -115,7 +91,7 @@ in
8448 8448
]; ];
allowedUDPPortRanges = [ allowedUDPPortRanges =[
# TURN UDP relays # TURN UDP relays
{ {
from = 49000; from = 49000;
@@ -130,16 +106,14 @@ in
}; };
# Add username to groups "wheel" and "video" - more may be added here later # Add username to groups "wheel" and "video" - more may be added here later
users.users.caddy.extraGroups = [ "mastodon" ];
users.users.${userName} = { users.users.${userName} = {
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFV9eSc9L+aJLoKoexq2f/jb5rpyZnhuGiyhS8YQAbaS wyatt@wyattjmiller.com" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFV9eSc9L+aJLoKoexq2f/jb5rpyZnhuGiyhS8YQAbaS wyatt@wyattjmiller.com"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4WKvKnnYpTbzZHFEslOKyfiiMqWxhW3AfX6E7ACmYU wyatt@wyattjmiller.com" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4WKvKnnYpTbzZHFEslOKyfiiMqWxhW3AfX6E7ACmYU wyatt@wyattjmiller.com"
]; ];
extraGroups = [ extraGroups = ["wheel" "video" "network"];
"wheel"
"video"
"network"
];
}; };
# fail2ban # fail2ban
@@ -154,6 +128,28 @@ in
}; };
}; };
# Mastodon service — social.wyattjmiller.com
services.mastodon = {
enable = true;
localDomain = mastodonFqdn;
webPort = 3000;
enableUnixSocket = false;
configureNginx = false;
secretKeyBaseFile = "${mastodonSecretsDir}/secret_key_base";
# otpSecretFile = "${mastodonSecretsDir}/otp_secret";
vapidPrivateKeyFile = "${mastodonSecretsDir}/vapid_private_key";
vapidPublicKeyFile = "${mastodonSecretsDir}/vapid_public_key";
streamingProcesses = 3;
# Configure SMTP after initial deploy via mastodonSecretsDir or a separate
# NixOS secrets manager (sops-nix / agenix).
smtp = {
host = "mail.wyattjmiller.com";
port = 25;
fromAddress = "notifications@${mastodonFqdn}";
authenticate = false;
};
};
# Matrix server # Matrix server
services.matrix-tuwunel = { services.matrix-tuwunel = {
enable = true; enable = true;
@@ -185,16 +181,40 @@ in
support_email = supportEmail; support_email = supportEmail;
support_mxid = "@wymiller:${matrixFqdn}"; support_mxid = "@wymiller:${matrixFqdn}";
rtc_transports = [ rtc_transports = [{
{
type = "livekit"; type = "livekit";
livekit_service_url = "https://${rtcFqdn}"; livekit_service_url = "https://${rtcFqdn}";
}];
};
# Mastodon as OIDC provider for Matrix login.
# Mastodon 4.3+ exposes OpenID Connect discovery at
# https://<domain>/.well-known/openid-configuration.
#
# REQUIRED RUNTIME SETUP (once, after first Mastodon deploy):
# 1. Visit https://social.wyattjmiller.com/settings/applications
# 2. Create a new application with the redirect URI:
# https://chat.wyattjmiller.com/_matrix/client/v3/login/sso/redirect/oidc-mastodon
# and scopes: profile
# 3. Write the Client Key → /var/lib/private/tuwunel/matrix-oauth-client-id (chmod 400, owned by tuwunel)
# Write the Client Secret → /var/lib/private/tuwunel/matrix-oauth-client-secret
# 4. nixos-rebuild switch (or restart tuwunel.service)
identity_provider = [
{
brand = "Mastodon";
issuer_url = "https://${mastodonFqdn}";
# id = mastodonOauthClientId;
callback_url = "https://${matrixFqdn}/_matrix/client/unstable/login/sso/callback/${lib.removeSuffix "\n" (mastodonOauthClientId)}";
discovery_url = "https://${mastodonFqdn}/.well-known/oauth-authorization-server";
client_id = lib.removeSuffix "\n" (mastodonOauthClientId);
client_secret = lib.removeSuffix "\n" (mastodonOauthClientSecret);
scope = ["profile"];
userid_claims = ["preferred_username"];
} }
]; ];
}; };
}; };
}; };
};
# LiveKit (Matrix RTC) # LiveKit (Matrix RTC)
services.livekit = { services.livekit = {
@@ -216,39 +236,36 @@ in
enable = true; enable = true;
package = pkgs.caddy; package = pkgs.caddy;
virtualHosts = { virtualHosts = {
"${matrixFqdn}" = { "${mastodonFqdn}" = {
extraConfig = '' extraConfig = ''
@matrixEndpoints path \ encode zstd gzip
/_matrix/* \
/_tuwunel/* \
/.well-known/matrix/*
handle @matrixEndpoints { root * ${config.services.mastodon.package}/public
reverse_proxy 127.0.0.1:8008
}
@sableConfig path /config.json handle /system/* {
handle @sableConfig { uri strip_prefix /system
root * ${sableConfig} root * /var/lib/mastodon/public-system
header Cache-Control "no-store"
file_server file_server
} }
@streaming path /api/v1/streaming*
handle @streaming {
reverse_proxy localhost:4000
}
handle { handle {
root * ${sableWeb} @notfile not file
handle @notfile {
reverse_proxy localhost:3000
}
file_server
}
'';
};
"${matrixFqdn}" = {
extraConfig = ''
encode zstd gzip encode zstd gzip
try_files {path} /index.html reverse_proxy localhost:8008
file_server {
precompressed br
}
header /assets/* Cache-Control "public, max-age=31536000, immutable"
header /sw.js Cache-Control "no-cache"
header /index.html Cache-Control "no-cache"
header Document-Policy "js-profiling"
}
''; '';
}; };
"${matrixFqdn}:8448" = { "${matrixFqdn}:8448" = {
@@ -291,10 +308,7 @@ in
matrix-registration-token-gen = { matrix-registration-token-gen = {
before = [ "tuwunel.service" ]; before = [ "tuwunel.service" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
path = with pkgs; [ path = with pkgs; [ coreutils openssl ];
coreutils
openssl
];
script = '' script = ''
set -eu set -eu
@@ -316,15 +330,9 @@ in
}; };
livekit-key-gen = { livekit-key-gen = {
before = [ before = [ "lk-jwt-service.service" "livekit.service" ];
"lk-jwt-service.service"
"livekit.service"
];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
path = with pkgs; [ path = with pkgs; [ coreutils openssl ];
coreutils
openssl
];
script = '' script = ''
set -eu set -eu
@@ -345,6 +353,49 @@ in
User = "root"; User = "root";
}; };
}; };
mastodon-secrets-gen = {
before = [ "mastodon-web.service" "mastodon-sidekiq-0.service" "mastodon-streaming.service" ];
wantedBy = [ "multi-user.target" ];
path = with pkgs; [ coreutils openssl ruby_3_4 ];
script = ''
set -eu
dir="${mastodonSecretsDir}"
install -d -m 0750 -o mastodon -g mastodon "$dir"
gen_hex() {
local f="$1"
if [ ! -f "$f" ]; then
umask 077
openssl rand -hex 64 | install -o mastodon -g mastodon -m 0400 /dev/stdin "$f"
fi
}
gen_hex "$dir/secret_key_base"
gen_hex "$dir/otp_secret"
if [ ! -f "$dir/vapid_private_key" ]; then
umask 077
ruby -ropenssl -rbase64 -e '
key = OpenSSL::PKey::EC.generate("prime256v1")
priv = Base64.urlsafe_encode64(key.private_key.to_s(2).rjust(32, "\x00"), padding: false)
pub = Base64.urlsafe_encode64(key.public_key.to_bn.to_s(2), padding: false)
File.write(ARGV[0], priv)
File.write(ARGV[1], pub)
' \
"$dir/vapid_private_key" \
"$dir/vapid_public_key"
chown mastodon:mastodon "$dir/vapid_private_key" "$dir/vapid_public_key"
chmod 0400 "$dir/vapid_private_key" "$dir/vapid_public_key"
fi
'';
serviceConfig = {
Type = "oneshot";
User = "root";
RemainAfterExit = true;
};
};
}; };
system.stateVersion = "25.11"; system.stateVersion = "25.11";
-8
View File
@@ -1,8 +0,0 @@
{
...
}: let in {
security.pam.services = {
login.u2fAuth = true;
sudo.u2fAuth = true;
};
}
+1 -7
View File
@@ -3,15 +3,9 @@
services.pipewire = { services.pipewire = {
enable = true; enable = true;
pulse.enable = true; pulse.enable = true;
alsa = {
enable = true;
support32Bit = true;
};
}; };
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
# helvum - UNMAINTAINED helvum
crosspipe
]; ];
} }