Compare commits

..

37 Commits

Author SHA1 Message Date
7153e2d3e3 Merge branch 'main' of orion:kiri/nixos-config 2025-12-04 18:48:31 +01:00
24b1438410 Sort todoman using priority 2025-12-04 18:45:31 +01:00
3d62cc10d3 Add host for work github 2025-12-04 18:45:24 +01:00
f92f4e8362 Add second key to gpg-agent 2025-12-04 18:45:11 +01:00
60fe1fd579 Remove home-manager syncthing 2025-12-04 18:44:56 +01:00
575d797b5c Add rustc for nixCats 2025-12-04 18:44:39 +01:00
b492aeb371 Move lazydev config and load blink.cmp on start 2025-12-04 18:44:15 +01:00
023007dc79 Fix syncthing perms 2025-12-04 18:42:28 +01:00
962aadd77b Add trash-cli 2025-12-04 18:42:22 +01:00
cb2388c3c6 Add harper and enable underline diagnostics 2025-12-04 18:42:17 +01:00
dca64dd6c2 Enable wake-on-lan for polaris 2025-12-04 18:41:59 +01:00
2a63a01ce3 Add float rule for imv 2025-12-02 13:29:21 +01:00
f794cdb44c Add polaris to syncthing devices 2025-12-02 13:20:03 +01:00
2b7c944ba5 Remove reference to syncthing home-manager module 2025-12-02 13:18:38 +01:00
b473b2dc16 Replace rclone with syncthing 2025-12-02 02:37:02 +01:00
1854c56c63 Add a homepage module 2025-12-02 01:31:33 +01:00
91cafd8108 Disable google drive sync 2025-12-02 01:11:59 +01:00
bdb9d72c1e Add nice fonts 2025-12-01 23:32:28 +01:00
9607277667 Improve filebrowser and rclone 2025-12-01 23:32:24 +01:00
830c3ebe5a Improve typst experience in neovim 2025-12-01 23:30:29 +01:00
ef4c190005 Add auto compilation of .md and .typ files to filebrowser 2025-12-01 16:31:33 +01:00
1f8a6b5591 Update hyprland windowrules 2025-12-01 15:07:55 +01:00
e952ca1d0e Add wallpaper to repo 2025-12-01 13:41:29 +01:00
091e11fe12 Switch to filebrowser 2025-12-01 12:30:08 +01:00
f63a5ace18 Add printer support 2025-12-01 02:39:50 +01:00
2c36e9738a Make sure calendar folders exist 2025-12-01 01:58:23 +01:00
4b92ff743e Change wallpaper 2025-12-01 01:39:23 +01:00
73658e1563 Override kitty stylix theme 2025-12-01 01:39:13 +01:00
d5c0c6836f Add gimp 2025-12-01 01:38:53 +01:00
6976180fd4 Update copyparty config 2025-12-01 01:38:40 +01:00
31aa73fcee Add lualine and bufferline 2025-12-01 01:38:31 +01:00
85616a53eb Move mini.nvim to editor.lua 2025-11-30 22:26:44 +01:00
43e161db0e Disable battery module on polaris 2025-11-30 21:39:12 +01:00
f2f044eebe Improve and add theming 2025-11-30 21:13:25 +01:00
383d8bd0c6 Add theme support to nixCats 2025-11-30 18:51:56 +01:00
b73ba4dfa3 Change theme to tokyo-city 2025-11-30 17:01:39 +01:00
68abcf7644 Change todoman config 2025-11-30 17:01:29 +01:00
35 changed files with 1645 additions and 317 deletions

View File

@@ -6,6 +6,8 @@ in
config.var = {
hostname = "altair";
has_battery = true;
hyprsunset.temperature = 2000;
hyprland = {

View File

@@ -10,9 +10,9 @@
../../modules/nixos/caddy.nix
../../modules/nixos/bitwarden.nix
../../modules/nixos/firewall.nix
../../modules/nixos/copyparty.nix
../../modules/nixos/syncthing.nix
../../modules/nixos/filebrowser.nix
../../modules/nixos/home-assistant.nix
../../modules/nixos/glance.nix
../../modules/nixos/radicale.nix
../../modules/nixos/actual-budget.nix
../../modules/nixos/gitea.nix

View File

@@ -3,10 +3,22 @@
imports = [
../../modules/nixos/desktop.nix
../../modules/nixos/ssh.nix
./hardware-configuration.nix
./variables.nix
];
networking = {
interfaces = {
enp5s0 = {
wakeOnLan.enable = true;
};
};
firewall = {
allowedUDPPorts = [ 9 ];
};
};
home-manager.users."${config.var.username}" = import ./home.nix;
system.stateVersion = "24.05";

View File

@@ -7,6 +7,8 @@ in
config.var = {
hostname = "polaris";
has_battery = false;
hyprsunset.temperature = 3500;
hyprland = {

View File

@@ -1,10 +1,19 @@
{ config, pkgs, ... }:
let
calendarsPath = "${config.xdg.dataHome}/calendars";
in
{
programs.pimsync.enable = true;
services.pimsync.enable = true;
systemd.user.tmpfiles.rules = [
"d ${calendarsPath} 0700 - - - -"
"d ${calendarsPath}/radicale 0700 - - - -"
"d ${calendarsPath}/university 0700 - - - -"
];
accounts.calendar = {
basePath = "${config.xdg.dataHome}/calendars";
basePath = calendarsPath;
accounts = {
"radicale" = {
primary = true;

View File

@@ -23,7 +23,6 @@
./kitty.nix
./lazygit.nix
./nh.nix
./rclone.nix
./spicetify.nix
./ssh.nix
./thunar.nix
@@ -81,6 +80,7 @@
pfetch
btop
fastfetch
gimp
# Just cool
peaclock
@@ -89,6 +89,8 @@
cmatrix
libreoffice-qt6-fresh
trash-cli
];
};
}

View File

@@ -2,7 +2,8 @@
config,
pkgs,
...
}: {
}:
{
programs.gpg = {
enable = true;
homedir = "${config.xdg.dataHome}/gnupg";
@@ -15,6 +16,9 @@
pinentry = {
package = pkgs.pinentry-gnome3;
};
sshKeys = ["CD848796822630B280FC6DFA55F24A20040F22B5"];
sshKeys = [
"CD848796822630B280FC6DFA55F24A20040F22B5"
"B8FBDFBD7F42C444C17E086E0EE2E34FB43A7187"
];
};
}

View File

@@ -144,24 +144,14 @@ in
windowrule = [
"match:title hyprpanel-settings, float on"
"match:class xdg-desktop-portal-gtk, float on, center on, size monitor_w/2 monitor_h/2"
# Bitwarden extension
# idle inhibit while watching videos
#"idleinhibit focus, class:^(mpv|.+exe|celluloid)$"
#"idleinhibit focus, class:^(zen)$, title:^(.*YouTube.*)$"
#"idleinhibit fullscreen, class:^(zen)$"
#"dimaround, class:^(gcr-prompter)$"
#"dimaround, class:^(xdg-desktop-portal-gtk)$"
#"dimaround, class:^(polkit-gnome-authentication-agent-1)$"
#"dimaround, class:^(zen)$, title:^(File Upload)$"
"match:class xdg-desktop-portal-gtk, float on, center on, size (monitor_w * 0.5) (monitor_h * 0.5)"
# Match on bitwarden chrome extension id
"match:class .*nngceckbapebfimnlniiiahkandclblb.*, float on, center on, size (monitor_w * 0.5) (monitor_h * 0.5)"
"match:class imv, float on, center on, max_size (monitor_w * 0.8) (monitor_h * 0.8)"
];
layerrule = [
"match:namespace vicinae, no_anim on, blur on, ignore_alpha 0"
#"no_anim, launcher"
#"no_anim, ^ags-.*"
];
input = {

View File

@@ -1,6 +1,6 @@
# Hyprpanel is the bar on top of the screen
# Display information like workspaces, battery, wifi, ...
{ config, ... }:
{ config, lib, ... }:
let
transparentButtons = config.theme.bar.transparentButtons;
@@ -46,11 +46,11 @@ in
middle = [
"media"
];
right = [
right = lib.flatten [
"systray"
"volume"
"bluetooth"
"battery"
(lib.optional config.var.has_battery "battery")
"network"
"clock"
"notifications"

View File

@@ -1,4 +1,5 @@
# Kitty is a fast, featureful, GPU based terminal emulator
{ config, lib, ... }:
{
programs.kitty = {
enable = true;
@@ -20,5 +21,52 @@
allow_remote_control = "yes";
listen_on = "unix:/tmp/mykitty";
};
# Override stylix generated colorscheme by officially provided kitty colorscheme
extraConfig = lib.mkAfter ''
## name: Kanagawa
## license: MIT
## author: Tommaso Laurenzi
## upstream: https://github.com/rebelot/kanagawa.nvim/
background #1F1F28
foreground #DCD7BA
selection_background #2D4F67
selection_foreground #C8C093
url_color #72A7BC
cursor #C8C093
# Tabs
active_tab_background #1F1F28
active_tab_foreground #C8C093
inactive_tab_background #1F1F28
inactive_tab_foreground #727169
#tab_bar_background #15161E
# normal
color0 #16161D
color1 #C34043
color2 #76946A
color3 #C0A36E
color4 #7E9CD8
color5 #957FB8
color6 #6A9589
color7 #C8C093
# bright
color8 #727169
color9 #E82424
color10 #98BB6C
color11 #E6C384
color12 #7FB4CA
color13 #938AA9
color14 #7AA89F
color15 #DCD7BA
# extended colors
color16 #FFA066
color17 #FF5D62
'';
};
}

View File

@@ -1,7 +1,19 @@
{ inputs, config, ... }:
{
inputs,
lib,
config,
...
}:
let
inherit (inputs.nixCats) utils;
luaPath = ./.;
themeConfig =
config.theme.neovim or {
plugin = null;
setup = "";
};
categoryDefinitions =
{ pkgs, ... }:
{
@@ -33,6 +45,7 @@ let
typescript
typescript-language-server
rustc
rust-analyzer
rustfmt
@@ -43,15 +56,24 @@ let
isort
astro-language-server
tinymist
typstyle
ltex-ls-plus
harper
];
};
startupPlugins = {
general = with pkgs.vimPlugins; [
lz-n
plenary-nvim
catppuccin-nvim
];
general =
with pkgs.vimPlugins;
[
lz-n
plenary-nvim
]
++ (lib.optional (themeConfig.plugin != null) themeConfig.plugin);
};
optionalPlugins = {
@@ -86,7 +108,13 @@ let
render-markdown-nvim
colorful-menu-nvim
lualine-nvim
bufferline-nvim
zen-mode-nvim
];
};
sharedLibraries = {
@@ -132,6 +160,13 @@ let
nixos_options = ''(builtins.getFlake "path://${config.var.configDirectory}").nixosConfigurations.${toString config.var.hostname}.options'';
home_manager_options = ''(builtins.getFlake "path://${config.var.configDirectory}").nixosConfigurations.${toString config.var.hostname}.options.home-manager.users.type.getSubOptions []'';
};
themeSetup = themeConfig.setup;
# Pass only base00-base0F to neovim
stylixColors = lib.filterAttrs (
k: v: builtins.match "base0[0-9A-F]" k != null
) config.lib.stylix.colors.withHashtag;
};
};

View File

@@ -171,13 +171,25 @@ require("lz.n").load({
require("luasnip.loaders.from_vscode").lazy_load()
end,
},
{
-- lazydev makes your lsp way better in your config without needing extra lsp configuration.
"lazydev.nvim",
cmd = "LazyDev",
ft = "lua",
after = function()
require("lazydev").setup({
library = {
{ words = { "nixCats" }, path = (nixCats.nixCatsPath or "") .. "/lua" },
},
})
end,
},
{
"blink.cmp",
before = function()
-- Trigger lazydev so it's ready for blink source
require("lz.n").trigger_load({ "lazydev.nvim", "luasnip" })
end,
event = "VimEnter",
after = function()
require("blink.cmp").setup({
keymap = {
@@ -205,12 +217,8 @@ require("lz.n").load({
documentation = {
auto_show = true,
auto_show_delay_ms = 500,
window = {
border = "rounded",
},
},
menu = {
border = "rounded",
draw = {
columns = { { "kind_icon" }, { "label", gap = 1 } },
components = {
@@ -254,7 +262,6 @@ require("lz.n").load({
-- Shows a signature help window while you type arguments for a function
signature = {
window = { border = "rounded" },
enabled = true,
},
})

View File

@@ -167,4 +167,47 @@ require("lz.n").load({
})
end,
},
{
"mini.nvim",
after = function()
-- Better Around/Inside textobjects
require("mini.ai").setup({ n_lines = 500 })
-- Add/delete/replace surroundings (brackets, quotes, etc.)
require("mini.surround").setup()
local files = require("mini.files")
files.setup()
vim.keymap.set("n", "<leader>e", function()
if not files.close() then
files.open(vim.api.nvim_buf_get_name(0))
end
end, { desc = "File [E]xplorer" })
local icons = require("mini.icons")
icons.setup()
icons.mock_nvim_web_devicons()
local hipatterns = require("mini.hipatterns")
hipatterns.setup({
highlighters = {
-- Highlight hex color strings (#rrggbb) using that color
hex_color = hipatterns.gen_highlighter.hex_color(),
},
})
local indentscope = require("mini.indentscope")
indentscope.setup({
symbol = "",
-- draw = { animation = indentscope.gen_animation.linear({}) },
})
vim.api.nvim_create_autocmd("FileType", {
pattern = { "help", "alpha", "dashboard", "neo-tree", "Trouble", "lazy", "mason" },
callback = function()
vim.b.miniindentscope_disable = true
end,
})
end,
},
})

View File

@@ -1,168 +1,172 @@
require("lz.n").load({
{
{
-- lazydev makes your lsp way better in your config without needing extra lsp configuration.
"lazydev.nvim",
cmd = "LazyDev",
ft = "lua",
after = function()
require("lazydev").setup({
library = {
{ words = { "nixCats" }, path = (nixCats.nixCatsPath or "") .. "/lua" },
"nvim-lspconfig",
event = { "BufReadPre", "BufNewFile" },
after = function()
vim.api.nvim_create_autocmd("LspAttach", {
group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }),
callback = function(args)
-- Get the client and buffer from the event arguments [cite: 119]
local client = vim.lsp.get_client_by_id(args.data.client_id)
local bufnr = args.buf
local map = function(keys, func, desc, mode)
mode = mode or "n"
vim.keymap.set(mode, keys, func, { buffer = bufnr, desc = "LSP: " .. desc })
end
-- Mappings (Standard LSP functions from lsp-defaults) [cite: 20-23]
map("grn", vim.lsp.buf.rename, "[R]e[n]ame")
map("gra", vim.lsp.buf.code_action, "[G]oto Code [A]ction", { "n", "x" })
map("grD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
-- Telescope Mappings
map("grr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences")
map("gri", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation")
map("grd", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition")
map("gO", require("telescope.builtin").lsp_document_symbols, "Open Document Symbols")
map("gW", require("telescope.builtin").lsp_dynamic_workspace_symbols, "Open Workspace Symbols")
map("grt", require("telescope.builtin").lsp_type_definitions, "[G]oto [T]ype Definition")
-- Highlight references (Document Highlight)
if client and client:supports_method("textDocument/documentHighlight", bufnr) then
local highlight_augroup = vim.api.nvim_create_augroup("kickstart-lsp-highlight", { clear = false })
vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, {
buffer = bufnr,
group = highlight_augroup,
callback = vim.lsp.buf.document_highlight,
})
vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, {
buffer = bufnr,
group = highlight_augroup,
callback = vim.lsp.buf.clear_references,
})
vim.api.nvim_create_autocmd("LspDetach", {
group = vim.api.nvim_create_augroup("kickstart-lsp-detach", { clear = true }),
callback = function(event)
vim.lsp.buf.clear_references()
vim.api.nvim_clear_autocmds({ group = "kickstart-lsp-highlight", buffer = event.buf })
end,
})
end
-- Inlay Hints
if client and client:supports_method("textDocument/inlayHint", bufnr) then
map("<leader>th", function()
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = bufnr }))
end, "[T]oggle Inlay [H]ints")
end
end,
})
-- 1. Setup Diagnostics (Visuals)
vim.diagnostic.config({
severity_sort = true,
-- underline = { severity = vim.diagnostic.severity.ERROR },
signs = {
text = {
[vim.diagnostic.severity.ERROR] = "",
[vim.diagnostic.severity.WARN] = "",
[vim.diagnostic.severity.INFO] = "",
[vim.diagnostic.severity.HINT] = "󰠠 ",
},
})
end,
},
{
"nvim-lspconfig",
event = { "BufReadPre", "BufNewFile" },
after = function()
vim.api.nvim_create_autocmd("LspAttach", {
group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }),
callback = function(args)
-- Get the client and buffer from the event arguments [cite: 119]
local client = vim.lsp.get_client_by_id(args.data.client_id)
local bufnr = args.buf
local map = function(keys, func, desc, mode)
mode = mode or "n"
vim.keymap.set(mode, keys, func, { buffer = bufnr, desc = "LSP: " .. desc })
end
-- Mappings (Standard LSP functions from lsp-defaults) [cite: 20-23]
map("grn", vim.lsp.buf.rename, "[R]e[n]ame")
map("gra", vim.lsp.buf.code_action, "[G]oto Code [A]ction", { "n", "x" })
map("grD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
-- Telescope Mappings
map("grr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences")
map("gri", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation")
map("grd", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition")
map("gO", require("telescope.builtin").lsp_document_symbols, "Open Document Symbols")
map("gW", require("telescope.builtin").lsp_dynamic_workspace_symbols, "Open Workspace Symbols")
map("grt", require("telescope.builtin").lsp_type_definitions, "[G]oto [T]ype Definition")
-- Highlight references (Document Highlight)
if client and client:supports_method("textDocument/documentHighlight", bufnr) then
local highlight_augroup = vim.api.nvim_create_augroup("kickstart-lsp-highlight", { clear = false })
vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, {
buffer = bufnr,
group = highlight_augroup,
callback = vim.lsp.buf.document_highlight,
})
vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, {
buffer = bufnr,
group = highlight_augroup,
callback = vim.lsp.buf.clear_references,
})
vim.api.nvim_create_autocmd("LspDetach", {
group = vim.api.nvim_create_augroup("kickstart-lsp-detach", { clear = true }),
callback = function(event)
vim.lsp.buf.clear_references()
vim.api.nvim_clear_autocmds({ group = "kickstart-lsp-highlight", buffer = event.buf })
end,
})
end
-- Inlay Hints
if client and client:supports_method("textDocument/inlayHint", bufnr) then
map("<leader>th", function()
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = bufnr }))
end, "[T]oggle Inlay [H]ints")
end
},
virtual_text = {
source = "if_many",
spacing = 4,
prefix = "",
format = function(diagnostic)
local diagnostic_message = {
[vim.diagnostic.severity.ERROR] = diagnostic.message,
[vim.diagnostic.severity.WARN] = diagnostic.message,
[vim.diagnostic.severity.INFO] = diagnostic.message,
[vim.diagnostic.severity.HINT] = diagnostic.message,
}
return diagnostic_message[diagnostic.severity]
end,
})
},
})
-- 1. Setup Diagnostics (Visuals)
vim.diagnostic.config({
severity_sort = true,
float = { border = "rounded", source = "if_many" },
underline = { severity = vim.diagnostic.severity.ERROR },
signs = {
text = {
[vim.diagnostic.severity.ERROR] = "",
[vim.diagnostic.severity.WARN] = "",
[vim.diagnostic.severity.INFO] = "",
[vim.diagnostic.severity.HINT] = "󰠠 ",
vim.lsp.config("lua_ls", {
settings = {
Lua = {
runtime = { version = "LuaJIT" },
signatureHelp = { enabled = true },
diagnostics = { globals = { "nixCats", "vim" } },
telemetry = { enabled = false },
completion = { callSnippet = "Replace" },
},
},
})
vim.lsp.enable("lua_ls")
-- Nix
vim.lsp.config("nixd", {
settings = {
nixd = {
nixpkgs = { expr = nixCats.extra("nixdExtras.nixpkgs") },
options = {
nixos = { expr = nixCats.extra("nixdExtras.nixos_options") },
["home-manager"] = { expr = nixCats.extra("nixdExtras.home_manager_options") },
},
formatting = { command = { "nixfmt" } },
},
virtual_text = {
source = "if_many",
spacing = 4,
prefix = "",
format = function(diagnostic)
local diagnostic_message = {
[vim.diagnostic.severity.ERROR] = diagnostic.message,
[vim.diagnostic.severity.WARN] = diagnostic.message,
[vim.diagnostic.severity.INFO] = diagnostic.message,
[vim.diagnostic.severity.HINT] = diagnostic.message,
}
return diagnostic_message[diagnostic.severity]
end,
},
})
},
})
vim.lsp.enable("nixd")
vim.lsp.config("lua_ls", {
settings = {
Lua = {
runtime = { version = "LuaJIT" },
signatureHelp = { enabled = true },
diagnostics = { globals = { "nixCats", "vim" } },
telemetry = { enabled = false },
completion = { callSnippet = "Replace" },
},
},
})
vim.lsp.enable("lua_ls")
-- Dafny
vim.lsp.enable("dafny")
-- Nix
vim.lsp.config("nixd", {
settings = {
nixd = {
nixpkgs = { expr = nixCats.extra("nixdExtras.nixpkgs") },
options = {
nixos = { expr = nixCats.extra("nixdExtras.nixos_options") },
["home-manager"] = { expr = nixCats.extra("nixdExtras.home_manager_options") },
},
formatting = { command = { "nixfmt" } },
},
},
})
vim.lsp.enable("nixd")
-- TypeScript/JS
vim.lsp.enable("ts_ls")
-- Dafny
vim.lsp.enable("dafny")
-- Rust
vim.lsp.enable("rust_analyzer")
-- TypeScript/JS
vim.lsp.enable("ts_ls")
-- Rust
vim.lsp.enable("rust_analyzer")
-- Python
vim.lsp.config("basedpyright", {
settings = {
basedpyright = {
analysis = {
autoSearchPaths = true,
useLibraryCodeForTypes = true,
diagnosticMode = "openFilesOnly",
typeCheckingMode = "standard",
inlayHints = {
variableTypes = true,
callArgumentNames = true,
functionReturnTypes = true,
},
-- Python
vim.lsp.config("basedpyright", {
settings = {
basedpyright = {
analysis = {
autoSearchPaths = true,
useLibraryCodeForTypes = true,
diagnosticMode = "openFilesOnly",
typeCheckingMode = "standard",
inlayHints = {
variableTypes = true,
callArgumentNames = true,
functionReturnTypes = true,
},
},
},
})
vim.lsp.enable("basedpyright")
},
})
vim.lsp.enable("basedpyright")
vim.lsp.enable("astro")
end,
},
vim.lsp.enable("astro")
vim.lsp.config("tinymist", {
settings = {
tinymist = {
formatterMode = "typstyle",
},
},
})
vim.lsp.enable("tinymist")
vim.lsp.config("ltex_plus", {
settings = {
ltex = {
language = "nl",
},
},
})
vim.lsp.enable("ltex_plus")
vim.lsp.enable("harper_ls")
end,
},
})

View File

@@ -1,49 +1,73 @@
require("lz.n").load({
-- {
-- "catppuccin-nvim",
-- event = "VimEnter",
-- after = function()
-- require("catppuccin").setup({
-- flavour = "mocha",
-- term_colors = true,
-- dim_inactive = {
-- enabled = true,
-- shade = "dark",
-- percentage = 0.15,
-- },
-- integrations = {
-- gitsigns = true,
-- telescope = true,
-- treesitter = true,
-- treesitter_context = true,
-- markdown = true,
-- which_key = true,
-- blink_cmp = {
-- style = "bordered",
-- },
-- },
--
-- native_lsp = {
-- enabled = true,
-- virtual_text = {
-- errors = { "italic" },
-- hints = { "italic" },
-- warnings = { "italic" },
-- information = { "italic" },
-- },
-- underlines = {
-- errors = { "underline" },
-- hints = { "underline" },
-- warnings = { "underline" },
-- information = { "underline" },
-- },
-- inlay_hints = {
-- background = true,
-- },
-- },
-- })
--
-- vim.cmd.colorscheme("catppuccin")
-- end,
-- },
{
"catppuccin-nvim",
"theme-loader",
event = "VimEnter",
after = function()
require("catppuccin").setup({
flavour = "mocha",
term_colors = true,
dim_inactive = {
enabled = true,
shade = "dark",
percentage = 0.15,
},
integrations = {
gitsigns = true,
telescope = true,
treesitter = true,
treesitter_context = true,
markdown = true,
which_key = true,
blink_cmp = {
style = "bordered",
},
},
load = function()
local theme_code = nixCats.extra("themeSetup")
native_lsp = {
enabled = true,
virtual_text = {
errors = { "italic" },
hints = { "italic" },
warnings = { "italic" },
information = { "italic" },
},
underlines = {
errors = { "underline" },
hints = { "underline" },
warnings = { "underline" },
information = { "underline" },
},
inlay_hints = {
background = true,
},
},
})
vim.cmd.colorscheme("catppuccin")
if theme_code and theme_code ~= "" then
local func, err = loadstring(theme_code)
if func then
func()
else
print("Error loading theme code: " .. err)
end
else
local colors = nixCats.extra("stylixColors")
if colors then
require("lz.n").trigger_load("mini.nvim")
require("mini.base16").setup({
palette = colors,
})
end
end
end,
},
{
@@ -85,9 +109,6 @@ require("lz.n").load({
require("which-key").setup({
preset = "modern",
delay = 200,
win = {
border = "rounded",
},
icons = {
-- set icon mappings to true if you have a Nerd Font
mappings = true,
@@ -106,52 +127,83 @@ require("lz.n").load({
end,
},
{
"mini.nvim",
"lualine.nvim",
event = "VimEnter",
after = function()
-- Better Around/Inside textobjects
require("mini.ai").setup({ n_lines = 500 })
require("lualine").setup({
options = {
icons_enabled = true,
globalstatus = true,
component_separators = "",
section_separators = "",
},
sections = {
lualine_a = { "mode" },
lualine_b = { "branch", "diagnostics" },
lualine_c = { "filename" },
-- Add/delete/replace surroundings (brackets, quotes, etc.)
require("mini.surround").setup()
-- Simple and easy statusline.
local statusline = require("mini.statusline")
statusline.setup({ use_icons = true })
statusline.section_location = function()
return "%2l:%-2v"
end
local files = require("mini.files")
files.setup()
vim.keymap.set("n", "<leader>e", function()
if not files.close() then
files.open(vim.api.nvim_buf_get_name(0))
end
end, { desc = "File [E]xplorer" })
local icons = require("mini.icons")
icons.setup()
icons.mock_nvim_web_devicons()
local hipatterns = require("mini.hipatterns")
hipatterns.setup({
highlighters = {
-- Highlight hex color strings (#rrggbb) using that color
hex_color = hipatterns.gen_highlighter.hex_color(),
lualine_x = { "lsp_status" },
lualine_y = { "progress" },
lualine_z = { "location" },
},
})
end,
},
{
"bufferline.nvim",
enabled = false,
event = "VimEnter",
after = function()
require("bufferline").setup({
options = {
mode = "buffers",
numbers = "none",
local indentscope = require("mini.indentscope")
indentscope.setup({
symbol = "",
-- draw = { animation = indentscope.gen_animation.linear({}) },
separator_style = "thick",
-- Integrations
diagnostics = "nvim_lsp",
diagnostics_indicator = function(count, level, diagnostics_dict, context)
local icon = level:match("error") and "" or ""
return " " .. icon .. count
end,
-- Visuals
show_buffer_close_icons = false,
show_close_icon = false,
color_icons = true,
show_tab_indicators = true,
},
highlights = {
fill = {
bg = "NONE", -- Makes the empty space transparent/blended
},
background = {
bg = "NONE", -- Makes inactive buffers transparent/blended
},
-- Optional: Fix separators if they look "cut off"
separator = {
fg = { attribute = "bg", highlight = "Normal" },
bg = "NONE",
},
separator_visible = {
fg = { attribute = "bg", highlight = "Normal" },
bg = "NONE",
},
},
})
vim.api.nvim_create_autocmd("FileType", {
pattern = { "help", "alpha", "dashboard", "neo-tree", "Trouble", "lazy", "mason" },
callback = function()
vim.b.miniindentscope_disable = true
end,
end,
},
{
"zen-mode.nvim",
after = function()
require("zen-mode").setup({
window = {
options = {
linebreak = true,
},
},
})
end,
},

View File

@@ -1,32 +1,70 @@
{ config, ... }:
{
config,
pkgs,
...
}:
{
programs.rclone = {
enable = true;
remotes = {
gdrive = {
config = {
type = "drive";
scope = "drive";
root_folder_id = "";
# Give rclone access to the ssh agent
package = pkgs.writeShellScriptBin "rclone" ''
export GNUPGHOME="${config.xdg.dataHome}/gnupg"
export SSH_AUTH_SOCK=$(${pkgs.gnupg}/bin/gpgconf --list-dirs agent-ssh-socket)
exec ${pkgs.rclone}/bin/rclone "$@"
'';
remotes = {
# gdrive = {
# config = {
# type = "drive";
# scope = "drive";
#
# root_folder_id = "";
# };
#
# secrets = {
# token = "${config.xdg.configHome}/rclone/gdrive_token";
#
# client_id = "${config.xdg.configHome}/rclone/gdrive_client_id";
# client_secret = "${config.xdg.configHome}/rclone/gdrive_client_secret"; # TODO: sops?
# };
#
# mounts = {
# "/" = {
# enable = true;
# mountPoint = "${config.home.homeDirectory}/gdrive";
#
# options = {
# dir-cache-time = "5m";
# poll-interval = "10s";
# };
# };
# };
# };
orion = {
config = {
type = "sftp";
user = config.var.username;
};
secrets = {
token = "${config.xdg.configHome}/rclone/gdrive_token";
client_id = "${config.xdg.configHome}/rclone/gdrive_client_id";
client_secret = "${config.xdg.configHome}/rclone/gdrive_client_secret"; # TODO: sops?
host = config.sops.secrets.orion_ip.path;
};
mounts = {
"/" = {
"/var/lib/filebrowser/files" = {
enable = true;
mountPoint = "${config.home.homeDirectory}/gdrive";
mountPoint = "${config.home.homeDirectory}/orion";
options = {
dir-cache-time = "5000h";
dir-cache-time = "5m";
poll-interval = "10s";
vfs-cache-mode = "full";
# Network optimizations
"buffer-size" = "32M";
"vfs-read-chunk-size" = "32M";
};
};
};

View File

@@ -4,6 +4,15 @@
enable = true;
enableDefaultConfig = false;
matchBlocks = {
"github-work" = {
hostname = "github.com";
user = "git";
identityFile = "/home/kiri/.ssh/github-work.pub";
identitiesOnly = true;
};
};
includes = [
config.sops.secrets.ssh_config_orion.path
];

View File

@@ -1,12 +1,14 @@
{ config, pkgs, ... }:
{
home.packages = [ pkgs.todoman ];
xdg.configFile."todoman/config.py".text = ''
path = "${config.xdg.dataHome}/calendars/*/*"
date_format = "%d-%m-%Y"
time_format = "%H:%M"
default_list = "personal"
default_due = 48
'';
programs.todoman = {
enable = true;
glob = "*/*";
extraConfig = ''
date_format = "%Y-%m-%d"
time_format = "%H:%M"
default_list = "personal"
default_due = 0
default_command = "list --sort priority,due"
humanize = True
'';
};
}

View File

@@ -1,3 +1,7 @@
{ config, ... }:
let
username = config.var.username;
in
{
services = {
copyparty = {
@@ -7,6 +11,39 @@
e2dsa = true;
no-cfg = true;
};
accounts = {
"${username}" = {
passwordFile = "/run/keys/copyparty-kiri-pass";
};
};
groups = {
"admin" = [ "${username}" ];
};
volumes = {
"/public" = {
path = "/var/lib/copyparty/public";
access = {
r = "*";
rwmd = "@admin";
};
flags = {
fk = 4;
scan = 60;
};
};
"/" = {
path = "/var/lib/copyparty/private";
access = {
rwmd = "@admin";
};
};
};
};
caddy.virtualHosts."files.jelles.net".extraConfig = "reverse_proxy :3923";

View File

@@ -7,6 +7,8 @@
./fonts.nix
./sddm.nix
./hyprland.nix
./printing.nix
./systemd-boot.nix
./syncthing.nix
];
}

View File

@@ -0,0 +1,128 @@
{
config,
pkgs,
lib,
...
}:
let
storageRoot = "/var/lib/filebrowser/files";
publishDirName = "_publish";
processorScript = pkgs.writeShellScriptBin "process-docs" ''
SRC_ROOT="${storageRoot}"
OUT_ROOT="${storageRoot}/${publishDirName}"
# Function to compile a single file
compile_file() {
local file="$1"
# Remove SRC_ROOT prefix to get relative path
local rel_path="''${file#$SRC_ROOT/}"
# Construct target path (swap extension to .pdf)
local target="$OUT_ROOT/''${rel_path%.*}.pdf"
local target_dir
target_dir=$(${pkgs.coreutils}/bin/dirname "$target")
echo "Processing: $rel_path"
${pkgs.coreutils}/bin/mkdir -p "$target_dir"
echo "Debug: Checking font visibility..."
typst fonts
if [[ "$file" == *.md ]]; then
pandoc "$file" -o "$target" --pdf-engine=typst -V mainfont="Libertinus Serif"
elif [[ "$file" == *.typ ]]; then
typst compile "$file" "$target"
fi
# Ensure filebrowser can read the new file
${pkgs.coreutils}/bin/chown filebrowser:filebrowser "$target"
}
export -f compile_file
export SRC_ROOT OUT_ROOT
# 1. Initial Scan: Find all .md/.typ files not inside the export dir
# and update them if the source is newer than the target
${pkgs.findutils}/bin/find "$SRC_ROOT" -type f \( -name "*.md" -o -name "*.typ" \) \
-not -path "$SRC_ROOT/${publishDirName}/*" | while read -r file; do
rel="''${file#$SRC_ROOT/}"
tgt="$OUT_ROOT/''${rel%.*}.pdf"
# Only compile if target doesn't exist or source is newer
if [ ! -f "$tgt" ] || [ "$file" -nt "$tgt" ]; then
compile_file "$file"
fi
done
# 2. Watcher Mode
echo "Starting watcher on $SRC_ROOT..."
# --exclude matches the export dir to prevent infinite loops
${pkgs.inotify-tools}/bin/inotifywait -m -r -e close_write,moved_to \
--exclude "${publishDirName}" \
--format '%w%f' "$SRC_ROOT" | while read -r file; do
if [[ "$file" == *.md ]] || [[ "$file" == *.typ ]]; then
compile_file "$file"
fi
done
'';
in
{
imports = [
./fonts.nix
];
services.filebrowser = {
enable = true;
settings = {
root = storageRoot;
port = 9876;
branding.name = "Jelle's Files";
};
};
services.caddy.virtualHosts."files.jelles.net".extraConfig = ''
reverse_proxy :${toString config.services.filebrowser.settings.port}
'';
# Auto compile pdfs
systemd.services.pdf-watcher = {
description = "Auto-compile MD and Typst to PDF";
after = [ "filebrowser.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
User = "filebrowser";
Group = "filebrowser";
ExecStart = "${processorScript}/bin/process-docs";
WorkingDirectory = storageRoot;
Environment = [
"HOME=/var/lib/filebrowser"
"XDG_CACHE_HOME=/var/lib/filebrowser/.cache"
# 3"TYPST_FONT_PATHS=${lib.makeSearchPath "share/fonts" fontPackages}"
];
Restart = "always";
};
path = with pkgs; [
typst
pandoc
];
};
# Allow my user to access the filebrowser directory
users.users."${config.var.username}".extraGroups = [ "filebrowser" ];
systemd.services.filebrowser.serviceConfig = {
UMask = lib.mkForce "0007";
};
systemd.tmpfiles.rules = [
"Z /var/lib/filebrowser 0750 filebrowser filebrowser -" # Explicitly secure the data dir root
"Z /var/lib/filebrowser/files 2770 filebrowser filebrowser -" # Sticky group on files
];
}

View File

@@ -20,6 +20,12 @@
nerd-fonts.meslo-lg
openmoji-color
twemoji-color-font
fira-sans
merriweather
lexend
literata
];
enableDefaultPackages = false;

165
modules/nixos/homepage.nix Normal file
View File

@@ -0,0 +1,165 @@
{ config, pkgs, ... }:
let
# Define standard colors/icons for consistency
domain = "jelles.net";
in
{
# Enable the Homepage Dashboard service
services.homepage-dashboard = {
enable = true;
listenPort = 8082; # Different from Glance (8101)
allowedHosts = "dashboard.${domain}";
# 1. Service Discovery & API Secrets
# For live stats (widgets), Homepage needs API keys.
# You can reference sops secrets here if you map them to a file readable by the homepage user.
# For now, I have set them to placeholders or disabled the API widgets where secrets are required.
services = [
{
"Personal" = [
{
"Home Assistant" = {
href = "https://home.${domain}";
description = "Smart Home Control";
icon = "home-assistant.png";
# To enable live stats (lights on, etc), un-comment and add a Long Lived Access Token:
# widget = {
# type = "homeassistant";
# url = "http://127.0.0.1:8123";
# key = "YOUR_LONG_LIVED_TOKEN";
# };
};
}
{
"Actual Budget" = {
href = "https://finance.${domain}";
description = "Finance Tracking";
icon = "actual-budget.png";
};
}
{
"Vaultwarden" = {
href = "https://vault.${domain}";
description = "Password Manager";
icon = "bitwarden.png";
# Widget to show status
widget = {
type = "vaultwarden";
url = "https://vault.${domain}";
};
};
}
{
"Radicale" = {
href = "https://radicale.${domain}";
description = "Calendar & Contacts";
icon = "radicale.png";
};
}
];
}
{
"Code & Files" = [
{
"Gitea" = {
href = "https://git.${domain}";
description = "Git Server";
icon = "gitea.png";
};
}
{
"FileBrowser" = {
href = "https://files.${domain}";
description = "Web File Manager";
icon = "filebrowser.png";
};
}
];
}
{
"Websites" = [
{
"Community" = {
href = "https://community.${domain}";
icon = "globe.png";
description = "Community Site";
};
}
{
"Zentire" = {
href = "https://zentire.${domain}";
icon = "globe.png";
description = "Zentire Site";
};
}
];
}
];
# 2. Widgets (Calendar, Search, Resources)
widgets = [
{
search = {
provider = "google";
target = "_blank";
};
}
{
# Shows system stats. Requires 'glances' or similar installed,
# but Homepage can also just show simple resources if running locally.
resources = {
cpu = true;
memory = true;
disk = "/";
};
}
{
# Calendar Widget linked to Radicale
# You need the "Private Export URL" for your calendar from Radicale.
calendar = {
showTime = true;
maxEvents = 10;
integrations = [
{
type = "ical";
url = "https://radicale.${domain}/kiri/personal.ics"; # Verify this path in your Radicale
name = "Personal";
color = "blue";
# If your Radicale is private, you might need to pass auth in the URL
# e.g. https://user:pass@radicale.jelles.net/...
}
];
};
}
];
settings = {
title = "Orion Dashboard";
background = {
# Using the wallpaper from your config if accessible, or a hex color
image = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/leef_dark_purple_minimalist.png";
opacity = 50;
};
layout = {
"Personal" = {
style = "row";
columns = 4;
};
"Code & Files" = {
style = "row";
columns = 2;
};
"Websites" = {
style = "row";
columns = 2;
};
};
};
};
# Expose Homepage via Caddy
services.caddy.virtualHosts."dashboard.${domain}".extraConfig = ''
reverse_proxy :8082
'';
}

View File

@@ -0,0 +1,17 @@
{ pkgs, ... }:
{
services.printing = {
enable = true;
drivers = with pkgs; [
cups-filters
cups-browsed
cnijfilter2
];
};
services.avahi = {
enable = true;
nssmdns4 = true;
openFirewall = true;
};
}

View File

@@ -0,0 +1,73 @@
{
config,
lib,
...
}:
let
devices = {
"altair" = {
id = "HDHWROJ-ZLNQKCL-PN6WGHA-IGJHIRI-3UHDYUU-LUJHYK4-UMKWLAZ-VFISJQF";
};
"orion" = {
id = "7ESQ3BX-FEW7656-ZPT3CKF-FLXON26-HXRNTDW-THSJBNF-LFWCHFB-ASP4WAG";
};
"polaris" = {
id = "6YBO3OK-3QVMKWL-ZOS4ZTF-G53CY6K-WYZJNFG-DTYCUA4-WJF2LRC-PJT3NAL";
};
};
username = config.var.username;
hostname = config.var.hostname;
isOrion = hostname == "orion";
# On desktops, sync to home directory. On server, sync to filebrowser storage.
syncPath = if isOrion then "/var/lib/filebrowser/files" else "/home/${username}/sync";
group = if isOrion then "filebrowser" else "users";
in
{
# 1. Firewall rules for synchronization
networking.firewall = {
allowedTCPPorts = [ 22000 ];
allowedUDPPorts = [
22000
21027
];
};
# 3. Syncthing Service Configuration
services.syncthing = {
enable = true;
user = username;
group = group;
overrideDevices = true; # Overrides any devices added via Web UI
overrideFolders = true; # Overrides any folders added via Web UI
settings = {
devices = devices;
folders = {
"sync" = {
path = syncPath;
devices = builtins.attrNames devices; # Share with all defined devices
# Ensure new files are readable by the group (chmod 770 approx)
ignorePerms = true;
};
};
gui = {
# access the GUI on localhost:8384
theme = "black";
};
};
};
# 4. Permission Hardening for Orion
# Force syncthing to write files with group-write permissions (007 umask = 770 perms)
systemd.services.syncthing.serviceConfig.UMask = lib.mkIf isOrion "0007";
systemd.tmpfiles.rules = [
"d /var/lib/syncthing 0700 ${username} ${group} -"
];
}

View File

@@ -26,6 +26,13 @@
transparentButtons = false;
floating = true;
};
neovim = {
plugin = pkgs.vimPlugins.catppuccin-nvim;
setup = ''
vim.cmd.colorscheme("catppuccin");
'';
};
};
description = "Theme configuration options";
};
@@ -36,22 +43,22 @@
# Mocha
# See https://tinted-theming.github.io/tinted-gallery/ for more schemes
base16Scheme = {
base00 = "1e1e2e"; # Default Background
base01 = "181825"; # Lighter Background (Used for status bars, line number and folding marks)
base02 = "313244"; # Selection Background
base03 = "45475a"; # Comments, Invisibles, Line Highlighting
base04 = "585b70"; # Dark Foreground (Used for status bars)
base05 = "cdd6f4"; # Default Foreground, Caret, Delimiters, Operators
base06 = "f5e0dc"; # Light Foreground (Not often used)
base07 = "b4befe"; # Light Background (Not often used)
base08 = "f38ba8"; # Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted
base09 = "fab387"; # Integers, Boolean, Constants, XML Attributes, Markup Link Url
base0A = "f9e2af"; # Classes, Markup Bold, Search Text Background
base0B = "a6e3a1"; # Strings, Inherited Class, Markup Code, Diff Inserted
base0C = "94e2d5"; # Support, Regular Expressions, Escape Characters, Markup Quotes
base0D = "89b4fa"; # Functions, Methods, Attribute IDs, Headings, Accent color
base0E = "cba6f7"; # Keywords, Storage, Selector, Markup Italic, Diff Changed
base0F = "f2cdcd"; # Deprecated, Opening/Closing Embedded Language Tags, e.g. <?php ?>
base00 = "#1e1e2e";
base01 = "#181825";
base02 = "#313244";
base03 = "#45475a";
base04 = "#585b70";
base05 = "#cdd6f4";
base06 = "#f5e0dc";
base07 = "#b4befe";
base08 = "#f38ba8";
base09 = "#fab387";
base0A = "#f9e2af";
base0B = "#a6e3a1";
base0C = "#94e2d5";
base0D = "#89b4fa";
base0E = "#cba6f7";
base0F = "#f2cdcd";
};
cursor = {

114
modules/themes/gruvbox.nix Normal file
View File

@@ -0,0 +1,114 @@
{
lib,
pkgs,
config,
...
}:
{
options.theme = lib.mkOption {
type = lib.types.attrs;
default = {
rounding = 17;
gaps-in = 5;
gaps-out = 10;
active-opacity = 1;
inactive-opacity = 1;
blur = true;
border-size = 3;
animation-speed = "fast"; # "fast" | "medium" | "slow"
fetch = "none"; # "nerdfetch" | "neofetch" | "pfetch" | "none"
textColorOnWallpaper = config.lib.stylix.colors.base01; # Color of the text displayed on the wallpaper (Lockscreen, display manager, ...)
bar = {
# Hyprpanel
position = "top"; # "top" | "bottom"
transparent = true;
transparentButtons = false;
floating = true;
};
neovim = {
plugin = pkgs.vimPlugins.tokyonight-nvim;
setup = ''
require("tokyonight").setup({
style = "night"
})
vim.cmd.colorscheme("tokyonight")
'';
};
};
description = "Theme configuration options";
};
config.stylix = {
enable = true;
# Tokyo Night Dark
# See https://tinted-theming.github.io/tinted-gallery/ for more schemes
base16Scheme = {
base00 = "#1A1B26";
base01 = "#16161E";
base02 = "#2F3549";
base03 = "#444B6A";
base04 = "#787C99";
base05 = "#A9B1D6";
base06 = "#CBCCD1";
base07 = "#D5D6DB";
base08 = "#C0CAF5";
base09 = "#A9B1D6";
base0A = "#0DB9D7";
base0B = "#9ECE6A";
base0C = "#B4F9F8";
base0D = "#2AC3DE";
base0E = "#BB9AF7";
base0F = "#F7768E";
};
cursor = {
name = "phinger-cursors-light";
package = pkgs.phinger-cursors;
size = 28;
};
fonts = {
monospace = {
package = pkgs.nerd-fonts.jetbrains-mono;
name = "JetBrains Mono Nerd Font";
};
sansSerif = {
package = pkgs.source-sans-pro;
name = "Source Sans Pro";
};
serif = config.stylix.fonts.sansSerif;
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = 13;
desktop = 13;
popups = 15;
terminal = 11.5;
};
};
polarity = "dark";
image = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/leef_dark_purple_minimalist.png";
sha256 = "sha256-q6ufFdC/tMSb+mllw7XhilkAObemXXyps2SBlnMt7mY=";
};
# image = pkgs.fetchurl {
# url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/alone-cloud_dark.png";
# sha256 = "sha256-L4Esjo6LEwhBEN29WX445F+54rlnvOtAMKsQz8Qpyuc=";
# };
# image = pkgs.fetchurl {
# url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/the-cloud-is-hidding-the-moon_dark.png";
# sha256 = "sha256-EEH2cHsVromD+X5VFF3YObNuSSRbDnpfqEN6fjCztbc=";
# };
};
}

View File

@@ -0,0 +1,162 @@
{
lib,
pkgs,
config,
...
}:
{
options.theme = lib.mkOption {
type = lib.types.attrs;
default = {
rounding = 17;
gaps-in = 5;
gaps-out = 10;
active-opacity = 1;
inactive-opacity = 1;
blur = true;
border-size = 3;
animation-speed = "fast"; # "fast" | "medium" | "slow"
fetch = "none"; # "nerdfetch" | "neofetch" | "pfetch" | "none"
textColorOnWallpaper = config.lib.stylix.colors.base01; # Color of the text displayed on the wallpaper (Lockscreen, display manager, ...)
bar = {
# Hyprpanel
position = "top"; # "top" | "bottom"
transparent = true;
transparentButtons = false;
floating = true;
};
neovim = {
plugin = pkgs.vimPlugins.kanagawa-nvim;
setup = ''
require("kanagawa").setup({
colors = {
theme = {
all = {
ui = {
bg_gutter = "none"
}
}
}
},
overrides = function(colors)
local theme = colors.theme
local makeDiagnosticColor = function(color)
local c = require("kanagawa.lib.color")
return { fg = color, bg = c(color):blend(theme.ui.bg, 0.95):to_hex() }
end
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 },
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 },
Pmenu = { fg = theme.ui.shade0, bg = theme.ui.bg_p1 }, -- add `blend = vim.o.pumblend` to enable transparency
PmenuSel = { fg = "NONE", bg = theme.ui.bg_p2 },
PmenuSbar = { bg = theme.ui.bg_m1 },
PmenuThumb = { bg = theme.ui.bg_p2 },
DiagnosticVirtualTextHint = makeDiagnosticColor(theme.diag.hint),
DiagnosticVirtualTextInfo = makeDiagnosticColor(theme.diag.info),
DiagnosticVirtualTextWarn = makeDiagnosticColor(theme.diag.warning),
DiagnosticVirtualTextError = makeDiagnosticColor(theme.diag.error),
}
end,
})
vim.cmd.colorscheme("kanagawa-dragon")
'';
};
};
description = "Theme configuration options";
};
config.stylix = {
enable = true;
# Tokyo Night Dark
# See https://tinted-theming.github.io/tinted-gallery/ for more schemes
base16Scheme = {
base00 = "#181616";
base01 = "#0d0c0c";
base02 = "#2d4f67";
base03 = "#a6a69c";
base04 = "#7fb4ca";
base05 = "#c5c9c5";
base06 = "#938aa9";
base07 = "#c5c9c5";
base08 = "#c4746e";
base09 = "#e46876";
base0A = "#c4b28a";
base0B = "#8a9a7b";
base0C = "#8ea4a2";
base0D = "#8ba4b0";
base0E = "#a292a3";
base0F = "#7aa89f";
};
cursor = {
name = "phinger-cursors-light";
package = pkgs.phinger-cursors;
size = 28;
};
fonts = {
monospace = {
package = pkgs.nerd-fonts.jetbrains-mono;
name = "JetBrains Mono Nerd Font";
};
sansSerif = {
package = pkgs.source-sans-pro;
name = "Source Sans Pro";
};
serif = config.stylix.fonts.sansSerif;
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = 13;
desktop = 13;
popups = 15;
terminal = 11.5;
};
};
polarity = "dark";
image = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/leef_dark_purple_minimalist.png";
sha256 = "sha256-q6ufFdC/tMSb+mllw7XhilkAObemXXyps2SBlnMt7mY=";
};
# image = pkgs.fetchurl {
# url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/alone-cloud_dark.png";
# sha256 = "sha256-L4Esjo6LEwhBEN29WX445F+54rlnvOtAMKsQz8Qpyuc=";
# };
# image = pkgs.fetchurl {
# url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/the-cloud-is-hidding-the-moon_dark.png";
# sha256 = "sha256-EEH2cHsVromD+X5VFF3YObNuSSRbDnpfqEN6fjCztbc=";
# };
};
}

View File

@@ -0,0 +1,138 @@
{
lib,
pkgs,
config,
...
}:
{
options.theme = lib.mkOption {
type = lib.types.attrs;
default = {
rounding = 17;
gaps-in = 5;
gaps-out = 10;
active-opacity = 1;
inactive-opacity = 1;
blur = true;
border-size = 3;
animation-speed = "fast"; # "fast" | "medium" | "slow"
fetch = "none"; # "nerdfetch" | "neofetch" | "pfetch" | "none"
textColorOnWallpaper = config.lib.stylix.colors.base01; # Color of the text displayed on the wallpaper (Lockscreen, display manager, ...)
bar = {
# Hyprpanel
position = "top"; # "top" | "bottom"
transparent = true;
transparentButtons = false;
floating = true;
};
neovim = {
plugin = pkgs.vimPlugins.kanagawa-nvim;
setup = ''
require("kanagawa").setup({
colors = {
theme = {
all = {
ui = {
bg_gutter = "none"
}
}
}
},
overrides = function(colors)
local theme = colors.theme
local makeDiagnosticColor = function(color)
local c = require("kanagawa.lib.color")
return { fg = color, bg = c(color):blend(theme.ui.bg, 0.95):to_hex() }
end
return {
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 },
Pmenu = { fg = theme.ui.shade0, bg = theme.ui.bg_p1 }, -- add `blend = vim.o.pumblend` to enable transparency
PmenuSel = { fg = "NONE", bg = theme.ui.bg_p2 },
PmenuSbar = { bg = theme.ui.bg_m1 },
PmenuThumb = { bg = theme.ui.bg_p2 },
DiagnosticVirtualTextHint = makeDiagnosticColor(theme.diag.hint),
DiagnosticVirtualTextInfo = makeDiagnosticColor(theme.diag.info),
DiagnosticVirtualTextWarn = makeDiagnosticColor(theme.diag.warning),
DiagnosticVirtualTextError = makeDiagnosticColor(theme.diag.error),
}
end,
})
vim.cmd.colorscheme("kanagawa-wave")
'';
};
};
description = "Theme configuration options";
};
config.stylix = {
enable = true;
# See https =//tinted-theming.github.io/tinted-gallery/ for more schemes
base16Scheme = {
base00 = "#1F1F28";
base01 = "#16161D";
base02 = "#223249";
base03 = "#54546D";
base04 = "#727169";
base05 = "#DCD7BA";
base06 = "#C8C093";
base07 = "#717C7C";
base08 = "#C34043";
base09 = "#FFA066";
base0A = "#C0A36E";
base0B = "#76946A";
base0C = "#6A9589";
base0D = "#7E9CD8";
base0E = "#957FB8";
base0F = "#D27E99";
};
cursor = {
name = "phinger-cursors-light";
package = pkgs.phinger-cursors;
size = 28;
};
fonts = {
monospace = {
package = pkgs.nerd-fonts.jetbrains-mono;
name = "JetBrains Mono Nerd Font";
};
sansSerif = {
package = pkgs.source-sans-pro;
name = "Source Sans Pro";
};
serif = config.stylix.fonts.sansSerif;
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = 13;
desktop = 13;
popups = 15;
terminal = 11.5;
};
};
polarity = "dark";
image = ./wallpapers/green_leaves_minimalist.png;
};
}

View File

@@ -0,0 +1,104 @@
{
lib,
pkgs,
config,
...
}:
{
options.theme = lib.mkOption {
type = lib.types.attrs;
default = {
rounding = 17;
gaps-in = 5;
gaps-out = 10;
active-opacity = 1;
inactive-opacity = 1;
blur = true;
border-size = 3;
animation-speed = "fast"; # "fast" | "medium" | "slow"
fetch = "none"; # "nerdfetch" | "neofetch" | "pfetch" | "none"
textColorOnWallpaper = config.lib.stylix.colors.base01; # Color of the text displayed on the wallpaper (Lockscreen, display manager, ...)
bar = {
# Hyprpanel
position = "top"; # "top" | "bottom"
transparent = true;
transparentButtons = false;
floating = true;
};
};
description = "Theme configuration options";
};
config.stylix = {
enable = true;
# Tokyo Night Dark
# See https://tinted-theming.github.io/tinted-gallery/ for more schemes
base16Scheme = {
base00 = "#171D23";
base01 = "#1D252C";
base02 = "#28323A";
base03 = "#526270";
base04 = "#B7C5D3";
base05 = "#D8E2EC";
base06 = "#F6F6F8";
base07 = "#FBFBFD";
base08 = "#F7768E";
base09 = "#FF9E64";
base0A = "#B7C5D3";
base0B = "#9ECE6A";
base0C = "#89DDFF";
base0D = "#7AA2F7";
base0E = "#BB9AF7";
base0F = "#BB9AF7";
};
cursor = {
name = "phinger-cursors-light";
package = pkgs.phinger-cursors;
size = 28;
};
fonts = {
monospace = {
package = pkgs.nerd-fonts.jetbrains-mono;
name = "JetBrains Mono Nerd Font";
};
sansSerif = {
package = pkgs.source-sans-pro;
name = "Source Sans Pro";
};
serif = config.stylix.fonts.sansSerif;
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = 13;
desktop = 13;
popups = 15;
terminal = 11.5;
};
};
polarity = "dark";
image = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/leef_dark_purple_minimalist.png";
sha256 = "sha256-q6ufFdC/tMSb+mllw7XhilkAObemXXyps2SBlnMt7mY=";
};
# image = pkgs.fetchurl {
# url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/alone-cloud_dark.png";
# sha256 = "sha256-L4Esjo6LEwhBEN29WX445F+54rlnvOtAMKsQz8Qpyuc=";
# };
# image = pkgs.fetchurl {
# url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/the-cloud-is-hidding-the-moon_dark.png";
# sha256 = "sha256-EEH2cHsVromD+X5VFF3YObNuSSRbDnpfqEN6fjCztbc=";
# };
};
}

View File

@@ -0,0 +1,114 @@
{
lib,
pkgs,
config,
...
}:
{
options.theme = lib.mkOption {
type = lib.types.attrs;
default = {
rounding = 17;
gaps-in = 5;
gaps-out = 10;
active-opacity = 1;
inactive-opacity = 1;
blur = true;
border-size = 3;
animation-speed = "fast"; # "fast" | "medium" | "slow"
fetch = "none"; # "nerdfetch" | "neofetch" | "pfetch" | "none"
textColorOnWallpaper = config.lib.stylix.colors.base01; # Color of the text displayed on the wallpaper (Lockscreen, display manager, ...)
bar = {
# Hyprpanel
position = "top"; # "top" | "bottom"
transparent = true;
transparentButtons = false;
floating = true;
};
neovim = {
plugin = pkgs.vimPlugins.tokyonight-nvim;
setup = ''
require("tokyonight").setup({
style = "night"
})
vim.cmd.colorscheme("tokyonight")
'';
};
};
description = "Theme configuration options";
};
config.stylix = {
enable = true;
# Tokyo Night Dark
# See https://tinted-theming.github.io/tinted-gallery/ for more schemes
base16Scheme = {
base00 = "#1A1B26";
base01 = "#16161E";
base02 = "#2F3549";
base03 = "#444B6A";
base04 = "#787C99";
base05 = "#A9B1D6";
base06 = "#CBCCD1";
base07 = "#D5D6DB";
base08 = "#C0CAF5";
base09 = "#A9B1D6";
base0A = "#0DB9D7";
base0B = "#9ECE6A";
base0C = "#B4F9F8";
base0D = "#2AC3DE";
base0E = "#BB9AF7";
base0F = "#F7768E";
};
cursor = {
name = "phinger-cursors-light";
package = pkgs.phinger-cursors;
size = 28;
};
fonts = {
monospace = {
package = pkgs.nerd-fonts.jetbrains-mono;
name = "JetBrains Mono Nerd Font";
};
sansSerif = {
package = pkgs.source-sans-pro;
name = "Source Sans Pro";
};
serif = config.stylix.fonts.sansSerif;
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = 13;
desktop = 13;
popups = 15;
terminal = 11.5;
};
};
polarity = "dark";
image = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/leef_dark_purple_minimalist.png";
sha256 = "sha256-q6ufFdC/tMSb+mllw7XhilkAObemXXyps2SBlnMt7mY=";
};
# image = pkgs.fetchurl {
# url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/alone-cloud_dark.png";
# sha256 = "sha256-L4Esjo6LEwhBEN29WX445F+54rlnvOtAMKsQz8Qpyuc=";
# };
# image = pkgs.fetchurl {
# url = "https://raw.githubusercontent.com/anotherhadi/awesome-wallpapers/refs/heads/main/app/static/wallpapers/the-cloud-is-hidding-the-moon_dark.png";
# sha256 = "sha256-EEH2cHsVromD+X5VFF3YObNuSSRbDnpfqEN6fjCztbc=";
# };
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@@ -1,7 +1,7 @@
{ config, lib, ... }:
{
imports = [
./themes/catppuccin.nix
./themes/kanagawa-wave.nix
];
config.var = {

View File

@@ -13,6 +13,7 @@
secrets = {
radicale_pass = { };
university_calendar_url = { };
orion_ip = { };
ssh_config_orion = {
mode = "0600";
};

View File

@@ -1,6 +1,7 @@
radicale_pass: ENC[AES256_GCM,data:zdUxtJKNPC8SzajhFKo=,iv:H55GWMiQLJvZx6rAufkk807lZflg0sepxoq6z0XJ/q4=,tag:MoDOuF37PeF7QEpUxBntEg==,type:str]
university_calendar_url: ENC[AES256_GCM,data:y5UtZVC0KJPUz//6S0QsrNeFGQshc88zieQgmlur75VFw9y5CJpnZRpdhLnYva00z5HBkxYQelLqS/I5GrXexWtC7Y7d1dCcQ+IZ0K7GGJ5NrYtjNXfMhzNSlhqjvl5lBGb+S565kel3VsCTyo/YRxdbBN6FA/oQNsx8/AvTgtsPeFkQRDGlGkybFRfWHWuTIDLL,iv:rZK9utRrm/KAkVRUjC3VR09MvDZjpoLx7BgaidzQo3o=,tag:tGWGoQCsS3zZh818OKixPw==,type:str]
ssh_config_orion: ENC[AES256_GCM,data:P2jH5BDIzeHSIwTBcZwTOXKes727xK0Xoj9W64GmEszEPZw8vA==,iv:hSY9mFdC82pBbOjMFuzoR2eufhjY2MGERJ4ODmcogbA=,tag:ejF535LrQwwH66nQG3qLGw==,type:str]
orion_ip: ENC[AES256_GCM,data:RCK6EKOEDaTu1uR2d/8=,iv:5JhIkVQEELB6MoPh49xq+0CrbPjI/6+qfqUHRqCza5s=,tag:+00T4+pWOWRj7R1ft39HAw==,type:str]
sops:
age:
- recipient: age122w85pqj508ukv0rd388mahecgfckmpgnsgz0zcyec37ljae2epsdnvxpl
@@ -21,7 +22,7 @@ sops:
ODdTa0VlYjg0ajJuUWhiRVUrR1VSTHMK6NVeKyMTomvZoqAtJN1SshIZdd2fHFBy
Waghxmi6x/93lf54E1ZiXZQ+LDCjqqmMY8jgoF00XCo0WeURlHXpaw==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-11-29T18:05:48Z"
mac: ENC[AES256_GCM,data:j0pHRA3c5lRdyLjqxlP2MTzIYb3WYAy7p+FttOjTQpXcyT5dFykXuu8rv+MQTmWdvHLQKC4iuZ7HTSO9qx8SbAuxHBWpoycpy3cZpmFp5T5crCl65AVQ/yRZKD9gRxkhnVW7aAK1kC3Mq07PamznvX/b7eEJ8h3tvmymuw6z/vY=,iv:W430t2YAXVcJztbO+fNdlOyjjy6+cH5r5YwuM2QdIdc=,tag:dDRJSslL9/Hac465A/TstA==,type:str]
lastmodified: "2025-12-01T16:01:07Z"
mac: ENC[AES256_GCM,data:LAXl/FJafDOEOYrukqfzGMIXZzihX2zHMIQaR735MHWsTr3DSkCUqZ5IPEn9EmUSDkO8SaS0QdhRk0h7IhzS4MOsAAMdEtAEec4k0f9sMCLRWbV/G4tYxESPeuQNwdwS0iPsBsMQgvH93u7ttR59zyzQE1izal5nMwK3yQmNV5s=,iv:R3bnPXQY38Zf9BJuEP+inbRIVvAmLvEyGrlWzl3N9YI=,tag:eetYNetPvKXiJnR7AA3dwA==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0